From 27ae4bccfd866a9bf334dc191631499d3cea1b19 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 21 Oct 2008 14:10:01 -0500 Subject: [svn-r15922] Description: Bring revisions 15289:15457 from trunk into metadata journaling branch. Tested on: FreeBSD/32 6.2 (duty) in debug mode FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe, in debug mode Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN, in production mode Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN, in production mode Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN, w/szip filter, in production mode Mac OS X/32 10.5.2 (amazon) in debug mode Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode --- MANIFEST | 41 +- bin/h5vers | 54 +- c++/src/H5AbstractDs.cpp | 12 +- c++/src/H5AbstractDs.h | 5 +- c++/src/H5Attribute.cpp | 103 +- c++/src/H5Attribute.h | 22 +- c++/src/H5Classes.h | 1 - c++/src/H5CommonFG.cpp | 33 + c++/src/H5DataSet.cpp | 120 +- c++/src/H5DataSet.h | 22 +- c++/src/H5DataSpace.cpp | 65 +- c++/src/H5DataSpace.h | 10 + c++/src/H5DataType.cpp | 132 +- c++/src/H5DataType.h | 21 +- c++/src/H5DcreatProp.cpp | 2 +- c++/src/H5DxferProp.h | 1 - c++/src/H5FaccProp.cpp | 2 +- c++/src/H5File.cpp | 232 +- c++/src/H5File.h | 33 +- c++/src/H5Group.cpp | 109 +- c++/src/H5Group.h | 20 +- c++/src/H5IdComponent.cpp | 247 +- c++/src/H5IdComponent.h | 35 +- c++/src/H5Object.cpp | 194 +- c++/src/H5Object.h | 29 +- c++/src/H5PropList.cpp | 56 +- c++/src/H5PropList.h | 9 + c++/test/tattr.cpp | 27 +- c++/test/tvlstr.cpp | 2 +- config/lt_vers.am | 4 +- configure | 4 +- configure.in | 2 +- fortran/src/H5Gf.c | 30 +- fortran/src/H5Gff.f90 | 78 +- fortran/src/H5f90proto.h | 252 +- fortran/src/H5test_kind.f90 | 218 +- fortran/test/tH5A_1_8.f90 | 8 +- fortran/test/tH5G_1_8.f90 | 2 +- fortran/test/tH5P.f90 | 2 +- hl/c++/test/ptableTest.cpp | 1 - hl/tools/Makefile.am | 2 +- hl/tools/Makefile.in | 2 +- hl/tools/gif2h5/h52giftest.sh | 4 +- hl/tools/gif2h5/testfiles/h52giftst.h5 | Bin 0 -> 82816 bytes hl/tools/gif2h5/testfiles/image1.gif | Bin 0 -> 9736 bytes hl/tools/h52jpeg/Makefile.am | 46 + hl/tools/h52jpeg/Makefile.in | 882 + hl/tools/h52jpeg/h52jpeg.c | 753 + hl/tools/h52jpeg/h52jpeg.sh | 96 + hl/tools/h52jpeg/h52jpegtst.c | 268 + hl/tools/h52jpeg/h52jpegtst.h | 286 + hl/tools/h52jpeg/image24pixel.txt | 101475 +++++++++++++++ hl/tools/h52jpeg/image8.txt | 120006 ++++++++++++++++++ hl/tools/h52jpeg/testfiles/h52jpegtst.h5 | Bin 0 -> 469661 bytes hl/tools/testfiles/h52giftst.h5 | Bin 82816 -> 0 bytes hl/tools/testfiles/image1.gif | Bin 9736 -> 0 bytes perform/pio_engine.c | 4158 +- perform/pio_perf.c | 361 +- perform/pio_standalone.h | 41 +- release_docs/INSTALL_Windows.txt | 102 +- release_docs/INSTALL_Windows_From_Command_Line.txt | 27 +- release_docs/INSTALL_Windows_Short_NET.TXT | 4 +- release_docs/INSTALL_Windows_Short_VS2005.TXT | 4 +- release_docs/RELEASE.txt | 52 +- src/H5A.c | 302 +- src/H5Abtree2.c | 4 +- src/H5Adense.c | 32 +- src/H5Aint.c | 115 +- src/H5Apkg.h | 24 +- src/H5Atest.c | 2 +- src/H5F.c | 18 +- src/H5Fmount.c | 152 +- src/H5Fpkg.h | 37 +- src/H5G.c | 28 +- src/H5Gdeprec.c | 6 +- src/H5Gname.c | 13 +- src/H5Gobj.c | 24 + src/H5Gprivate.h | 7 + src/H5Gpublic.h | 1 + src/H5Gtraverse.c | 40 +- src/H5O.c | 2 +- src/H5Oattr.c | 297 +- src/H5Oattribute.c | 274 +- src/H5Pdcpl.c | 2 +- src/H5Tcompound.c | 6 +- src/Makefile.in | 4 +- test/dtypes.c | 110 +- test/mount.c | 424 +- test/objcopy.c | 2 + test/tattr.c | 1049 +- test/testhdf5.c | 2 +- test/tsohm.c | 49 +- tools/h52jpeg/Makefile.am | 46 - tools/h52jpeg/Makefile.in | 882 - tools/h52jpeg/h52jpeg.c | 641 - tools/h52jpeg/h52jpeg.sh | 87 - tools/h52jpeg/h52jpegtst.c | 181 - tools/h52jpeg/image24pixel.txt | 101475 --------------- tools/h52jpeg/image8.txt | 120006 ------------------ tools/h52jpeg/testfiles/h52jpegtst.h5 | Bin 227613 -> 0 bytes tools/h5copy/h5copy.c | 2 +- tools/h5diff/h5diff_common.c | 34 +- tools/h5diff/h5diff_main.c | 10 + tools/h5diff/testfiles/h5diff_10.txt | 19 +- tools/h5diff/testfiles/h5diff_19.txt | 24 + tools/h5diff/testfiles/h5diff_600.txt | 19 +- tools/h5diff/testfiles/h5diff_603.txt | 19 +- tools/h5diff/testfiles/h5diff_604.txt | 19 +- tools/h5diff/testfiles/h5diff_605.txt | 19 +- tools/h5diff/testfiles/h5diff_606.txt | 19 +- tools/h5diff/testfiles/h5diff_612.txt | 19 +- tools/h5diff/testfiles/h5diff_613.txt | 19 +- tools/h5diff/testfiles/h5diff_614.txt | 19 +- tools/h5diff/testfiles/h5diff_615.txt | 19 +- tools/h5diff/testfiles/h5diff_621.txt | 19 +- tools/h5diff/testfiles/h5diff_622.txt | 19 +- tools/h5diff/testfiles/h5diff_623.txt | 19 +- tools/h5diff/testfiles/h5diff_624.txt | 19 +- tools/h5diff/testh5diff.sh | 6 + tools/h5dump/h5dump.c | 15 +- tools/h5jam/testfiles/tall.h5 | Bin 0 -> 9968 bytes tools/h5jam/testfiles/twithub.h5 | Bin 0 -> 10592 bytes tools/h5jam/testfiles/twithub513.h5 | Bin 0 -> 11056 bytes tools/h5jam/testfiles/u10.txt | 1 + tools/h5jam/testfiles/u511.txt | 1 + tools/h5jam/testfiles/u512.txt | 1 + tools/h5jam/testfiles/u513.txt | 1 + tools/h5jam/testh5jam.sh.in | 5 +- tools/h5ls/h5ls.c | 2 +- tools/h5repack/h5repack.sh.in | 4 +- tools/h5repack/h5repack_copy.c | 14 +- tools/h5repack/h5repack_main.c | 10 +- tools/h5repack/h5repacktst.c | 3 + tools/h5stat/testfiles/h5stat_newgrat.ddl | 2 +- tools/h5stat/testfiles/h5stat_newgrat.h5 | Bin 6363055 -> 6363081 bytes tools/h5stat/testfiles/h5stat_tsohm.ddl | 18 +- tools/h5stat/testfiles/h5stat_tsohm.h5 | Bin 3603 -> 3887 bytes tools/lib/h5diff.c | 147 +- tools/lib/h5diff.h | 2 + tools/testfiles/tdatareg.ddl | 5 +- tools/testfiles/twithub.h5 | Bin 10592 -> 0 bytes tools/testfiles/twithub513.h5 | Bin 11056 -> 0 bytes tools/testfiles/u10.txt | 1 - tools/testfiles/u511.txt | 1 - tools/testfiles/u512.txt | 1 - tools/testfiles/u513.txt | 1 - windows/hdf5bt.BAT | 26 +- windows/hdf5build.BAT | 150 +- windows/hl/tools/gif2h5/h52giftest.bat | 4 +- windows/src/H5pubconf.h | 765 +- windows/tools/h5diff/testh5diff.bat | 6 + windows/tools/h5jam/testh5jam.bat | 6 +- windows/tools/h5repack/h5repack.bat | 2 +- 153 files changed, 231307 insertions(+), 227382 deletions(-) create mode 100644 hl/tools/gif2h5/testfiles/h52giftst.h5 create mode 100644 hl/tools/gif2h5/testfiles/image1.gif create mode 100644 hl/tools/h52jpeg/Makefile.am create mode 100644 hl/tools/h52jpeg/Makefile.in create mode 100644 hl/tools/h52jpeg/h52jpeg.c create mode 100644 hl/tools/h52jpeg/h52jpeg.sh create mode 100644 hl/tools/h52jpeg/h52jpegtst.c create mode 100644 hl/tools/h52jpeg/h52jpegtst.h create mode 100644 hl/tools/h52jpeg/image24pixel.txt create mode 100644 hl/tools/h52jpeg/image8.txt create mode 100644 hl/tools/h52jpeg/testfiles/h52jpegtst.h5 delete mode 100644 hl/tools/testfiles/h52giftst.h5 delete mode 100644 hl/tools/testfiles/image1.gif delete mode 100644 tools/h52jpeg/Makefile.am delete mode 100644 tools/h52jpeg/Makefile.in delete mode 100644 tools/h52jpeg/h52jpeg.c delete mode 100644 tools/h52jpeg/h52jpeg.sh delete mode 100644 tools/h52jpeg/h52jpegtst.c delete mode 100644 tools/h52jpeg/image24pixel.txt delete mode 100644 tools/h52jpeg/image8.txt delete mode 100644 tools/h52jpeg/testfiles/h52jpegtst.h5 create mode 100644 tools/h5diff/testfiles/h5diff_19.txt create mode 100644 tools/h5jam/testfiles/tall.h5 create mode 100644 tools/h5jam/testfiles/twithub.h5 create mode 100644 tools/h5jam/testfiles/twithub513.h5 create mode 100755 tools/h5jam/testfiles/u10.txt create mode 100755 tools/h5jam/testfiles/u511.txt create mode 100755 tools/h5jam/testfiles/u512.txt create mode 100755 tools/h5jam/testfiles/u513.txt delete mode 100644 tools/testfiles/twithub.h5 delete mode 100644 tools/testfiles/twithub513.h5 delete mode 100755 tools/testfiles/u10.txt delete mode 100755 tools/testfiles/u511.txt delete mode 100755 tools/testfiles/u512.txt delete mode 100755 tools/testfiles/u513.txt diff --git a/MANIFEST b/MANIFEST index f94692c..84e1744 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1432,6 +1432,7 @@ ./tools/h5diff/testfiles/h5diff_16_3.txt ./tools/h5diff/testfiles/h5diff_17.txt ./tools/h5diff/testfiles/h5diff_18.txt +./tools/h5diff/testfiles/h5diff_19.txt ./tools/h5diff/testfiles/h5diff_20.txt ./tools/h5diff/testfiles/h5diff_21.txt ./tools/h5diff/testfiles/h5diff_22.txt @@ -1529,12 +1530,15 @@ ./tools/h5jam/getub.c # test files for jam -./tools/testfiles/twithub.h5 -./tools/testfiles/twithub513.h5 -./tools/testfiles/u10.txt -./tools/testfiles/u511.txt -./tools/testfiles/u512.txt -./tools/testfiles/u513.txt +./tools/h5jam/testfiles/twithub.h5 +./tools/h5jam/testfiles/u10.txt +./tools/h5jam/testfiles/tall.h5 +./tools/h5jam/testfiles/u511.txt +./tools/h5jam/testfiles/u512.txt +./tools/h5jam/testfiles/twithub513.h5 +./tools/h5jam/testfiles/u513.txt + + # test files for h5copy ./tools/h5copy/testfiles/h5copytst.h5 @@ -1553,15 +1557,15 @@ ./tools/testfiles/h5mkgrp_version.ls #h52jpeg -./tools/h52jpeg/Makefile.in -./tools/h52jpeg/Makefile.am -./tools/h52jpeg/h52jpeg.sh -./tools/h52jpeg/h52jpeg.c -./tools/h52jpeg/h52jpegtst.c -./tools/h52jpeg/image24pixel.txt -./tools/h52jpeg/image8.txt -./tools/h52jpeg/testfiles/h52jpegtst.h5 - +./hl/tools/h52jpeg/h52jpegtst.h +./hl/tools/h52jpeg/h52jpegtst.c +./hl/tools/h52jpeg/h52jpeg.c +./hl/tools/h52jpeg/image24pixel.txt +./hl/tools/h52jpeg/image8.txt +./hl/tools/h52jpeg/Makefile.am +./hl/tools/h52jpeg/Makefile.in +./hl/tools/h52jpeg/h52jpeg.sh +./hl/tools/h52jpeg/testfiles/h52jpegtst.h5 # high level libraries ./hl/COPYING @@ -1642,6 +1646,8 @@ ./hl/test/test_table_cray.hdf5 ./hl/test/usa.wri ./hl/test/dtype_file.txt + +# tools ./hl/tools/COPYING ./hl/tools/Makefile.am ./hl/tools/Makefile.in @@ -1657,9 +1663,8 @@ ./hl/tools/gif2h5/writehdf.c ./hl/tools/gif2h5/h52gifgentst.c ./hl/tools/gif2h5/h52giftest.sh -# testfiles -./hl/tools/testfiles/image1.gif -./hl/tools/testfiles/h52giftst.h5 +./hl/tools/gif2h5/testfiles/image1.gif +./hl/tools/gif2h5/testfiles/h52giftst.h5 # hl fortran diff --git a/bin/h5vers b/bin/h5vers index e68a4de..1b41d0f 100755 --- a/bin/h5vers +++ b/bin/h5vers @@ -73,6 +73,8 @@ use strict; # something like: This is hdf5-1.2.3-pre1 currently under development. # The AC_INIT macro in configure.in will also change in this case to be # something like: AC_INIT([HDF5], [hdf5-1.2.3-pre1], [help@hdfgroup.org]) +# Version changes are also reflected in the Windows-maintained H5pubconf.h +# file. # # Whenever the version changes, this script will increment the revision # field in HDF5's libtool shared library version in config/lt_vers.am, @@ -157,9 +159,10 @@ while ($_ = shift) { die "mutually exclusive options given\n" if $set && $inc; # Determine file to use as H5public.h, README.txt, -# release_docs/RELEASE.txt, configure.in, and config/lt_vers.am. The -# README.txt, release_docs/RELEASE.txt, configure.in, and -# config/lt_vers.am files are always in the directory above H5public.h +# release_docs/RELEASE.txt, configure.in, windows/src/H5pubconf.h, +# and config/lt_vers.am. The README.txt, release_docs/RELEASE.txt, +# configure.in, windows/src/H5pubconf.h, and config/lt_vers.am +# files are always in the directory above H5public.h unless ($file) { for (@files) { ($file=$_,last) if -f $_; @@ -183,6 +186,10 @@ die "unable to read file: $RELEASE\n" unless -r $file; my $CONFIGURE = $file; $CONFIGURE =~ s/[^\/]*$/..\/configure.in/; die "unable to read file: $CONFIGURE\n" unless -r $file; +# windows/src/H5pubconf.h +my $H5PUBCONF = $file; +$H5PUBCONF =~ s/[^\/]*$/..\/windows\/src\/H5pubconf.h/; +die "unable to read file: $H5PUBCONF\n" unless -r $file; # Get the current version number. open FILE, $file or die "unable to open $file: $!\n"; @@ -230,6 +237,7 @@ if ($set) { $README = ""; $RELEASE = ""; $CONFIGURE = ""; + $H5PUBCONF = ""; $LT_VERS = ""; @newver = @curver; } @@ -341,6 +349,46 @@ sub gen_configure { # Update the configure.in files and regenerate them gen_configure("HDF5", $CONFIGURE) if $CONFIGURE; +sub gen_h5pubconf { + my ($name, $pubconf, @vers) = @_; + + my $namelc = lc($name); + my $nameuc = uc($name); + + open FILE, $pubconf or die "$pubconf: $!\n"; + my @contents = ; + close FILE; + + for (my $i = 0; $i < $#contents; ++$i) { + if ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE\s+/) { + $contents[$i] = "\#define H5_PACKAGE \"$namelc\"\n"; + } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_NAME\s+/) { + $contents[$i] = "\#define H5_PACKAGE_NAME \"$nameuc\"\n"; + } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_STRING\s+/) { + $contents[$i] = sprintf("\#define H5_PACKAGE_STRING \"$nameuc %d.%d.%d%s\"\n", + @vers[0,1,2], + $newver[3] eq "" ? "" : "-".$newver[3]); + } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_TARNAME\s+/) { + $contents[$i] = "\#define H5_PACKAGE_TARNAME \"$namelc\"\n"; + } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_VERSION\s+/) { + $contents[$i] = sprintf("\#define H5_PACKAGE_VERSION \"%d.%d.%d%s\"\n", + @vers[0,1,2], + $newver[3] eq "" ? "" : "-".$newver[3]); + } elsif ($contents[$i] =~ /\#\s*define\s+H5_VERSION\s+/) { + $contents[$i] = sprintf("\#define H5_VERSION \"%d.%d.%d%s\"\n", + @vers[0,1,2], + $newver[3] eq "" ? "" : "-".$newver[3]); + } + } + + open FILE, ">$pubconf" or die "$pubconf: $!\n"; + print FILE @contents; + close FILE; +} + +# Update the Windows-maintained H5pubconf.h file +gen_h5pubconf("HDF5", $H5PUBCONF, @newver) if $H5PUBCONF; + # Print the new version number if ($verbose) { printf("version %d.%d release %d%s\n", @newver[0,1,2], diff --git a/c++/src/H5AbstractDs.cpp b/c++/src/H5AbstractDs.cpp index 7cb170d..a61cc88 100644 --- a/c++/src/H5AbstractDs.cpp +++ b/c++/src/H5AbstractDs.cpp @@ -34,21 +34,21 @@ namespace H5 { ///\brief Default constructor // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -AbstractDs::AbstractDs() : H5Object() {} +AbstractDs::AbstractDs(){} //-------------------------------------------------------------------------- // Function: AbstractDs default constructor ///\brief Creates an AbstractDs instance using an existing id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -AbstractDs::AbstractDs( const hid_t ds_id ) : H5Object( ds_id ) {} +AbstractDs::AbstractDs(const hid_t ds_id){} //-------------------------------------------------------------------------- // Function: AbstractDs copy constructor ///\brief Copy constructor: makes a copy of the original AbstractDs object. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -AbstractDs::AbstractDs( const AbstractDs& original ) : H5Object( original ) {} +AbstractDs::AbstractDs(const AbstractDs& original){} //-------------------------------------------------------------------------- // Function: AbstractDs::getTypeClass @@ -80,8 +80,10 @@ H5T_class_t AbstractDs::getTypeClass() const return( type_class ); else { - throw DataTypeIException(inMemFunc("getTypeClass"), - "H5Tget_class returns H5T_NO_CLASS"); + if (fromClass() == "DataSet") + throw DataTypeIException("DataSet::getTypeClass", "H5Tget_class returns H5T_NO_CLASS"); + else if (fromClass() == "Attribute") + throw DataTypeIException("Attribute::getTypeClass", "H5Tget_class returns H5T_NO_CLASS"); } } diff --git a/c++/src/H5AbstractDs.h b/c++/src/H5AbstractDs.h index 2f4e520..c98e5e1 100644 --- a/c++/src/H5AbstractDs.h +++ b/c++/src/H5AbstractDs.h @@ -33,7 +33,7 @@ class FloatType; class IntType; class StrType; class VarLenType; -class H5_DLLCPP AbstractDs : public H5Object { +class H5_DLLCPP AbstractDs { public: // Gets a copy the datatype of that this abstract dataset uses. // Note that this datatype is a generic one and can only be accessed @@ -62,6 +62,9 @@ class H5_DLLCPP AbstractDs : public H5Object { // dataset - pure virtual. virtual hsize_t getStorageSize() const = 0; + // Returns this class name + virtual H5std_string fromClass() const = 0; + // Copy constructor AbstractDs( const AbstractDs& original ); diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index 043dc4d..64993a2 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -26,12 +26,14 @@ #include "H5PropList.h" #include "H5Object.h" #include "H5AbstractDs.h" -#include "H5Attribute.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" #include "H5DcreatProp.h" #include "H5CommonFG.h" #include "H5DataType.h" #include "H5DataSpace.h" -#include "H5private.h" +#include "H5File.h" +#include "H5Attribute.h" #ifndef H5_NO_NAMESPACE namespace H5 { @@ -46,7 +48,7 @@ namespace H5 { ///\brief Default constructor: Creates a stub attribute // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- -Attribute::Attribute() : AbstractDs() {} +Attribute::Attribute() : AbstractDs(), IdComponent(), id(0) {} //-------------------------------------------------------------------------- // Function: Attribute copy constructor @@ -54,7 +56,11 @@ Attribute::Attribute() : AbstractDs() {} ///\param original - IN: Original Attribute object to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Attribute::Attribute( const Attribute& original ) : AbstractDs( original ) {} +Attribute::Attribute(const Attribute& original) : AbstractDs(), IdComponent() +{ + id = original.getId(); + incRefCount(); // increment number of references to this id +} //-------------------------------------------------------------------------- // Function: Attribute overloaded constructor @@ -64,7 +70,10 @@ Attribute::Attribute( const Attribute& original ) : AbstractDs( original ) {} ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Attribute::Attribute(const hid_t existing_id) : AbstractDs(existing_id) {} +Attribute::Attribute(const hid_t existing_id) : AbstractDs(), IdComponent() +{ + id = existing_id; +} //-------------------------------------------------------------------------- // Function: Attribute::write @@ -208,6 +217,23 @@ hid_t Attribute::p_get_type() const } //-------------------------------------------------------------------------- +// Function: Attribute::getFileName +///\brief Gets the name of the file, in which this attribute belongs. +///\return File name +///\exception H5::IdComponentException +// Programmer Binh-Minh Ribler - Jul, 2004 +//-------------------------------------------------------------------------- +H5std_string Attribute::getFileName() const +{ + try { + return(p_get_file_name()); + } + catch (IdComponentException E) { + throw FileIException("Attribute::getFileName", E.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- // Function: Attribute::getName ///\brief Gets the name of this attribute, returning its length. ///\param buf_size - IN: Desired length of the name @@ -297,6 +323,67 @@ hsize_t Attribute::getStorageSize() const } //-------------------------------------------------------------------------- +// Function: Attribute::dereference +// Purpose Dereference a ref into a DataSet object. +// Parameters +// ref - IN: Reference pointer +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// May 2008 - BMR +// Moved from IdComponent into H5File, H5Object, and Attribute +//-------------------------------------------------------------------------- +Attribute::Attribute(H5Object& obj, void* ref) : AbstractDs(), IdComponent() +{ + id = obj.p_dereference(ref); +} + +Attribute::Attribute(H5File& h5file, void* ref) : AbstractDs(), IdComponent() +{ + id = h5file.p_dereference(ref); +} + +//-------------------------------------------------------------------------- +// Function: Attribute::getId +// Purpose: Get the id of this attribute +// Description: +// Class hierarchy is revised to address bugzilla 1068. Class +// AbstractDS and Attribute are moved out of H5Object. In +// addition, member IdComponent::id is moved into subclasses, and +// IdComponent::getId now becomes pure virtual function. +// Programmer Binh-Minh Ribler - May, 2008 +//-------------------------------------------------------------------------- +hid_t Attribute::getId() const +{ + return(id); +} + +//-------------------------------------------------------------------------- +// Function: Attribute::p_setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +void Attribute::p_setId(const hid_t new_id) +{ + // handling references to this old id + try { + close(); + } + catch (Exception close_error) { + throw AttributeIException("Attribute::p_setId", close_error.getDetailMsg()); + } + // reset object's id to the given id + id = new_id; +} + +//-------------------------------------------------------------------------- // Function: Attribute::close ///\brief Closes this attribute. /// @@ -312,8 +399,10 @@ void Attribute::close() { throw AttributeIException("Attribute::close", "H5Aclose failed"); } - // reset the id because the attribute that it represents is now closed - id = 0; + // reset the id when the attribute that it represents is no longer + // referenced + if (getCounter() == 0) + id = 0; } } diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h index 513b6ab..7d7ca8d 100644 --- a/c++/src/H5Attribute.h +++ b/c++/src/H5Attribute.h @@ -21,11 +21,14 @@ namespace H5 { #endif -class H5_DLLCPP Attribute : public AbstractDs { +class H5_DLLCPP Attribute : public AbstractDs, public IdComponent { public: // Closes this attribute. virtual void close(); + // Gets the name of the file, in which this attribute belongs. + H5std_string getFileName() const; + // Gets the name of this attribute. ssize_t getName( size_t buf_size, H5std_string& attr_name ) const; H5std_string getName( size_t buf_size ) const; // returns name, not its length @@ -45,11 +48,15 @@ class H5_DLLCPP Attribute : public AbstractDs { void write(const DataType& mem_type, const void *buf ) const; void write(const DataType& mem_type, const H5std_string& strg ) const; + // Creates an attribute by way of dereference. + Attribute(H5Object& obj, void* ref); + Attribute(H5File& file, void* ref); + // Returns this class name virtual H5std_string fromClass () const { return("Attribute"); } - // Creates a copy of an existing attribute using the attribute id - Attribute( const hid_t attr_id ); + // Creates a copy of an existing attribute using the attribute id + Attribute( const hid_t attr_id ); // Copy constructor: makes a copy of an existing Attribute object. Attribute( const Attribute& original ); @@ -57,10 +64,19 @@ class H5_DLLCPP Attribute : public AbstractDs { // Default constructor Attribute(); + // Gets the attribute id. + virtual hid_t getId() const; + // Destructor: properly terminates access to this attribute. virtual ~Attribute(); + protected: + // Sets the attribute id. + virtual void p_setId(const hid_t new_id); + private: + hid_t id; // HDF5 attribute id + // This function contains the common code that is used by // getTypeClass and various API functions getXxxType // defined in AbstractDs for generic datatype and specific diff --git a/c++/src/H5Classes.h b/c++/src/H5Classes.h index 03f1257..f691548 100644 --- a/c++/src/H5Classes.h +++ b/c++/src/H5Classes.h @@ -21,7 +21,6 @@ namespace H5 { #endif class Exception; - class ReferenceCounter; class IdComponent; class H5Object; class PropList; diff --git a/c++/src/H5CommonFG.cpp b/c++/src/H5CommonFG.cpp index 8386e03..364f639 100644 --- a/c++/src/H5CommonFG.cpp +++ b/c++/src/H5CommonFG.cpp @@ -15,6 +15,11 @@ #include +// remove when done +#include + using std::cerr; + using std::endl; + #include "H5Include.h" #include "H5Exception.h" #include "H5IdComponent.h" @@ -239,7 +244,13 @@ DataSet CommonFG::openDataSet( const H5std_string& name ) const ///\par Description /// Note that both names are interpreted relative to the /// specified location. +/// For information on creating hard link and soft link, please +/// refer to the C layer Reference Manual at: +/// http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-CreateHard and +/// http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-CreateSoft // Programmer Binh-Minh Ribler - 2000 +// Modification +// 2007: QAK modified to use H5L APIs - BMR //-------------------------------------------------------------------------- void CommonFG::link( H5L_type_t link_type, const char* curr_name, const char* new_name ) const { @@ -283,6 +294,8 @@ void CommonFG::link( H5L_type_t link_type, const H5std_string& curr_name, const ///\param name - IN: Name of the object to be removed ///\exception H5::FileIException or H5::GroupIException // Programmer Binh-Minh Ribler - 2000 +// Modification +// 2007: QAK modified to use H5L APIs - BMR //-------------------------------------------------------------------------- void CommonFG::unlink( const char* name ) const { @@ -317,6 +330,8 @@ void CommonFG::unlink( const H5std_string& name ) const /// to the Group Interface in the HDF5 User's Guide at: /// http://hdf.ncsa.uiuc.edu/HDF5/doc/Groups.html // Programmer Binh-Minh Ribler - 2000 +// Modification +// 2007: QAK modified to use H5L APIs - BMR //-------------------------------------------------------------------------- void CommonFG::move( const char* src, const char* dst ) const { @@ -380,6 +395,7 @@ void CommonFG::getObjinfo( const H5std_string& name, hbool_t follow_link, H5G_st /// It differs from the above functions in that it doesn't have /// the paramemter \a follow_link. // Programmer Binh-Minh Ribler - Nov, 2005 +// Note: need to modify to use H5Oget_info and H5Lget_info - BMR //-------------------------------------------------------------------------- void CommonFG::getObjinfo( const char* name, H5G_stat_t& statbuf ) const { @@ -452,6 +468,11 @@ H5std_string CommonFG::getLinkval( const H5std_string& name, size_t size ) const /// object header, e.g., data sets, groups, named data types, /// and data spaces, but not symbolic links. // Programmer Binh-Minh Ribler - 2000 +// Modification +// 2007: QAK modified to use H5O APIs; however the first parameter is +// no longer just file or group, this function should be moved +// to another class to accommodate attribute, dataset, and named +// datatype. - BMR //-------------------------------------------------------------------------- void CommonFG::setComment( const char* name, const char* comment ) const { @@ -480,6 +501,10 @@ void CommonFG::setComment( const H5std_string& name, const H5std_string& comment ///\param name - IN: Name of the object ///\exception H5::FileIException or H5::GroupIException // Programmer Binh-Minh Ribler - May 2005 +// 2007: QAK modified to use H5O APIs; however the first parameter is +// no longer just file or group, this function should be moved +// to another class to accommodate attribute, dataset, and named +// datatype. - BMR //-------------------------------------------------------------------------- void CommonFG::removeComment(const char* name) const { @@ -509,6 +534,10 @@ void CommonFG::removeComment(const H5std_string& name) const ///\return Comment string ///\exception H5::FileIException or H5::GroupIException // Programmer Binh-Minh Ribler - May 2005 +// 2007: QAK modified to use H5O APIs; however the first parameter is +// no longer just file or group, this function should be moved +// to another class to accommodate attribute, dataset, and named +// datatype. - BMR //-------------------------------------------------------------------------- H5std_string CommonFG::getComment (const H5std_string& name) const { @@ -549,6 +578,10 @@ H5std_string CommonFG::getComment (const H5std_string& name) const ///\return Comment string ///\exception H5::FileIException or H5::GroupIException // Programmer Binh-Minh Ribler - 2000 +// 2007: QAK modified to use H5O APIs; however the first parameter is +// no longer just file or group, this function should be moved +// to another class to accommodate attribute, dataset, and named +// datatype. - BMR //-------------------------------------------------------------------------- H5std_string CommonFG::getComment( const char* name, size_t bufsize ) const { diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 9858e7d..3051e08 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -28,10 +28,13 @@ #include "H5PropList.h" #include "H5DxferProp.h" #include "H5DcreatProp.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" #include "H5CommonFG.h" #include "H5DataType.h" #include "H5DataSpace.h" #include "H5AbstractDs.h" +#include "H5File.h" #include "H5DataSet.h" #ifndef H5_NO_NAMESPACE @@ -47,7 +50,7 @@ namespace H5 { ///\brief Default constructor: creates a stub DataSet. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSet::DataSet() : AbstractDs() {} +DataSet::DataSet() : AbstractDs(), H5Object(), id(0) {} //-------------------------------------------------------------------------- // Function: DataSet overloaded constructor @@ -55,7 +58,10 @@ DataSet::DataSet() : AbstractDs() {} ///\param existing_id - IN: Id of an existing dataset // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSet::DataSet(const hid_t existing_id) : AbstractDs(existing_id) {} +DataSet::DataSet(const hid_t existing_id) : AbstractDs(), H5Object() +{ + id = existing_id; +} //-------------------------------------------------------------------------- // Function: DataSet copy constructor @@ -63,7 +69,11 @@ DataSet::DataSet(const hid_t existing_id) : AbstractDs(existing_id) {} ///\param original - IN: DataSet instance to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSet::DataSet( const DataSet& original ) : AbstractDs( original ) {} +DataSet::DataSet(const DataSet& original) : AbstractDs(original), H5Object(original) +{ + id = original.getId(); + incRefCount(); // increment number of references to this id +} //-------------------------------------------------------------------------- // Function: DataSet overload constructor - dereference @@ -77,9 +87,14 @@ DataSet::DataSet( const DataSet& original ) : AbstractDs( original ) {} /// is a datatype that has been named by DataType::commit. // Programmer Binh-Minh Ribler - Oct, 2006 //-------------------------------------------------------------------------- -DataSet::DataSet(IdComponent& obj, void* ref) : AbstractDs() +DataSet::DataSet(H5Object& obj, void* ref) : AbstractDs(), H5Object() +{ + id = obj.p_dereference(ref); +} + +DataSet::DataSet(H5File& h5file, void* ref) : AbstractDs(), H5Object() { - IdComponent::dereference(obj, ref); + id = h5file.p_dereference(ref); } //-------------------------------------------------------------------------- @@ -455,52 +470,6 @@ void DataSet::fillMemBuf(void *buf, DataType& buf_type, DataSpace& space) } } -//-------------------------------------------------------------------------- -// Function: DataSet::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use -/// DataSet::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* DataSet::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type) const -{ - try { - return(p_reference(name, dataspace.getId(), ref_type)); - } - catch (IdComponentException E) { - throw DataSetIException("DataSet::Reference", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: DataSet::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// DataSet::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* DataSet::Reference(const char* name) const -{ - try { - return(p_reference(name, -1, H5R_OBJECT)); - } - catch (IdComponentException E) { - throw DataSetIException("DataSet::Reference", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: DataSet::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// DataSet::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* DataSet::Reference(const H5std_string& name) const -{ - return(Reference(name.c_str())); -} - #ifndef H5_NO_DEPRECATED_SYMBOLS //-------------------------------------------------------------------------- // Function: DataSet::getObjType @@ -550,6 +519,49 @@ DataSpace DataSet::getRegion(void *ref, H5R_type_t ref_type) const } //-------------------------------------------------------------------------- +// Function: DataSet::getId +// Purpose: Get the id of this attribute +// Description: +// Class hierarchy is revised to address bugzilla 1068. Class +// AbstractDs and Attribute are moved out of H5Object. In +// addition, member IdComponent::id is moved into subclasses, and +// IdComponent::getId now becomes pure virtual function. +// Programmer Binh-Minh Ribler - May, 2008 +//-------------------------------------------------------------------------- +hid_t DataSet::getId() const +{ + return(id); +} + +//-------------------------------------------------------------------------- +// Function: DataSet::p_setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +void DataSet::p_setId(const hid_t new_id) +{ + // handling references to this old id + try { + close(); + } + catch (Exception close_error) { + throw DataSetIException(inMemFunc("p_setId"), close_error.getDetailMsg()); + } + // reset object's id to the given id + id = new_id; + + // increment the reference counter of the new id + //incRefCount(); +} + +//-------------------------------------------------------------------------- // Function: DataSet::close ///\brief Closes this dataset. /// @@ -565,8 +577,10 @@ void DataSet::close() { throw DataSetIException("DataSet::close", "H5Dclose failed"); } - // reset the id because the dataset that it represents is now closed - id = 0; + // reset the id when the dataset that it represents is no longer + // referenced + if (getCounter() == 0) + id = 0; } } diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h index 7323f52..f5d13d0 100644 --- a/c++/src/H5DataSet.h +++ b/c++/src/H5DataSet.h @@ -23,7 +23,7 @@ namespace H5 { #endif -class H5_DLLCPP DataSet : public AbstractDs { +class H5_DLLCPP DataSet : public H5Object, public AbstractDs { public: // Close this dataset. virtual void close(); @@ -81,19 +81,12 @@ class H5_DLLCPP DataSet : public AbstractDs { // Retrieves a dataspace with the region pointed to selected. DataSpace getRegion(void *ref, H5R_type_t ref_type = H5R_DATASET_REGION) const; - // Creates a reference to a named Hdf5 object or to a dataset region - // in this object. - void* Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type = H5R_DATASET_REGION) const; - - // Creates a reference to a named Hdf5 object in this object. - void* Reference(const char* name) const; // will be obsolete - void* Reference(const H5std_string& name) const; // will be obsolete - // Returns this class name virtual H5std_string fromClass () const { return("DataSet"); } // Creates a dataset by way of dereference. - DataSet(IdComponent& obj, void* ref); + DataSet(H5Object& obj, void* ref); + DataSet(H5File& file, void* ref); // Default constructor. DataSet(); @@ -104,15 +97,24 @@ class H5_DLLCPP DataSet : public AbstractDs { // Creates a copy of an existing DataSet using its id. DataSet(const hid_t existing_id); + // Gets the dataset id. + virtual hid_t getId() const; + // Destructor: properly terminates access to this dataset. virtual ~DataSet(); private: + hid_t id; // HDF5 dataset id + // This function contains the common code that is used by // getTypeClass and various API functions getXxxType // defined in AbstractDs for generic datatype and specific // sub-types virtual hid_t p_get_type() const; + + protected: + // Sets the dataset id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp index 245e27d..3d74b51 100644 --- a/c++/src/H5DataSpace.cpp +++ b/c++/src/H5DataSpace.cpp @@ -47,7 +47,7 @@ const DataSpace DataSpace::ALL( H5S_ALL ); ///\exception H5::DataSpaceIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSpace::DataSpace( H5S_class_t type ) : IdComponent(0) +DataSpace::DataSpace(H5S_class_t type) : IdComponent() { id = H5Screate( type ); if( id < 0 ) @@ -65,7 +65,7 @@ DataSpace::DataSpace( H5S_class_t type ) : IdComponent(0) ///\exception H5::DataSpaceIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : IdComponent(0) +DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : IdComponent() { id = H5Screate_simple( rank, dims, maxdims ); if( id < 0 ) @@ -82,7 +82,10 @@ DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : ///\exception H5::DataSpaceIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSpace::DataSpace(const hid_t existing_id) : IdComponent(existing_id) {} +DataSpace::DataSpace(const hid_t existing_id) : IdComponent() +{ + id = existing_id; +} //-------------------------------------------------------------------------- // Function: DataSpace copy constructor @@ -90,7 +93,11 @@ DataSpace::DataSpace(const hid_t existing_id) : IdComponent(existing_id) {} ///\param original - IN: DataSpace object to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSpace::DataSpace( const DataSpace& original ) : IdComponent( original ) {} +DataSpace::DataSpace(const DataSpace& original) : IdComponent(original) +{ + id = original.getId(); + incRefCount(); // increment number of references to this id +} //-------------------------------------------------------------------------- // Function: DataSpace::copy @@ -548,6 +555,47 @@ void DataSpace::selectHyperslab( H5S_seloper_t op, const hsize_t *count, const h } //-------------------------------------------------------------------------- +// Function: DataSpace::getId +// Purpose: Get the id of this attribute +// Modification: +// May 2008 - BMR +// Class hierarchy is revised to address bugzilla 1068. Class +// AbstractDS and Attribute are moved out of H5Object. In +// addition, member IdComponent::id is moved into subclasses, and +// IdComponent::getId now becomes pure virtual function. +// Programmer Binh-Minh Ribler - May, 2008 +//-------------------------------------------------------------------------- +hid_t DataSpace::getId() const +{ + return(id); +} + +//-------------------------------------------------------------------------- +// Function: DataSpace::p_setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +void DataSpace::p_setId(const hid_t new_id) +{ + // handling references to this old id + try { + close(); + } + catch (Exception close_error) { + throw DataSpaceIException(inMemFunc("p_setId"), close_error.getDetailMsg()); + } + // reset object's id to the given id + id = new_id; +} + +//-------------------------------------------------------------------------- // Function: DataSpace::close ///\brief Closes this dataspace. /// @@ -564,8 +612,10 @@ void DataSpace::close() { throw DataSpaceIException("DataSpace::close", "H5Sclose failed"); } - // reset the id because the dataspace that it represents is now closed - id = 0; + // reset the id when the dataspace that it represents is no longer + // referenced + if (getCounter() == 0) + id = 0; } } @@ -583,8 +633,7 @@ DataSpace::~DataSpace() { try { close(); - } - catch (Exception close_error) { + } catch (Exception close_error) { cerr << "DataSpace::~DataSpace - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5DataSpace.h b/c++/src/H5DataSpace.h index e1c5ba4..80842f7 100644 --- a/c++/src/H5DataSpace.h +++ b/c++/src/H5DataSpace.h @@ -112,8 +112,18 @@ class H5_DLLCPP DataSpace : public IdComponent { // Copy constructor: makes a copy of the original DataSpace object. DataSpace(const DataSpace& original); + // Gets the dataspace id. + virtual hid_t getId() const; + // Destructor: properly terminates access to this dataspace. virtual ~DataSpace(); + + private: + hid_t id; // HDF5 dataspace id + + protected: + // Sets the dataspace id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index c31395e..e023bda 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -62,7 +62,10 @@ namespace H5 { // - BMR 5/2004 // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataType::DataType(const hid_t existing_id) : H5Object(existing_id) {} +DataType::DataType(const hid_t existing_id) : H5Object() +{ + id = existing_id; +} //-------------------------------------------------------------------------- // Function: DataType overloaded constructor @@ -92,9 +95,19 @@ DataType::DataType( const H5T_class_t type_class, size_t size ) : H5Object() /// is a datatype that has been named by DataType::commit. // Programmer Binh-Minh Ribler - Oct, 2006 //-------------------------------------------------------------------------- -DataType::DataType(IdComponent& obj, void* ref) : H5Object() + /* DataType::DataType(IdComponent& obj, void* ref) : H5Object() +{ + H5Object::dereference(obj, ref); +} + */ +DataType::DataType(H5Object& obj, void* ref) : H5Object() { - IdComponent::dereference(obj, ref); + id = obj.p_dereference(ref); +} + +DataType::DataType(H5File& file, void* ref) : H5Object() +{ + id = file.p_dereference(ref); } //-------------------------------------------------------------------------- @@ -102,14 +115,18 @@ DataType::DataType(IdComponent& obj, void* ref) : H5Object() ///\brief Default constructor: Creates a stub datatype // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataType::DataType() : H5Object() {} +DataType::DataType() : H5Object(), id(0) {} //-------------------------------------------------------------------------- // Function: DataType copy constructor ///\brief Copy constructor: makes a copy of the original DataType object. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataType::DataType(const DataType& original) : H5Object(original) {} +DataType::DataType(const DataType& original) : H5Object(original) +{ + id = original.getId(); + incRefCount(); // increment number of references to this id +} //-------------------------------------------------------------------------- // Function: DataType::copy @@ -616,52 +633,6 @@ bool DataType::isVariableStr() const } } -//-------------------------------------------------------------------------- -// Function: DataType::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// DataType::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* DataType::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type) const -{ - try { - return(p_reference(name, dataspace.getId(), ref_type)); - } - catch (IdComponentException E) { - throw DataTypeIException(inMemFunc("Reference"), E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: DataType::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// DataType::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* DataType::Reference(const char* name) const -{ - try { - return(p_reference(name, -1, H5R_OBJECT)); - } - catch (IdComponentException E) { - throw DataTypeIException(inMemFunc("Reference"), E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: DataType::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// DataType::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* DataType::Reference(const H5std_string& name) const -{ - return(Reference(name.c_str())); -} - #ifndef H5_NO_DEPRECATED_SYMBOLS //-------------------------------------------------------------------------- // Function: DataType::getObjType @@ -708,6 +679,47 @@ DataSpace DataType::getRegion(void *ref, H5R_type_t ref_type) const } //-------------------------------------------------------------------------- +// Function: DataType::getId +// Purpose: Get the id of this attribute +// Modification: +// May 2008 - BMR +// Class hierarchy is revised to address bugzilla 1068. Class +// AbstractDS and Attribute are moved out of H5Object. In +// addition, member IdComponent::id is moved into subclasses, and +// IdComponent::getId now becomes pure virtual function. +// Programmer Binh-Minh Ribler - May, 2008 +//-------------------------------------------------------------------------- +hid_t DataType::getId() const +{ + return(id); +} + +//-------------------------------------------------------------------------- +// Function: DataType::p_setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +void DataType::p_setId(const hid_t new_id) +{ + // handling references to this old id + try { + close(); + } + catch (Exception close_error) { + throw DataTypeIException(inMemFunc("p_setId"), close_error.getDetailMsg()); + } + // reset object's id to the given id + id = new_id; +} + +//-------------------------------------------------------------------------- // Function: DataType::close ///\brief Closes the datatype if it is not a predefined type. /// @@ -723,8 +735,10 @@ void DataType::close() { throw DataTypeIException(inMemFunc("close"), "H5Tclose failed"); } - // reset the id because the datatype that it represents is now closed - id = 0; + // reset the id when the datatype that it represents is no longer + // referenced + if (getCounter() == 0) + id = 0; } } @@ -740,14 +754,12 @@ void DataType::close() //-------------------------------------------------------------------------- DataType::~DataType() { - try { - close(); - } - catch (Exception close_error) { - cerr << inMemFunc("~DataType - ") << close_error.getDetailMsg() << endl; - } + try { + close(); + } catch (Exception close_error) { + cerr << inMemFunc("~DataType - ") << close_error.getDetailMsg() << endl; + } } - #ifndef H5_NO_NAMESPACE } // end namespace #endif diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h index 588a57a..4e7ca03 100644 --- a/c++/src/H5DataType.h +++ b/c++/src/H5DataType.h @@ -30,7 +30,8 @@ class H5_DLLCPP DataType : public H5Object { DataType( const DataType& original ); // Creates a datatype by way of dereference. - DataType(IdComponent& obj, void* ref); + DataType(H5Object& obj, void* ref); + DataType(H5File& file, void* ref); // Closes this datatype. virtual void close(); @@ -99,14 +100,6 @@ class H5_DLLCPP DataType : public H5Object { // Checks whether this datatype is a variable-length string. bool isVariableStr() const; - // Creates a reference to a named HDF5 object or to a dataset region - // in this object. - void* Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type = H5R_DATASET_REGION) const; // will be obsolete - - // Creates a reference to a named HDF5 object in this object. - void* Reference(const char* name) const; // will be obsolete - void* Reference(const H5std_string& name) const; // will be obsolete - #ifndef H5_NO_DEPRECATED_SYMBOLS // Retrieves the type of object that an object reference points to. H5G_obj_t getObjType(void *ref, H5R_type_t ref_type = H5R_OBJECT) const; @@ -124,8 +117,18 @@ class H5_DLLCPP DataType : public H5Object { // Default constructor DataType(); + // Gets the datatype id. + virtual hid_t getId() const; + // Destructor: properly terminates access to this datatype. virtual ~DataType(); + + protected: + hid_t id; // HDF5 datatype id + + // Sets the datatype id. + virtual void p_setId(const hid_t new_id); + private: void p_commit(hid_t loc_id, const char* name); }; diff --git a/c++/src/H5DcreatProp.cpp b/c++/src/H5DcreatProp.cpp index e524355..19a4e6e 100644 --- a/c++/src/H5DcreatProp.cpp +++ b/c++/src/H5DcreatProp.cpp @@ -54,7 +54,7 @@ DSetCreatPropList::DSetCreatPropList( const DSetCreatPropList& orig ) : PropList /// existing dataset creation property list. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DSetCreatPropList::DSetCreatPropList(const hid_t plist_id) : PropList( plist_id ) {} +DSetCreatPropList::DSetCreatPropList(const hid_t plist_id) : PropList(plist_id) {} //-------------------------------------------------------------------------- // Function: DSetCreatPropList::setChunk diff --git a/c++/src/H5DxferProp.h b/c++/src/H5DxferProp.h index 8da29c4..11e15fc 100644 --- a/c++/src/H5DxferProp.h +++ b/c++/src/H5DxferProp.h @@ -104,7 +104,6 @@ class H5_DLLCPP DSetMemXferPropList : public PropList { // Noop destructor virtual ~DSetMemXferPropList(); - }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5FaccProp.cpp b/c++/src/H5FaccProp.cpp index 6a70b3b..f2ab0f3 100644 --- a/c++/src/H5FaccProp.cpp +++ b/c++/src/H5FaccProp.cpp @@ -225,7 +225,7 @@ void FileAccPropList::getFamily(hsize_t& memb_size, FileAccPropList& memb_plist) { throw PropListIException("FileAccPropList::getFamily", "H5Pget_fapl_family failed"); } - memb_plist.setId(memb_plist_id); + memb_plist.p_setId(memb_plist_id); } //-------------------------------------------------------------------------- diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp index aa11e31..0e71543 100644 --- a/c++/src/H5File.cpp +++ b/c++/src/H5File.cpp @@ -50,7 +50,7 @@ namespace H5 { ///\brief Default constructor: creates a stub H5File object. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -H5File::H5File() : IdComponent(0) {} +H5File::H5File() : IdComponent(), id(0) {} //-------------------------------------------------------------------------- // Function: H5File overloaded constructor @@ -140,7 +140,11 @@ void H5File::p_get_file(const char* name, unsigned int flags, const FileCreatPro ///\param original - IN: H5File instance to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -H5File::H5File( const H5File& original ) : IdComponent( original ) {} +H5File::H5File(const H5File& original) : IdComponent(original) +{ + id = original.getId(); + incRefCount(); // increment number of references to this id +} //-------------------------------------------------------------------------- // Function: H5File::flush @@ -502,52 +506,6 @@ H5std_string H5File::getFileName() const } } -//-------------------------------------------------------------------------- -// Function: H5File::Reference -///\brief Important!!! - This functions does not work correctly, it -/// will be removed in the near future. Please use -/// H5File::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* H5File::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type) const -{ - try { - return(p_reference(name, dataspace.getId(), ref_type)); - } - catch (IdComponentException E) { - throw FileIException("H5File::Reference", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: H5File::Reference -///\brief Important!!! - This functions does not work correctly, it -/// will be removed in the near future. Please use similar -/// H5File::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* H5File::Reference(const char* name) const -{ - try { - return(p_reference(name, -1, H5R_OBJECT)); - } - catch (IdComponentException E) { - throw FileIException("H5File::Reference", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: H5File::Reference -///\brief Important!!! - This functions does not work correctly, it -/// will be removed in the near future. Please use similar -/// H5File::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* H5File::Reference(const H5std_string& name) const -{ - return(Reference(name.c_str())); -} - #ifndef H5_NO_DEPRECATED_SYMBOLS //-------------------------------------------------------------------------- // Function: H5File::getObjType @@ -617,6 +575,134 @@ hsize_t H5File::getFileSize() const } //-------------------------------------------------------------------------- +// Function: H5File::p_reference (protected) +// Purpose Creates a reference to an HDF5 object or a dataset region. +// Parameters +// name - IN: Name of the object to be referenced +// dataspace - IN: Dataspace with selection +// ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5File::p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const +{ + herr_t ret_value = H5Rcreate(ref, getId(), name, ref_type, space_id); + if (ret_value < 0) + { + throw IdComponentException("", "H5Rcreate failed"); + } +} + +//-------------------------------------------------------------------------- +// Function: H5File::reference +///\brief Creates a reference to an HDF5 object or a dataset region. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced +///\param dataspace - IN: Dataspace with selection +///\param ref_type - IN: Type of reference to query, valid values are: +/// \li \c H5R_OBJECT \tReference is an object reference. +/// \li \c H5R_DATASET_REGION \tReference is a dataset region +/// reference. - this is the default +///\exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5File::reference(void* ref, const char* name, const DataSpace& dataspace, H5R_type_t ref_type) const +{ + try { + p_reference(ref, name, dataspace.getId(), ref_type); + } + catch (IdComponentException E) { + throw IdComponentException("H5File::reference", E.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- +// Function: H5File::reference +///\brief This is an overloaded function, provided for your convenience. +/// It differs from the above function in that it only creates +/// a reference to an HDF5 object, not to a dataset region. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced - \c char pointer +///\exception H5::IdComponentException +///\par Description +// This function passes H5R_OBJECT and -1 to the protected +// function for it to pass to the C API H5Rcreate +// to create a reference to the named object. +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5File::reference(void* ref, const char* name) const +{ + try { + p_reference(ref, name, -1, H5R_OBJECT); + } + catch (IdComponentException E) { + throw IdComponentException("H5File::reference", E.getDetailMsg()); + } +} +//-------------------------------------------------------------------------- +// Function: H5File::reference +///\brief This is an overloaded function, provided for your convenience. +/// It differs from the above function in that it takes an +/// \c std::string for the object's name. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced - \c std::string +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5File::reference(void* ref, const H5std_string& name) const +{ + reference(ref, name.c_str()); +} + +#ifndef H5_NO_DEPRECATED_SYMBOLS +//-------------------------------------------------------------------------- +// Function: H5File::p_get_obj_type (protected) +// Purpose Retrieves the type of object that an object reference points to. +// Parameters +// ref - IN: Reference to query +// ref_type - IN: Type of reference to query +// Return An object type, which can be one of the following: +// H5G_LINK Object is a symbolic link. +// H5G_GROUP Object is a group. +// H5G_DATASET Object is a dataset. +// H5G_TYPE Object is a named datatype +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +H5G_obj_t H5File::p_get_obj_type(void *ref, H5R_type_t ref_type) const +{ + H5G_obj_t obj_type = H5Rget_obj_type1(getId(), ref_type, ref); + + if (obj_type == H5G_UNKNOWN) + { + throw IdComponentException("", "H5Rget_obj_type failed"); + } + return(obj_type); +} +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + + +//-------------------------------------------------------------------------- +// Function: H5File::p_get_region (protected) +// Purpose Retrieves a dataspace with the region pointed to selected. +// Parameters +// ref_type - IN: Type of reference to get region of - default +// to H5R_DATASET_REGION +// ref - IN: Reference to get region of +// Return Dataspace id +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +hid_t H5File::p_get_region(void *ref, H5R_type_t ref_type) const +{ + hid_t space_id = H5Rget_region(getId(), ref_type, ref); + if (space_id < 0) + { + throw IdComponentException("", "H5Rget_region failed"); + } + return(space_id); +} + +//-------------------------------------------------------------------------- // Function: H5File::getLocId // Purpose: Get the id of this file // Description @@ -630,6 +716,47 @@ hid_t H5File::getLocId() const } //-------------------------------------------------------------------------- +// Function: H5File::getId +// Purpose: Get the id of this attribute +// Modification: +// May 2008 - BMR +// Class hierarchy is revised to address bugzilla 1068. Class +// AbstractDS and Attribute are moved out of H5Object. In +// addition, member IdComponent::id is moved into subclasses, and +// IdComponent::getId now becomes pure virtual function. +// Programmer Binh-Minh Ribler - May, 2008 +//-------------------------------------------------------------------------- +hid_t H5File::getId() const +{ + return(id); +} + +//-------------------------------------------------------------------------- +// Function: H5File::p_setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +void H5File::p_setId(const hid_t new_id) +{ + // handling references to this old id + try { + close(); + } + catch (Exception E) { + throw FileIException("H5File::p_setId", E.getDetailMsg()); + } + // reset object's id to the given id + id = new_id; +} + +//-------------------------------------------------------------------------- // Function: H5File::close ///\brief Closes this HDF5 file. /// @@ -645,8 +772,10 @@ void H5File::close() { throw FileIException("H5File::close", "H5Fclose failed"); } - // reset the id because the file that it represents is now closed - id = 0; + // reset the id when the file that it represents is no longer + // referenced + if (getCounter() == 0) + id = 0; } } @@ -685,8 +814,7 @@ H5File::~H5File() { try { close(); - } - catch (Exception close_error) { + } catch (Exception close_error) { cerr << "H5File::~H5File - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5File.h b/c++/src/H5File.h index b239efe..b49118e 100644 --- a/c++/src/H5File.h +++ b/c++/src/H5File.h @@ -89,11 +89,10 @@ class H5_DLLCPP H5File : public IdComponent, public CommonFG { // Creates a reference to a named HDF5 object or to a dataset region // in this object. - void* Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type = H5R_DATASET_REGION) const; // will be obsolete - - // Creates a reference to a named Hdf5 object in this object. - void* Reference(const char* name) const; // will be obsolete - void* Reference(const H5std_string& name) const; // will be obsolete + void reference(void* ref, const char* name, const DataSpace& dataspace, + H5R_type_t ref_type = H5R_DATASET_REGION) const; + void reference(void* ref, const char* name) const; + void reference(void* ref, const H5std_string& name) const; // Returns this class name virtual H5std_string fromClass () const { return("H5File"); } @@ -110,14 +109,38 @@ class H5_DLLCPP H5File : public IdComponent, public CommonFG { // Copy constructor: makes a copy of the original H5File object. H5File(const H5File& original); + // Gets the HDF5 file id. + virtual hid_t getId() const; + // H5File destructor. virtual ~H5File(); private: + hid_t id; // HDF5 file id + +#ifndef DOXYGEN_SHOULD_SKIP_THIS + // This function is private and contains common code between the // constructors taking a string or a char* void p_get_file( const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ); + // Creates a reference to an HDF5 object or a dataset region. + void p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const; + +#ifndef H5_NO_DEPRECATED_SYMBOLS + // Retrieves the type of object that an object reference points to. + H5G_obj_t p_get_obj_type(void *ref, H5R_type_t ref_type) const; +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + + // Retrieves a dataspace with the region pointed to selected. + hid_t p_get_region(void *ref, H5R_type_t ref_type) const; + + protected: + // Sets the HDF5 file id. + virtual void p_setId(const hid_t new_id); + +#endif // DOXYGEN_SHOULD_SKIP_THIS + }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index f3c058a..f50691e 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -50,7 +50,7 @@ namespace H5 { ///\brief Default constructor: creates a stub Group. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Group::Group() : H5Object() {} +Group::Group() : H5Object(), id(0) {} //-------------------------------------------------------------------------- // Function: Group copy constructor @@ -58,7 +58,11 @@ Group::Group() : H5Object() {} ///\param original - IN: Original group to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Group::Group( const Group& original ) : H5Object( original ) {} +Group::Group(const Group& original) : H5Object(original) +{ + id = original.getId(); + incRefCount(); // increment number of references to this id +} //-------------------------------------------------------------------------- // Function: Group::getLocId @@ -77,7 +81,10 @@ hid_t Group::getLocId() const ///\param group_id - IN: Id of an existing group // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Group::Group( const hid_t group_id ) : H5Object( group_id ) {} +Group::Group(const hid_t existing_id) : H5Object() +{ + id = existing_id; +} //-------------------------------------------------------------------------- // Function: Group overload constructor - dereference @@ -89,55 +96,14 @@ Group::Group( const hid_t group_id ) : H5Object( group_id ) {} /// is a datatype that has been named by DataType::commit. // Programmer Binh-Minh Ribler - Oct, 2006 //-------------------------------------------------------------------------- -Group::Group(IdComponent& obj, void* ref) : H5Object() +Group::Group(H5Object& obj, void* ref) : H5Object() { - IdComponent::dereference(obj, ref); -} - -//-------------------------------------------------------------------------- -// Function: Group::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// Group::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* Group::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type) const -{ - try { - return(p_reference(name, dataspace.getId(), ref_type)); - } - catch (IdComponentException E) { - throw GroupIException("Group::Reference", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: Group::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// Group::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* Group::Reference(const char* name) const -{ - try { - return(p_reference(name, -1, H5R_OBJECT)); - } - catch (IdComponentException E) { - throw GroupIException("Group::Reference", E.getDetailMsg()); - } + id = obj.p_dereference(ref); } -//-------------------------------------------------------------------------- -// Function: Group::Reference -///\brief Important!!! - This functions may not work correctly, it -/// will be removed in the near future. Please use similar -/// Group::reference instead! -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* Group::Reference(const H5std_string& name) const +Group::Group(H5File& h5file, void* ref) : H5Object() { - return(Reference(name.c_str())); + id = h5file.p_dereference(ref); } #ifndef H5_NO_DEPRECATED_SYMBOLS @@ -188,6 +154,47 @@ DataSpace Group::getRegion(void *ref, H5R_type_t ref_type) const } //-------------------------------------------------------------------------- +// Function: Group::getId +// Purpose: Get the id of this attribute +// Modification: +// May 2008 - BMR +// Class hierarchy is revised to address bugzilla 1068. Class +// AbstractDS and Attribute are moved out of H5Object. In +// addition, member IdComponent::id is moved into subclasses, and +// IdComponent::getId now becomes pure virtual function. +// Programmer Binh-Minh Ribler - May, 2008 +//-------------------------------------------------------------------------- +hid_t Group::getId() const +{ + return(id); +} + +//-------------------------------------------------------------------------- +// Function: Group::p_setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +void Group::p_setId(const hid_t new_id) +{ + // handling references to this old id + try { + close(); + } + catch (Exception close_error) { + throw GroupIException("Group::p_setId", close_error.getDetailMsg()); + } + // reset object's id to the given id + id = new_id; +} + +//-------------------------------------------------------------------------- // Function: Group::close ///\brief Closes this group. /// @@ -203,8 +210,10 @@ void Group::close() { throw GroupIException("Group::close", "H5Gclose failed"); } - // reset the id because the group that it represents is now closed - id = 0; + // reset the id when the group that it represents is no longer + // referenced + if (getCounter() == 0) + id = 0; } } diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h index 5df85bb..d296b84 100644 --- a/c++/src/H5Group.h +++ b/c++/src/H5Group.h @@ -34,14 +34,6 @@ class H5_DLLCPP Group : public H5Object, public CommonFG { // Retrieves a dataspace with the region pointed to selected. DataSpace getRegion(void *ref, H5R_type_t ref_type = H5R_DATASET_REGION) const; - // Creates a reference to a named Hdf5 object or to a dataset region - // in this object. - void* Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type = H5R_DATASET_REGION) const; // will be obsolete - - // Creates a reference to a named Hdf5 object in this object. - void* Reference(const char* name) const; // will be obsolete - void* Reference(const H5std_string& name) const; // will be obsolete - // Returns this class name virtual H5std_string fromClass () const { return("Group"); } @@ -52,7 +44,8 @@ class H5_DLLCPP Group : public H5Object, public CommonFG { virtual hid_t getLocId() const; // Creates a group by way of dereference. - Group(IdComponent& obj, void* ref); + Group(H5Object& obj, void* ref); + Group(H5File& obj, void* ref); // default constructor Group(); @@ -60,12 +53,21 @@ class H5_DLLCPP Group : public H5Object, public CommonFG { // Copy constructor: makes a copy of the original object Group(const Group& original); + // Gets the group id. + virtual hid_t getId() const; + // Destructor virtual ~Group(); // Creates a copy of an existing group using its id. Group( const hid_t group_id ); + private: + hid_t id; // HDF5 group id + + protected: + // Sets the group id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp index bb015fb..a068b20 100644 --- a/c++/src/H5IdComponent.cpp +++ b/c++/src/H5IdComponent.cpp @@ -18,7 +18,6 @@ #endif /*H5_VMS*/ #include - #include "H5Include.h" #include "H5Exception.h" #include "H5Library.h" @@ -36,7 +35,7 @@ namespace H5 { ///\exception H5::DataTypeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -IdComponent::IdComponent(const hid_t h5_id) : id(h5_id) {} +IdComponent::IdComponent(const hid_t h5_id) {} //-------------------------------------------------------------------------- // Function: IdComponent copy constructor @@ -44,11 +43,7 @@ IdComponent::IdComponent(const hid_t h5_id) : id(h5_id) {} ///\param original - IN: IdComponent instance to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -IdComponent::IdComponent( const IdComponent& original ) -{ - id = original.id; - incRefCount(); // increment number of references to this id -} +IdComponent::IdComponent( const IdComponent& original ) {} //-------------------------------------------------------------------------- // Function: IdComponent::incRefCount @@ -69,7 +64,7 @@ void IdComponent::incRefCount(const hid_t obj_id) const //-------------------------------------------------------------------------- void IdComponent::incRefCount() const { - incRefCount(id); + incRefCount(getId()); } //-------------------------------------------------------------------------- @@ -99,7 +94,7 @@ void IdComponent::decRefCount(const hid_t obj_id) const //-------------------------------------------------------------------------- void IdComponent::decRefCount() const { - decRefCount(id); + decRefCount(getId()); } //-------------------------------------------------------------------------- @@ -128,7 +123,7 @@ int IdComponent::getCounter(const hid_t obj_id) const //-------------------------------------------------------------------------- int IdComponent::getCounter() const { - return (getCounter(id)); + return (getCounter(getId())); } //-------------------------------------------------------------------------- @@ -173,7 +168,7 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) if (this != &rhs) { // handling references to this id - try { + try { close(); } catch (Exception close_error) { @@ -181,10 +176,9 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) } // copy the data members from the rhs object - id = rhs.id; - - // increment the reference counter - incRefCount(); + p_setId(rhs.getId()); + incRefCount(getId()); // a = b, so there are two objects with the same + // hdf5 id } return *this; } @@ -196,40 +190,31 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) ///\exception H5::IdComponentException when the attempt to close the HDF5 /// object fails // Description: -// The underlaying reference counting in the C library ensures -// that the current valid id of this object is properly closed. -// Then the object's id is reset to the new id. +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 +// Modification +// 2008/7/23 - BMR +// Changed all subclasses' setId to p_setId and put back setId +// here. p_setId is used in the library where the id provided +// by a C API passed on to user's application in the form of a +// C++ API object, which will be destroyed properly, and so +// p_setId does not call incRefCount. On the other hand, the +// public version setId is used by other applications, in which +// the id passed to setId already has a reference count, so setId +// must call incRefCount. //-------------------------------------------------------------------------- void IdComponent::setId(const hid_t new_id) { - // handling references to this old id - try { - close(); - } - catch (Exception close_error) { - throw IdComponentException(inMemFunc("copy"), close_error.getDetailMsg()); - } - - // reset object's id to the given id - id = new_id; + // set to new_id + p_setId(new_id); // increment the reference counter of the new id incRefCount(); } //-------------------------------------------------------------------------- -// Function: IdComponent::getId -///\brief Returns the id of this object -///\return HDF5 id -// Programmer Binh-Minh Ribler - 2000 -//-------------------------------------------------------------------------- -hid_t IdComponent::getId () const -{ - return(id); -} - -//-------------------------------------------------------------------------- // Function: IdComponent destructor ///\brief Noop destructor. // Programmer Binh-Minh Ribler - 2000 @@ -273,7 +258,7 @@ H5std_string IdComponent::inMemFunc(const char* func_name) const ///\brief Default constructor. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -IdComponent::IdComponent() : id(-1) {} +IdComponent::IdComponent() {} //-------------------------------------------------------------------------- // Function: IdComponent::p_get_file_name (protected) @@ -287,8 +272,10 @@ IdComponent::IdComponent() : id(-1) {} //-------------------------------------------------------------------------- H5std_string IdComponent::p_get_file_name() const { + hid_t temp_id = getId(); + // Preliminary call to H5Fget_name to get the length of the file name - ssize_t name_size = H5Fget_name(id, NULL, 0); + ssize_t name_size = H5Fget_name(temp_id, NULL, 0); // If H5Aget_name returns a negative value, raise an exception, if( name_size < 0 ) @@ -298,7 +285,7 @@ H5std_string IdComponent::p_get_file_name() const // Call H5Fget_name again to get the actual file name char* name_C = new char[name_size+1]; // temporary C-string for C API - name_size = H5Fget_name(id, name_C, name_size+1); + name_size = H5Fget_name(temp_id, name_C, name_size+1); // Check for failure again if( name_size < 0 ) @@ -313,175 +300,21 @@ H5std_string IdComponent::p_get_file_name() const } //-------------------------------------------------------------------------- -// Function: IdComponent::p_reference (protected) -// Purpose Creates a reference to an HDF5 object or a dataset region. +// Function: H5Object::p_dereference (protected) +// Purpose Opens the HDF5 object referenced. // Parameters -// name - IN: Name of the object to be referenced -// dataspace - IN: Dataspace with selection -// ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION -// Exception H5::IdComponentException -// Programmer Binh-Minh Ribler - May, 2004 +// ref - IN: Reference pointer +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - Oct, 2006 //-------------------------------------------------------------------------- -void IdComponent::p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const -{ - herr_t ret_value = H5Rcreate(ref, id, name, ref_type, space_id); - if (ret_value < 0) - { - throw IdComponentException("", "H5Rcreate failed"); - } -} - -//-------------------------------------------------------------------------- -// Function: IdComponent::reference -///\brief Creates a reference to an HDF5 object or a dataset region. -///\param ref - IN: Reference pointer -///\param name - IN: Name of the object to be referenced -///\param dataspace - IN: Dataspace with selection -///\param ref_type - IN: Type of reference to query, valid values are: -/// \li \c H5R_OBJECT \tReference is an object reference. -/// \li \c H5R_DATASET_REGION \tReference is a dataset region -/// reference. - this is the default -///\exception H5::IdComponentException -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void IdComponent::reference(void* ref, const char* name, const DataSpace& dataspace, H5R_type_t ref_type) const -{ - try { - p_reference(ref, name, dataspace.getId(), ref_type); - } - catch (IdComponentException E) { - throw IdComponentException("IdComponent::reference", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: IdComponent::reference -///\brief This is an overloaded function, provided for your convenience. -/// It differs from the above function in that it only creates -/// a reference to an HDF5 object, not to a dataset region. -///\param ref - IN: Reference pointer -///\param name - IN: Name of the object to be referenced - \c char pointer -///\exception H5::IdComponentException -///\par Description -// This function passes H5R_OBJECT and -1 to the protected -// function for it to pass to the C API H5Rcreate -// to create a reference to the named object. -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void IdComponent::reference(void* ref, const char* name) const -{ - try { - p_reference(ref, name, -1, H5R_OBJECT); - } - catch (IdComponentException E) { - throw IdComponentException("IdComponent::reference", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- -// Function: IdComponent::reference -///\brief This is an overloaded function, provided for your convenience. -/// It differs from the above function in that it takes an -/// \c std::string for the object's name. -///\param ref - IN: Reference pointer -///\param name - IN: Name of the object to be referenced - \c std::string -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void IdComponent::reference(void* ref, const H5std_string& name) const -{ - reference(ref, name.c_str()); -} - -//-------------------------------------------------------------------------- -// Function: IdComponent::p_reference (protected) -// Purpose Creates a reference to an HDF5 object or a dataset region. -// Parameters -// name - IN: Name of the object to be referenced -// dataspace - IN: Dataspace with selection -// ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION -// Return A reference -// Exception H5::IdComponentException -// Notes This function is incorrect, and will be removed in the near -// future after notifying users of the new APIs ::reference's. -// BMR - Oct 8, 2006 -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -void* IdComponent::p_reference(const char* name, hid_t space_id, H5R_type_t ref_type) const -{ - hobj_ref_t ref; - herr_t ret_value = H5Rcreate(&ref, id, name, ref_type, space_id); - if (ret_value < 0) - { - throw IdComponentException("", "H5Rcreate failed"); - } - return (reinterpret_cast(ref)); -} - -//-------------------------------------------------------------------------- -// Function: IdComponent::dereference -// Purpose Opens the HDF5 object referenced. -// Parameters -// obj - IN: Dataset reference object is in or location of -// object that the dataset is located within. -// ref - IN: Reference pointer -// Exception H5::IdComponentException -// Programmer Binh-Minh Ribler - Oct, 2006 -//-------------------------------------------------------------------------- -void IdComponent::dereference(IdComponent& obj, void* ref) -{ - id = H5Rdereference(obj.getId(), H5R_OBJECT, ref); - if (id < 0) - { - throw IdComponentException("", "H5Rdereference failed"); - } -} - -#ifndef H5_NO_DEPRECATED_SYMBOLS -//-------------------------------------------------------------------------- -// Function: IdComponent::p_get_obj_type (protected) -// Purpose Retrieves the type of object that an object reference points to. -// Parameters -// ref - IN: Reference to query -// ref_type - IN: Type of reference to query -// Return An object type, which can be one of the following: -// H5G_LINK Object is a symbolic link. -// H5G_GROUP Object is a group. -// H5G_DATASET Object is a dataset. -// H5G_TYPE Object is a named datatype -// Exception H5::IdComponentException -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -H5G_obj_t IdComponent::p_get_obj_type(void *ref, H5R_type_t ref_type) const -{ - H5G_obj_t obj_type = H5Rget_obj_type1(id, ref_type, ref); - - if (obj_type == H5G_UNKNOWN) - { - throw IdComponentException("", "H5Rget_obj_type failed"); - } - return(obj_type); -} -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - -//-------------------------------------------------------------------------- -// Function: IdComponent::p_get_region (protected) -// Purpose Retrieves a dataspace with the region pointed to selected. -// Parameters -// ref_type - IN: Type of reference to get region of - default -// to H5R_DATASET_REGION -// ref - IN: Reference to get region of -// Return Dataspace id -// Exception H5::IdComponentException -// Programmer Binh-Minh Ribler - May, 2004 -//-------------------------------------------------------------------------- -hid_t IdComponent::p_get_region(void *ref, H5R_type_t ref_type) const +hid_t IdComponent::p_dereference(void* ref) { - hid_t space_id = H5Rget_region(id, ref_type, ref); - if (space_id < 0) + hid_t temp_id = H5Rdereference(getId(), H5R_OBJECT, ref); + if (temp_id < 0) { - throw IdComponentException("", "H5Rget_region failed"); + throw ReferenceException("", "H5Rdereference failed"); } - return(space_id); + return(temp_id); } // @@ -495,7 +328,7 @@ hid_t IdComponent::p_get_region(void *ref, H5R_type_t ref_type) const // Return true if id is valid, false, otherwise // Programmer Binh-Minh Ribler - May, 2005 //-------------------------------------------------------------------------- -bool IdComponent::p_valid_id(const hid_t obj_id) const +bool IdComponent::p_valid_id(const hid_t obj_id) { H5I_type_t id_type = H5Iget_type(obj_id); if (id_type <= H5I_BADID || id_type >= H5I_NTYPES) diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h index facdefd..7f573a1 100644 --- a/c++/src/H5IdComponent.h +++ b/c++/src/H5IdComponent.h @@ -44,13 +44,11 @@ class H5_DLLCPP IdComponent { // Assignment operator. IdComponent& operator=( const IdComponent& rhs ); - void reference(void* ref, const char* name, const DataSpace& dataspace, - H5R_type_t ref_type = H5R_DATASET_REGION) const; - void reference(void* ref, const char* name) const; - void reference(void* ref, const H5std_string& name) const; + // Opens the HDF5 object referenced. + hid_t p_dereference(void* ref); - // Open a referenced HDF5 object. - void dereference(IdComponent& obj, void* ref); + // Gets the identifier of this object. + virtual hid_t getId () const = 0; // Sets the identifier of this object to a new value. void setId(const hid_t new_id); @@ -61,9 +59,6 @@ class H5_DLLCPP IdComponent { // Copy constructor: makes copy of the original IdComponent object. IdComponent( const IdComponent& original ); - // Gets the value of IdComponent's data member. - virtual hid_t getId () const; - #ifndef DOXYGEN_SHOULD_SKIP_THIS // Pure virtual function for there are various H5*close for the // subclasses. @@ -83,7 +78,6 @@ class H5_DLLCPP IdComponent { protected: #ifndef DOXYGEN_SHOULD_SKIP_THIS - hid_t id; // HDF5 object id // Default constructor. IdComponent(); @@ -91,23 +85,12 @@ class H5_DLLCPP IdComponent { // Gets the name of the file, in which an HDF5 object belongs. H5std_string p_get_file_name() const; - // Gets the id of the H5 file in which the given object is located. - hid_t p_get_file_id(); - - // Creates a reference to an HDF5 object or a dataset region. - void p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const; - void* p_reference(const char* name, hid_t space_id, H5R_type_t ref_type) const; // will be removed - -#ifndef H5_NO_DEPRECATED_SYMBOLS - // Retrieves the type of object that an object reference points to. - H5G_obj_t p_get_obj_type(void *ref, H5R_type_t ref_type) const; -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - - // Retrieves a dataspace with the region pointed to selected. - hid_t p_get_region(void *ref, H5R_type_t ref_type) const; - // Verifies that the given id is valid. - bool p_valid_id(const hid_t obj_id) const; + static bool p_valid_id(const hid_t obj_id); + + // Sets the identifier of this object to a new value. - this one + // doesn't increment reference count + virtual void p_setId(const hid_t new_id) = 0; #endif // DOXYGEN_SHOULD_SKIP_THIS diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp index c027f51..9dafea8 100644 --- a/c++/src/H5Object.cpp +++ b/c++/src/H5Object.cpp @@ -21,10 +21,15 @@ #include "H5PropList.h" #include "H5Object.h" #include "H5DcreatProp.h" +#include "H5DxferProp.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" #include "H5CommonFG.h" #include "H5DataType.h" #include "H5DataSpace.h" #include "H5AbstractDs.h" +#include "H5File.h" +#include "H5DataSet.h" #include "H5Attribute.h" #ifndef H5_NO_NAMESPACE @@ -103,7 +108,7 @@ Attribute H5Object::createAttribute( const char* name, const DataType& data_type hid_t type_id = data_type.getId(); hid_t space_id = data_space.getId(); hid_t plist_id = create_plist.getId(); - hid_t attr_id = H5Acreate2(id, name, type_id, space_id, plist_id, H5P_DEFAULT ); + hid_t attr_id = H5Acreate2(getId(), name, type_id, space_id, plist_id, H5P_DEFAULT ); // If the attribute id is valid, create and return the Attribute object if( attr_id > 0 ) @@ -137,7 +142,7 @@ Attribute H5Object::createAttribute( const H5std_string& name, const DataType& d //-------------------------------------------------------------------------- Attribute H5Object::openAttribute( const char* name ) const { - hid_t attr_id = H5Aopen( id, name, H5P_DEFAULT ); + hid_t attr_id = H5Aopen(getId(), name, H5P_DEFAULT); if( attr_id > 0 ) { Attribute attr( attr_id ); @@ -171,7 +176,8 @@ Attribute H5Object::openAttribute( const H5std_string& name ) const //-------------------------------------------------------------------------- Attribute H5Object::openAttribute( const unsigned int idx ) const { - hid_t attr_id = H5Aopen_by_idx(id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx, H5P_DEFAULT, H5P_DEFAULT); + hid_t attr_id = H5Aopen_by_idx(getId(), ".", H5_INDEX_CRT_ORDER, + H5_ITER_INC, (hsize_t)idx, H5P_DEFAULT, H5P_DEFAULT); if( attr_id > 0 ) { Attribute attr( attr_id ); @@ -209,7 +215,8 @@ int H5Object::iterateAttrs( attr_operator_t user_op, unsigned *_idx, void *op_da // call the C library routine H5Aiterate2 to iterate the attributes hsize_t idx = (hsize_t)*_idx; - int ret_value = H5Aiterate2(id, H5_INDEX_NAME, H5_ITER_INC, &idx, userAttrOpWrpr, (void *) userData); + int ret_value = H5Aiterate2(getId(), H5_INDEX_NAME, H5_ITER_INC, &idx, + userAttrOpWrpr, (void *) userData); // release memory delete userData; @@ -235,7 +242,7 @@ int H5Object::getNumAttrs() const { H5O_info_t oinfo; /* Object info */ - if(H5Oget_info(id, &oinfo) < 0) + if(H5Oget_info(getId(), &oinfo) < 0) throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed"); else return( (int)oinfo.num_attrs ); @@ -250,7 +257,7 @@ int H5Object::getNumAttrs() const //-------------------------------------------------------------------------- void H5Object::removeAttr( const char* name ) const { - herr_t ret_value = H5Adelete(id, name); + herr_t ret_value = H5Adelete(getId(), name); if( ret_value < 0 ) throw AttributeIException(inMemFunc("removeAttr"), "H5Adelete failed"); } @@ -277,7 +284,7 @@ void H5Object::removeAttr( const H5std_string& name ) const //-------------------------------------------------------------------------- void H5Object::renameAttr(const char* oldname, const char* newname) const { - herr_t ret_value = H5Arename(id, oldname, newname); + herr_t ret_value = H5Arename(getId(), oldname, newname); if (ret_value < 0) throw AttributeIException(inMemFunc("renameAttr"), "H5Arename failed"); } @@ -306,9 +313,9 @@ void H5Object::renameAttr(const H5std_string& oldname, const H5std_string& newna /// This object is used to identify the file to be flushed. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void H5Object::flush(H5F_scope_t scope ) const +void H5Object::flush(H5F_scope_t scope) const { - herr_t ret_value = H5Fflush( id, scope ); + herr_t ret_value = H5Fflush(getId(), scope); if( ret_value < 0 ) { throw FileIException(inMemFunc("flush"), "H5Fflush failed"); @@ -333,6 +340,175 @@ H5std_string H5Object::getFileName() const } //-------------------------------------------------------------------------- +// Function: H5Object::p_reference (protected) +// Purpose Creates a reference to an HDF5 object or a dataset region. +// Parameters +// name - IN: Name of the object to be referenced +// dataspace - IN: Dataspace with selection +// ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const +{ + herr_t ret_value = H5Rcreate(ref, getId(), name, ref_type, space_id); + if (ret_value < 0) + { + throw IdComponentException("", "H5Rcreate failed"); + } +} + +//-------------------------------------------------------------------------- +// Function: H5Object::reference +///\brief Creates a reference to an HDF5 object or a dataset region. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced +///\param dataspace - IN: Dataspace with selection +///\param ref_type - IN: Type of reference to query, valid values are: +/// \li \c H5R_OBJECT \tReference is an object reference. +/// \li \c H5R_DATASET_REGION \tReference is a dataset region +/// reference. - this is the default +///\exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::reference(void* ref, const char* name, const DataSpace& dataspace, H5R_type_t ref_type) const +{ + try { + p_reference(ref, name, dataspace.getId(), ref_type); + } + catch (IdComponentException E) { + throw IdComponentException("H5Object::reference", E.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- +// Function: H5Object::reference +///\brief This is an overloaded function, provided for your convenience. +/// It differs from the above function in that it only creates +/// a reference to an HDF5 object, not to a dataset region. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced - \c char pointer +///\exception H5::IdComponentException +///\par Description +// This function passes H5R_OBJECT and -1 to the protected +// function for it to pass to the C API H5Rcreate +// to create a reference to the named object. +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::reference(void* ref, const char* name) const +{ + try { + p_reference(ref, name, -1, H5R_OBJECT); + } + catch (IdComponentException E) { + throw IdComponentException("H5Object::reference", E.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- +// Function: H5Object::reference +///\brief This is an overloaded function, provided for your convenience. +/// It differs from the above function in that it takes an +/// \c std::string for the object's name. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced - \c std::string +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::reference(void* ref, const H5std_string& name) const +{ + reference(ref, name.c_str()); +} + +//-------------------------------------------------------------------------- +// Function: H5Object::dereference +// Purpose Dereference a ref into a DataSet object. +// Parameters +// ref - IN: Reference pointer +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// May 2008 - BMR +// Moved from IdComponent into H5File and H5Object +//-------------------------------------------------------------------------- +void H5Object::dereference(H5File& h5file, void* ref) +{ + hid_t temp_id; + try { + temp_id = h5file.p_dereference(ref); + } + catch (ReferenceException ref_err) { + throw (inMemFunc("dereference"), ref_err.getDetailMsg()); + } + + // No failure, set id to the object + p_setId(temp_id); +} + +void H5Object::dereference(H5Object& obj, void* ref) +{ + hid_t temp_id; + try { + temp_id = obj.p_dereference(ref); + } + catch (ReferenceException ref_err) { + throw (inMemFunc("dereference"), ref_err.getDetailMsg()); + } + + // No failure, set id to the object + p_setId(temp_id); +} + +#ifndef H5_NO_DEPRECATED_SYMBOLS +//-------------------------------------------------------------------------- +// Function: H5Object::p_get_obj_type (protected) +// Purpose Retrieves the type of object that an object reference points to. +// Parameters +// ref - IN: Reference to query +// ref_type - IN: Type of reference to query +// Return An object type, which can be one of the following: +// H5G_LINK Object is a symbolic link. +// H5G_GROUP Object is a group. +// H5G_DATASET Object is a dataset. +// H5G_TYPE Object is a named datatype +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +H5G_obj_t H5Object::p_get_obj_type(void *ref, H5R_type_t ref_type) const +{ + H5G_obj_t obj_type = H5Rget_obj_type1(getId(), ref_type, ref); + + if (obj_type == H5G_UNKNOWN) + { + throw IdComponentException("", "H5Rget_obj_type failed"); + } + return(obj_type); +} +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + + +//-------------------------------------------------------------------------- +// Function: H5Object::p_get_region (protected) +// Purpose Retrieves a dataspace with the region pointed to selected. +// Parameters +// ref_type - IN: Type of reference to get region of - default +// to H5R_DATASET_REGION +// ref - IN: Reference to get region of +// Return Dataspace id +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +hid_t H5Object::p_get_region(void *ref, H5R_type_t ref_type) const +{ + hid_t space_id = H5Rget_region(getId(), ref_type, ref); + if (space_id < 0) + { + throw IdComponentException("", "H5Rget_region failed"); + } + return(space_id); +} + + +//-------------------------------------------------------------------------- // Function: H5Object destructor ///\brief Noop destructor. // Programmer Binh-Minh Ribler - 2000 diff --git a/c++/src/H5Object.h b/c++/src/H5Object.h index 77de529..49655a1 100644 --- a/c++/src/H5Object.h +++ b/c++/src/H5Object.h @@ -20,8 +20,7 @@ #include "H5Classes.h" // constains forward class declarations // H5Object is a baseclass. It has these subclasses: -// Group, AbstractDs, and DataType. -// AbstractDs, in turn, has subclasses DataSet and Attribute. +// Group, DataSet, and DataType. // DataType, in turn, has several specific datatypes as subclasses. #ifndef H5_NO_NAMESPACE @@ -80,6 +79,17 @@ class H5_DLLCPP H5Object : public IdComponent { void renameAttr(const char* oldname, const char* newname) const; void renameAttr(const H5std_string& oldname, const H5std_string& newname) const; + // Creates a reference to a named Hdf5 object or to a dataset region + // in this object. + void reference(void* ref, const char* name, const DataSpace& dataspace, + H5R_type_t ref_type = H5R_DATASET_REGION) const; + void reference(void* ref, const char* name) const; + void reference(void* ref, const H5std_string& name) const; + + // Open a referenced HDF5 object. + void dereference(H5File& h5file, void* ref); + void dereference(H5Object& obj, void* ref); + // Copy constructor: makes copy of an H5Object object. H5Object(const H5Object& original); @@ -93,6 +103,21 @@ class H5_DLLCPP H5Object : public IdComponent { // Creates a copy of an existing object giving the object id H5Object( const hid_t object_id ); + + // Gets the id of the H5 file in which the given object is located. + hid_t p_get_file_id(); + + // Creates a reference to an HDF5 object or a dataset region. + void p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const; + +#ifndef H5_NO_DEPRECATED_SYMBOLS + // Retrieves the type of object that an object reference points to. + H5G_obj_t p_get_obj_type(void *ref, H5R_type_t ref_type) const; +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + + // Retrieves a dataspace with the region pointed to selected. + hid_t p_get_region(void *ref, H5R_type_t ref_type) const; + #endif // DOXYGEN_SHOULD_SKIP_THIS }; /* end class H5Object */ diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp index f39ae78..579c8ac 100644 --- a/c++/src/H5PropList.cpp +++ b/c++/src/H5PropList.cpp @@ -46,7 +46,7 @@ const PropList PropList::DEFAULT( H5P_DEFAULT ); ///\brief Default constructor: creates a stub property list object. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -PropList::PropList() : IdComponent( 0 ) {} +PropList::PropList() : IdComponent(), id(0) {} //-------------------------------------------------------------------------- // Function: PropList copy constructor @@ -54,7 +54,11 @@ PropList::PropList() : IdComponent( 0 ) {} ///\param original - IN: The original property list to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -PropList::PropList( const PropList& original ) : IdComponent( original ) {} +PropList::PropList(const PropList& original) : IdComponent(original) +{ + id = original.getId(); + incRefCount(); // increment number of references to this id +} //-------------------------------------------------------------------------- // Function: PropList overloaded constructor @@ -70,7 +74,7 @@ PropList::PropList( const PropList& original ) : IdComponent( original ) {} // description was what I came up with from reading the code. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -PropList::PropList( const hid_t plist_id ) : IdComponent(0) +PropList::PropList( const hid_t plist_id ) : IdComponent() { if (H5I_GENPROP_CLS == H5Iget_type(plist_id)) { // call C routine to create the new property @@ -205,6 +209,46 @@ void PropList::copyProp( PropList& dest, PropList& src, const H5std_string& name } //-------------------------------------------------------------------------- +// Function: PropList::getId +// Purpose: Get the id of this attribute +// Description: +// Class hierarchy is revised to address bugzilla 1068. Class +// AbstractDS and Attribute are moved out of H5Object. In +// addition, member IdComponent::id is moved into subclasses, and +// IdComponent::getId now becomes pure virtual function. +// Programmer Binh-Minh Ribler - May, 2008 +//-------------------------------------------------------------------------- +hid_t PropList::getId() const +{ + return(id); +} + +//-------------------------------------------------------------------------- +// Function: PropList::p_setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +void PropList::p_setId(const hid_t new_id) +{ + // handling references to this old id + try { + close(); + } + catch (Exception close_error) { + throw PropListIException(inMemFunc("p_setId"), close_error.getDetailMsg()); + } + // reset object's id to the given id + id = new_id; +} + +//-------------------------------------------------------------------------- // Function: PropList::close ///\brief Closes the property list if it is not a default one. /// @@ -220,8 +264,10 @@ void PropList::close() { throw PropListIException(inMemFunc("close"), "H5Pclose failed"); } - // reset the id because the property list that it represents is now closed - id = 0; + // reset the id when the property list that it represents is no longer + // referenced + if (getCounter() == 0) + id = 0; } } diff --git a/c++/src/H5PropList.h b/c++/src/H5PropList.h index 09ea6f1..5dfa538 100644 --- a/c++/src/H5PropList.h +++ b/c++/src/H5PropList.h @@ -103,8 +103,17 @@ class H5_DLLCPP PropList : public IdComponent { // Copy constructor: creates a copy of a PropList object. PropList(const PropList& original); + // Gets the property list id. + virtual hid_t getId() const; + // Destructor: properly terminates access to this property list. virtual ~PropList(); + + protected: + hid_t id; // HDF5 property list id + + // Sets the property list id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE diff --git a/c++/test/tattr.cpp b/c++/test/tattr.cpp index 0d545d7..fe95fe7 100644 --- a/c++/test/tattr.cpp +++ b/c++/test/tattr.cpp @@ -1050,6 +1050,11 @@ static void test_attr_dtype_shared() // Open the file again fid1.openFile(FILENAME, H5F_ACC_RDWR); + // Enclosing to work around the issue of unused variables and/or + // objects created by copy constructors stay around until end of + // scope, causing incorrect number of ref counts. + { // First enclosed block + // Create a datatype to commit and use IntType dtype(PredType::NATIVE_INT); @@ -1065,13 +1070,6 @@ static void test_attr_dtype_shared() // Create dataspace for dataset DataSpace dspace; - // Enclose the following so that all temporary objects can be - // destroyed before testing reference count - this is to overcome - // the different time when the temporary objects are to be destroyed - // by different compilers. - { - - // Create dataset DataSet dset = fid1.createDataSet(DSET1_NAME, dtype, dspace); #ifndef H5_NO_DEPRECATED_SYMBOLS @@ -1089,8 +1087,8 @@ static void test_attr_dtype_shared() verify_val((int)statbuf.nlink, 3, "DataSet::getObjinfo", __LINE__, __FILE__); #endif /* H5_NO_DEPRECATED_SYMBOLS */ - // Close attribute - attr.close(); + // Close attribute + attr.close(); // Delete attribute dset.removeAttr(ATTR1_NAME); @@ -1101,8 +1099,8 @@ static void test_attr_dtype_shared() verify_val((int)statbuf.nlink, 2, "DataSet::getObjinfo after DataSet::removeAttr", __LINE__, __FILE__); #endif /* H5_NO_DEPRECATED_SYMBOLS */ - // Create attribute on dataset - attr = dset.createAttribute(ATTR1_NAME,dtype,dspace); + // Create attribute on dataset + attr = dset.createAttribute(ATTR1_NAME,dtype,dspace); #ifndef H5_NO_DEPRECATED_SYMBOLS // Check reference count on named datatype @@ -1118,11 +1116,15 @@ static void test_attr_dtype_shared() dset.close(); dspace.close(); dtype.close(); + } // end of first enclosing + fid1.close(); // Open the file again fid1.openFile(FILENAME, H5F_ACC_RDWR); + { // Second enclosed block... + // Open dataset DataSet *dset2 = new DataSet (fid1.openDataSet(DSET1_NAME)); @@ -1142,12 +1144,11 @@ static void test_attr_dtype_shared() fid1.getObjinfo(TYPE1_NAME, statbuf); verify_val((int)statbuf.nlink, 3, "DataSet::openAttribute", __LINE__, __FILE__); #endif /* H5_NO_DEPRECATED_SYMBOLS */ + } // end of second enclosing // Unlink the dataset fid1.unlink(DSET1_NAME); - } // end of enclosing to test reference counts - #ifndef H5_NO_DEPRECATED_SYMBOLS // Check reference count on named datatype fid1.getObjinfo(TYPE1_NAME, statbuf); diff --git a/c++/test/tvlstr.cpp b/c++/test/tvlstr.cpp index 007ab10..d4d0fd1 100644 --- a/c++/test/tvlstr.cpp +++ b/c++/test/tvlstr.cpp @@ -416,7 +416,7 @@ static void test_vlstring_type() file1 = new H5File(FILENAME, H5F_ACC_RDWR); // Open the variable-length string datatype just created - vlstr_type.setId((file1->openStrType(VLSTR_TYPE)).getId()); + vlstr_type = file1->openStrType(VLSTR_TYPE); // Verify character set and padding cset = vlstr_type.getCset(); diff --git a/config/lt_vers.am b/config/lt_vers.am index 75a15e8..3ee533e 100644 --- a/config/lt_vers.am +++ b/config/lt_vers.am @@ -16,8 +16,8 @@ ## # Add libtool shared library version numbers to the HDF5 library # See libtool versioning documentation online. -LT_VERS_INTERFACE = 5 -LT_VERS_REVISION = 9 +LT_VERS_INTERFACE = 6 +LT_VERS_REVISION = 4 LT_VERS_AGE = 0 ## If the API changes *at all*, increment LT_VERS_INTERFACE and diff --git a/configure b/configure index a659d59..3e4c5a0 100755 --- a/configure +++ b/configure @@ -50635,7 +50635,7 @@ if test -n "$TESTPARALLEL"; then fi fi -ac_config_files="$ac_config_files src/libhdf5.settings Makefile src/Makefile test/Makefile test/testerror.sh testpar/Makefile testpar/testph5.sh perform/Makefile tools/Makefile tools/h5dump/Makefile tools/h5dump/testh5dump.sh tools/h5dump/testh5dumpxml.sh tools/h5import/Makefile tools/h5diff/Makefile tools/h5jam/Makefile tools/h5jam/testh5jam.sh tools/h5repack/Makefile tools/h5repack/h5repack.sh tools/h5ls/Makefile tools/h5copy/Makefile tools/h5recover/Makefile tools/h5recover/testh5recover.sh tools/lib/Makefile tools/misc/Makefile tools/misc/h5cc tools/misc/testh5repart.sh tools/h5stat/testh5stat.sh tools/h5stat/Makefile tools/h52jpeg/Makefile examples/Makefile examples/testh5cc.sh c++/Makefile c++/src/Makefile c++/src/h5c++ c++/test/Makefile c++/examples/Makefile c++/examples/testh5c++.sh fortran/Makefile fortran/src/h5fc fortran/src/libhdf5_fortran.settings fortran/src/Makefile fortran/test/Makefile fortran/testpar/Makefile fortran/examples/Makefile fortran/examples/testh5fc.sh hl/Makefile hl/src/Makefile hl/test/Makefile hl/tools/Makefile hl/tools/gif2h5/Makefile hl/examples/Makefile hl/c++/Makefile hl/c++/src/Makefile hl/c++/test/Makefile hl/c++/examples/Makefile hl/fortran/Makefile hl/fortran/src/Makefile hl/fortran/test/Makefile hl/fortran/examples/Makefile" +ac_config_files="$ac_config_files src/libhdf5.settings Makefile src/Makefile test/Makefile test/testerror.sh testpar/Makefile testpar/testph5.sh perform/Makefile tools/Makefile tools/h5dump/Makefile tools/h5dump/testh5dump.sh tools/h5dump/testh5dumpxml.sh tools/h5import/Makefile tools/h5diff/Makefile tools/h5jam/Makefile tools/h5jam/testh5jam.sh tools/h5repack/Makefile tools/h5repack/h5repack.sh tools/h5ls/Makefile tools/h5copy/Makefile tools/h5recover/Makefile tools/h5recover/testh5recover.sh tools/lib/Makefile tools/misc/Makefile tools/misc/h5cc tools/misc/testh5repart.sh tools/h5stat/testh5stat.sh tools/h5stat/Makefile examples/Makefile examples/testh5cc.sh c++/Makefile c++/src/Makefile c++/src/h5c++ c++/test/Makefile c++/examples/Makefile c++/examples/testh5c++.sh fortran/Makefile fortran/src/h5fc fortran/src/libhdf5_fortran.settings fortran/src/Makefile fortran/test/Makefile fortran/testpar/Makefile fortran/examples/Makefile fortran/examples/testh5fc.sh hl/Makefile hl/src/Makefile hl/test/Makefile hl/tools/Makefile hl/tools/gif2h5/Makefile hl/tools/h52jpeg/Makefile hl/examples/Makefile hl/c++/Makefile hl/c++/src/Makefile hl/c++/test/Makefile hl/c++/examples/Makefile hl/fortran/Makefile hl/fortran/src/Makefile hl/fortran/test/Makefile hl/fortran/examples/Makefile" cat >confcache <<\_ACEOF @@ -51752,7 +51752,6 @@ do "tools/misc/testh5repart.sh") CONFIG_FILES="$CONFIG_FILES tools/misc/testh5repart.sh" ;; "tools/h5stat/testh5stat.sh") CONFIG_FILES="$CONFIG_FILES tools/h5stat/testh5stat.sh" ;; "tools/h5stat/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5stat/Makefile" ;; - "tools/h52jpeg/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h52jpeg/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "examples/testh5cc.sh") CONFIG_FILES="$CONFIG_FILES examples/testh5cc.sh" ;; "c++/Makefile") CONFIG_FILES="$CONFIG_FILES c++/Makefile" ;; @@ -51774,6 +51773,7 @@ do "hl/test/Makefile") CONFIG_FILES="$CONFIG_FILES hl/test/Makefile" ;; "hl/tools/Makefile") CONFIG_FILES="$CONFIG_FILES hl/tools/Makefile" ;; "hl/tools/gif2h5/Makefile") CONFIG_FILES="$CONFIG_FILES hl/tools/gif2h5/Makefile" ;; + "hl/tools/h52jpeg/Makefile") CONFIG_FILES="$CONFIG_FILES hl/tools/h52jpeg/Makefile" ;; "hl/examples/Makefile") CONFIG_FILES="$CONFIG_FILES hl/examples/Makefile" ;; "hl/c++/Makefile") CONFIG_FILES="$CONFIG_FILES hl/c++/Makefile" ;; "hl/c++/src/Makefile") CONFIG_FILES="$CONFIG_FILES hl/c++/src/Makefile" ;; diff --git a/configure.in b/configure.in index 0e932cd..0fba4cb 100644 --- a/configure.in +++ b/configure.in @@ -3843,7 +3843,6 @@ AC_CONFIG_FILES([src/libhdf5.settings tools/misc/testh5repart.sh tools/h5stat/testh5stat.sh tools/h5stat/Makefile - tools/h52jpeg/Makefile examples/Makefile examples/testh5cc.sh c++/Makefile @@ -3865,6 +3864,7 @@ AC_CONFIG_FILES([src/libhdf5.settings hl/test/Makefile hl/tools/Makefile hl/tools/gif2h5/Makefile + hl/tools/h52jpeg/Makefile hl/examples/Makefile hl/c++/Makefile hl/c++/src/Makefile diff --git a/fortran/src/H5Gf.c b/fortran/src/H5Gf.c index 28e5312..1f3e416 100644 --- a/fortran/src/H5Gf.c +++ b/fortran/src/H5Gf.c @@ -725,14 +725,18 @@ done: * * nlinks - Number of links in group * max_corder - Current maximum creation order value for group + * mounted - Whether group has a file mounted on it (0 = false, 1 = true) * * Returns: 0 on success, -1 on failure * Programmer: M.S. Breitenfeld * February 15, 2008 - * Modifications: N/A + * Modifications: + * - Added 'mounted' paramater + * M.S. Breitenfeld + * July 16, 2008 *---------------------------------------------------------------------------*/ int_f -nh5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder) +nh5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted ) { int_f ret_value = 0; /* Return value */ @@ -749,6 +753,8 @@ nh5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *ma *storage_type = (int_f)ginfo.storage_type; *nlinks = (int_f)ginfo.nlinks; *max_corder = (int_f)ginfo.max_corder; + *mounted = 0; + if(ginfo.mounted) *mounted = 1; done: return ret_value; @@ -774,16 +780,20 @@ done: * * nlinks - Number of links in group * max_corder - Current maximum creation order value for group + * mounted - Whether group has a file mounted on it (0 = false, 1 = true) * * Returns: 0 on success, -1 on failure * Programmer: M.S. Breitenfeld * February 18, 2008 - * Modifications: N/A + * Modifications: + * - Added 'mounted' paramater + * M.S. Breitenfeld + * July 16, 2008 *---------------------------------------------------------------------------*/ int_f nh5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, int_f *index_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id, - int_f *storage_type, int_f *nlinks, int_f *max_corder) + int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted ) { char *c_group_name = NULL; /* Buffer to hold group name C string */ @@ -807,6 +817,8 @@ nh5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, *storage_type = (int_f)ginfo.storage_type; *nlinks = (int_f)ginfo.nlinks; *max_corder = (int_f)ginfo.max_corder; + *mounted = 0; + if(ginfo.mounted) *mounted = 1; done: if(c_group_name) @@ -830,15 +842,19 @@ nh5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, * * nlinks - Number of links in group * max_corder - Current maximum creation order value for group + * mounted - Whether group has a file mounted on it (0 = false, 1 = true) * * Returns: 0 on success, -1 on failure * Programmer: M.S. Breitenfeld * February 18, 2008 - * Modifications: N/A + * Modifications: + * - Added 'mounted' paramater + * M.S. Breitenfeld + * July 16, 2008 *---------------------------------------------------------------------------*/ int_f nh5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, hid_t_f *lapl_id, - int_f *storage_type, int_f *nlinks, int_f *max_corder) + int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted) { char *c_group_name = NULL; /* Buffer to hold group name C string */ @@ -861,6 +877,8 @@ nh5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen *storage_type = (int_f)ginfo.storage_type; *nlinks = (int_f)ginfo.nlinks; *max_corder = (int_f)ginfo.max_corder; + *mounted = 0; + if(ginfo.mounted) *mounted = 1; done: if(c_group_name) diff --git a/fortran/src/H5Gff.f90 b/fortran/src/H5Gff.f90 index 1e4b2b1..13baa94 100644 --- a/fortran/src/H5Gff.f90 +++ b/fortran/src/H5Gff.f90 @@ -1197,16 +1197,19 @@ CONTAINS ! Success: 0 ! Failure: -1 ! Optional parameters: -! NONE +! mounted - Whether group has a file mounted on it ! ! Programmer: M. S. Breitenfeld ! February 15, 2008 ! -! Modifications: N/A +! Modifications: +! - Added 'mounted' paramater +! M.S. Breitenfeld +! July 16, 2008 ! !---------------------------------------------------------------------- - SUBROUTINE h5gget_info_f(group_id, storage_type, nlinks, max_corder, hdferr) + SUBROUTINE h5gget_info_f(group_id, storage_type, nlinks, max_corder, hdferr, mounted) !This definition is needed for Windows DLLs !DEC$if defined(BUILD_HDF5_DLL) !DEC$attributes dllexport :: h5gget_info_f @@ -1222,11 +1225,14 @@ CONTAINS INTEGER, INTENT(OUT) :: max_corder ! Current maximum creation order value for group INTEGER, INTENT(OUT) :: hdferr ! Error code: ! 0 on success and -1 on failure + LOGICAL, INTENT(OUT), OPTIONAL :: mounted ! Whether group has a file mounted on it + + INTEGER :: mounted_c ! MS FORTRAN needs explicit interface for C functions called here. ! INTERFACE - INTEGER FUNCTION h5gget_info_c(group_id, storage_type, nlinks, max_corder) + INTEGER FUNCTION h5gget_info_c(group_id, storage_type, nlinks, max_corder, mounted_c) USE H5GLOBAL !DEC$ IF DEFINED(HDF5F90_WINDOWS) !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5GGET_INFO_C'::h5gget_info_c @@ -1235,10 +1241,19 @@ CONTAINS INTEGER, INTENT(OUT) :: storage_type INTEGER, INTENT(OUT) :: nlinks INTEGER, INTENT(OUT) :: max_corder + INTEGER :: mounted_c END FUNCTION h5gget_info_c END INTERFACE - hdferr = h5gget_info_c(group_id, storage_type, nlinks, max_corder) + hdferr = h5gget_info_c(group_id, storage_type, nlinks, max_corder, mounted_c) + + IF(PRESENT(mounted))THEN + IF(mounted_c.EQ.0) THEN + mounted = .FALSE. + ELSE + mounted = .TRUE. + ENDIF + ENDIF END SUBROUTINE h5gget_info_f @@ -1266,17 +1281,21 @@ CONTAINS ! Success: 0 ! Failure: -1 ! Optional parameters: -! lapl_id - Link access property list +! lapl_id - Link access property list +! mounted - Whether group has a file mounted on it ! ! Programmer: M. S. Breitenfeld ! February 18, 2008 ! -! Modifications: N/A +! Modifications: +! - Added 'mounted' paramater +! M.S. Breitenfeld +! July 16, 2008 ! !---------------------------------------------------------------------- SUBROUTINE h5gget_info_by_idx_f(loc_id, group_name, index_type, order, n, & - storage_type, nlinks, max_corder, hdferr, lapl_id) + storage_type, nlinks, max_corder, hdferr, lapl_id, mounted) !This definition is needed for Windows DLLs !DEC$if defined(BUILD_HDF5_DLL) !DEC$attributes dllexport :: h5gget_info_by_idx_f @@ -1297,7 +1316,9 @@ CONTAINS INTEGER, INTENT(OUT) :: hdferr ! Error code: ! 0 on success and -1 on failure INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list + LOGICAL, INTENT(OUT), OPTIONAL :: mounted ! Whether group has a file mounted on it + INTEGER :: mounted_c INTEGER(HID_T) :: lapl_id_default INTEGER(SIZE_T) :: group_name_len ! length of group name @@ -1305,7 +1326,7 @@ CONTAINS ! INTERFACE INTEGER FUNCTION h5gget_info_by_idx_c(loc_id, group_name, group_name_len, index_type, order, n, lapl_id_default, & - storage_type, nlinks, max_corder) + storage_type, nlinks, max_corder, mounted_c) USE H5GLOBAL !DEC$ IF DEFINED(HDF5F90_WINDOWS) !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5GGET_INFO_BY_IDX_C'::h5gget_info_by_idx_c @@ -1321,6 +1342,7 @@ CONTAINS INTEGER, INTENT(OUT) :: max_corder INTEGER(SIZE_T) :: group_name_len + INTEGER :: mounted_c END FUNCTION h5gget_info_by_idx_c END INTERFACE @@ -1328,11 +1350,19 @@ CONTAINS group_name_len = LEN(group_name) lapl_id_default = H5P_DEFAULT_F - IF(present(lapl_id)) lapl_id_default = lapl_id + IF(PRESENT(lapl_id)) lapl_id_default = lapl_id hdferr = h5gget_info_by_idx_c(loc_id, group_name, group_name_len, & index_type, order, n, lapl_id_default, & - storage_type, nlinks, max_corder) + storage_type, nlinks, max_corder, mounted_c) + + IF(PRESENT(mounted))THEN + IF(mounted_c.EQ.0) THEN + mounted = .FALSE. + ELSE + mounted = .TRUE. + ENDIF + ENDIF END SUBROUTINE h5gget_info_by_idx_f @@ -1357,17 +1387,20 @@ CONTAINS ! Success: 0 ! Failure: -1 ! Optional parameters: -! lapl_id - Link access property list +! lapl_id - Link access property list +! mounted - Whether group has a file mounted on it ! ! Programmer: M. S. Breitenfeld ! February 18, 2008 ! -! Modifications: N/A -! +! Modifications: +! - Added 'mounted' paramater +! M.S. Breitenfeld +! July 16, 2008 !---------------------------------------------------------------------- SUBROUTINE h5gget_info_by_name_f(loc_id, group_name, & - storage_type, nlinks, max_corder, hdferr, lapl_id) + storage_type, nlinks, max_corder, hdferr, lapl_id, mounted) !This definition is needed for Windows DLLs !DEC$if defined(BUILD_HDF5_DLL) !DEC$attributes dllexport :: h5gget_info_by_name_f @@ -1385,7 +1418,9 @@ CONTAINS INTEGER, INTENT(OUT) :: hdferr ! Error code: ! 0 on success and -1 on failure INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list + LOGICAL, INTENT(OUT), OPTIONAL :: mounted ! Whether group has a file mounted on it + INTEGER :: mounted_c INTEGER(HID_T) :: lapl_id_default INTEGER(SIZE_T) :: group_name_len ! length of group name @@ -1393,7 +1428,7 @@ CONTAINS ! INTERFACE INTEGER FUNCTION h5gget_info_by_name_c(loc_id, group_name, group_name_len, lapl_id_default, & - storage_type, nlinks, max_corder) + storage_type, nlinks, max_corder, mounted_c) USE H5GLOBAL !DEC$ IF DEFINED(HDF5F90_WINDOWS) !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5GGET_INFO_BY_NAME_C'::h5gget_info_by_name_c @@ -1406,6 +1441,7 @@ CONTAINS INTEGER, INTENT(OUT) :: max_corder INTEGER(SIZE_T) :: group_name_len + INTEGER :: mounted_c END FUNCTION h5gget_info_by_name_c END INTERFACE @@ -1416,7 +1452,15 @@ CONTAINS IF(PRESENT(lapl_id)) lapl_id_default = lapl_id hdferr = h5gget_info_by_name_c(loc_id, group_name, group_name_len, lapl_id_default, & - storage_type, nlinks, max_corder) + storage_type, nlinks, max_corder, mounted_c) + + IF(PRESENT(mounted))THEN + IF(mounted_c.EQ.0) THEN + mounted = .FALSE. + ELSE + mounted = .TRUE. + ENDIF + ENDIF END SUBROUTINE h5gget_info_by_name_f diff --git a/fortran/src/H5f90proto.h b/fortran/src/H5f90proto.h index 3f8f361..af86372 100644 --- a/fortran/src/H5f90proto.h +++ b/fortran/src/H5f90proto.h @@ -339,7 +339,7 @@ H5_FCDLL int_f nh5dfill_real_c(void * fill_value, hid_t_f *fill_type_id, hid_t_f H5_FCDLL int_f nh5dfill_double_c(void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id); H5_FCDLL int_f nh5dget_space_status_c ( hid_t_f *dset_id, int_f *flag); H5_FCDLL int_f nh5dcreate_anon_c (hid_t_f *loc_id, hid_t_f *type_id, hid_t_f *space_id, - hid_t_f *dcpl_id, hid_t_f *dapl_id, hid_t_f *dset_id); /*MSB*/ + hid_t_f *dcpl_id, hid_t_f *dapl_id, hid_t_f *dset_id); /* * Functions from H5Gf.c @@ -378,14 +378,14 @@ H5_FCDLL int_f nh5gmove2_c (hid_t_f *src_loc_id, _fcd src_name, int_f *src_namel H5_FCDLL int_f nh5gget_linkval_c (hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size, _fcd value ); H5_FCDLL int_f nh5gset_comment_c (hid_t_f *loc_id, _fcd name, int_f *namelen, _fcd comment, int_f *commentlen); H5_FCDLL int_f nh5gget_comment_c (hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *bufsize, _fcd comment); -H5_FCDLL int_f nh5gcreate_anon_c (hid_t_f *loc_id, hid_t_f *gcpl_id, hid_t_f *gapl_id, hid_t_f *grp_id); /*MSB*/ -H5_FCDLL int_f nh5gget_create_plist_c(hid_t_f *grp_id, hid_t_f *gcpl_id ); /*MSB*/ -H5_FCDLL int_f nh5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder); /*MSB*/ +H5_FCDLL int_f nh5gcreate_anon_c (hid_t_f *loc_id, hid_t_f *gcpl_id, hid_t_f *gapl_id, hid_t_f *grp_id); +H5_FCDLL int_f nh5gget_create_plist_c(hid_t_f *grp_id, hid_t_f *gcpl_id ); +H5_FCDLL int_f nh5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted); H5_FCDLL int_f nh5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, int_f *index_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id, - int_f *storage_type, int_f *nlinks, int_f *max_corder); /*MSB*/ + int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted); H5_FCDLL int_f nh5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, hid_t_f *lapl_id, - int_f *storage_type, int_f *nlinks, int_f *max_corder); /*MSB*/ + int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted); /* * Functions from H5Af.c @@ -467,23 +467,23 @@ H5_FCDLL int_f nh5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f # define nh5aget_type_c H5_FC_FUNC_(h5aget_type_c, H5AGET_TYPE_C) # define nh5aget_num_attrs_c H5_FC_FUNC_(h5aget_num_attrs_c, H5AGET_NUM_ATTRS_C) # define nh5adelete_c H5_FC_FUNC_(h5adelete_c, H5ADELETE_C) -# define nh5aget_storage_size_c H5_FC_FUNC_(h5aget_storage_size_c, H5AGET_STORAGE_SIZE_C) /* MSB */ -# define nh5arename_by_name_c H5_FC_FUNC_(h5arename_by_name_c, H5ARENAME_BY_NAME_C) /* MSB */ -# define nh5aopen_c H5_FC_FUNC_(h5aopen_c, H5AOPEN_C) /* MSB */ -# define nh5adelete_by_name_c H5_FC_FUNC_(h5adelete_by_name_c,H5ADELETE_BY_NAME_C) /* MSB */ -# define nh5adelete_by_idx_c H5_FC_FUNC_(h5adelete_by_idx_c,H5ADELETE_BY_IDX_C) /* MSB */ -# define nh5aget_name_by_idx_c H5_FC_FUNC_(h5aget_name_by_idx_c,H5AGET_NAME_BY_IDX_C) /* MSB */ -# define nh5aget_create_plist_c H5_FC_FUNC_(h5aget_create_plist_c,H5AGET_CREATE_PLIST_C) /* MSB */ -# define nh5aopen_by_idx_c H5_FC_FUNC_(h5aopen_by_idx_c,H5AOPEN_BY_IDX_C) /* MSB */ -# define nh5aget_info_c H5_FC_FUNC_(h5aget_info_c,H5AGET_INFO_C) /* MSB */ -# define nh5aget_info_by_idx_c H5_FC_FUNC_(h5aget_info_by_idx_c,H5AGET_INFO_BY_IDX_C) /* MSB */ -# define nh5aget_info_by_name_c H5_FC_FUNC_(h5aget_info_by_name_c,H5AGET_INFO_BY_NAME_C) /* MSB */ -# define nh5aget_info_by_name_c H5_FC_FUNC_(h5aget_info_by_name_c,H5AGET_INFO_BY_NAME_C) /* MSB */ -# define nh5acreate_by_name_c H5_FC_FUNC_(h5acreate_by_name_c,H5ACREATE_BY_NAME_C) /* MSB */ -# define nh5aexists_c H5_FC_FUNC_(h5aexists_c,H5AEXISTS_C) /* MSB */ -# define nh5aexists_by_name_c H5_FC_FUNC_(h5aexists_by_name_c,H5AEXISTS_BY_NAME_C) /* MSB */ -# define nh5aopen_by_name_c H5_FC_FUNC_(h5aopen_by_name_c,H5AOPEN_BY_NAME_C) /* MSB */ -# define nh5arename_c H5_FC_FUNC_(h5arename_c,H5ARENAME_C) /* MSB */ +# define nh5aget_storage_size_c H5_FC_FUNC_(h5aget_storage_size_c, H5AGET_STORAGE_SIZE_C) +# define nh5arename_by_name_c H5_FC_FUNC_(h5arename_by_name_c, H5ARENAME_BY_NAME_C) +# define nh5aopen_c H5_FC_FUNC_(h5aopen_c, H5AOPEN_C) +# define nh5adelete_by_name_c H5_FC_FUNC_(h5adelete_by_name_c,H5ADELETE_BY_NAME_C) +# define nh5adelete_by_idx_c H5_FC_FUNC_(h5adelete_by_idx_c,H5ADELETE_BY_IDX_C) +# define nh5aget_name_by_idx_c H5_FC_FUNC_(h5aget_name_by_idx_c,H5AGET_NAME_BY_IDX_C) +# define nh5aget_create_plist_c H5_FC_FUNC_(h5aget_create_plist_c,H5AGET_CREATE_PLIST_C) +# define nh5aopen_by_idx_c H5_FC_FUNC_(h5aopen_by_idx_c,H5AOPEN_BY_IDX_C) +# define nh5aget_info_c H5_FC_FUNC_(h5aget_info_c,H5AGET_INFO_C) +# define nh5aget_info_by_idx_c H5_FC_FUNC_(h5aget_info_by_idx_c,H5AGET_INFO_BY_IDX_C) +# define nh5aget_info_by_name_c H5_FC_FUNC_(h5aget_info_by_name_c,H5AGET_INFO_BY_NAME_C) +# define nh5aget_info_by_name_c H5_FC_FUNC_(h5aget_info_by_name_c,H5AGET_INFO_BY_NAME_C) +# define nh5acreate_by_name_c H5_FC_FUNC_(h5acreate_by_name_c,H5ACREATE_BY_NAME_C) +# define nh5aexists_c H5_FC_FUNC_(h5aexists_c,H5AEXISTS_C) +# define nh5aexists_by_name_c H5_FC_FUNC_(h5aexists_by_name_c,H5AEXISTS_BY_NAME_C) +# define nh5aopen_by_name_c H5_FC_FUNC_(h5aopen_by_name_c,H5AOPEN_BY_NAME_C) +# define nh5arename_c H5_FC_FUNC_(h5arename_c,H5ARENAME_C) H5_FCDLL int_f nh5acreate_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *type_id, hid_t_f *space_id, hid_t_f *crt_prp, hid_t_f *aapl, hid_t_f *attr_id); H5_FCDLL int_f nh5aopen_name_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_id); @@ -562,45 +562,45 @@ H5_FCDLL int_f nh5aget_space_c (hid_t_f *attr_id, hid_t_f *space_id); H5_FCDLL int_f nh5aget_type_c (hid_t_f *attr_id, hid_t_f *type_id); H5_FCDLL int_f nh5aget_num_attrs_c (hid_t_f *obj_id, int_f *attr_num); H5_FCDLL int_f nh5aget_name_c(hid_t_f *attr_id, size_t_f *size, _fcd buf); -H5_FCDLL int_f nh5aget_storage_size_c ( hid_t_f *attr_id, hsize_t_f *size ); /* MSB */ +H5_FCDLL int_f nh5aget_storage_size_c ( hid_t_f *attr_id, hsize_t_f *size ); H5_FCDLL int_f nh5arename_by_name_c ( hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd old_attr_name, size_t_f *old_attr_namelen, _fcd new_attr_name, size_t_f *new_attr_namelen, - hid_t_f *lapl_id ); /* MSB */ + hid_t_f *lapl_id ); H5_FCDLL int_f nh5aopen_c ( hid_t_f *obj_id, _fcd attr_name, size_t_f *attr_namelen, - hid_t_f *aapl_id, hid_t_f *attr_id); /* MSB */ + hid_t_f *aapl_id, hid_t_f *attr_id); H5_FCDLL int_f nh5adelete_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, - _fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id); /* MSB */ + _fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id); H5_FCDLL int_f nh5adelete_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, - int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id); /* MSB */ + int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id); H5_FCDLL int_f nh5aget_name_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, int_f *idx_type, int_f *order, hsize_t_f *n, _fcd name, - size_t_f *size, hid_t_f *lapl_id); /* MSB */ -H5_FCDLL int_f nh5aget_create_plist_c ( hid_t_f *attr_id, hid_t_f *creation_prop_id ); /* MSB */ + size_t_f *size, hid_t_f *lapl_id); +H5_FCDLL int_f nh5aget_create_plist_c ( hid_t_f *attr_id, hid_t_f *creation_prop_id ); H5_FCDLL int_f nh5aopen_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, - int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id); /* MSB */ + int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id); H5_FCDLL int_f nh5aget_info_c (hid_t_f *loc_id, int_f *corder_valid, int_f *corder, - int_f *cset, hsize_t_f *data_size ); /* MSB */ + int_f *cset, hsize_t_f *data_size ); H5_FCDLL int_f nh5aget_info_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id, int_f *corder_valid, int_f *corder, - int_f *cset, hsize_t_f *data_size ); /* MSB */ + int_f *cset, hsize_t_f *data_size ); H5_FCDLL int_f nh5aget_info_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id, int_f *corder_valid, int_f *corder, - int_f *cset, hsize_t_f *data_size ); /* MSB */ + int_f *cset, hsize_t_f *data_size ); H5_FCDLL int_f nh5acreate_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen, hid_t_f *type_id, hid_t_f *space_id, hid_t_f *acpl_id, hid_t_f *aapl_id, - hid_t_f *lapl_id, hid_t_f *attr_id ); /* MSB */ -H5_FCDLL int_f nh5aexists_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_exists); /* MSB */ + hid_t_f *lapl_id, hid_t_f *attr_id ); +H5_FCDLL int_f nh5aexists_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_exists); H5_FCDLL int_f nh5aexists_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen, - hid_t_f *lapl_id, int_f *attr_exists); /* MSB */ + hid_t_f *lapl_id, int_f *attr_exists); H5_FCDLL int_f nh5aopen_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen, - hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id); /* MSB */ + hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id); H5_FCDLL int_f nh5arename_c( hid_t_f *loc_id, _fcd old_attr_name, size_t_f *old_attr_namelen, - _fcd new_attr_name, size_t_f *new_attr_namelen); /* MSB */ + _fcd new_attr_name, size_t_f *new_attr_namelen); /* * Functions form H5Tf.c file @@ -869,37 +869,37 @@ H5_FCDLL int_f nh5olink_c (hid_t_f *object_id, hid_t_f *new_loc_id, _fcd name, s # define nh5pset_fapl_multi_sc H5_FC_FUNC_(h5pset_fapl_multi_sc, H5PSET_FAPL_MULTI_SC) # define nh5pset_szip_c H5_FC_FUNC_(h5pset_szip_c, H5PSET_SZIP_C) # define nh5pall_filters_avail_c H5_FC_FUNC_(h5pall_filters_avail_c, H5PALL_FILTERS_AVAIL_C) -# define nh5pget_attr_phase_change_c H5_FC_FUNC_(h5pget_attr_phase_change_c, H5PGET_ATTR_PHASE_CHANGE_C) /* MSB */ -# define nh5pset_attr_creation_order_c H5_FC_FUNC_(h5pset_attr_creation_order_c, H5PSET_ATTR_CREATION_ORDER_C) /* MSB */ -# define nh5pset_shared_mesg_nindexes_c H5_FC_FUNC_(h5pset_shared_mesg_nindexes_c, H5PSET_SHARED_MESG_NINDEXES_C) /* MSB */ -# define nh5pset_shared_mesg_index_c H5_FC_FUNC_(h5pset_shared_mesg_index_c,H5PSET_SHARED_MESG_INDEX_C) /* MSB */ -# define nh5pget_attr_creation_order_c H5_FC_FUNC_(h5pget_attr_creation_order_c,H5PGET_ATTR_CREATION_ORDER_C) /* MSB */ -# define nh5pset_libver_bounds_c H5_FC_FUNC_(h5pset_libver_bounds_c,H5PSET_LIBVER_BOUNDS_C) /* MSB */ -# define nh5pset_link_creation_order_c H5_FC_FUNC_(h5pset_link_creation_order_c, H5PSET_LINK_CREATION_ORDER_C) /* MSB */ -# define nh5pget_link_phase_change_c H5_FC_FUNC_(h5pget_link_phase_change_c, H5PGET_LINK_PHASE_CHANGE_C) /* MSB */ -# define nh5pget_obj_track_times_c H5_FC_FUNC_(h5pget_obj_track_times_c, H5PGET_OBJ_TRACK_TIMES_C) /* MSB */ -# define nh5pset_obj_track_times_c H5_FC_FUNC_(h5pset_obj_track_times_c, H5PSET_OBJ_TRACK_TIMES_C) /* MSB */ -# define nh5pset_create_inter_group_c H5_FC_FUNC_(h5pset_create_inter_group_c,H5PSET_CREATE_INTER_GROUP_C) /* MSB */ -# define nh5pget_create_inter_group_c H5_FC_FUNC_(h5pget_create_inter_group_c,H5PGET_CREATE_INTER_GROUP_C) /* MSB */ -# define nh5pget_link_creation_order_c H5_FC_FUNC_(h5pget_link_creation_order_c,H5PGET_LINK_CREATION_ORDER_C) /* MSB */ -# define nh5pset_char_encoding_c H5_FC_FUNC_(h5pset_char_encoding_c, H5PSET_CHAR_ENCODING_C) /* MSB */ -# define nh5pget_char_encoding_c H5_FC_FUNC_(h5pget_char_encoding_c, H5PGET_CHAR_ENCODING_C) /* MSB */ -# define nh5pset_copy_object_c H5_FC_FUNC_(h5pset_copy_object_c, H5PSET_COPY_OBJECT_C) /* MSB */ -# define nh5pget_copy_object_c H5_FC_FUNC_(h5pget_copy_object_c, H5PGET_COPY_OBJECT_C) /* MSB */ -# define nh5pget_data_transform_c H5_FC_FUNC_(h5pget_data_transform_c, H5PGET_DATA_TRANSFORM_C) /* MSB */ -# define nh5pset_data_transform_c H5_FC_FUNC_(h5pset_data_transform_c, H5PSET_DATA_TRANSFORM_C) /* MSB */ -# define nh5pget_local_heap_size_hint_c H5_FC_FUNC_(h5pget_local_heap_size_hint_c, H5PGET_LOCAL_HEAP_SIZE_HINT_C) /* MSB */ -# define nh5pget_est_link_info_c H5_FC_FUNC_(h5pget_est_link_info_c,H5PGET_EST_LINK_INFO_C) /* MSB */ -# define nh5pset_est_link_info_c H5_FC_FUNC_(h5pset_est_link_info_c,H5PSET_EST_LINK_INFO_C) /* MSB */ -# define nh5pset_local_heap_size_hint_c H5_FC_FUNC_(h5pset_local_heap_size_hint_c, H5PSET_LOCAL_HEAP_SIZE_HINT_C) /* MSB */ -# define nh5pset_link_phase_change_c H5_FC_FUNC_(h5pset_link_phase_change_c, H5PSET_LINK_PHASE_CHANGE_C) /* MSB */ -# define nh5pset_fapl_direct_c H5_FC_FUNC_(h5pset_fapl_direct_c, H5PSET_FAPL_DIRECT_C) /* MSB */ -# define nh5pget_fapl_direct_c H5_FC_FUNC_(h5pget_fapl_direct_c, H5PGET_FAPL_DIRECT_C) /* MSB */ -# define nh5pset_attr_phase_change_c H5_FC_FUNC_(h5pset_attr_phase_change_c, H5PSET_ATTR_PHASE_CHANGE_C) /* MSB */ -# define nh5pset_nbit_c H5_FC_FUNC_(h5pset_nbit_c, H5PSET_NBIT_C) /* MSB */ -# define nh5pset_scaleoffset_c H5_FC_FUNC_(h5pset_scaleoffset_c, H5PSET_SCALEOFFSET_C) /* MSB */ -# define nh5pset_nlinks_c H5_FC_FUNC_(h5pset_nlinks_c, H5PSET_NLINKS_C) /* MSB */ -# define nh5pget_nlinks_c H5_FC_FUNC_(h5pget_nlinks_c, H5PGET_NLINKS_C) /* MSB */ +# define nh5pget_attr_phase_change_c H5_FC_FUNC_(h5pget_attr_phase_change_c, H5PGET_ATTR_PHASE_CHANGE_C) +# define nh5pset_attr_creation_order_c H5_FC_FUNC_(h5pset_attr_creation_order_c, H5PSET_ATTR_CREATION_ORDER_C) +# define nh5pset_shared_mesg_nindexes_c H5_FC_FUNC_(h5pset_shared_mesg_nindexes_c, H5PSET_SHARED_MESG_NINDEXES_C) +# define nh5pset_shared_mesg_index_c H5_FC_FUNC_(h5pset_shared_mesg_index_c,H5PSET_SHARED_MESG_INDEX_C) +# define nh5pget_attr_creation_order_c H5_FC_FUNC_(h5pget_attr_creation_order_c,H5PGET_ATTR_CREATION_ORDER_C) +# define nh5pset_libver_bounds_c H5_FC_FUNC_(h5pset_libver_bounds_c,H5PSET_LIBVER_BOUNDS_C) +# define nh5pset_link_creation_order_c H5_FC_FUNC_(h5pset_link_creation_order_c, H5PSET_LINK_CREATION_ORDER_C) +# define nh5pget_link_phase_change_c H5_FC_FUNC_(h5pget_link_phase_change_c, H5PGET_LINK_PHASE_CHANGE_C) +# define nh5pget_obj_track_times_c H5_FC_FUNC_(h5pget_obj_track_times_c, H5PGET_OBJ_TRACK_TIMES_C) +# define nh5pset_obj_track_times_c H5_FC_FUNC_(h5pset_obj_track_times_c, H5PSET_OBJ_TRACK_TIMES_C) +# define nh5pset_create_inter_group_c H5_FC_FUNC_(h5pset_create_inter_group_c,H5PSET_CREATE_INTER_GROUP_C) +# define nh5pget_create_inter_group_c H5_FC_FUNC_(h5pget_create_inter_group_c,H5PGET_CREATE_INTER_GROUP_C) +# define nh5pget_link_creation_order_c H5_FC_FUNC_(h5pget_link_creation_order_c,H5PGET_LINK_CREATION_ORDER_C) +# define nh5pset_char_encoding_c H5_FC_FUNC_(h5pset_char_encoding_c, H5PSET_CHAR_ENCODING_C) +# define nh5pget_char_encoding_c H5_FC_FUNC_(h5pget_char_encoding_c, H5PGET_CHAR_ENCODING_C) +# define nh5pset_copy_object_c H5_FC_FUNC_(h5pset_copy_object_c, H5PSET_COPY_OBJECT_C) +# define nh5pget_copy_object_c H5_FC_FUNC_(h5pget_copy_object_c, H5PGET_COPY_OBJECT_C) +# define nh5pget_data_transform_c H5_FC_FUNC_(h5pget_data_transform_c, H5PGET_DATA_TRANSFORM_C) +# define nh5pset_data_transform_c H5_FC_FUNC_(h5pset_data_transform_c, H5PSET_DATA_TRANSFORM_C) +# define nh5pget_local_heap_size_hint_c H5_FC_FUNC_(h5pget_local_heap_size_hint_c, H5PGET_LOCAL_HEAP_SIZE_HINT_C) +# define nh5pget_est_link_info_c H5_FC_FUNC_(h5pget_est_link_info_c,H5PGET_EST_LINK_INFO_C) +# define nh5pset_est_link_info_c H5_FC_FUNC_(h5pset_est_link_info_c,H5PSET_EST_LINK_INFO_C) +# define nh5pset_local_heap_size_hint_c H5_FC_FUNC_(h5pset_local_heap_size_hint_c, H5PSET_LOCAL_HEAP_SIZE_HINT_C) +# define nh5pset_link_phase_change_c H5_FC_FUNC_(h5pset_link_phase_change_c, H5PSET_LINK_PHASE_CHANGE_C) +# define nh5pset_fapl_direct_c H5_FC_FUNC_(h5pset_fapl_direct_c, H5PSET_FAPL_DIRECT_C) +# define nh5pget_fapl_direct_c H5_FC_FUNC_(h5pget_fapl_direct_c, H5PGET_FAPL_DIRECT_C) +# define nh5pset_attr_phase_change_c H5_FC_FUNC_(h5pset_attr_phase_change_c, H5PSET_ATTR_PHASE_CHANGE_C) +# define nh5pset_nbit_c H5_FC_FUNC_(h5pset_nbit_c, H5PSET_NBIT_C) +# define nh5pset_scaleoffset_c H5_FC_FUNC_(h5pset_scaleoffset_c, H5PSET_SCALEOFFSET_C) +# define nh5pset_nlinks_c H5_FC_FUNC_(h5pset_nlinks_c, H5PSET_NLINKS_C) +# define nh5pget_nlinks_c H5_FC_FUNC_(h5pget_nlinks_c, H5PGET_NLINKS_C) H5_FCDLL int_f nh5pcreate_c ( hid_t_f *class, hid_t_f *prp_id ); H5_FCDLL int_f nh5pclose_c ( hid_t_f *prp_id ); @@ -1025,37 +1025,37 @@ H5_FCDLL int_f nh5pset_fapl_multi_sc ( hid_t_f *prp_id , int_f *flag); H5_FCDLL int_f nh5pset_szip_c ( hid_t_f *prp_id , int_f *options_mask, int_f *pixels_per_block); H5_FCDLL int_f nh5pall_filters_avail_c ( hid_t_f *prp_id , int_f *status); H5_FCDLL int_f nh5pfill_value_defined_c ( hid_t_f *prp_id , int_f *flag); -H5_FCDLL int_f nh5pget_attr_phase_change_c (hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense ); /* MSB */ -H5_FCDLL int_f nh5pset_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags ); /* MSB */ -H5_FCDLL int_f nh5pset_shared_mesg_nindexes_c(hid_t_f *plist_id, int_f *nindexes ); /* MSB */ -H5_FCDLL int_f nh5pset_shared_mesg_index_c(hid_t_f *fcpl_id, int_f *index_num, int_f *mesg_type_flags, int_f *min_mesg_size); /* MSB */ -H5_FCDLL int_f nh5pget_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags); /* MSB */ -H5_FCDLL int_f nh5pset_libver_bounds_c(hid_t_f *fapl_id, int_f *low, int_f *high); /* MSB */ -H5_FCDLL int_f nh5pset_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags); /* MSB */ -H5_FCDLL int_f nh5pget_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense ); /* MSB */ -H5_FCDLL int_f nh5pget_obj_track_times_c(hid_t_f *plist_id, int_f *flag); /* MSB */ -H5_FCDLL int_f nh5pset_obj_track_times_c(hid_t_f *plist_id, int_f *flag); /* MSB */ -H5_FCDLL int_f nh5pset_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group); /* MSB */ -H5_FCDLL int_f nh5pget_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group); /* MSB */ -H5_FCDLL int_f nh5pget_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags); /* MSB */ -H5_FCDLL int_f nh5pset_char_encoding_c(hid_t_f *plist_id, int_f *encoding); /* MSB */ -H5_FCDLL int_f nh5pget_char_encoding_c(hid_t_f *plist_id, int_f *encoding); /* MSB */ -H5_FCDLL int_f nh5pset_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options); /* MSB */ -H5_FCDLL int_f nh5pget_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options); /* MSB */ -H5_FCDLL int_f nh5pget_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len, size_t_f *size); /* MSB */ -H5_FCDLL int_f nh5pset_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len); /* MSB */ -H5_FCDLL int_f nh5pget_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint); /* MSB */ -H5_FCDLL int_f nh5pget_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len); /* MSB */ -H5_FCDLL int_f nh5pset_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint); /* MSB */ -H5_FCDLL int_f nh5pset_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len); /* MSB */ -H5_FCDLL int_f nh5pset_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense ); /* MSB */ -H5_FCDLL int_f nh5pset_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size ); /* MSB */ -H5_FCDLL int_f nh5pget_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size ); /* MSB */ -H5_FCDLL int_f nh5pset_attr_phase_change_c (hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense ); /* MSB */ -H5_FCDLL int_f nh5pset_nbit_c(hid_t_f *plist_id ); /* MSB */ -H5_FCDLL int_f nh5pset_scaleoffset_c(hid_t_f *plist_id, int_f *scale_type, int_f *scale_factor ); /* MSB */ -H5_FCDLL int_f nh5pset_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks); /* MSB */ -H5_FCDLL int_f nh5pget_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks); /* MSB */ +H5_FCDLL int_f nh5pget_attr_phase_change_c (hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense ); +H5_FCDLL int_f nh5pset_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags ); +H5_FCDLL int_f nh5pset_shared_mesg_nindexes_c(hid_t_f *plist_id, int_f *nindexes ); +H5_FCDLL int_f nh5pset_shared_mesg_index_c(hid_t_f *fcpl_id, int_f *index_num, int_f *mesg_type_flags, int_f *min_mesg_size); +H5_FCDLL int_f nh5pget_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags); +H5_FCDLL int_f nh5pset_libver_bounds_c(hid_t_f *fapl_id, int_f *low, int_f *high); +H5_FCDLL int_f nh5pset_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags); +H5_FCDLL int_f nh5pget_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense ); +H5_FCDLL int_f nh5pget_obj_track_times_c(hid_t_f *plist_id, int_f *flag); +H5_FCDLL int_f nh5pset_obj_track_times_c(hid_t_f *plist_id, int_f *flag); +H5_FCDLL int_f nh5pset_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group); +H5_FCDLL int_f nh5pget_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group); +H5_FCDLL int_f nh5pget_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags); +H5_FCDLL int_f nh5pset_char_encoding_c(hid_t_f *plist_id, int_f *encoding); +H5_FCDLL int_f nh5pget_char_encoding_c(hid_t_f *plist_id, int_f *encoding); +H5_FCDLL int_f nh5pset_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options); +H5_FCDLL int_f nh5pget_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options); +H5_FCDLL int_f nh5pget_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len, size_t_f *size); +H5_FCDLL int_f nh5pset_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len); +H5_FCDLL int_f nh5pget_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint); +H5_FCDLL int_f nh5pget_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len); +H5_FCDLL int_f nh5pset_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint); +H5_FCDLL int_f nh5pset_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len); +H5_FCDLL int_f nh5pset_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense ); +H5_FCDLL int_f nh5pset_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size ); +H5_FCDLL int_f nh5pget_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size ); +H5_FCDLL int_f nh5pset_attr_phase_change_c (hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense ); +H5_FCDLL int_f nh5pset_nbit_c(hid_t_f *plist_id ); +H5_FCDLL int_f nh5pset_scaleoffset_c(hid_t_f *plist_id, int_f *scale_type, int_f *scale_factor ); +H5_FCDLL int_f nh5pset_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks); +H5_FCDLL int_f nh5pget_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks); /* * Functions frome H5Rf.c */ @@ -1158,51 +1158,51 @@ H5_FCDLL int_f nh5zget_filter_info_c (int_f *filter, int_f *flag); /* * Functions from H5Lf.c */ -# define nh5lcopy_c H5_FC_FUNC_(h5lcopy_c, H5LCOPY_C) /*MSB*/ -# define nh5lcreate_external_c H5_FC_FUNC_(h5lcreate_external_c, H5LCREATE_EXTERNAL_C) /*MSB*/ -# define nh5lcreate_hard_c H5_FC_FUNC_(h5lcreate_hard_c, H5LCREATE_HARD_C) /*MSB*/ -# define nh5lcreate_soft_c H5_FC_FUNC_(h5lcreate_soft_c, H5LCREATE_SOFT_C) /*MSB*/ -# define nh5ldelete_c H5_FC_FUNC_(h5ldelete_c, H5LDELETE_C) /*MSB*/ -# define nh5ldelete_by_idx_c H5_FC_FUNC_(h5ldelete_by_idx_c, H5LDELETE_BY_IDX_C) /*MSB*/ -# define nh5lexists_c H5_FC_FUNC_(h5lexists_c, H5LEXISTS_C) /*MSB*/ -# define nh5lget_info_c H5_FC_FUNC_(h5lget_info_c, H5LGET_INFO_C) /*MSB*/ -# define nh5lget_info_by_idx_c H5_FC_FUNC_(h5lget_info_by_idx_c, H5LGET_INFO_BY_IDX_C) /*MSB*/ -# define nh5lis_registered_c H5_FC_FUNC_(h5lis_registered_c, H5LIS_REGISTERED_C) /*MSB*/ -# define nh5lmove_c H5_FC_FUNC_(h5lmove_c, H5LMOVE_C) /* MSB */ -# define nh5lget_name_by_idx_c H5_FC_FUNC_(h5lget_name_by_idx_c, H5LGET_NAME_BY_IDX_C) /* MSB */ -# define nh5lget_val_c H5_FC_FUNC_(h5lget_val_c, H5LGET_VAL_C) /* MSB */ +# define nh5lcopy_c H5_FC_FUNC_(h5lcopy_c, H5LCOPY_C) +# define nh5lcreate_external_c H5_FC_FUNC_(h5lcreate_external_c, H5LCREATE_EXTERNAL_C) +# define nh5lcreate_hard_c H5_FC_FUNC_(h5lcreate_hard_c, H5LCREATE_HARD_C) +# define nh5lcreate_soft_c H5_FC_FUNC_(h5lcreate_soft_c, H5LCREATE_SOFT_C) +# define nh5ldelete_c H5_FC_FUNC_(h5ldelete_c, H5LDELETE_C) +# define nh5ldelete_by_idx_c H5_FC_FUNC_(h5ldelete_by_idx_c, H5LDELETE_BY_IDX_C) +# define nh5lexists_c H5_FC_FUNC_(h5lexists_c, H5LEXISTS_C) +# define nh5lget_info_c H5_FC_FUNC_(h5lget_info_c, H5LGET_INFO_C) +# define nh5lget_info_by_idx_c H5_FC_FUNC_(h5lget_info_by_idx_c, H5LGET_INFO_BY_IDX_C) +# define nh5lis_registered_c H5_FC_FUNC_(h5lis_registered_c, H5LIS_REGISTERED_C) +# define nh5lmove_c H5_FC_FUNC_(h5lmove_c, H5LMOVE_C) +# define nh5lget_name_by_idx_c H5_FC_FUNC_(h5lget_name_by_idx_c, H5LGET_NAME_BY_IDX_C) +# define nh5lget_val_c H5_FC_FUNC_(h5lget_val_c, H5LGET_VAL_C) H5_FCDLL int_f nh5lcopy_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id, _fcd dest_name, size_t_f *dest_namelen, - hid_t_f *lcpl_id, hid_t_f *lapl_id); /*MSB*/ + hid_t_f *lcpl_id, hid_t_f *lapl_id); H5_FCDLL int_f nh5lcreate_external_c(_fcd file_name, size_t_f *file_namelen, _fcd obj_name, size_t_f *obj_namelen, hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, - hid_t_f *lcpl_id, hid_t_f *lapl_id); /*MSB*/ + hid_t_f *lcpl_id, hid_t_f *lapl_id); H5_FCDLL int_f nh5lcreate_hard_c(hid_t_f *obj_loc_id, _fcd obj_name, size_t_f *obj_namelen, hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, - hid_t_f *lcpl_id, hid_t_f *lapl_id ); /*MSB*/ + hid_t_f *lcpl_id, hid_t_f *lapl_id ); H5_FCDLL int_f nh5lcreate_soft_c(_fcd target_path, size_t_f *target_path_len, hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_name_len, - hid_t_f *lcpl_id, hid_t_f *lapl_id ); /*MSB*/ -H5_FCDLL int_f nh5ldelete_c( hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id ); /*MSB*/ + hid_t_f *lcpl_id, hid_t_f *lapl_id ); +H5_FCDLL int_f nh5ldelete_c( hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id ); H5_FCDLL int_f nh5ldelete_by_idx_c (hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, - int_f *index_field, int_f *order, hsize_t_f *n, hid_t_f *lapl_id); /*MSB*/ -H5_FCDLL int_f nh5lexists_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, int_f *link_exists); /*MSB*/ + int_f *index_field, int_f *order, hsize_t_f *n, hid_t_f *lapl_id); +H5_FCDLL int_f nh5lexists_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, int_f *link_exists); H5_FCDLL int_f nh5lget_info_c (hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, int_f *cset, int_f *corder, int_f *corder_valid, int_f *link_type, int_f *address, hsize_t_f *link_len, - hid_t_f *lapl_id); /*MSB*/ + hid_t_f *lapl_id); H5_FCDLL int_f nh5lget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, int_f *index_field, int_f *order, hsize_t_f *n, - int_f *corder_valid, int_f *corder, int_f *cset, hsize_t_f *data_size, hid_t_f *lapl_id); /*MSB*/ -H5_FCDLL int_f nh5lis_registered_c(int_f *link_cls_id); /*MSB*/ + int_f *corder_valid, int_f *corder, int_f *cset, hsize_t_f *data_size, hid_t_f *lapl_id); +H5_FCDLL int_f nh5lis_registered_c(int_f *link_cls_id); H5_FCDLL int_f nh5lmove_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id, - _fcd dest_name, size_t_f *dest_namelen, hid_t_f *lcpl_id, hid_t_f *lapl_id); /*MSB*/ + _fcd dest_name, size_t_f *dest_namelen, hid_t_f *lcpl_id, hid_t_f *lapl_id); H5_FCDLL int_f nh5lget_name_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, int_f *index_field, int_f *order, hsize_t_f *n, - size_t_f *size, _fcd name, hid_t_f *lapl_id); /*MSB*/ + size_t_f *size, _fcd name, hid_t_f *lapl_id); H5_FCDLL int_f nh5lget_val_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, size_t_f *size, void *linkval_buff, hid_t_f *lapl_id) ; diff --git a/fortran/src/H5test_kind.f90 b/fortran/src/H5test_kind.f90 index 802d8f9..db7178e 100644 --- a/fortran/src/H5test_kind.f90 +++ b/fortran/src/H5test_kind.f90 @@ -17,131 +17,131 @@ ! This fortran program generates H5fortran_detect.f90 ! ! - program test_kind - integer :: i, j, ii, last, kind_numbers(10) - integer :: jr, jd + PROGRAM test_kind + INTEGER :: i, j, ii, last, kind_numbers(10) + INTEGER :: jr, jd last = -1 ii = 0 - j = selected_int_kind(18) + j = SELECTED_INT_KIND(18) ! write(*,*) j - do i = 1,100 - j = selected_int_kind(i) - if(j .ne. last) then - if(last .ne. -1) then + DO i = 1,100 + j = SELECTED_INT_KIND(i) + IF(j .NE. last) THEN + IF(last .NE. -1) THEN ii = ii + 1 kind_numbers(ii) = last - endif + ENDIF last = j - if(j .eq. -1) exit - endif - enddo + IF(j .EQ. -1) EXIT + ENDIF + ENDDO ! write(*,*) kind_numbers(1:ii) ! Generate a program - write(*,*) "program int_kind" - write(*,*) "write(*,*) "" /*generating header file*/ """ + WRITE(*,*) "program int_kind" + WRITE(*,*) "write(*,*) "" /*generating header file*/ """ j = 0 - write(*, "("" call i"", i2.2,""()"")") j + WRITE(*, "("" call i"", i2.2,""()"")") j jr = 0 - write(*, "("" call r"", i2.2,""()"")") jr + WRITE(*, "("" call r"", i2.2,""()"")") jr jd = 0 - write(*, "("" call d"", i2.2,""()"")") jd - do i = 1, ii + WRITE(*, "("" call d"", i2.2,""()"")") jd + DO i = 1, ii j = kind_numbers(i) - write(*, "("" call i"", i2.2,""()"")") j - enddo - write(*,*) "end program int_kind" + WRITE(*, "("" call i"", i2.2,""()"")") j + ENDDO + WRITE(*,*) "end program int_kind" j = 0 - write(*, "("" subroutine i"" i2.2,""()"")") j - write(*,*)" implicit none" - write(*,*)" integer :: a = 0" - write(*,*)" integer :: a_size" - write(*,*)" a_size = bit_size(a)" - write(*,*)" if (a_size .eq. 8) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_1"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 16) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_2"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 32) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_4"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 64) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_8"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 128) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_16"" " - write(*,*)" endif" - write(*,*)" return" - write(*,*)" end subroutine" + WRITE(*, "("" subroutine i"", i2.2,""()"")") j + WRITE(*,*)" implicit none" + WRITE(*,*)" integer :: a = 0" + WRITE(*,*)" integer :: a_size" + WRITE(*,*)" a_size = bit_size(a)" + WRITE(*,*)" if (a_size .eq. 8) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_1"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 16) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_2"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 32) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_4"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 64) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_8"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 128) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_NATIVE_16"" " + WRITE(*,*)" endif" + WRITE(*,*)" return" + WRITE(*,*)" end subroutine" jr = 0 - write(*, "("" subroutine r"" i2.2,""()"")") j - write(*,*)" implicit none" - write(*,*)" real :: b(1) = 0" - write(*,*)" integer :: a(1) = 0" - write(*,*)" integer :: a_size" - write(*,*)" integer :: real_size" - write(*,*)" integer :: ab_size ! How many integers needed to hold a real" - write(*,*)" integer :: ba_size ! How many reals needed to hold an integer" - write(*,*)" a_size = bit_size(a(1)) ! Size in bits for integer" - write(*,*)" ab_size = size(transfer(b,a))" - write(*,*)" ba_size = size(transfer(a,b))" - write(*,*)" if (ab_size .eq. ba_size) real_size=a_size" - write(*,*)" if (ab_size .gt. ba_size) real_size=a_size*ba_size" - write(*,*)" if (ab_size .lt. ba_size) real_size=a_size/ba_size" - write(*,*)" if (real_size .eq. 32) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_REAL_NATIVE_4"" " - write(*,*)" endif" - write(*,*)" if (real_size .eq. 64) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_REAL_NATIVE_8"" " - write(*,*)" endif" - write(*,*)" if (real_size .eq. 128) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_REAL_NATIVE_16"" " - write(*,*)" endif" - write(*,*)" return" - write(*,*)" end subroutine" + WRITE(*, "("" subroutine r"", i2.2,""()"")") j + WRITE(*,*)" implicit none" + WRITE(*,*)" real :: b(1) = 0" + WRITE(*,*)" integer :: a(1) = 0" + WRITE(*,*)" integer :: a_size" + WRITE(*,*)" integer :: real_size" + WRITE(*,*)" integer :: ab_size ! How many integers needed to hold a real" + WRITE(*,*)" integer :: ba_size ! How many reals needed to hold an integer" + WRITE(*,*)" a_size = bit_size(a(1)) ! Size in bits for integer" + WRITE(*,*)" ab_size = size(transfer(b,a))" + WRITE(*,*)" ba_size = size(transfer(a,b))" + WRITE(*,*)" if (ab_size .eq. ba_size) real_size=a_size" + WRITE(*,*)" if (ab_size .gt. ba_size) real_size=a_size*ba_size" + WRITE(*,*)" if (ab_size .lt. ba_size) real_size=a_size/ba_size" + WRITE(*,*)" if (real_size .eq. 32) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_REAL_NATIVE_4"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (real_size .eq. 64) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_REAL_NATIVE_8"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (real_size .eq. 128) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_REAL_NATIVE_16"" " + WRITE(*,*)" endif" + WRITE(*,*)" return" + WRITE(*,*)" end subroutine" jd = 0 - write(*, "("" subroutine d"" i2.2,""()"")") jd - write(*,*)" implicit none" - write(*,*)" double precision :: b = 0" - write(*,*)" integer :: a(8) = 0" - write(*,*)" integer :: a_size" - write(*,*)" integer :: b_size" - write(*,*)" a_size = bit_size(a(1))" - write(*,*)" b_size = size(transfer(b,a))*a_size" - write(*,*)" if (b_size .eq. 64) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_DOUBLE_NATIVE_8"" " - write(*,*)" endif" - write(*,*)" if (b_size .eq. 128) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_DOUBLE_NATIVE_16"" " - write(*,*)" endif" - write(*,*)" return" - write(*,*)" end subroutine" - do i = 1, ii + WRITE(*, "("" subroutine d"", i2.2,""()"")") jd + WRITE(*,*)" implicit none" + WRITE(*,*)" double precision :: b = 0" + WRITE(*,*)" integer :: a(8) = 0" + WRITE(*,*)" integer :: a_size" + WRITE(*,*)" integer :: b_size" + WRITE(*,*)" a_size = bit_size(a(1))" + WRITE(*,*)" b_size = size(transfer(b,a))*a_size" + WRITE(*,*)" if (b_size .eq. 64) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_DOUBLE_NATIVE_8"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (b_size .eq. 128) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_DOUBLE_NATIVE_16"" " + WRITE(*,*)" endif" + WRITE(*,*)" return" + WRITE(*,*)" end subroutine" + DO i = 1, ii j = kind_numbers(i) - write(*, "("" subroutine i"" i2.2,""()"")") j - write(*,*)" implicit none" - write(*,*)" integer(",j,") :: a = 0" - write(*,*)" integer :: a_size" - write(*,*)" a_size = bit_size(a)" - write(*,*)" if (a_size .eq. 8) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_1"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 16) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_2"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 32) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_4"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 64) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_8"" " - write(*,*)" endif" - write(*,*)" if (a_size .eq. 128) then" - write(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_16"" " - write(*,*)" endif" - write(*,*)" return" - write(*,*)" end subroutine" - enddo - end program + WRITE(*, "("" subroutine i"", i2.2,""()"")") j + WRITE(*,*)" implicit none" + WRITE(*,*)" integer(",j,") :: a = 0" + WRITE(*,*)" integer :: a_size" + WRITE(*,*)" a_size = bit_size(a)" + WRITE(*,*)" if (a_size .eq. 8) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_1"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 16) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_2"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 32) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_4"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 64) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_8"" " + WRITE(*,*)" endif" + WRITE(*,*)" if (a_size .eq. 128) then" + WRITE(*,*)" write(*,*) ""#define H5_FORTRAN_HAS_INTEGER_16"" " + WRITE(*,*)" endif" + WRITE(*,*)" return" + WRITE(*,*)" end subroutine" + ENDDO + END PROGRAM diff --git a/fortran/test/tH5A_1_8.f90 b/fortran/test/tH5A_1_8.f90 index a74b63f..58408ee 100644 --- a/fortran/test/tH5A_1_8.f90 +++ b/fortran/test/tH5A_1_8.f90 @@ -25,7 +25,7 @@ SUBROUTINE attribute_test_1_8(cleanup, total_error) IMPLICIT NONE LOGICAL, INTENT(IN) :: cleanup - INTEGER, INTENT(OUT) :: total_error + INTEGER, INTENT(INOUT) :: total_error CHARACTER(LEN=5), PARAMETER :: filename = "atest" !File name CHARACTER(LEN=9), PARAMETER :: dsetname = "atestdset" !Dataset name @@ -2561,7 +2561,7 @@ SUBROUTINE test_attr_dense_open( fcpl, fapl, total_error) INTEGER(HID_T), INTENT(IN) :: fcpl INTEGER(HID_T), INTENT(IN) :: fapl - INTEGER, INTENT(IN) :: total_error + INTEGER, INTENT(INOUT) :: total_error CHARACTER(LEN=8) :: FileName = "tattr.h5" INTEGER(HID_T) :: fid INTEGER(HID_T) :: dcpl @@ -2824,7 +2824,7 @@ SUBROUTINE test_attr_corder_create_basic( fcpl, fapl, total_error ) INTEGER(HID_T), INTENT(IN) :: fcpl INTEGER(HID_T), INTENT(IN) :: fapl - INTEGER, INTENT(IN) :: total_error + INTEGER, INTENT(INOUT) :: total_error CHARACTER(LEN=8) :: FileName = "tattr.h5" INTEGER(HID_T) :: fid INTEGER(HID_T) :: dcpl @@ -3150,7 +3150,7 @@ SUBROUTINE test_attr_many(new_format, fcpl, fapl, total_error) LOGICAL, INTENT(IN) :: new_format INTEGER(HID_T), INTENT(IN) :: fcpl INTEGER(HID_T), INTENT(IN) :: fapl - INTEGER, INTENT(IN) :: total_error + INTEGER, INTENT(INOUT) :: total_error CHARACTER(LEN=8) :: FileName = "tattr.h5" INTEGER(HID_T) :: fid INTEGER(HID_T) :: sid diff --git a/fortran/test/tH5G_1_8.f90 b/fortran/test/tH5G_1_8.f90 index aea5248..8b5e5f2 100644 --- a/fortran/test/tH5G_1_8.f90 +++ b/fortran/test/tH5G_1_8.f90 @@ -1251,7 +1251,7 @@ SUBROUTINE delete_by_idx(cleanup, fapl, total_error) ! /* Verify link information for new link */ CALL link_info_by_idx_check(group_id, objname, u, & - .TRUE., use_index, total_error) + .TRUE., use_index(i), total_error) ENDDO ! /* Verify state of group (compact) */ diff --git a/fortran/test/tH5P.f90 b/fortran/test/tH5P.f90 index 76edd61..e8e3a1d 100644 --- a/fortran/test/tH5P.f90 +++ b/fortran/test/tH5P.f90 @@ -191,7 +191,7 @@ memb_map(H5FD_MEM_OHDR_F) = H5FD_MEM_OHDR_F memb_addr(H5FD_MEM_OHDR_F) = 0.4 - memb_name = '' + memb_name = ' ' memb_name(H5FD_MEM_SUPER_F) = '%s-s.h5' memb_name(H5FD_MEM_BTREE_F) = '%s-b.h5' memb_name(H5FD_MEM_DRAW_F) = '%s-r.h5' diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp index 4e7d306..77edce4 100644 --- a/hl/c++/test/ptableTest.cpp +++ b/hl/c++/test/ptableTest.cpp @@ -74,7 +74,6 @@ int main(void) return -1; } - int BasicTest() { herr_t err; diff --git a/hl/tools/Makefile.am b/hl/tools/Makefile.am index 5ef8a96..71eb149 100644 --- a/hl/tools/Makefile.am +++ b/hl/tools/Makefile.am @@ -22,6 +22,6 @@ include $(top_srcdir)/config/commence.am # All subdirectories -SUBDIRS=gif2h5 +SUBDIRS=gif2h5 include $(top_srcdir)/config/conclude.am diff --git a/hl/tools/Makefile.in b/hl/tools/Makefile.in index d89e847..6d486ec 100644 --- a/hl/tools/Makefile.in +++ b/hl/tools/Makefile.in @@ -324,7 +324,7 @@ TRACE = perl $(top_srcdir)/bin/trace CHECK_CLEANFILES = *.chkexe *.chklog *.clog # All subdirectories -SUBDIRS = gif2h5 +SUBDIRS = gif2h5 # Automake needs to be taught how to build lib, progs, and tests targets. # These will be filled in automatically for the most part (e.g., diff --git a/hl/tools/gif2h5/h52giftest.sh b/hl/tools/gif2h5/h52giftest.sh index 80f6910..7874bca 100644 --- a/hl/tools/gif2h5/h52giftest.sh +++ b/hl/tools/gif2h5/h52giftest.sh @@ -16,8 +16,8 @@ # HDF Utilities Test script -TESTFILE1="$srcdir/../testfiles/h52giftst.h5" -TESTFILE2="$srcdir/../testfiles/image1.gif" +TESTFILE1="$srcdir/testfiles/h52giftst.h5" +TESTFILE2="$srcdir/testfiles/image1.gif" # initialize errors variable errors=0 diff --git a/hl/tools/gif2h5/testfiles/h52giftst.h5 b/hl/tools/gif2h5/testfiles/h52giftst.h5 new file mode 100644 index 0000000..a827b3b Binary files /dev/null and b/hl/tools/gif2h5/testfiles/h52giftst.h5 differ diff --git a/hl/tools/gif2h5/testfiles/image1.gif b/hl/tools/gif2h5/testfiles/image1.gif new file mode 100644 index 0000000..b90b23a Binary files /dev/null and b/hl/tools/gif2h5/testfiles/image1.gif differ diff --git a/hl/tools/h52jpeg/Makefile.am b/hl/tools/h52jpeg/Makefile.am new file mode 100644 index 0000000..05ea153 --- /dev/null +++ b/hl/tools/h52jpeg/Makefile.am @@ -0,0 +1,46 @@ +# +# Copyright by The HDF Group. +# Copyright by the Board of Trustees of the University of Illinois. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have +# access to either file, you may request a copy from help@hdfgroup.org. +## +## Makefile.am +## Run automake to generate a Makefile.in from this file. +# +# HDF5 Library Makefile(.in) +# + +include $(top_srcdir)/config/commence.am + +# Include src and tools/lib directories +INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src + +# These are our main targets +TEST_PROG=h52jpegtst +TEST_SCRIPT=$(srcdir)/h52jpeg.sh + +check_SCRIPTS=$(TEST_SCRIPT) +check_PROGRAMS=$(TEST_PROG) + +bin_PROGRAMS=h52jpeg +noinst_PROGRAMS=h52jpegtst + +h52jpeg_SOURCES=h52jpeg.c +h52jpegtst_SOURCES=h52jpegtst.c + +# Programs all depend on the hdf5 library, the tools library, and the HL +# library. +LDADD=$(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -ljpeg + +CHECK_CLEANFILES+=*.h5 +CHECK_CLEANFILES+=*.jpeg + +include $(top_srcdir)/config/conclude.am diff --git a/hl/tools/h52jpeg/Makefile.in b/hl/tools/h52jpeg/Makefile.in new file mode 100644 index 0000000..f6b2328 --- /dev/null +++ b/hl/tools/h52jpeg/Makefile.in @@ -0,0 +1,882 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This Makefile.in 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. + +@SET_MAKE@ + +# +# Copyright by The HDF Group. +# Copyright by the Board of Trustees of the University of Illinois. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have +# access to either file, you may request a copy from help@hdfgroup.org. +# +# HDF5 Library Makefile(.in) +# + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/config/commence.am \ + $(top_srcdir)/config/conclude.am +check_PROGRAMS = $(am__EXEEXT_1) +bin_PROGRAMS = h52jpeg$(EXEEXT) +noinst_PROGRAMS = h52jpegtst$(EXEEXT) +TESTS = $(check_PROGRAMS) $(check_SCRIPTS) +subdir = hl/tools/h52jpeg +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/H5config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +am__EXEEXT_1 = h52jpegtst$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am_h52jpeg_OBJECTS = h52jpeg.$(OBJEXT) +h52jpeg_OBJECTS = $(am_h52jpeg_OBJECTS) +h52jpeg_LDADD = $(LDADD) +h52jpeg_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) +am_h52jpegtst_OBJECTS = h52jpegtst.$(OBJEXT) +h52jpegtst_OBJECTS = $(am_h52jpegtst_OBJECTS) +h52jpegtst_LDADD = $(LDADD) +h52jpegtst_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/bin/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(h52jpeg_SOURCES) $(h52jpegtst_SOURCES) +DIST_SOURCES = $(h52jpeg_SOURCES) $(h52jpegtst_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal +ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@ +AMTAR = @AMTAR@ +AM_MAKEFLAGS = @AM_MAKEFLAGS@ +AR = @AR@ + +# Set the paths for AFS installs of autotools for Linux machines +# Ideally, these tools should never be needed during the build. +AUTOCONF = /home1/packages/autoconf/autoconf-2.60/bin/autoconf +AUTOHEADER = /home1/packages/autoconf/autoconf-2.60/bin/autoheader +AUTOMAKE = /home1/packages/automake/automake-1.9.6/bin/automake-1.9 +AWK = @AWK@ +BYTESEX = @BYTESEX@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CC_VERSION = @CC_VERSION@ + +# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5, +# but which shouldn't be exported to h5cc for building other programs. +CFLAGS = @CFLAGS@ @H5_CFLAGS@ +CLEARFILEBUF = @CLEARFILEBUF@ +CODESTACK = @CODESTACK@ +CONFIG_DATE = @CONFIG_DATE@ +CONFIG_MODE = @CONFIG_MODE@ +CONFIG_USER = @CONFIG_USER@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_PKG = @DEBUG_PKG@ +DEFAULT_API_VERSION = @DEFAULT_API_VERSION@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@ +DIRECT_VFD = @DIRECT_VFD@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DYNAMIC_DIRS = @DYNAMIC_DIRS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXTERNAL_FILTERS = @EXTERNAL_FILTERS@ + +# Make sure that these variables are exported to the Makefiles +F9XMODEXT = @F9XMODEXT@ +F9XMODFLAG = @F9XMODFLAG@ +F9XSUFFIXFLAG = @F9XSUFFIXFLAG@ +FC = @FC@ +FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@ +FCFLAGS_f90 = @FCFLAGS_f90@ +FCLIBS = @FCLIBS@ +FGREP = @FGREP@ +FILTERS = @FILTERS@ +FSEARCH_DIRS = @FSEARCH_DIRS@ +GPFS = @GPFS@ +GREP = @GREP@ +H5_CFLAGS = @H5_CFLAGS@ +H5_CPPFLAGS = @H5_CPPFLAGS@ +H5_CXXFLAGS = @H5_CXXFLAGS@ +H5_FCFLAGS = @H5_FCFLAGS@ +H5_LONE_COLON = @H5_LONE_COLON@ +H5_VERSION = @H5_VERSION@ +HADDR_T = @HADDR_T@ +HAVE_DMALLOC = @HAVE_DMALLOC@ +HDF5_HL = @HDF5_HL@ +HDF5_INTERFACES = @HDF5_INTERFACES@ +HDF_CXX = @HDF_CXX@ +HDF_FORTRAN = @HDF_FORTRAN@ +HID_T = @HID_T@ +HL = @HL@ +HL_FOR = @HL_FOR@ +HSIZE_T = @HSIZE_T@ +HSSIZE_T = @HSSIZE_T@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTRUMENT = @INSTRUMENT@ +INSTRUMENT_LIBRARY = @INSTRUMENT_LIBRARY@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINUX_LFS = @LINUX_LFS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_STATIC_EXEC = @LT_STATIC_EXEC@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MPE = @MPE@ +MPI_GET_SIZE = @MPI_GET_SIZE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PARALLEL = @PARALLEL@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PTHREAD = @PTHREAD@ +RANLIB = @RANLIB@ +ROOT = @ROOT@ +RUNPARALLEL = @RUNPARALLEL@ +RUNSERIAL = @RUNSERIAL@ +R_INTEGER = @R_INTEGER@ +R_LARGE = @R_LARGE@ +SEARCH = @SEARCH@ +SED = @SED@ +SETX = @SETX@ +SET_MAKE = @SET_MAKE@ + +# Hardcode SHELL to be /bin/sh. Most machines have this shell, and +# on at least one machine configure fails to detect its existence (janus). +# Also, when HDF5 is configured on one machine but run on another, +# configure's automatic SHELL detection may not work on the build machine. +SHELL = /bin/sh +SIZE_T = @SIZE_T@ +STATIC_EXEC = @STATIC_EXEC@ +STATIC_SHARED = @STATIC_SHARED@ +STRICT_FORMAT_CHECKS = @STRICT_FORMAT_CHECKS@ +STRIP = @STRIP@ +TESTPARALLEL = @TESTPARALLEL@ +THREADSAFE = @THREADSAFE@ +TIME = @TIME@ +TR = @TR@ +TRACE_API = @TRACE_API@ +UNAME_INFO = @UNAME_INFO@ +USE_FILTER_DEFLATE = @USE_FILTER_DEFLATE@ +USE_FILTER_FLETCHER32 = @USE_FILTER_FLETCHER32@ +USE_FILTER_NBIT = @USE_FILTER_NBIT@ +USE_FILTER_SCALEOFFSET = @USE_FILTER_SCALEOFFSET@ +USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@ +USE_FILTER_SZIP = @USE_FILTER_SZIP@ +USINGMEMCHECKER = @USINGMEMCHECKER@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_FC = @ac_ct_FC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = $(exec_prefix)/doc +dvidir = @dvidir@ +enable_shared = @enable_shared@ +enable_static = @enable_static@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ + +# Install directories that automake doesn't know about +includedir = $(exec_prefix)/include +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Shell commands used in Makefiles +RM = rm -f +CP = cp + +# Some machines need a command to run executables; this is that command +# so that our tests will run. +# We use RUNTESTS instead of RUNSERIAL directly because it may be that +# some tests need to be run with a different command. Older versions +# of the makefiles used the command +# $(LIBTOOL) --mode=execute +# in some directories, for instance. +RUNTESTS = $(RUNSERIAL) + +# Libraries to link to while building +LIBHDF5 = $(top_builddir)/src/libhdf5.la +LIBH5TEST = $(top_builddir)/test/libh5test.la +LIBH5F = $(top_builddir)/fortran/src/libhdf5_fortran.la +LIBH5FTEST = $(top_builddir)/fortran/test/libh5test_fortran.la +LIBH5CPP = $(top_builddir)/c++/src/libhdf5_cpp.la +LIBH5TOOLS = $(top_builddir)/tools/lib/libh5tools.la +LIBH5_HL = $(top_builddir)/hl/src/libhdf5_hl.la +LIBH5F_HL = $(top_builddir)/hl/fortran/src/libhdf5hl_fortran.la +LIBH5CPP_HL = $(top_builddir)/hl/c++/src/libhdf5_hl_cpp.la + +# Scripts used to build examples +# If only shared libraries have been installed, have h5cc build examples with +# shared libraries instead of static libraries +H5CC = $(bindir)/h5cc +H5CC_PP = $(bindir)/h5pcc +H5FC = $(bindir)/h5fc +H5FC_PP = $(bindir)/h5pfc +H5CPP = $(bindir)/h5c++ + +# The trace script; this is used on source files from the C library to +# insert tracing macros. +TRACE = perl $(top_srcdir)/bin/trace + +# .chkexe files are used to mark tests that have run successfully. +# .chklog files are output from those tests. +# *.clog are from the MPE option. +CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.h5 *.jpeg + +# Include src and tools/lib directories +INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src + +# These are our main targets +TEST_PROG = h52jpegtst +TEST_SCRIPT = $(srcdir)/h52jpeg.sh +check_SCRIPTS = $(TEST_SCRIPT) +h52jpeg_SOURCES = h52jpeg.c +h52jpegtst_SOURCES = h52jpegtst.c + +# Programs all depend on the hdf5 library, the tools library, and the HL +# library. +LDADD = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -ljpeg + +# Automake needs to be taught how to build lib, progs, and tests targets. +# These will be filled in automatically for the most part (e.g., +# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and +# EXTRA_TEST variables are supplied to allow the user to force targets to +# be built at certain times. +LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES) \ + $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB) + +PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS) \ + $(EXTRA_PROG) + +TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_) +TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_) +TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_) +TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/tools/h52jpeg/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign hl/tools/h52jpeg/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +h52jpeg$(EXEEXT): $(h52jpeg_OBJECTS) $(h52jpeg_DEPENDENCIES) + @rm -f h52jpeg$(EXEEXT) + $(LINK) $(h52jpeg_OBJECTS) $(h52jpeg_LDADD) $(LIBS) +h52jpegtst$(EXEEXT): $(h52jpegtst_OBJECTS) $(h52jpegtst_DEPENDENCIES) + @rm -f h52jpegtst$(EXEEXT) + $(LINK) $(h52jpegtst_OBJECTS) $(h52jpegtst_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h52jpeg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h52jpegtst.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) all-local +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libtool clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool mostlyclean-local + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ + clean clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \ + pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# List all build rules defined by HDF5 Makefiles as "PHONY" targets here. +# This tells the Makefiles that these targets are not files to be built but +# commands that should be executed even if a file with the same name already +# exists. +.PHONY: build-check-clean build-check-p build-check-s build-lib build-progs \ + build-tests check-clean check-install check-p check-s check-vfd \ + install-doc lib progs tests uninstall-doc _exec_check-s _test help + +help: + @$(top_srcdir)/bin/makehelp + +# lib/progs/tests targets recurse into subdirectories. build-* targets +# build files in this directory. +build-lib: $(LIB) +build-progs: $(LIB) $(PROGS) +build-tests: $(LIB) $(PROGS) $(TESTS) + +# General rule for recursive building targets. +# BUILT_SOURCES contain targets that need to be built before anything else +# in the directory (e.g., for Fortran type detection) +lib progs tests check-s check-p :: $(BUILT_SOURCES) + @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1; + @for d in X $(SUBDIRS); do \ + if test $$d != X && test $$d != .; then \ + (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ + fi; \ + done + +# General rule for recursive cleaning targets. Like the rule above, +# but doesn't require building BUILT_SOURCES. +check-clean :: + @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1; + @for d in X $(SUBDIRS); do \ + if test $$d != X && test $$d != .; then \ + (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ + fi; \ + done + +# Tell Automake to build tests when the user types `make all' (this is +# not its default behavior). Also build EXTRA_LIB and EXTRA_PROG since +# Automake won't build them automatically, either. +all-local: $(EXTRA_LIB) $(EXTRA_PROG) $(TESTS) + +# make install-doc doesn't do anything outside of doc directory, but +# Makefiles should recognize it. +# UPDATE: docs no longer reside in this build tree, so this target +# is depreciated. +install-doc uninstall-doc: + @echo "Nothing to be done." + +# clean up files generated by tests so they can be re-run. +build-check-clean: + $(RM) -rf $(CHECK_CLEANFILES) + +# run check-clean whenever mostlyclean is run +mostlyclean-local: build-check-clean + +# check-install is just a synonym for installcheck +check-install: installcheck + +# Run each test in order, passing $(TEST_FLAGS) to the program. +# Since tests are done in a shell loop, "make -i" does apply inside it. +# Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop. +# The timestamps give a rough idea how much time the tests use. +# +# Note that targets in TESTS (defined above) will be built when the user +# types 'make tests' or 'make check', but only programs in TEST_PROG, +# TEST_PROG_PARA, or TEST_SCRIPT will actually be executed. +check-TESTS: test + +test _test: + @$(MAKE) build-check-s + @$(MAKE) build-check-p + +# Actual execution of check-s. +build-check-s: $(LIB) $(PROGS) $(TESTS) + @if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then \ + echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \ + fi + @$(MAKE) $(AM_MAKEFLAGS) _exec_check-s + @if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then \ + echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\ + fi + +_exec_check-s: $(TEST_PROG_CHKEXE) $(TEST_SCRIPT_CHKSH) + +# The dummy.chkexe here prevents the target from being +# empty if there are no tests in the current directory. +# $${log} is the log file. +# $${tname} is the name of test. +$(TEST_PROG_CHKEXE) $(TEST_PROG_PARA_CHKEXE) dummy.chkexe_: + @if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummy.chkexe_"; then \ + tname=$(@:.chkexe_=)$(EXEEXT);\ + log=$(@:.chkexe_=.chklog); \ + echo "============================"; \ + if $(top_srcdir)/bin/newer $(@:.chkexe_=.chkexe) $${tname}; then \ + echo "No need to test $${tname} again."; \ + else \ + echo "============================" > $${log}; \ + if test "X$(FORTRAN_API)" = "Xyes"; then \ + echo "Fortran API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \ + echo "Fortran API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ + elif test "X$(CXX_API)" = "Xyes"; then \ + echo "C++ API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \ + echo "C++ API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log};\ + else \ + echo "Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \ + echo "$(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ + fi; \ + echo "============================" >> $${log}; \ + srcdir="$(srcdir)" \ + $(TIME) $(RUNTESTS) ./$${tname} $(TEST_FLAGS) >> $${log} 2>&1 \ + && touch $(@:.chkexe_=.chkexe) || \ + (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \ + (cat $${log} && false) || exit 1; \ + echo "" >> $${log}; \ + echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \ + echo "============================" >> $${log}; \ + echo "Finished testing $${tname} $(TEST_FLAGS)"; \ + cat $${log}; \ + fi; \ + fi + +# The dummysh.chkexe here prevents the target from being +# empty if there are no tests in the current directory. +# $${log} is the log file. +# $${tname} is the name of test. +$(TEST_SCRIPT_CHKSH) $(TEST_SCRIPT_PARA_CHKSH) dummysh.chkexe_: + @if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummysh.chkexe_"; then \ + cmd=$(@:.chkexe_=);\ + tname=`basename $$cmd`;\ + chkname=`basename $(@:.chkexe_=.chkexe)`;\ + log=`basename $(@:.chkexe_=.chklog)`; \ + echo "============================"; \ + if $(top_srcdir)/bin/newer $${chkname} $$cmd $(SCRIPT_DEPEND); then \ + echo "No need to test $${tname} again."; \ + else \ + echo "============================" > $${log}; \ + if test "X$(FORTRAN_API)" = "Xyes"; then \ + echo "Fortran API: Testing $${tname} $(TEST_FLAGS)"; \ + echo "Fortran API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ + elif test "X$(CXX_API)" = "Xyes"; then \ + echo "C++ API: Testing $${tname} $(TEST_FLAGS)"; \ + echo "C++ API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ + else \ + echo "Testing $${tname} $(TEST_FLAGS)"; \ + echo "$${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ + fi; \ + echo "============================" >> $${log}; \ + RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)" \ + srcdir="$(srcdir)" \ + $(TIME) $(SHELL) $$cmd $(TEST_FLAGS) >> $${log} 2>&1 \ + && touch $${chkname} || \ + (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \ + (cat $${log} && false) || exit 1; \ + echo "" >> $${log}; \ + echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \ + echo "============================" >> $${log}; \ + echo "Finished testing $${tname} $(TEST_FLAGS)"; \ + cat $${log}; \ + fi; \ + echo "============================"; \ + fi + +# Actual execution of check-p. +build-check-p: $(LIB) $(PROGS) $(TESTS) + @if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then \ + echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \ + fi + @if test -n "$(TEST_PROG_PARA)"; then \ + echo "**** Hint ****"; \ + echo "Parallel test files reside in the current directory" \ + "by default."; \ + echo "Set HDF5_PARAPREFIX to use another directory. E.g.,"; \ + echo " HDF5_PARAPREFIX=/PFS/user/me"; \ + echo " export HDF5_PARAPREFIX"; \ + echo " make check"; \ + echo "**** end of Hint ****"; \ + fi + @for test in $(TEST_PROG_PARA) dummy; do \ + if test $$test != dummy; then \ + $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ \ + RUNTESTS="$(RUNPARALLEL)" || exit 1; \ + fi; \ + done + @for test in $(TEST_SCRIPT_PARA) dummy; do \ + if test $$test != dummy; then \ + $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ || exit 1; \ + fi; \ + done + @if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then \ + echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\ + fi + +# Run test with different Virtual File Driver +check-vfd: $(LIB) $(PROGS) $(TESTS) + @for vfd in $(VFD_LIST) dummy; do \ + if test $$vfd != dummy; then \ + echo "============================"; \ + echo "Testing Virtual File Driver $$vfd"; \ + echo "============================"; \ + $(MAKE) $(AM_MAKEFLAGS) check-clean || exit 1; \ + HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \ + fi; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/hl/tools/h52jpeg/h52jpeg.c b/hl/tools/h52jpeg/h52jpeg.c new file mode 100644 index 0000000..c4dacd1 --- /dev/null +++ b/hl/tools/h52jpeg/h52jpeg.c @@ -0,0 +1,753 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + + +#include +#include + +/* + * Include file for users of JPEG library. + * system headers that define at least the typedefs FILE and size_t are needed before + */ + +#include "jpeglib.h" +#include "jerror.h" + +/* Tools library and HDF5 Image headers */ + +#include "H5private.h" +#include "h5tools.h" +#include "h5tools_utils.h" +#include "h5trav.h" +#include "H5IMpublic.h" + + +const char *progname = "h52jpeg"; +int d_status = EXIT_SUCCESS; + +/* command-line options: The user can specify short or long-named parameters */ +static const char *s_opts = "hVvi:cp:"; +static struct long_options l_opts[] = { + { "help", no_arg, 'h' }, + { "version", no_arg, 'V' }, + { "verbose", no_arg, 'v' }, + { "image", require_arg, 'i' }, + { "convert", no_arg, 'c' }, + { "palette", require_arg, 'p' }, + { NULL, 0, '\0' } +}; + + +/* a structure that contains h52jpeg options */ +typedef struct +{ + const char *file_name; + const char *template_name; + const char *image_name; + int convert_true; + int idx_palette; + int verbose; +} h52jpeg_opt_t; + + +/* prototypes */ +static void usage(const char *prog); +static int h52jpeg(h52jpeg_opt_t opt); +static void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name); +static int do_object(hid_t fid, h52jpeg_opt_t opt, const char* image_name); +static int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name, char* jpeg_name); +static void write_JPEG_file(char *filename, JSAMPLE *image_buffer, int image_height, int image_width, int planes); +static void convert_to_true( hsize_t width, hsize_t height, unsigned char* ibuf, unsigned char* pbuf, unsigned char* tbuf); + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: h52jpeg main program + * + * main reads command line options and calls h52jpeg + * + * Programmer: Pedro Vicente, pvn@hdfgroup.org + * + * Return: 1, error, 0 success + * + * Date: May 30, 2008 + * + *------------------------------------------------------------------------- + */ +int main(int argc, const char *argv[]) +{ + h52jpeg_opt_t opt; /* command line options for h52jpeg */ + int op; /* option got from command line */ + + /* initialze options to 0 */ + memset(&opt,0,sizeof(h52jpeg_opt_t)); + + /* parse command line options */ + while ((op = get_option(argc, argv, s_opts, l_opts)) != EOF) + { + switch ((char)op) + { + + case 'h': + usage(progname); + exit(EXIT_SUCCESS); + + case 'V': + print_version(progname); + exit(EXIT_SUCCESS); + + case 'v': + opt.verbose = 1; + break; + + case 'i': + opt.image_name = opt_arg; + break; + + case 'c': + opt.convert_true = 1; + + break; + case 'p': + opt.idx_palette = atoi(opt_arg); + break; + + } /* switch */ + + + } /* while */ + + /* check for file names to be processed */ + if ( argv[ opt_ind ] != NULL && argv[ opt_ind + 1 ] != NULL ) + { + opt.file_name = argv[ opt_ind ]; + opt.template_name = argv[ opt_ind + 1 ]; + } + + else + { + usage(progname); + exit(EXIT_FAILURE); + } + + if ( h52jpeg(opt) < 0 ) + return 1; + + + return 0; +} + + + +/*------------------------------------------------------------------------- + * Function: usage + * + * Purpose: print usage + * + * Return: void + * + *------------------------------------------------------------------------- + */ +static void usage(const char *prog) +{ + printf("usage: %s [OPTIONS] file template\n", prog); + printf(" file HDF5 file name\n"); + printf(" template Name template for jpeg images\n"); + printf(" OPTIONS\n"); + printf(" -h, --help Print a usage message and exit\n"); + printf(" -v, --verbose Verbose mode, print object information\n"); + printf(" -V, --version Print HDF5 version number and exit\n"); + printf(" -i, --image Image name (full path in HDF5 file)\n"); + printf(" -c, --convert Convert image from graycolor to truecolor\n"); + printf(" -p P, --palette=P Use HDF5 palette index P in conversion -c\n"); + + printf("\n"); + + printf(" P - is an integer, the palette index in the HDF5 image. Default is 0\n"); + printf(" template - is a string used to name the jpeg file name; this name is made\n"); + printf(" by concatenating this template with the HDF5 image name\n"); + + printf("\n"); + + printf("Examples of use:\n"); + printf("\n"); + printf("1) h52jpeg -v file.h5 myjpeg\n"); + printf("\n"); + printf(" Exports all images found on file.h5 to jpeg images, giving output information\n"); + + printf("\n"); + printf("2) h52jpeg -v -i image file.h5 myjpeg\n"); + printf("\n"); + printf(" Exports the HDF5 image named to a jpeg file\n"); + + printf("\n"); + printf("2) h52jpeg -v -c p 1 -i image file.h5 myjpeg\n"); + printf("\n"); + printf(" Exports the HDF5 image named to a true color jpeg image, using\n"); + printf(" the palette of index 1 in that image to do the conversion\n"); + + +} + +/*------------------------------------------------------------------------- + * Function: h52jpeg + * + * Parameters: OPT, options at command line + * + * Purpose: traverse the HDF5 file, save HDF5 images to jpeg files + * + * Return: 0, success, -1 error + * + *------------------------------------------------------------------------- + */ +static int h52jpeg(h52jpeg_opt_t opt) +{ + hid_t fid; + trav_table_t *travt = NULL; + size_t i; + + + /* open the HDF5 file */ + if (( fid = h5tools_fopen(opt.file_name, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) + { + error_msg(progname, "cannot open file <%s>\n", opt.file_name ); + return -1; + } + + /*------------------------------------------------------------------------- + * object name was specified at command line + *------------------------------------------------------------------------- + */ + + if ( opt.image_name ) + { + /* read object, save jpeg image */ + do_object(fid, opt, opt.image_name); + + } + + /*------------------------------------------------------------------------- + * object name was not specified; traverse the file + *------------------------------------------------------------------------- + */ + + else + + { + + /* initialize traversal table */ + trav_table_init(&travt); + + /* get the list of objects in the file */ + if ( h5trav_gettable(fid, travt) < 0 ) + goto out; + + /* search for images/datasets in file */ + for ( i = 0; i < travt->nobjs; i++) + { + + switch ( travt->objs[i].type ) + { + default: + printf( "unknown object. Exiting ...\n" ); + goto out; + + case H5TRAV_TYPE_GROUP: + case H5TRAV_TYPE_NAMED_DATATYPE: + case H5TRAV_TYPE_LINK: + case H5TRAV_TYPE_UDLINK: + + break; + + case H5TRAV_TYPE_DATASET: + + /* read object, save jpeg image */ + do_object(fid, opt, travt->objs[i].name); + + break; /* H5TRAV_TYPE_DATASET */ + + } /* switch */ + + } /* i */ + + + /* HDfree table */ + trav_table_free(travt); + + } /* opt.image_name */ + + + /* close */ + if ( H5Fclose(fid) < 0 ) + return -1; + + return 0; + +out: + H5E_BEGIN_TRY + { + H5Fclose(fid); + + } H5E_END_TRY; + + trav_table_free(travt); + + + return -1; +} + + +/*------------------------------------------------------------------------- + * Function: do_object + * + * Parameters: FID: HDF5 file id + * OPT: command line options + * OBJECT_NAME: the name of the object (type H5TRAV_TYPE_DATASET) + * + * Purpose: make the jpeg file name, read HDF5 image, save the jpeg image + * + * + * Return: 0, success, -1 error + * + *------------------------------------------------------------------------- + */ +static +int do_object(hid_t fid, h52jpeg_opt_t opt, const char* object_name) +{ + int done=0; /* return value from do_image */ + char jpeg_name[1024]; + + /* build the jpeg file name */ + make_jpeg_name( opt.template_name, object_name, jpeg_name); + + if ( opt.verbose) + { + printf("%s ...", object_name ); + } + + /*------------------------------------------------------------------------- + * HDF5 Image + *------------------------------------------------------------------------- + */ + + if ( H5IMis_image( fid, object_name ) ) + { + /* read image, save jpeg image */ + done = do_image(fid, opt, object_name, jpeg_name); + } + + + if ( opt.verbose) + { + if ( done ) + { + printf("saved to %s\n", jpeg_name ); + } + else + { + printf("\n"); + } + + } + + return 0; + + +} + + +/*------------------------------------------------------------------------- + * Function: do_image + * + * Parameters: FID: HDF5 file id + * OPT: command line options + * OBJECT_NAME: the name of the HDF5 image + * JPEG_NAME: the name of the jpeg image + * + * Purpose: read HDF5 image, save jpeg image + * + * Return: 0, success, -1 error + * + *------------------------------------------------------------------------- + */ +static +int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name, char* jpeg_name) +{ + hsize_t width; + hsize_t height; + hsize_t planes; + char interlace[20]; + hssize_t npals; + const char* name; + int done; + unsigned char* ibuf=NULL; + + name = image_name; + + done = 0; + + if ( H5IMget_image_info( fid, name, &width, &height, &planes, interlace, &npals ) < 0 ) + goto out; + + if (NULL == (ibuf = HDmalloc( (int)width * (int)height * (int)planes ))) + goto out; + + if ( H5IMread_image( fid, name, ibuf ) < 0 ) + { + goto out; + } + + /*------------------------------------------------------------------------- + * no conversion to true color requested or true color image, just save what we found + * this will result either in + * + * 24bit HDF5 ---> true color jpeg + * 8bit HDF5 ---> grey color jpeg + * + *------------------------------------------------------------------------- + */ + if ( planes == 3 || !opt.convert_true ) + { + /* write the jpeg file */ + write_JPEG_file (jpeg_name, + ibuf, + (int) height, + (int) width, + (int) planes); + + done = 1; + } + /*------------------------------------------------------------------------- + * conversion to truecolor + * this will result in + * + * 8bit HDF5 ---> true color jpeg + * + *------------------------------------------------------------------------- + */ + else if (opt.convert_true && planes == 1 ) + { + hsize_t pdims[2]; /* palette dimensions */ + unsigned char *pbuf=NULL;/* palette array */ + unsigned char *tbuf=NULL;/* true color array */ + int ipal; /* palette to use */ + + if ( H5IMget_npalettes( fid, name, &npals ) < 0 ) + { + goto out; + } + + /*------------------------------------------------------------------------- + * there are palettes + *------------------------------------------------------------------------- + */ + if ( npals > 0 ) + { + /* use either the default (0) palette or a requested one */ + ipal = ( opt.idx_palette > 0 ) ? opt.idx_palette : 0; + + /* the requested palette may not exist . use the default */ + if ( opt.idx_palette >= npals ) + { + ipal = 0; + + if ( opt.verbose ) + { + printf("palette index <%d> does not exist. Using default...", + opt.idx_palette ); + } + } + + + if ( H5IMget_palette_info( fid, name, ipal, pdims ) < 0 ) + goto out; + + if (NULL == (pbuf = HDmalloc( (size_t)pdims[0] * (size_t)pdims[1] ))) + goto out; + + if (NULL == (tbuf = HDmalloc( (int)width * (int)height * 3 ))) + goto out; + + if ( H5IMget_palette( fid, name, ipal, pbuf ) < 0 ) + goto out; + + /* convert indexed image to true color image */ + convert_to_true(width, height, ibuf, pbuf, tbuf); + + /* write the jpeg file */ + write_JPEG_file (jpeg_name, + tbuf, + (int) height, + (int) width, + 3); + + done = 1; + + HDfree( pbuf ); + HDfree( tbuf ); + pbuf = NULL; + tbuf = NULL; + } + /*------------------------------------------------------------------------- + * there are no palettes + *------------------------------------------------------------------------- + */ + else + { + done = 0; + if ( opt.verbose ) + { + printf("image <%s> has no palette...", name ); + } + } /* no palettes */ + + } /* conversion to truecolor */ + + HDfree( ibuf ); + ibuf = NULL; + + return done; + +out: + + return -1; + +} + +/*------------------------------------------------------------------------- + * Function: make_jpeg_name + * + * Parameters: template name (IN), image name (IN), jpeg name (IN/OUT) + * + * Purpose: build a name for the jpeg image file upon a template name + * and the HDF5 image name. Replace the special characters + * '%', '@', '$', '/', ':', '&', ' ', and '*' with '_' + * + * Return: void + * + *------------------------------------------------------------------------- + */ +static +void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name) +{ + int j; + int len; + + HDstrcpy( jpeg_name, template_name ); + HDstrcat( jpeg_name, image_name ); + HDstrcat( jpeg_name, ".jpeg" ); + len = HDstrlen( jpeg_name); + + /* HDF5 path names might contain '/', replace with '_' */ + for (j = 0; j < len; j++) + { + if ( (jpeg_name[j] == '/') || + (jpeg_name[j] == '%') || + (jpeg_name[j] == '@') || + (jpeg_name[j] == '$') || + (jpeg_name[j] == '/') || + (jpeg_name[j] == ':') || + (jpeg_name[j] == '&') || + (jpeg_name[j] == ' ') || + (jpeg_name[j] == '*') ) + { + jpeg_name[j] = '_'; + } + } + +} + +/*------------------------------------------------------------------------- + * Function: convert_to_true + * + * Parameters: WIDTH (IN): width of image + * HEIGHT (IN): height of image + * IBUF (IN): indexed image buffer + * PBUF (IN): palette buffer + * TBUF (IN/OUT): true color image buffer + * + * Purpose: convert a greycolor buffer to a true color buffer using a palette buffer + * + * Return: void + * + *------------------------------------------------------------------------- + */ +static +void convert_to_true( hsize_t width, hsize_t height, unsigned char* ibuf, unsigned char* pbuf, unsigned char* tbuf) +{ + hsize_t i, j; + + for ( i = 0, j = 0; i < width * height; i++, j += 3) + { + unsigned char idx; + unsigned char r; + unsigned char g; + unsigned char b; + + /* get the index from the grey image */ + idx = ibuf[i]; + + /* get the RGB color */ + r = pbuf[3*idx]; + g = pbuf[3*idx+1]; + b = pbuf[3*idx+2]; + + /* define the color buffer */ + tbuf[j] = r; + tbuf[j+1] = g; + tbuf[j+2] = b; + + } + + +} + + +/*------------------------------------------------------------------------- + * Function: write_JPEG_file (adapted from example.c of jpeg distribution) + * + * Purpose: save a jpeg file named FILENAME, using the image buffer IMAGE_BUFFER + * + * The standard input image format is a rectangular array of pixels, with + * each pixel having the same number of "component" values (color channels). + * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). + * If you are working with color data, then the color values for each pixel + * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit + * RGB color. + * + * Return: void, exits on error + * + *------------------------------------------------------------------------- + */ + +static +void write_JPEG_file(char *filename, /* JPEG file name */ + JSAMPLE *image_buffer, /* Points to large array of R,G,B-order data */ + int image_height, /* Number of rows in image */ + int image_width, /* Number of columns in image */ + int planes) /* # of color components per pixel */ +{ + /* This struct contains the JPEG compression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + * It is possible to have several such structures, representing multiple + * compression/decompression processes, in existence at once. We refer + * to any one struct (and its associated working data) as a "JPEG object". + */ + struct jpeg_compress_struct cinfo; + /* This struct represents a JPEG error handler. It is declared separately + * because applications often want to supply a specialized error handler + * (see the second half of this file for an example). But here we just + * take the easy way out and use the standard error handler, which will + * print a message on stderr and call exit() if compression fails. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct jpeg_error_mgr jerr; + /* More stuff */ + FILE * outfile; /* target file */ + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ + + /* Step 1: allocate and initialize JPEG compression object */ + + /* We have to set up the error handler first, in case the initialization + * step fails. (Unlikely, but it could happen if you are out of memory.) + * This routine fills in the contents of struct jerr, and returns jerr's + * address which we place into the link field in cinfo. + */ + cinfo.err = jpeg_std_error(&jerr); + /* Now we can initialize the JPEG compression object. */ + jpeg_create_compress(&cinfo); + + /* Step 2: specify data destination (eg, a file) */ + /* Note: steps 2 and 3 can be done in either order. */ + + /* Here we use the library-supplied code to send compressed data to a + * stdio stream. You can also write your own code to do something else. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to write binary files. + */ + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + + /* Step 3: set parameters for compression */ + + /* First we supply a description of the input image. + * Four fields of the cinfo struct must be filled in: + */ + cinfo.image_width = image_width; /* image width and height, in pixels */ + cinfo.image_height = image_height; + cinfo.input_components = planes; /* # of color components per pixel */ + + /* colorspace of input image */ + if (planes == 3) + cinfo.in_color_space = JCS_RGB; + else if (planes == 1) + cinfo.in_color_space = JCS_GRAYSCALE; + + /* Now use the library's routine to set default compression parameters. + * (You must set at least cinfo.in_color_space before calling this, + * since the defaults depend on the source color space.) + */ + jpeg_set_defaults(&cinfo); + /* Now you can set any non-default parameters you wish to. + * Here we just illustrate the use of quality (quantization table) scaling: + */ + jpeg_set_quality(&cinfo, 100, TRUE /* limit to baseline-JPEG values */); + + /* Step 4: Start compressor */ + + /* TRUE ensures that we will write a complete interchange-JPEG file. + * Pass TRUE unless you are very sure of what you're doing. + */ + jpeg_start_compress(&cinfo, TRUE); + + /* Step 5: while (scan lines remain to be written) */ + /* jpeg_write_scanlines(...); */ + + /* Here we use the library's state variable cinfo.next_scanline as the + * loop counter, so that we don't have to keep track ourselves. + * To keep things simple, we pass one scanline per call; you can pass + * more if you wish, though. + */ + row_stride = image_width * planes; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + /* jpeg_write_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could pass + * more than one scanline at a time if that's more convenient. + */ + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + + /* Step 6: Finish compression */ + + jpeg_finish_compress(&cinfo); + /* After finish_compress, we can close the output file. */ + fclose(outfile); + + /* Step 7: release JPEG compression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_compress(&cinfo); + + /* And we're done! */ +} + diff --git a/hl/tools/h52jpeg/h52jpeg.sh b/hl/tools/h52jpeg/h52jpeg.sh new file mode 100644 index 0000000..f9b1e2c --- /dev/null +++ b/hl/tools/h52jpeg/h52jpeg.sh @@ -0,0 +1,96 @@ +#! /bin/sh +# +# Copyright by The HDF Group. +# Copyright by the Board of Trustees of the University of Illinois. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have +# access to either file, you may request a copy from help@hdfgroup.org. +# +# Tests for the h52jpeg tool +# Pedro Vicente Nunes (THG), 6/16/2008 + +TOOL=h52jpeg # The tool name +TOOL_BIN=`pwd`/$TOOL # The path of the tool binary + +SRCFILE=h52jpegtst.h5 +INDIR=$srcdir/testfiles +TESTFILE="$INDIR/$SRCFILE" + +nerrors=0 + + +# Print a line-line message left justified in a field of 70 characters +# beginning with the word "Testing". +# +TESTING() { + SPACES=" " + echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012' +} + +# Just call the tool binary with the command line parameters +# and use the return value of main to print FAILED or PASSED +# +TOOLTEST() +{ + # Run test. + # Tflops interprets "$@" as "" when no parameter is given (e.g., the + # case of missing file name). Changed it to use $@ till Tflops fixes it. + + if [ "`uname -s`" = "TFLOPS O/S" ]; then + $RUNSERIAL $TOOL_BIN $@ + else + $RUNSERIAL $TOOL_BIN "$@" + fi + + RET=$? + if [ $RET != 0 ] ; then + echo "*FAILED*" + nerrors="`expr $nerrors + 1`" + else + echo " PASSED" + fi +} + + + +############################################################################## +# The tests +# To avoid the printing of the complete full path of the test file, that hides +# all the other parameters for long paths, the printing of the command line +# is done first in +# TESTING with the name only of the test file $TOOL, not its full path $TESTFILE +############################################################################## + + + +# Test for traversing the file and export all images using defaults +TESTING $TOOL $SRCFILE myjpeg1 +TOOLTEST $TESTFILE myjpeg1 + +# Test for reading an image path +TESTING $TOOL -i im8_1pal $SRCFILE myjpeg2 +TOOLTEST -i im8_1pal $TESTFILE myjpeg2 + +# Test for conversion HDF5 8bit ---> jpeg true, use the default palette +TESTING $TOOL -c $SRCFILE myjpeg3 +TOOLTEST -c $TESTFILE myjpeg3 + +# Test for conversion HDF5 8bit ---> jpeg true, use a palette +TESTING $TOOL -c -p 1 $SRCFILE myjpeg4 +TOOLTEST -c -p 1 $TESTFILE myjpeg4 + + + +if test $nerrors -eq 0 ; then + echo "All $TOOL tests passed." +fi + +exit $nerrors + diff --git a/hl/tools/h52jpeg/h52jpegtst.c b/hl/tools/h52jpeg/h52jpegtst.c new file mode 100644 index 0000000..08ad7d4 --- /dev/null +++ b/hl/tools/h52jpeg/h52jpegtst.c @@ -0,0 +1,268 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include "H5private.h" +#include "h52jpegtst.h" +#include +#include + +#define IM_1PAL "im8_1pal" +#define IM_2PAL "im8_2pal" +#define PAL1 "pal1" +#define PAL2 "pal2" + +static int make_images( hid_t fid ); +static int read_data(const char* fname, hsize_t *width, hsize_t *height ); +unsigned char *gbuf = NULL; /* global buffer for image data */ + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: h52jpegtst main program. Generate images to be used + * by h52jpeg tests + * + * Programmer: Pedro Vicente, pvn@hdfgroup.org + * + * Date: May 30, 2008 + * + *------------------------------------------------------------------------- + */ +int main( void ) +{ + hid_t fid; /* HDF5 file identifier */ + + /* create a new HDF5 file using default properties. */ + if (( fid = H5Fcreate( "h52jpegtst.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT )) < 0 ) + return 1; + + /* make images */ + if ( make_images( fid ) < 0 ) + goto out; + + /* close the file. */ + H5Fclose( fid ); + + return 0; + +out: + printf("Error on return function...Exiting\n"); + H5Fclose( fid ); + return 1; +} + +/*------------------------------------------------------------------------- + * Function: make_images + * + * Purpose: generate images + * + *------------------------------------------------------------------------- + */ + +static int make_images( hid_t fid ) +{ + hid_t gid; + hsize_t width; /* width of image */ + hsize_t height; /* height of image */ + hsize_t pal_dims[2] = {PAL_ENTRIES,3}; /* palette dimensions */ + unsigned char pal[ PAL_ENTRIES * 3 ]; /* palette array */ + int i, n; + + /*------------------------------------------------------------------------- + * indexed image with 1 palette + *------------------------------------------------------------------------- + */ + + /* read first data file */ + if ( read_data( "image8.txt", &width, &height ) < 0 ) + goto out; + + /* make the image */ + if ( H5IMmake_image_8bit( fid, IM_1PAL, width, height, gbuf ) < 0 ) + goto out; + + /* make a palette */ + if ( H5IMmake_palette( fid, PAL1, pal_dims, pal_rgb ) < 0 ) + goto out; + + /* attach the 1st palette to the image */ + if ( H5IMlink_palette( fid, IM_1PAL, PAL1 ) < 0 ) + { + goto out; + } + + /*------------------------------------------------------------------------- + * indexed image with 2 palettes + *------------------------------------------------------------------------- + */ + + /* make the image */ + if ( H5IMmake_image_8bit( fid, IM_2PAL, width, height, gbuf ) < 0 ) + goto out; + + /* attach the 1st palette to the image */ + if ( H5IMlink_palette( fid, IM_2PAL, PAL1 ) < 0 ) + { + goto out; + } + + /*------------------------------------------------------------------------- + * define another palette, green tones + *------------------------------------------------------------------------- + */ + for ( i = 0, n = 0; i < PAL_ENTRIES*3; i+=3, n++) + { + pal[i] =0; /* red */ + pal[i+1]=n; /* green */ + pal[i+2]=0; /* blue */ + } + + /* save the palette */ + if ( H5IMmake_palette( fid, PAL2, pal_dims, pal ) < 0 ) + goto out; + + /* attach the palette to the image */ + if ( H5IMlink_palette( fid, IM_2PAL, PAL2 ) < 0 ) + { + goto out; + } + + /*------------------------------------------------------------------------- + * make another image, in a group and no palette + *------------------------------------------------------------------------- + */ + + if (( gid = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) + goto out; + + /* make the image with a name with "%", "@", "$", "/", ":", "&", and "*" */ + if ( H5IMmake_image_8bit( gid, "1%2@3$45:6&7*", width, height, gbuf ) < 0 ) + goto out; + + H5Gclose(gid); + + + /*------------------------------------------------------------------------- + * true color image with pixel interlace in RGB type + *------------------------------------------------------------------------- + */ + + /* read second data file */ + if ( read_data( "image24pixel.txt", &width, &height ) < 0 ) + goto out; + + /* make dataset */ + if ( H5IMmake_image_24bit( fid, "img24", width, height, "INTERLACE_PIXEL", gbuf ) < 0 ) + goto out; + + return 0; + +out: + printf("Error on return function...Exiting\n"); + return -1; +} + + + + + +/*------------------------------------------------------------------------- + * read_data + * utility function to read ASCII image data + * the files have a header of the type + * + * components + * n + * height + * n + * width + * n + * + * followed by the image data + * + *------------------------------------------------------------------------- + */ + +static int read_data( const char* fname, /*IN*/ + hsize_t *width, /*OUT*/ + hsize_t *height /*OUT*/ ) +{ + int i, n; + int color_planes; + char str[20]; + FILE *f; + int w, h; + char *srcdir = getenv("srcdir"); /* the source directory */ + char data_file[512]=""; /* buffer to hold name of existing data file */ + + /*------------------------------------------------------------------------- + * compose the name of the file to open, using "srcdir", if appropriate + *------------------------------------------------------------------------- + */ + strcpy(data_file, ""); + if (srcdir) + { + strcpy(data_file, srcdir); + strcat(data_file, "/"); + } + strcat(data_file,fname); + + /*------------------------------------------------------------------------- + * read + *------------------------------------------------------------------------- + */ + + f = fopen(data_file, "r"); + if ( f == NULL ) + { + printf( "Could not open file %s. Try set $srcdir \n", data_file ); + return -1; + } + + fscanf( f, "%s", str ); + fscanf( f, "%d", &color_planes ); + fscanf( f, "%s", str ); + fscanf( f, "%d", &h); + fscanf( f, "%s", str ); + fscanf( f, "%d", &w); + + *width = (hsize_t)w; + *height = (hsize_t)h; + + if ( gbuf ) + { + free( gbuf ); + gbuf=NULL; + } + + gbuf = (unsigned char*) malloc (w * h * color_planes * sizeof( unsigned char )); + + for (i = 0; i < h * w * color_planes ; i++) + { + fscanf( f, "%d",&n ); + gbuf[i] = (unsigned char)n; + } + fclose(f); + + return 1; + +} + + + + + diff --git a/hl/tools/h52jpeg/h52jpegtst.h b/hl/tools/h52jpeg/h52jpegtst.h new file mode 100644 index 0000000..749e571 --- /dev/null +++ b/hl/tools/h52jpeg/h52jpegtst.h @@ -0,0 +1,286 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +#ifndef _PAL_RGB_H +#define _PAL_RGB_H + +#define PAL_ENTRIES 256 + +const unsigned char pal_rgb[PAL_ENTRIES*3] = {0,0,0, +0,0,131, +0,0,135, +0,0,139, +0,0,143, +0,0,147, +0,0,151, +0,0,155, +0,0,159, +0,0,163, +0,0,167, +0,0,171, +0,0,175, +0,0,179, +0,0,183, +0,0,187, +0,0,191, +0,0,195, +0,0,199, +0,0,203, +0,0,207, +0,0,211, +0,0,215, +0,0,219, +0,0,223, +0,0,227, +0,0,231, +0,0,235, +0,0,239, +0,0,243, +0,0,247, +0,0,251, +0,0,255, +0,0,255, +0,3,255, +0,7,255, +0,11,255, +0,15,255, +0,19,255, +0,23,255, +0,27,255, +0,31,255, +0,35,255, +0,39,255, +0,43,255, +0,47,255, +0,51,255, +0,55,255, +0,59,255, +0,63,255, +0,67,255, +0,71,255, +0,75,255, +0,79,255, +0,83,255, +0,87,255, +0,91,255, +0,95,255, +0,99,255, +0,103,255, +0,107,255, +0,111,255, +0,115,255, +0,119,255, +0,123,255, +0,127,255, +0,131,255, +0,135,255, +0,139,255, +0,143,255, +0,147,255, +0,151,255, +0,155,255, +0,159,255, +0,163,255, +0,167,255, +0,171,255, +0,175,255, +0,179,255, +0,183,255, +0,187,255, +0,191,255, +0,195,255, +0,199,255, +0,203,255, +0,207,255, +0,211,255, +0,215,255, +0,219,255, +0,223,255, +0,227,255, +0,231,255, +0,235,255, +0,239,255, +0,243,255, +0,247,255, +0,251,255, +0,255,255, +0,255,255, +3,255,251, +7,255,247, +11,255,243, +15,255,239, +19,255,235, +23,255,231, +27,255,227, +31,255,223, +35,255,219, +39,255,215, +43,255,211, +47,255,207, +51,255,203, +55,255,199, +59,255,195, +63,255,191, +67,255,187, +71,255,183, +75,255,179, +79,255,175, +83,255,171, +87,255,167, +91,255,163, +95,255,159, +99,255,155, +103,255,151, +107,255,147, +111,255,143, +115,255,139, +119,255,135, +123,255,131, +127,255,127, +131,255,123, +135,255,119, +139,255,115, +143,255,111, +147,255,107, +151,255,103, +155,255,99, +159,255,95, +163,255,91, +167,255,87, +171,255,83, +175,255,79, +179,255,75, +183,255,71, +187,255,67, +191,255,63, +195,255,59, +199,255,55, +203,255,51, +207,255,47, +211,255,43, +215,255,39, +219,255,35, +223,255,31, +227,255,27, +231,255,23, +235,255,19, +239,255,15, +243,255,11, +247,255,7, +251,255,3, +255,255,0, +255,251,0, +255,247,0, +255,243,0, +255,239,0, +255,235,0, +255,231,0, +255,227,0, +255,223,0, +255,219,0, +255,215,0, +255,211,0, +255,207,0, +255,203,0, +255,199,0, +255,195,0, +255,191,0, +255,187,0, +255,183,0, +255,179,0, +255,175,0, +255,171,0, +255,167,0, +255,163,0, +255,159,0, +255,155,0, +255,151,0, +255,147,0, +255,143,0, +255,139,0, +255,135,0, +255,131,0, +255,127,0, +255,123,0, +255,119,0, +255,115,0, +255,111,0, +255,107,0, +255,103,0, +255,99,0, +255,95,0, +255,91,0, +255,87,0, +255,83,0, +255,79,0, +255,75,0, +255,71,0, +255,67,0, +255,63,0, +255,59,0, +255,55,0, +255,51,0, +255,47,0, +255,43,0, +255,39,0, +255,35,0, +255,31,0, +255,27,0, +255,23,0, +255,19,0, +255,15,0, +255,11,0, +255,7,0, +255,3,0, +255,0,0, +250,0,0, +246,0,0, +241,0,0, +237,0,0, +233,0,0, +228,0,0, +224,0,0, +219,0,0, +215,0,0, +211,0,0, +206,0,0, +202,0,0, +197,0,0, +193,0,0, +189,0,0, +184,0,0, +180,0,0, +175,0,0, +171,0,0, +167,0,0, +162,0,0, +158,0,0, +153,0,0, +149,0,0, +145,0,0, +140,0,0, +136,0,0, +131,0,0, +127,0,0 +}; + + + +#endif /* _PAL_RGB_H */ + + + + diff --git a/hl/tools/h52jpeg/image24pixel.txt b/hl/tools/h52jpeg/image24pixel.txt new file mode 100644 index 0000000..8af73f2 --- /dev/null +++ b/hl/tools/h52jpeg/image24pixel.txt @@ -0,0 +1,101475 @@ +components +3 +height +149 +width +227 +48 +47 +45 +48 +47 +45 +49 +48 +46 +50 +49 +47 +53 +49 +46 +53 +49 +46 +54 +50 +47 +54 +50 +47 +56 +51 +47 +56 +51 +47 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +50 +47 +57 +49 +46 +57 +49 +46 +56 +48 +45 +56 +48 +45 +57 +49 +46 +57 +49 +46 +58 +50 +47 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +54 +46 +43 +54 +46 +43 +54 +46 +43 +53 +45 +42 +53 +45 +42 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +50 +45 +41 +47 +42 +36 +47 +44 +37 +47 +44 +37 +48 +45 +38 +49 +46 +39 +50 +47 +40 +51 +48 +41 +51 +48 +41 +54 +51 +44 +54 +51 +44 +55 +52 +45 +56 +53 +46 +56 +53 +46 +57 +54 +47 +58 +55 +48 +58 +55 +46 +65 +58 +48 +66 +60 +48 +68 +62 +50 +70 +64 +52 +73 +65 +52 +74 +66 +53 +75 +67 +54 +75 +67 +54 +77 +68 +53 +77 +68 +53 +79 +67 +51 +78 +66 +50 +79 +67 +51 +79 +67 +51 +80 +68 +52 +82 +69 +53 +82 +63 +49 +89 +63 +50 +98 +64 +52 +110 +66 +53 +125 +69 +54 +139 +72 +56 +153 +71 +57 +163 +70 +55 +175 +71 +58 +184 +71 +57 +190 +69 +58 +197 +71 +59 +199 +71 +62 +202 +71 +63 +203 +72 +64 +208 +69 +64 +231 +70 +76 +237 +67 +76 +235 +68 +75 +235 +69 +73 +238 +67 +73 +239 +66 +68 +241 +62 +66 +244 +61 +65 +248 +59 +65 +247 +58 +64 +244 +58 +63 +240 +60 +63 +233 +63 +64 +226 +64 +62 +215 +63 +60 +203 +65 +55 +187 +61 +47 +181 +64 +46 +181 +64 +46 +180 +63 +45 +180 +63 +45 +179 +64 +45 +178 +63 +45 +175 +64 +45 +173 +64 +44 +170 +65 +44 +166 +65 +45 +162 +66 +44 +159 +64 +42 +155 +65 +41 +152 +64 +42 +150 +65 +44 +148 +62 +45 +146 +63 +47 +146 +63 +47 +145 +62 +46 +145 +62 +44 +144 +61 +43 +146 +60 +43 +146 +60 +43 +148 +63 +43 +148 +63 +43 +148 +61 +42 +148 +61 +42 +148 +61 +42 +149 +62 +43 +150 +63 +44 +150 +64 +47 +150 +63 +54 +149 +62 +53 +151 +61 +50 +159 +63 +49 +169 +66 +51 +179 +68 +51 +188 +68 +52 +191 +68 +52 +185 +63 +48 +181 +65 +50 +172 +70 +56 +158 +72 +59 +135 +72 +57 +111 +65 +50 +84 +56 +42 +67 +51 +38 +61 +53 +50 +57 +53 +52 +57 +53 +52 +55 +51 +50 +55 +49 +49 +54 +48 +48 +53 +48 +45 +53 +48 +45 +55 +50 +47 +55 +50 +47 +55 +50 +47 +54 +49 +46 +54 +49 +45 +53 +48 +44 +53 +48 +44 +52 +49 +44 +47 +47 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +48 +47 +45 +48 +47 +45 +50 +46 +45 +50 +46 +45 +53 +44 +45 +52 +43 +44 +52 +42 +43 +51 +41 +42 +55 +40 +43 +61 +46 +49 +69 +54 +57 +80 +58 +60 +106 +66 +67 +124 +73 +72 +141 +77 +77 +149 +79 +79 +159 +87 +91 +170 +100 +110 +170 +111 +131 +159 +116 +144 +148 +123 +163 +135 +127 +174 +128 +134 +186 +126 +136 +189 +115 +121 +173 +96 +97 +145 +84 +75 +118 +80 +68 +104 +83 +74 +103 +79 +71 +94 +77 +72 +94 +84 +81 +98 +102 +100 +111 +124 +125 +130 +141 +145 +144 +153 +158 +152 +163 +169 +159 +162 +168 +154 +158 +160 +147 +143 +146 +129 +123 +124 +108 +102 +103 +85 +88 +87 +69 +81 +78 +69 +85 +82 +91 +85 +81 +98 +85 +81 +98 +48 +47 +45 +48 +47 +45 +49 +48 +46 +49 +48 +46 +52 +48 +45 +53 +49 +46 +54 +50 +47 +54 +50 +47 +56 +51 +47 +56 +51 +47 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +57 +49 +46 +57 +49 +46 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +57 +49 +46 +57 +49 +46 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +54 +46 +43 +54 +46 +43 +53 +45 +42 +53 +45 +42 +53 +45 +42 +52 +44 +41 +52 +44 +41 +52 +44 +41 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +51 +46 +42 +48 +43 +37 +48 +45 +38 +48 +45 +38 +49 +46 +39 +50 +47 +40 +51 +48 +41 +52 +49 +42 +52 +49 +42 +54 +51 +44 +54 +51 +44 +55 +52 +45 +55 +52 +45 +56 +53 +46 +57 +54 +47 +58 +55 +48 +58 +55 +46 +64 +57 +47 +65 +59 +47 +67 +61 +49 +69 +63 +51 +72 +64 +51 +73 +65 +52 +74 +66 +53 +74 +66 +53 +76 +67 +52 +76 +67 +52 +77 +65 +49 +77 +65 +49 +77 +65 +49 +78 +66 +50 +79 +67 +51 +81 +68 +52 +80 +62 +48 +85 +63 +49 +94 +65 +51 +106 +67 +52 +120 +68 +54 +132 +69 +52 +146 +69 +53 +156 +67 +51 +167 +67 +52 +175 +65 +52 +181 +65 +52 +188 +66 +55 +192 +68 +58 +196 +69 +60 +197 +70 +61 +205 +67 +64 +225 +69 +73 +231 +66 +73 +232 +67 +73 +234 +68 +72 +237 +68 +71 +239 +66 +68 +243 +64 +67 +246 +63 +67 +248 +59 +65 +247 +58 +64 +244 +58 +63 +240 +60 +63 +233 +63 +64 +224 +65 +62 +213 +64 +60 +202 +64 +54 +185 +62 +47 +181 +64 +46 +180 +63 +45 +180 +63 +45 +180 +63 +45 +178 +63 +44 +176 +63 +45 +175 +64 +45 +173 +64 +44 +169 +64 +43 +166 +65 +45 +161 +65 +43 +159 +64 +42 +155 +65 +41 +152 +64 +42 +150 +65 +44 +148 +62 +45 +146 +63 +47 +145 +62 +46 +145 +62 +46 +145 +62 +44 +144 +61 +43 +146 +60 +43 +146 +60 +43 +148 +63 +43 +147 +62 +42 +148 +61 +42 +148 +61 +42 +148 +61 +42 +149 +62 +43 +150 +63 +44 +150 +64 +47 +148 +64 +53 +149 +62 +53 +152 +62 +51 +160 +62 +49 +171 +65 +51 +181 +68 +52 +189 +67 +52 +191 +68 +53 +187 +65 +50 +183 +67 +54 +172 +70 +56 +156 +73 +59 +133 +71 +58 +108 +64 +51 +83 +57 +42 +66 +52 +41 +62 +54 +51 +58 +54 +53 +57 +53 +52 +56 +52 +51 +56 +50 +50 +55 +49 +49 +54 +49 +46 +54 +49 +46 +55 +50 +47 +55 +50 +47 +55 +50 +47 +54 +49 +46 +54 +49 +45 +53 +48 +44 +53 +48 +44 +52 +49 +44 +47 +47 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +48 +47 +45 +48 +47 +45 +50 +46 +45 +50 +46 +45 +51 +45 +45 +53 +44 +45 +52 +42 +43 +51 +41 +42 +53 +41 +43 +60 +45 +48 +67 +52 +55 +78 +56 +58 +100 +62 +61 +118 +69 +65 +134 +74 +73 +143 +78 +76 +154 +84 +86 +164 +97 +106 +165 +108 +125 +157 +114 +142 +145 +123 +162 +134 +128 +174 +127 +133 +185 +123 +132 +187 +111 +117 +169 +91 +91 +141 +81 +72 +117 +79 +67 +105 +79 +70 +101 +79 +71 +95 +80 +72 +95 +82 +78 +95 +91 +89 +102 +110 +111 +116 +131 +135 +136 +148 +153 +149 +153 +158 +151 +154 +160 +148 +153 +157 +143 +143 +145 +131 +126 +127 +111 +106 +107 +89 +93 +91 +76 +86 +83 +74 +88 +83 +90 +86 +82 +97 +88 +81 +97 +47 +46 +44 +47 +46 +44 +48 +47 +45 +49 +48 +46 +52 +48 +45 +52 +48 +45 +53 +49 +46 +53 +49 +46 +55 +50 +46 +55 +50 +46 +55 +50 +46 +55 +50 +46 +57 +50 +44 +57 +50 +44 +57 +50 +44 +57 +50 +44 +57 +49 +46 +56 +48 +46 +55 +47 +45 +55 +47 +45 +55 +47 +45 +55 +47 +45 +56 +48 +46 +57 +49 +47 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +54 +46 +44 +53 +45 +43 +53 +45 +43 +53 +45 +43 +52 +44 +42 +52 +44 +42 +52 +44 +42 +52 +44 +42 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +51 +46 +42 +50 +45 +39 +49 +46 +39 +50 +47 +40 +51 +48 +41 +51 +48 +41 +52 +49 +42 +52 +49 +42 +53 +50 +43 +54 +51 +44 +54 +51 +44 +54 +51 +44 +55 +52 +45 +56 +53 +46 +57 +54 +47 +57 +54 +47 +58 +55 +46 +63 +56 +46 +64 +58 +46 +66 +60 +48 +68 +62 +50 +71 +63 +52 +72 +64 +53 +72 +64 +51 +72 +64 +51 +73 +64 +49 +73 +64 +49 +75 +63 +49 +75 +63 +49 +75 +63 +47 +76 +64 +48 +77 +65 +49 +78 +66 +50 +77 +65 +49 +81 +65 +49 +89 +66 +50 +100 +67 +50 +113 +67 +51 +124 +67 +50 +135 +66 +50 +146 +65 +48 +152 +60 +45 +160 +58 +43 +167 +59 +46 +175 +61 +50 +181 +64 +54 +186 +68 +58 +191 +70 +61 +197 +68 +62 +217 +67 +69 +225 +64 +70 +227 +66 +71 +231 +66 +70 +234 +68 +70 +240 +67 +69 +244 +65 +68 +248 +63 +68 +250 +59 +64 +249 +58 +63 +245 +59 +64 +240 +61 +64 +232 +64 +64 +220 +65 +61 +209 +64 +59 +198 +64 +53 +183 +61 +46 +179 +64 +45 +179 +64 +45 +178 +63 +44 +178 +63 +45 +176 +63 +45 +175 +62 +44 +173 +64 +44 +170 +63 +45 +167 +64 +45 +165 +64 +44 +161 +65 +43 +157 +65 +44 +154 +63 +42 +152 +64 +42 +149 +64 +43 +148 +62 +45 +145 +62 +46 +145 +62 +46 +145 +62 +46 +144 +61 +43 +144 +61 +43 +144 +61 +43 +144 +61 +43 +145 +62 +44 +145 +62 +44 +146 +60 +43 +146 +60 +43 +147 +61 +44 +147 +61 +44 +148 +63 +43 +149 +63 +46 +149 +65 +54 +150 +63 +53 +154 +62 +51 +163 +62 +50 +175 +65 +52 +185 +67 +53 +191 +68 +53 +193 +67 +53 +192 +68 +56 +184 +70 +59 +174 +73 +61 +153 +74 +61 +129 +71 +59 +104 +64 +52 +81 +58 +44 +66 +53 +44 +63 +55 +52 +61 +55 +55 +60 +54 +54 +58 +52 +52 +57 +52 +49 +56 +51 +48 +55 +50 +47 +55 +50 +47 +54 +50 +47 +54 +50 +47 +54 +50 +47 +53 +49 +46 +53 +50 +45 +52 +49 +44 +52 +49 +44 +50 +49 +44 +46 +48 +45 +44 +49 +45 +46 +48 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +48 +47 +45 +50 +46 +45 +53 +47 +47 +52 +46 +46 +53 +44 +45 +52 +42 +43 +52 +42 +43 +57 +45 +47 +62 +50 +52 +73 +53 +54 +91 +57 +55 +108 +63 +57 +124 +69 +64 +134 +73 +68 +144 +79 +77 +152 +91 +96 +155 +102 +118 +148 +109 +136 +140 +119 +158 +131 +125 +173 +125 +130 +185 +117 +126 +183 +102 +109 +164 +84 +86 +137 +77 +69 +118 +76 +65 +107 +77 +65 +101 +79 +70 +99 +81 +72 +99 +77 +72 +94 +78 +75 +92 +91 +91 +101 +113 +116 +121 +133 +137 +136 +135 +140 +134 +138 +143 +136 +141 +144 +133 +134 +138 +124 +120 +122 +108 +102 +105 +88 +90 +91 +77 +86 +83 +76 +90 +85 +91 +90 +84 +96 +91 +83 +96 +46 +45 +43 +47 +46 +44 +47 +46 +44 +48 +47 +45 +51 +47 +44 +52 +48 +45 +52 +48 +45 +52 +48 +45 +54 +49 +45 +54 +49 +45 +54 +49 +45 +54 +49 +45 +56 +49 +43 +56 +49 +43 +56 +49 +43 +56 +49 +43 +55 +47 +45 +55 +47 +45 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +55 +47 +45 +55 +47 +45 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +53 +45 +43 +53 +45 +43 +53 +45 +43 +52 +44 +42 +52 +44 +42 +52 +44 +42 +51 +43 +41 +51 +43 +41 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +52 +47 +44 +51 +48 +43 +51 +48 +41 +51 +48 +41 +52 +49 +42 +52 +49 +42 +53 +50 +43 +53 +50 +43 +53 +50 +43 +53 +50 +43 +53 +50 +43 +54 +51 +44 +55 +52 +45 +56 +53 +46 +56 +53 +46 +57 +54 +47 +57 +54 +45 +62 +55 +45 +63 +57 +45 +64 +58 +46 +66 +60 +48 +69 +61 +50 +69 +61 +50 +70 +62 +49 +70 +62 +49 +71 +61 +49 +71 +62 +47 +72 +60 +46 +73 +61 +47 +73 +61 +47 +74 +62 +46 +76 +64 +48 +74 +65 +48 +75 +68 +50 +78 +69 +52 +85 +68 +52 +94 +68 +51 +105 +68 +50 +115 +66 +49 +126 +65 +47 +134 +63 +45 +140 +57 +41 +148 +57 +39 +157 +57 +42 +163 +60 +45 +172 +64 +51 +179 +69 +56 +184 +72 +60 +193 +70 +62 +210 +68 +67 +218 +65 +67 +222 +66 +67 +226 +68 +67 +231 +67 +68 +236 +66 +67 +243 +64 +67 +247 +63 +65 +250 +59 +64 +249 +58 +63 +245 +59 +64 +238 +62 +64 +229 +65 +64 +218 +66 +61 +205 +64 +57 +194 +64 +51 +181 +61 +45 +176 +64 +44 +176 +64 +44 +176 +64 +44 +175 +62 +44 +174 +63 +44 +174 +63 +44 +172 +63 +43 +169 +64 +45 +166 +63 +44 +163 +64 +43 +160 +64 +42 +156 +64 +43 +152 +64 +42 +150 +64 +41 +148 +63 +42 +145 +62 +44 +145 +62 +46 +145 +62 +46 +144 +61 +45 +144 +61 +43 +144 +61 +43 +143 +60 +42 +143 +60 +42 +144 +61 +43 +144 +61 +43 +143 +60 +42 +143 +60 +42 +146 +60 +43 +145 +62 +44 +148 +62 +45 +146 +63 +45 +149 +65 +54 +150 +63 +53 +156 +62 +50 +166 +64 +52 +178 +66 +54 +188 +67 +56 +193 +67 +55 +194 +66 +55 +194 +70 +60 +186 +74 +63 +172 +76 +64 +151 +75 +62 +124 +70 +58 +98 +64 +52 +76 +58 +46 +65 +55 +45 +64 +56 +53 +62 +57 +54 +61 +55 +55 +60 +55 +52 +58 +53 +50 +57 +52 +49 +56 +51 +48 +56 +51 +48 +54 +50 +47 +54 +50 +47 +54 +50 +47 +51 +50 +46 +53 +50 +45 +50 +49 +44 +50 +49 +44 +49 +50 +45 +45 +50 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +48 +48 +46 +48 +48 +46 +49 +48 +46 +49 +48 +46 +53 +49 +48 +54 +48 +48 +53 +47 +47 +53 +44 +45 +52 +43 +44 +54 +44 +45 +58 +48 +49 +68 +50 +50 +84 +55 +49 +99 +59 +51 +113 +65 +55 +123 +69 +59 +130 +72 +68 +137 +82 +85 +141 +95 +108 +139 +105 +130 +131 +115 +152 +125 +121 +171 +120 +125 +181 +111 +119 +181 +96 +102 +162 +81 +82 +139 +76 +69 +121 +76 +64 +112 +76 +64 +104 +80 +69 +103 +81 +70 +102 +76 +67 +94 +71 +66 +86 +77 +76 +90 +94 +94 +102 +106 +110 +113 +117 +121 +120 +120 +125 +119 +122 +128 +118 +119 +122 +111 +107 +111 +97 +96 +98 +84 +87 +89 +76 +84 +84 +76 +93 +87 +89 +93 +86 +93 +93 +86 +94 +45 +45 +45 +45 +45 +45 +46 +45 +43 +47 +46 +44 +48 +47 +45 +49 +48 +46 +51 +47 +44 +52 +48 +45 +51 +47 +44 +51 +47 +44 +52 +47 +43 +52 +47 +43 +52 +47 +43 +52 +47 +43 +54 +47 +41 +54 +47 +41 +52 +47 +44 +52 +47 +44 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +52 +47 +44 +52 +47 +44 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +51 +46 +43 +51 +46 +43 +50 +45 +42 +50 +45 +42 +50 +45 +42 +49 +44 +41 +49 +44 +41 +49 +44 +41 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +53 +50 +45 +53 +50 +45 +53 +50 +45 +53 +50 +45 +53 +50 +45 +54 +51 +46 +54 +51 +46 +55 +52 +47 +56 +53 +48 +57 +54 +49 +57 +54 +47 +60 +53 +45 +61 +54 +44 +63 +56 +46 +64 +57 +47 +66 +58 +47 +67 +59 +48 +67 +59 +48 +67 +59 +46 +68 +58 +46 +68 +58 +46 +70 +58 +46 +71 +59 +45 +72 +60 +46 +73 +61 +47 +74 +62 +48 +73 +64 +49 +74 +71 +54 +77 +72 +53 +82 +71 +53 +89 +70 +53 +98 +69 +51 +106 +68 +49 +117 +66 +47 +125 +62 +44 +130 +59 +41 +139 +58 +41 +147 +58 +42 +154 +61 +44 +163 +66 +50 +172 +70 +56 +178 +74 +61 +187 +73 +63 +204 +71 +66 +212 +68 +67 +216 +68 +66 +221 +69 +66 +226 +66 +66 +233 +65 +65 +240 +61 +64 +244 +60 +62 +249 +58 +63 +248 +58 +60 +244 +60 +62 +237 +63 +62 +225 +66 +62 +211 +67 +58 +197 +65 +53 +185 +63 +48 +178 +63 +45 +174 +63 +44 +174 +63 +44 +174 +63 +44 +173 +62 +45 +172 +62 +45 +172 +62 +45 +170 +63 +45 +168 +62 +46 +164 +63 +45 +160 +63 +44 +158 +63 +43 +154 +63 +44 +151 +63 +43 +149 +62 +42 +147 +62 +42 +145 +62 +44 +144 +63 +46 +143 +62 +45 +143 +62 +45 +143 +62 +45 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +143 +60 +44 +143 +62 +45 +145 +62 +46 +144 +63 +46 +148 +66 +52 +151 +65 +52 +157 +64 +49 +168 +64 +51 +182 +65 +55 +191 +67 +57 +197 +66 +56 +196 +65 +55 +190 +67 +59 +183 +72 +63 +166 +76 +67 +144 +74 +64 +116 +69 +59 +90 +62 +50 +69 +57 +45 +60 +53 +43 +64 +57 +51 +64 +56 +53 +63 +55 +53 +62 +54 +51 +61 +53 +50 +60 +52 +49 +57 +52 +48 +56 +51 +47 +54 +50 +47 +52 +51 +47 +52 +51 +47 +50 +51 +46 +51 +50 +46 +49 +50 +45 +49 +50 +45 +48 +50 +45 +45 +50 +46 +44 +50 +46 +45 +50 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +48 +48 +46 +49 +48 +46 +51 +50 +48 +53 +49 +48 +53 +49 +48 +52 +46 +46 +50 +44 +44 +52 +43 +44 +55 +46 +47 +61 +47 +46 +78 +53 +46 +89 +57 +46 +101 +61 +49 +110 +64 +51 +115 +66 +59 +121 +75 +75 +128 +90 +101 +131 +103 +128 +127 +112 +151 +122 +120 +170 +117 +123 +183 +107 +115 +180 +95 +100 +166 +84 +84 +148 +79 +71 +131 +76 +66 +119 +78 +65 +109 +78 +66 +104 +77 +65 +101 +74 +65 +96 +71 +66 +89 +71 +70 +88 +75 +75 +87 +77 +80 +85 +93 +99 +99 +96 +102 +98 +98 +105 +97 +96 +102 +92 +90 +96 +84 +87 +91 +77 +85 +88 +77 +88 +88 +80 +94 +89 +86 +96 +87 +88 +96 +87 +90 +44 +44 +44 +44 +44 +44 +46 +45 +43 +46 +45 +43 +47 +46 +44 +48 +47 +45 +51 +47 +44 +51 +47 +44 +50 +46 +43 +50 +46 +43 +51 +46 +42 +51 +46 +42 +51 +46 +42 +51 +46 +42 +53 +46 +40 +53 +45 +42 +51 +46 +43 +51 +46 +43 +50 +45 +42 +49 +44 +41 +49 +44 +41 +50 +45 +42 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +50 +45 +42 +50 +45 +42 +50 +45 +42 +50 +45 +42 +49 +44 +41 +49 +44 +41 +49 +44 +41 +48 +43 +40 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +53 +50 +45 +53 +50 +45 +54 +51 +46 +55 +52 +47 +56 +53 +48 +56 +53 +48 +56 +53 +46 +59 +52 +44 +60 +53 +43 +61 +54 +44 +62 +55 +45 +64 +55 +46 +65 +57 +46 +65 +57 +46 +65 +57 +46 +67 +57 +47 +67 +57 +45 +69 +57 +45 +70 +58 +46 +71 +59 +47 +72 +60 +46 +74 +62 +48 +72 +65 +49 +74 +71 +54 +73 +72 +54 +78 +71 +53 +86 +70 +54 +92 +69 +51 +100 +67 +50 +110 +64 +48 +118 +62 +45 +123 +60 +43 +130 +59 +41 +140 +59 +42 +148 +61 +44 +156 +64 +49 +163 +70 +53 +170 +74 +58 +180 +74 +61 +196 +72 +64 +204 +69 +65 +209 +70 +65 +214 +69 +64 +222 +67 +65 +228 +64 +62 +236 +62 +63 +241 +58 +60 +247 +59 +60 +244 +58 +59 +240 +60 +61 +233 +64 +61 +220 +67 +61 +205 +67 +56 +190 +64 +50 +177 +62 +44 +174 +63 +44 +171 +64 +44 +170 +63 +43 +170 +63 +43 +170 +63 +45 +169 +62 +44 +169 +62 +44 +168 +63 +44 +165 +62 +45 +162 +63 +44 +160 +63 +44 +155 +62 +44 +151 +63 +43 +149 +62 +42 +147 +62 +41 +145 +63 +42 +143 +62 +43 +143 +62 +45 +143 +62 +45 +143 +62 +45 +142 +61 +44 +142 +61 +44 +142 +61 +44 +141 +60 +43 +142 +61 +44 +139 +60 +43 +141 +60 +43 +139 +60 +43 +139 +60 +45 +140 +61 +44 +141 +62 +47 +142 +63 +46 +148 +66 +52 +151 +65 +50 +160 +64 +50 +172 +66 +53 +185 +67 +57 +194 +67 +58 +197 +66 +58 +194 +65 +59 +186 +65 +57 +177 +73 +64 +163 +78 +71 +141 +78 +69 +111 +71 +61 +83 +63 +52 +65 +59 +47 +57 +54 +45 +64 +57 +51 +65 +55 +53 +63 +55 +52 +62 +54 +51 +60 +52 +49 +57 +52 +48 +56 +51 +47 +55 +52 +47 +52 +51 +47 +52 +51 +47 +51 +52 +47 +50 +51 +46 +50 +51 +46 +48 +50 +45 +48 +50 +45 +46 +51 +45 +45 +51 +47 +45 +51 +47 +46 +51 +47 +46 +51 +47 +48 +50 +47 +48 +50 +47 +49 +49 +47 +49 +49 +47 +50 +49 +47 +51 +50 +48 +51 +50 +48 +52 +48 +47 +50 +46 +45 +49 +45 +44 +52 +46 +46 +56 +46 +44 +71 +52 +45 +79 +52 +41 +88 +56 +43 +96 +60 +48 +101 +63 +54 +109 +71 +70 +121 +89 +100 +130 +107 +133 +128 +117 +159 +124 +124 +178 +119 +124 +188 +110 +117 +187 +100 +104 +175 +91 +91 +161 +82 +77 +143 +76 +66 +126 +79 +65 +114 +76 +64 +104 +73 +61 +99 +72 +62 +96 +72 +66 +94 +69 +67 +88 +64 +66 +79 +59 +64 +70 +66 +71 +74 +68 +77 +74 +74 +81 +74 +74 +81 +73 +73 +81 +70 +75 +81 +69 +79 +85 +73 +86 +87 +79 +94 +89 +83 +96 +89 +83 +96 +88 +85 +43 +43 +43 +43 +43 +43 +44 +44 +44 +45 +45 +45 +47 +46 +44 +47 +46 +44 +48 +47 +45 +48 +47 +45 +49 +45 +42 +49 +45 +42 +49 +45 +42 +49 +45 +42 +50 +45 +41 +50 +45 +41 +50 +45 +41 +50 +45 +41 +50 +45 +42 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +50 +44 +44 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +50 +44 +44 +50 +44 +44 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +48 +42 +42 +48 +42 +42 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +46 +43 +52 +49 +44 +52 +49 +44 +52 +49 +44 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +52 +49 +44 +52 +49 +44 +53 +50 +45 +54 +51 +46 +55 +52 +47 +55 +52 +47 +56 +53 +48 +56 +53 +46 +58 +51 +43 +59 +52 +44 +60 +53 +45 +61 +54 +46 +63 +54 +47 +63 +54 +45 +63 +54 +45 +63 +55 +44 +66 +56 +46 +66 +56 +46 +69 +56 +47 +69 +57 +45 +71 +59 +47 +72 +60 +48 +74 +62 +50 +72 +64 +51 +72 +69 +54 +71 +70 +52 +75 +69 +53 +81 +68 +52 +88 +67 +50 +95 +66 +50 +102 +63 +46 +110 +61 +44 +118 +61 +44 +124 +58 +42 +133 +57 +41 +140 +59 +42 +147 +61 +46 +155 +66 +50 +162 +70 +55 +172 +70 +56 +187 +70 +60 +194 +70 +62 +201 +70 +62 +208 +69 +62 +217 +68 +64 +226 +67 +63 +234 +64 +64 +240 +62 +62 +242 +58 +58 +241 +59 +58 +236 +60 +60 +228 +65 +60 +214 +67 +59 +198 +68 +54 +181 +64 +47 +170 +61 +41 +170 +63 +45 +169 +64 +45 +169 +64 +45 +168 +63 +44 +168 +62 +46 +168 +62 +46 +167 +61 +45 +165 +62 +45 +163 +61 +46 +160 +63 +46 +158 +63 +45 +154 +63 +45 +150 +63 +44 +147 +62 +42 +145 +63 +42 +143 +62 +41 +143 +62 +43 +141 +62 +45 +141 +62 +45 +140 +61 +44 +140 +61 +46 +140 +61 +46 +139 +60 +45 +139 +60 +45 +139 +60 +45 +138 +61 +45 +138 +59 +44 +137 +60 +44 +138 +60 +47 +139 +62 +46 +139 +61 +48 +140 +63 +47 +146 +67 +50 +152 +66 +49 +161 +65 +49 +174 +66 +54 +188 +67 +58 +194 +67 +60 +196 +67 +61 +192 +67 +61 +185 +70 +65 +178 +81 +74 +165 +88 +82 +143 +88 +81 +115 +82 +73 +87 +73 +62 +67 +67 +55 +60 +63 +54 +62 +57 +51 +64 +55 +50 +62 +55 +49 +61 +54 +48 +58 +53 +47 +57 +52 +46 +56 +51 +47 +54 +51 +46 +52 +51 +46 +52 +51 +46 +51 +52 +47 +49 +51 +46 +49 +51 +46 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +51 +47 +45 +51 +47 +45 +51 +47 +45 +51 +47 +46 +51 +47 +46 +51 +47 +48 +50 +47 +48 +50 +47 +48 +48 +46 +49 +49 +47 +50 +50 +48 +50 +49 +47 +48 +47 +45 +47 +46 +44 +50 +46 +45 +52 +47 +44 +63 +48 +43 +68 +48 +41 +75 +51 +41 +84 +56 +45 +90 +60 +52 +100 +70 +70 +117 +93 +106 +131 +115 +141 +137 +128 +171 +133 +132 +190 +126 +131 +199 +116 +122 +198 +109 +112 +189 +99 +101 +175 +86 +83 +154 +76 +67 +130 +75 +63 +113 +73 +60 +103 +71 +59 +99 +69 +62 +95 +70 +66 +93 +68 +66 +87 +63 +65 +78 +59 +63 +72 +58 +66 +69 +62 +72 +71 +68 +77 +72 +71 +81 +73 +71 +81 +72 +74 +82 +71 +78 +86 +75 +85 +88 +77 +94 +90 +79 +97 +89 +78 +97 +88 +79 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +44 +46 +44 +45 +47 +46 +44 +48 +47 +45 +48 +47 +45 +49 +45 +42 +49 +45 +42 +49 +45 +42 +49 +45 +42 +50 +45 +41 +50 +45 +41 +50 +45 +41 +50 +45 +42 +50 +44 +44 +49 +43 +43 +49 +43 +43 +48 +42 +42 +48 +42 +42 +49 +43 +43 +49 +43 +43 +50 +44 +44 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +50 +44 +44 +50 +44 +44 +50 +44 +44 +49 +43 +43 +49 +43 +43 +48 +42 +42 +48 +42 +42 +48 +42 +42 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +51 +47 +44 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +52 +49 +44 +52 +49 +44 +53 +50 +45 +54 +51 +46 +54 +51 +46 +55 +52 +47 +56 +53 +48 +56 +53 +48 +57 +50 +44 +58 +51 +43 +59 +52 +44 +60 +53 +45 +62 +53 +46 +62 +53 +46 +62 +53 +46 +62 +53 +44 +66 +56 +47 +66 +56 +46 +69 +56 +47 +69 +56 +47 +71 +58 +49 +73 +61 +49 +74 +62 +50 +73 +63 +51 +70 +67 +52 +70 +67 +52 +74 +66 +53 +79 +65 +52 +84 +65 +50 +92 +64 +50 +98 +62 +48 +106 +60 +45 +113 +60 +46 +119 +57 +42 +125 +56 +41 +133 +56 +40 +140 +58 +44 +149 +61 +47 +155 +66 +52 +164 +66 +53 +178 +70 +58 +186 +69 +59 +193 +70 +62 +202 +71 +63 +212 +71 +64 +222 +70 +65 +231 +67 +65 +238 +66 +64 +237 +59 +59 +235 +59 +59 +231 +62 +59 +223 +66 +59 +209 +68 +58 +191 +68 +52 +175 +64 +45 +164 +62 +40 +166 +65 +45 +166 +65 +45 +165 +64 +44 +165 +64 +46 +165 +64 +46 +164 +63 +45 +164 +63 +45 +164 +62 +47 +162 +62 +46 +159 +64 +46 +156 +63 +46 +152 +63 +45 +149 +62 +43 +145 +63 +42 +143 +62 +41 +143 +62 +43 +141 +62 +45 +141 +62 +45 +141 +62 +45 +140 +61 +44 +140 +61 +46 +139 +60 +45 +139 +60 +45 +138 +61 +45 +138 +61 +45 +136 +60 +46 +136 +60 +46 +136 +60 +46 +136 +60 +47 +135 +62 +47 +136 +62 +49 +139 +63 +49 +145 +68 +50 +150 +67 +49 +162 +66 +52 +173 +67 +54 +186 +67 +59 +193 +68 +62 +193 +68 +62 +187 +69 +65 +185 +80 +76 +178 +91 +84 +165 +101 +92 +145 +102 +93 +117 +95 +84 +91 +85 +73 +71 +77 +65 +67 +73 +63 +60 +57 +50 +63 +56 +50 +62 +55 +49 +59 +54 +48 +57 +52 +46 +55 +52 +45 +54 +51 +46 +52 +51 +46 +52 +51 +46 +51 +52 +46 +50 +52 +47 +49 +51 +46 +47 +52 +46 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +51 +47 +45 +51 +47 +45 +51 +47 +45 +51 +47 +46 +51 +47 +46 +51 +47 +48 +50 +47 +48 +50 +47 +47 +47 +45 +48 +48 +46 +50 +50 +48 +50 +50 +48 +49 +48 +46 +48 +47 +45 +48 +47 +45 +51 +47 +44 +56 +44 +44 +59 +44 +41 +67 +48 +42 +75 +55 +48 +83 +60 +54 +94 +73 +72 +116 +98 +110 +135 +122 +148 +144 +138 +182 +140 +141 +198 +132 +136 +207 +122 +128 +204 +114 +120 +198 +105 +107 +182 +87 +87 +159 +73 +68 +132 +69 +61 +110 +71 +60 +100 +68 +60 +97 +67 +62 +94 +67 +65 +89 +64 +67 +86 +64 +68 +80 +62 +69 +75 +71 +81 +82 +75 +87 +85 +81 +94 +87 +85 +96 +88 +83 +95 +85 +82 +94 +84 +84 +94 +83 +89 +95 +83 +94 +91 +76 +97 +90 +74 +97 +90 +74 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +46 +45 +45 +45 +45 +45 +45 +45 +46 +45 +43 +46 +45 +43 +47 +46 +44 +47 +46 +44 +49 +45 +42 +48 +44 +41 +48 +44 +41 +48 +44 +41 +47 +43 +40 +47 +43 +40 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +48 +44 +43 +49 +45 +44 +49 +45 +44 +50 +46 +45 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +48 +44 +41 +49 +45 +42 +50 +46 +43 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +52 +48 +45 +53 +49 +46 +54 +50 +47 +55 +52 +47 +56 +48 +45 +57 +50 +44 +58 +51 +45 +59 +52 +46 +61 +52 +47 +62 +53 +46 +62 +53 +46 +62 +53 +46 +63 +52 +46 +63 +53 +44 +66 +53 +45 +67 +54 +46 +68 +55 +47 +70 +57 +48 +71 +58 +49 +70 +60 +50 +71 +63 +52 +72 +64 +53 +74 +64 +54 +80 +63 +53 +84 +62 +51 +88 +60 +49 +94 +57 +48 +98 +54 +43 +109 +57 +46 +116 +56 +45 +124 +56 +43 +131 +57 +44 +141 +59 +47 +147 +61 +48 +152 +63 +49 +158 +62 +48 +167 +65 +51 +173 +65 +52 +181 +67 +56 +190 +69 +58 +202 +71 +61 +212 +71 +62 +222 +69 +63 +229 +67 +64 +232 +64 +63 +234 +66 +65 +230 +68 +65 +218 +69 +62 +200 +68 +56 +183 +66 +49 +170 +65 +46 +162 +66 +44 +162 +65 +46 +161 +64 +45 +162 +63 +44 +162 +62 +46 +161 +61 +45 +161 +61 +45 +162 +62 +46 +160 +63 +47 +156 +60 +44 +154 +61 +44 +152 +60 +45 +149 +62 +45 +147 +61 +44 +144 +61 +43 +142 +61 +42 +140 +62 +42 +139 +60 +43 +139 +60 +43 +138 +61 +45 +137 +60 +44 +137 +60 +44 +137 +60 +44 +136 +58 +45 +135 +59 +45 +137 +61 +47 +134 +60 +47 +134 +60 +47 +135 +61 +48 +136 +62 +51 +136 +64 +50 +137 +65 +53 +139 +65 +52 +145 +69 +53 +151 +68 +52 +163 +69 +57 +177 +73 +62 +186 +71 +64 +187 +68 +62 +187 +69 +65 +184 +77 +71 +180 +90 +82 +175 +102 +95 +163 +113 +102 +145 +115 +104 +126 +114 +100 +106 +106 +94 +86 +94 +83 +73 +81 +70 +76 +76 +66 +74 +70 +61 +66 +62 +53 +60 +56 +47 +57 +53 +44 +55 +52 +43 +54 +51 +44 +51 +51 +43 +52 +51 +46 +51 +52 +46 +49 +52 +45 +49 +52 +45 +48 +50 +45 +47 +49 +44 +44 +49 +43 +44 +49 +43 +45 +50 +46 +45 +50 +46 +45 +50 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +48 +50 +47 +48 +50 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +52 +48 +47 +52 +43 +48 +59 +47 +51 +65 +51 +50 +67 +52 +47 +74 +59 +54 +93 +79 +79 +121 +109 +121 +139 +133 +159 +147 +144 +187 +148 +150 +207 +144 +149 +217 +131 +137 +211 +116 +122 +198 +106 +110 +183 +95 +98 +167 +90 +91 +148 +76 +73 +116 +72 +66 +100 +65 +62 +93 +62 +62 +88 +63 +66 +85 +65 +73 +86 +76 +85 +92 +85 +96 +98 +98 +113 +110 +110 +125 +120 +118 +134 +124 +114 +127 +117 +108 +121 +111 +103 +117 +104 +95 +107 +95 +87 +95 +80 +91 +90 +70 +96 +90 +68 +99 +93 +71 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +45 +47 +45 +45 +45 +45 +45 +45 +46 +44 +45 +46 +45 +43 +47 +46 +44 +46 +45 +43 +48 +44 +41 +48 +44 +41 +47 +43 +40 +47 +43 +40 +47 +43 +40 +47 +43 +40 +46 +42 +41 +46 +42 +41 +46 +42 +41 +46 +42 +41 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +48 +44 +43 +48 +44 +41 +49 +45 +42 +50 +46 +43 +51 +47 +44 +51 +47 +44 +50 +46 +43 +50 +46 +43 +50 +46 +43 +50 +46 +43 +50 +46 +43 +50 +46 +43 +51 +47 +44 +52 +48 +45 +53 +49 +46 +54 +50 +47 +56 +48 +46 +57 +49 +46 +58 +50 +47 +59 +52 +46 +61 +52 +47 +62 +53 +48 +62 +53 +48 +61 +52 +45 +63 +52 +46 +63 +52 +46 +65 +52 +46 +66 +53 +45 +67 +54 +46 +69 +56 +48 +71 +58 +50 +72 +59 +51 +72 +62 +53 +72 +62 +53 +76 +61 +54 +79 +62 +54 +81 +61 +52 +86 +59 +50 +90 +57 +48 +95 +55 +47 +104 +55 +48 +112 +55 +46 +119 +55 +45 +129 +57 +45 +137 +57 +46 +144 +60 +49 +150 +60 +49 +155 +61 +49 +162 +64 +51 +167 +65 +51 +172 +66 +53 +180 +68 +56 +190 +69 +58 +201 +70 +60 +212 +69 +61 +219 +68 +61 +223 +68 +64 +224 +69 +64 +222 +70 +65 +212 +71 +62 +196 +70 +56 +178 +67 +50 +165 +66 +45 +158 +66 +45 +159 +67 +46 +158 +66 +45 +159 +64 +46 +158 +63 +45 +158 +63 +45 +158 +63 +45 +158 +62 +46 +158 +62 +46 +154 +61 +44 +153 +62 +44 +150 +61 +45 +148 +61 +44 +144 +61 +43 +143 +62 +43 +140 +62 +42 +140 +61 +44 +139 +60 +43 +138 +61 +43 +137 +60 +44 +137 +60 +44 +137 +60 +44 +135 +59 +43 +135 +59 +45 +133 +60 +45 +134 +60 +47 +133 +61 +47 +133 +61 +49 +131 +61 +49 +132 +62 +50 +134 +64 +54 +135 +65 +55 +136 +66 +54 +147 +71 +57 +151 +69 +55 +163 +71 +60 +175 +74 +64 +184 +73 +66 +184 +71 +65 +183 +76 +70 +179 +84 +78 +177 +100 +92 +170 +113 +102 +159 +126 +111 +144 +127 +111 +127 +124 +109 +109 +115 +101 +90 +102 +90 +78 +88 +77 +76 +78 +65 +75 +73 +61 +69 +67 +55 +64 +61 +52 +61 +58 +49 +56 +56 +46 +52 +52 +44 +49 +49 +41 +50 +51 +45 +50 +51 +45 +48 +51 +44 +47 +50 +43 +47 +49 +44 +46 +48 +43 +46 +48 +43 +46 +48 +43 +47 +49 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +48 +50 +47 +48 +50 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +50 +48 +49 +53 +43 +52 +57 +45 +55 +60 +50 +51 +63 +53 +51 +72 +63 +58 +94 +86 +84 +120 +114 +124 +138 +136 +158 +147 +147 +185 +148 +151 +202 +144 +150 +212 +132 +139 +207 +121 +129 +194 +113 +121 +184 +107 +116 +173 +104 +110 +158 +92 +95 +128 +88 +90 +113 +83 +85 +106 +82 +87 +106 +84 +94 +104 +90 +103 +109 +102 +118 +118 +114 +130 +127 +116 +136 +127 +126 +146 +135 +131 +149 +137 +126 +142 +129 +118 +134 +121 +114 +128 +113 +102 +116 +101 +90 +101 +84 +89 +88 +67 +94 +88 +62 +97 +91 +67 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +46 +45 +45 +45 +45 +45 +45 +45 +46 +45 +43 +46 +45 +43 +46 +45 +43 +45 +44 +42 +47 +43 +40 +46 +42 +39 +46 +42 +39 +46 +42 +39 +44 +43 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +44 +42 +43 +44 +42 +43 +45 +43 +44 +45 +43 +44 +45 +43 +44 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +46 +44 +48 +44 +43 +48 +44 +43 +49 +45 +44 +50 +46 +45 +50 +46 +45 +50 +46 +45 +50 +46 +45 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +50 +46 +45 +51 +47 +46 +52 +48 +47 +53 +49 +46 +56 +48 +46 +57 +49 +46 +58 +50 +47 +59 +51 +48 +61 +51 +49 +61 +52 +47 +61 +52 +47 +61 +52 +47 +63 +52 +48 +63 +52 +46 +65 +52 +46 +65 +52 +46 +67 +54 +48 +68 +55 +49 +70 +57 +51 +71 +58 +52 +72 +59 +53 +74 +59 +54 +75 +60 +55 +78 +61 +54 +80 +59 +54 +83 +58 +53 +86 +55 +50 +91 +54 +46 +99 +54 +48 +107 +54 +46 +116 +53 +44 +125 +55 +47 +135 +57 +47 +141 +59 +48 +148 +60 +48 +150 +60 +49 +157 +63 +51 +160 +64 +52 +162 +64 +51 +168 +64 +51 +177 +67 +54 +186 +68 +56 +197 +69 +58 +205 +68 +58 +213 +70 +64 +215 +72 +64 +212 +73 +66 +204 +73 +63 +190 +69 +58 +174 +67 +51 +161 +66 +46 +156 +65 +46 +157 +66 +47 +156 +65 +46 +156 +63 +46 +155 +62 +45 +155 +62 +45 +155 +62 +45 +155 +62 +47 +155 +63 +48 +152 +60 +45 +150 +61 +45 +148 +60 +46 +147 +61 +46 +143 +62 +45 +140 +61 +44 +139 +60 +43 +138 +61 +43 +137 +60 +42 +137 +60 +42 +137 +60 +44 +135 +59 +43 +135 +59 +45 +133 +60 +45 +132 +58 +45 +131 +59 +45 +132 +60 +48 +130 +60 +48 +130 +60 +50 +130 +62 +51 +131 +63 +52 +133 +65 +56 +135 +67 +58 +136 +68 +57 +148 +74 +61 +151 +72 +59 +160 +72 +62 +172 +75 +68 +178 +75 +70 +179 +76 +71 +178 +83 +77 +174 +96 +86 +173 +115 +103 +166 +129 +113 +157 +140 +122 +145 +142 +123 +130 +137 +119 +115 +128 +111 +99 +113 +98 +88 +99 +85 +78 +82 +68 +77 +78 +64 +72 +73 +59 +68 +68 +56 +64 +64 +52 +57 +59 +46 +52 +54 +43 +47 +49 +38 +48 +49 +41 +48 +49 +41 +47 +48 +42 +47 +48 +42 +46 +47 +42 +46 +47 +42 +47 +47 +45 +47 +47 +45 +47 +47 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +49 +47 +50 +54 +43 +57 +55 +43 +57 +56 +47 +52 +59 +54 +51 +72 +69 +62 +95 +94 +89 +122 +122 +124 +139 +141 +154 +144 +148 +177 +146 +151 +191 +143 +149 +199 +132 +142 +195 +125 +137 +187 +123 +137 +182 +124 +139 +178 +125 +140 +171 +125 +136 +154 +119 +131 +143 +113 +126 +135 +110 +125 +130 +110 +126 +126 +111 +130 +126 +121 +142 +133 +131 +153 +141 +139 +161 +148 +145 +168 +152 +144 +165 +148 +136 +157 +138 +131 +150 +131 +124 +141 +123 +106 +123 +105 +92 +104 +84 +86 +86 +62 +91 +87 +58 +93 +89 +62 +45 +46 +48 +45 +46 +48 +45 +46 +48 +45 +46 +48 +45 +46 +48 +45 +46 +48 +46 +46 +46 +46 +46 +46 +46 +45 +43 +46 +45 +43 +45 +44 +42 +45 +44 +42 +46 +42 +39 +46 +42 +39 +46 +42 +39 +46 +42 +41 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +43 +42 +48 +44 +43 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +50 +46 +45 +51 +47 +46 +52 +48 +47 +57 +49 +47 +58 +50 +48 +59 +51 +49 +60 +52 +49 +61 +51 +49 +61 +51 +49 +61 +51 +49 +61 +52 +47 +62 +51 +47 +62 +51 +47 +64 +50 +47 +64 +51 +45 +65 +52 +46 +67 +54 +48 +68 +55 +49 +69 +56 +50 +70 +57 +51 +72 +57 +52 +73 +58 +53 +74 +59 +54 +76 +58 +54 +78 +57 +52 +81 +56 +51 +84 +53 +48 +94 +55 +50 +101 +54 +48 +111 +54 +47 +120 +56 +47 +130 +57 +48 +138 +58 +47 +144 +60 +49 +148 +62 +49 +153 +63 +52 +155 +63 +52 +155 +63 +50 +159 +63 +49 +165 +65 +50 +174 +66 +53 +184 +68 +55 +191 +69 +58 +199 +71 +62 +203 +72 +64 +202 +74 +65 +195 +73 +62 +182 +70 +58 +170 +66 +53 +158 +65 +48 +153 +64 +46 +153 +65 +45 +153 +65 +45 +152 +63 +45 +151 +62 +44 +151 +62 +44 +153 +62 +44 +153 +61 +46 +151 +62 +46 +149 +60 +44 +148 +61 +44 +147 +61 +46 +144 +61 +45 +142 +61 +44 +138 +61 +43 +138 +61 +45 +137 +60 +44 +136 +59 +41 +136 +59 +41 +135 +59 +43 +135 +59 +43 +132 +59 +44 +132 +59 +44 +131 +59 +45 +128 +59 +44 +129 +59 +47 +128 +60 +49 +128 +60 +49 +129 +62 +53 +131 +64 +55 +131 +67 +58 +135 +68 +60 +136 +69 +60 +148 +76 +64 +150 +72 +60 +158 +71 +62 +167 +74 +67 +174 +76 +73 +174 +81 +76 +173 +93 +86 +170 +106 +94 +167 +128 +111 +161 +143 +121 +154 +154 +130 +143 +155 +131 +134 +149 +128 +122 +139 +120 +109 +123 +106 +98 +109 +93 +83 +90 +74 +81 +85 +70 +75 +79 +64 +69 +73 +58 +64 +68 +54 +59 +61 +48 +53 +55 +44 +49 +51 +40 +48 +49 +41 +47 +48 +40 +46 +47 +41 +46 +45 +40 +46 +45 +41 +46 +45 +41 +47 +46 +44 +48 +47 +45 +47 +46 +44 +47 +46 +44 +47 +46 +44 +47 +46 +44 +47 +46 +44 +46 +46 +44 +47 +46 +44 +46 +46 +44 +48 +47 +45 +47 +47 +45 +48 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +50 +45 +49 +55 +44 +58 +54 +42 +56 +51 +45 +49 +57 +54 +49 +72 +74 +63 +98 +102 +88 +123 +128 +122 +139 +144 +147 +141 +147 +163 +143 +150 +176 +140 +149 +182 +131 +144 +178 +129 +144 +175 +133 +153 +178 +141 +164 +182 +146 +168 +179 +147 +168 +171 +144 +164 +163 +140 +160 +158 +135 +158 +152 +130 +153 +143 +125 +152 +137 +129 +156 +139 +136 +163 +144 +148 +176 +154 +152 +177 +155 +148 +173 +151 +139 +163 +141 +133 +155 +132 +127 +146 +124 +107 +124 +105 +88 +102 +79 +83 +86 +59 +89 +85 +56 +90 +86 +57 +43 +47 +50 +43 +47 +50 +43 +47 +50 +43 +47 +50 +45 +46 +48 +45 +46 +48 +46 +46 +46 +46 +46 +46 +45 +45 +45 +45 +45 +45 +46 +45 +43 +45 +44 +42 +45 +44 +42 +44 +43 +41 +44 +43 +41 +44 +43 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +44 +42 +43 +45 +43 +44 +45 +43 +44 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +43 +42 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +47 +43 +42 +46 +42 +41 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +49 +45 +44 +51 +47 +46 +52 +48 +47 +57 +48 +49 +58 +50 +48 +59 +51 +49 +60 +52 +50 +61 +51 +50 +61 +51 +49 +60 +50 +48 +60 +50 +48 +61 +50 +48 +61 +50 +46 +63 +49 +46 +63 +49 +46 +64 +50 +47 +65 +51 +48 +66 +53 +47 +67 +54 +48 +68 +54 +51 +67 +56 +52 +68 +57 +53 +69 +58 +54 +71 +57 +54 +72 +57 +52 +75 +56 +52 +78 +53 +48 +88 +55 +50 +95 +54 +48 +105 +55 +48 +114 +55 +47 +125 +58 +49 +134 +60 +49 +140 +62 +50 +144 +62 +50 +151 +64 +54 +151 +63 +53 +151 +63 +53 +151 +63 +51 +156 +64 +51 +163 +67 +53 +171 +67 +54 +179 +69 +56 +186 +69 +59 +189 +71 +61 +190 +72 +62 +185 +71 +61 +176 +68 +56 +166 +65 +53 +155 +63 +48 +151 +64 +47 +151 +64 +45 +151 +64 +45 +150 +63 +46 +149 +62 +45 +148 +61 +44 +149 +60 +44 +150 +61 +47 +150 +61 +47 +149 +60 +46 +147 +59 +45 +146 +60 +47 +142 +60 +46 +139 +60 +45 +137 +60 +44 +137 +60 +44 +136 +60 +44 +135 +59 +43 +134 +58 +42 +134 +58 +42 +134 +58 +42 +131 +58 +43 +131 +58 +43 +130 +58 +44 +128 +58 +46 +128 +58 +48 +128 +60 +49 +128 +61 +52 +127 +63 +54 +130 +66 +57 +131 +68 +61 +135 +70 +64 +136 +72 +63 +145 +75 +65 +146 +72 +61 +154 +71 +63 +163 +76 +69 +168 +80 +76 +168 +88 +81 +169 +102 +93 +166 +118 +104 +162 +140 +119 +155 +153 +128 +149 +164 +135 +140 +163 +135 +134 +157 +131 +126 +145 +125 +116 +130 +113 +106 +117 +101 +92 +101 +82 +86 +95 +76 +78 +85 +67 +69 +76 +58 +63 +70 +54 +60 +64 +50 +55 +58 +47 +54 +56 +45 +48 +49 +41 +48 +48 +40 +46 +45 +40 +47 +44 +39 +47 +43 +40 +47 +43 +42 +49 +45 +44 +50 +46 +45 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +47 +46 +44 +49 +45 +44 +47 +46 +44 +50 +46 +45 +48 +47 +45 +50 +46 +45 +48 +47 +45 +48 +47 +45 +48 +47 +45 +48 +47 +45 +50 +45 +49 +56 +44 +58 +53 +41 +53 +49 +43 +43 +54 +54 +44 +71 +76 +56 +96 +104 +81 +122 +131 +112 +136 +146 +135 +141 +151 +150 +143 +154 +160 +141 +153 +165 +134 +150 +163 +135 +155 +162 +144 +170 +169 +155 +185 +177 +160 +192 +179 +152 +183 +168 +154 +182 +167 +155 +183 +168 +152 +183 +165 +145 +177 +156 +137 +171 +146 +137 +171 +144 +144 +177 +148 +146 +179 +150 +149 +180 +149 +144 +173 +143 +136 +162 +133 +132 +155 +129 +123 +146 +120 +103 +122 +100 +84 +98 +73 +81 +84 +57 +85 +84 +56 +86 +85 +57 +44 +48 +51 +44 +48 +51 +44 +48 +51 +44 +48 +51 +46 +47 +49 +46 +47 +49 +47 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +46 +47 +46 +44 +46 +45 +43 +46 +45 +43 +46 +45 +43 +45 +44 +42 +45 +44 +42 +45 +43 +44 +45 +43 +44 +45 +43 +44 +44 +42 +43 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +45 +43 +44 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +43 +42 +47 +43 +42 +48 +44 +43 +48 +44 +43 +47 +43 +42 +47 +43 +42 +46 +42 +41 +45 +41 +40 +48 +44 +43 +48 +44 +43 +47 +43 +42 +48 +44 +43 +49 +45 +44 +50 +46 +45 +51 +47 +46 +52 +48 +47 +58 +49 +50 +58 +49 +50 +59 +51 +49 +60 +52 +50 +61 +51 +50 +60 +50 +49 +60 +50 +48 +59 +49 +47 +61 +50 +48 +60 +49 +47 +62 +48 +45 +62 +48 +45 +63 +49 +46 +64 +50 +47 +65 +52 +46 +63 +52 +46 +64 +53 +49 +64 +55 +50 +64 +57 +51 +65 +58 +52 +66 +57 +52 +67 +56 +52 +70 +55 +52 +72 +53 +47 +81 +53 +49 +88 +53 +47 +97 +54 +47 +108 +56 +45 +117 +57 +46 +128 +60 +47 +134 +62 +48 +139 +61 +49 +147 +63 +53 +149 +62 +53 +147 +63 +53 +147 +63 +52 +149 +66 +52 +154 +66 +52 +160 +67 +52 +165 +68 +52 +172 +66 +53 +176 +68 +56 +180 +69 +58 +177 +69 +59 +170 +66 +55 +161 +63 +52 +154 +62 +49 +150 +62 +48 +149 +63 +46 +148 +63 +43 +147 +61 +44 +147 +61 +44 +147 +60 +43 +147 +60 +43 +148 +60 +46 +148 +60 +46 +147 +59 +45 +146 +60 +45 +143 +60 +46 +141 +59 +45 +138 +59 +44 +137 +60 +44 +135 +59 +43 +135 +59 +43 +134 +58 +42 +134 +58 +42 +133 +57 +41 +131 +58 +41 +131 +58 +43 +129 +57 +42 +127 +57 +45 +127 +57 +45 +128 +60 +49 +127 +60 +51 +127 +63 +54 +128 +65 +56 +130 +67 +60 +133 +70 +63 +136 +73 +66 +138 +73 +67 +142 +74 +65 +144 +71 +62 +151 +72 +67 +159 +78 +74 +167 +86 +82 +167 +96 +90 +169 +112 +101 +164 +131 +114 +156 +148 +125 +150 +161 +131 +143 +168 +138 +136 +167 +136 +131 +160 +132 +126 +150 +126 +121 +136 +117 +112 +123 +106 +100 +112 +92 +93 +105 +83 +82 +94 +74 +74 +83 +64 +66 +75 +58 +62 +69 +53 +58 +64 +50 +57 +60 +49 +51 +52 +44 +50 +50 +42 +49 +46 +41 +47 +44 +39 +47 +41 +41 +48 +42 +42 +49 +43 +43 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +47 +46 +44 +47 +46 +44 +47 +46 +44 +50 +44 +46 +56 +42 +55 +53 +40 +49 +51 +43 +40 +53 +54 +38 +69 +75 +49 +92 +103 +71 +117 +130 +100 +134 +147 +121 +142 +155 +138 +145 +158 +148 +144 +159 +154 +139 +158 +152 +141 +165 +151 +151 +180 +158 +162 +197 +165 +169 +206 +173 +165 +201 +173 +166 +202 +176 +167 +203 +177 +164 +200 +172 +151 +190 +159 +139 +179 +145 +136 +176 +141 +141 +178 +144 +142 +178 +142 +144 +178 +143 +141 +172 +138 +132 +161 +130 +128 +153 +123 +119 +142 +114 +100 +120 +93 +81 +95 +69 +77 +81 +54 +81 +81 +53 +82 +81 +53 +44 +48 +51 +44 +48 +51 +44 +48 +51 +44 +48 +51 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +46 +44 +47 +46 +44 +46 +45 +43 +46 +45 +43 +47 +45 +46 +46 +44 +45 +46 +44 +45 +45 +43 +44 +44 +42 +43 +43 +41 +42 +43 +41 +42 +42 +40 +41 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +41 +39 +40 +41 +39 +40 +43 +41 +42 +43 +41 +42 +44 +42 +43 +45 +43 +44 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +46 +42 +41 +45 +41 +40 +44 +40 +39 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +50 +46 +45 +52 +48 +47 +52 +48 +47 +58 +49 +50 +59 +50 +51 +59 +50 +51 +60 +51 +52 +61 +51 +50 +60 +50 +49 +60 +50 +49 +59 +49 +48 +60 +49 +47 +60 +49 +47 +62 +48 +47 +61 +47 +46 +62 +48 +45 +62 +48 +45 +63 +49 +46 +62 +51 +47 +61 +54 +48 +59 +54 +48 +59 +56 +51 +60 +57 +52 +61 +58 +53 +62 +57 +51 +64 +55 +50 +67 +54 +48 +71 +52 +46 +79 +52 +43 +89 +52 +43 +100 +53 +43 +110 +56 +44 +120 +58 +45 +127 +59 +46 +133 +59 +46 +143 +60 +52 +145 +60 +53 +144 +62 +51 +143 +64 +51 +144 +65 +50 +147 +66 +49 +151 +65 +50 +153 +64 +48 +160 +62 +49 +166 +64 +52 +170 +66 +55 +170 +66 +57 +165 +64 +54 +159 +62 +53 +151 +61 +50 +149 +63 +50 +146 +63 +45 +146 +63 +45 +145 +62 +44 +144 +61 +43 +145 +59 +42 +145 +59 +42 +146 +60 +45 +146 +60 +45 +145 +59 +46 +145 +59 +46 +142 +59 +45 +141 +59 +45 +138 +59 +46 +136 +58 +45 +134 +58 +44 +132 +59 +44 +133 +57 +41 +133 +57 +41 +131 +58 +41 +130 +57 +40 +130 +57 +42 +129 +57 +42 +126 +56 +44 +126 +56 +44 +128 +60 +49 +128 +61 +52 +128 +64 +55 +129 +66 +57 +132 +69 +62 +133 +73 +65 +136 +75 +70 +140 +77 +70 +140 +73 +65 +142 +72 +64 +152 +74 +70 +161 +83 +79 +168 +93 +88 +169 +104 +98 +169 +123 +110 +164 +142 +121 +153 +156 +129 +146 +167 +134 +137 +172 +139 +130 +170 +136 +128 +161 +132 +127 +153 +128 +126 +139 +119 +120 +129 +110 +106 +120 +97 +100 +114 +91 +90 +104 +81 +81 +93 +73 +73 +84 +67 +67 +76 +59 +62 +68 +54 +60 +63 +52 +54 +55 +47 +52 +52 +44 +51 +48 +43 +48 +43 +39 +49 +40 +41 +49 +40 +41 +50 +41 +42 +52 +43 +44 +50 +41 +42 +50 +41 +42 +50 +41 +42 +50 +41 +42 +50 +41 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +49 +43 +43 +49 +43 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +43 +45 +54 +41 +50 +53 +41 +45 +52 +45 +37 +52 +54 +33 +65 +72 +38 +87 +99 +59 +113 +128 +87 +130 +146 +109 +141 +156 +125 +144 +160 +134 +144 +162 +140 +139 +161 +138 +141 +168 +137 +149 +184 +142 +160 +200 +148 +164 +208 +157 +169 +211 +171 +168 +210 +174 +167 +209 +173 +161 +203 +165 +147 +189 +151 +133 +175 +135 +130 +172 +132 +135 +176 +134 +136 +174 +133 +140 +177 +136 +139 +171 +134 +129 +159 +123 +123 +148 +116 +113 +136 +107 +95 +115 +87 +77 +93 +66 +73 +79 +51 +74 +77 +48 +76 +76 +48 +46 +47 +49 +44 +48 +49 +46 +47 +49 +46 +47 +49 +46 +48 +47 +46 +48 +47 +46 +48 +47 +47 +47 +47 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +47 +45 +48 +47 +45 +48 +47 +43 +47 +46 +44 +49 +45 +44 +50 +46 +45 +49 +45 +44 +49 +45 +44 +48 +44 +43 +47 +43 +44 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +44 +43 +41 +42 +43 +41 +44 +43 +41 +42 +45 +40 +44 +42 +40 +41 +44 +40 +41 +41 +39 +40 +41 +39 +40 +40 +38 +39 +42 +40 +41 +43 +41 +42 +44 +42 +43 +44 +43 +41 +45 +43 +44 +46 +45 +43 +47 +46 +44 +47 +46 +44 +45 +44 +42 +45 +44 +42 +47 +43 +42 +47 +43 +42 +46 +42 +41 +45 +41 +40 +44 +40 +39 +44 +40 +39 +49 +45 +44 +50 +45 +42 +50 +45 +42 +50 +45 +42 +51 +46 +43 +52 +47 +44 +53 +48 +45 +54 +49 +46 +59 +51 +49 +59 +51 +49 +60 +52 +50 +60 +52 +50 +61 +51 +49 +60 +50 +48 +59 +49 +47 +59 +49 +47 +60 +49 +47 +60 +49 +47 +61 +47 +46 +61 +47 +46 +61 +47 +44 +62 +48 +45 +63 +49 +46 +61 +50 +46 +62 +51 +45 +61 +54 +46 +60 +55 +49 +57 +57 +49 +57 +58 +50 +58 +58 +50 +59 +56 +49 +63 +54 +47 +67 +50 +43 +74 +49 +44 +84 +50 +41 +94 +51 +42 +104 +54 +43 +111 +57 +45 +118 +60 +46 +123 +59 +47 +135 +61 +50 +139 +61 +51 +139 +63 +50 +140 +64 +50 +142 +64 +51 +143 +64 +49 +146 +63 +49 +149 +61 +47 +152 +60 +47 +156 +62 +50 +162 +66 +54 +161 +67 +55 +158 +66 +55 +153 +63 +52 +150 +62 +50 +148 +62 +49 +148 +62 +47 +147 +61 +46 +144 +61 +45 +142 +61 +44 +142 +61 +44 +140 +61 +44 +140 +61 +46 +141 +62 +47 +142 +60 +46 +142 +60 +46 +139 +60 +47 +138 +59 +46 +136 +58 +45 +135 +59 +45 +132 +59 +44 +132 +59 +44 +130 +58 +43 +128 +59 +43 +127 +58 +42 +126 +59 +42 +126 +59 +43 +124 +58 +42 +124 +58 +44 +124 +58 +46 +128 +62 +50 +129 +62 +53 +128 +64 +54 +130 +67 +58 +133 +70 +61 +133 +74 +66 +136 +77 +69 +139 +79 +71 +140 +73 +67 +142 +73 +68 +147 +80 +74 +152 +92 +84 +157 +104 +96 +157 +117 +105 +158 +135 +117 +157 +153 +128 +147 +162 +133 +143 +170 +137 +137 +172 +139 +129 +169 +135 +127 +162 +132 +125 +155 +127 +122 +144 +121 +116 +136 +111 +103 +126 +98 +98 +121 +93 +92 +112 +85 +85 +103 +79 +78 +93 +72 +71 +82 +65 +64 +73 +56 +61 +65 +51 +56 +56 +46 +56 +53 +46 +53 +48 +44 +51 +43 +41 +50 +40 +41 +50 +40 +41 +51 +41 +42 +52 +42 +43 +50 +41 +44 +48 +42 +42 +48 +42 +44 +50 +41 +42 +50 +41 +44 +50 +41 +44 +50 +41 +44 +50 +41 +44 +51 +42 +45 +51 +42 +45 +49 +43 +45 +49 +43 +45 +48 +44 +45 +48 +44 +45 +48 +44 +45 +49 +43 +47 +52 +41 +47 +52 +42 +43 +52 +45 +37 +52 +54 +33 +63 +70 +37 +84 +96 +56 +109 +124 +81 +129 +144 +103 +137 +153 +116 +141 +158 +122 +141 +161 +126 +136 +161 +122 +138 +167 +123 +145 +182 +130 +155 +196 +136 +159 +203 +144 +159 +201 +153 +158 +199 +157 +157 +198 +154 +152 +193 +149 +140 +183 +138 +130 +173 +128 +133 +174 +130 +140 +181 +137 +132 +171 +127 +137 +174 +133 +137 +169 +130 +126 +156 +120 +118 +143 +111 +108 +131 +102 +90 +110 +83 +74 +90 +63 +70 +76 +50 +70 +74 +47 +70 +72 +48 +47 +48 +43 +46 +48 +43 +47 +48 +43 +48 +49 +44 +48 +49 +44 +48 +49 +44 +49 +50 +45 +50 +49 +45 +51 +50 +46 +52 +51 +47 +52 +51 +47 +54 +50 +47 +53 +49 +46 +52 +49 +44 +51 +47 +44 +52 +47 +44 +53 +48 +45 +53 +48 +45 +52 +47 +44 +51 +46 +43 +50 +44 +44 +49 +45 +44 +48 +44 +43 +48 +44 +43 +46 +44 +45 +46 +44 +45 +45 +45 +47 +45 +45 +47 +44 +44 +46 +43 +43 +45 +42 +41 +46 +41 +41 +43 +46 +41 +47 +46 +41 +45 +47 +40 +47 +46 +41 +45 +47 +41 +45 +46 +41 +45 +46 +42 +43 +46 +42 +43 +47 +43 +42 +47 +43 +42 +45 +44 +42 +46 +45 +41 +45 +45 +43 +45 +46 +41 +46 +47 +42 +46 +47 +42 +45 +45 +45 +45 +45 +45 +46 +44 +45 +47 +45 +46 +47 +46 +44 +48 +47 +45 +50 +46 +43 +50 +46 +43 +50 +45 +42 +52 +44 +41 +53 +45 +42 +54 +46 +43 +56 +47 +42 +58 +49 +44 +58 +49 +42 +59 +50 +43 +61 +52 +45 +61 +52 +45 +62 +53 +48 +62 +53 +48 +62 +53 +48 +61 +52 +47 +60 +51 +46 +59 +50 +45 +61 +50 +46 +60 +49 +45 +60 +49 +47 +59 +48 +46 +61 +47 +46 +62 +48 +47 +62 +48 +47 +64 +49 +46 +66 +47 +41 +66 +49 +41 +60 +51 +42 +57 +54 +45 +53 +56 +45 +52 +55 +46 +54 +54 +46 +59 +50 +45 +64 +45 +41 +71 +41 +39 +79 +39 +39 +86 +41 +38 +91 +46 +40 +97 +53 +44 +102 +60 +48 +109 +63 +48 +121 +65 +48 +127 +64 +47 +134 +65 +49 +139 +66 +51 +143 +64 +51 +147 +61 +48 +147 +59 +47 +146 +56 +45 +147 +59 +47 +147 +61 +46 +148 +65 +49 +149 +66 +50 +148 +67 +50 +146 +65 +48 +145 +62 +46 +145 +59 +44 +151 +59 +48 +151 +58 +50 +146 +59 +49 +140 +61 +48 +136 +63 +48 +132 +63 +47 +130 +63 +46 +130 +63 +46 +136 +64 +49 +136 +63 +48 +138 +62 +49 +137 +61 +48 +136 +60 +47 +135 +59 +46 +132 +58 +45 +131 +59 +45 +123 +57 +43 +126 +64 +51 +118 +60 +46 +112 +56 +41 +118 +62 +45 +118 +62 +45 +118 +59 +45 +125 +63 +50 +125 +59 +47 +131 +63 +52 +136 +68 +57 +139 +72 +63 +138 +76 +65 +135 +77 +66 +133 +79 +67 +135 +78 +69 +144 +76 +73 +149 +84 +80 +147 +99 +89 +142 +113 +97 +138 +125 +106 +134 +138 +113 +135 +151 +124 +136 +159 +130 +139 +166 +135 +138 +167 +137 +139 +168 +138 +138 +168 +140 +132 +165 +136 +124 +161 +130 +114 +155 +123 +110 +151 +117 +104 +142 +105 +97 +133 +95 +91 +122 +88 +89 +116 +85 +90 +110 +83 +86 +101 +78 +79 +88 +69 +73 +75 +61 +66 +63 +54 +64 +57 +51 +58 +48 +46 +53 +43 +42 +51 +39 +41 +51 +39 +43 +51 +39 +43 +49 +38 +42 +47 +41 +45 +45 +41 +42 +45 +40 +44 +45 +39 +41 +47 +38 +43 +49 +38 +44 +51 +38 +45 +51 +38 +45 +52 +39 +46 +52 +39 +46 +51 +40 +48 +50 +40 +48 +48 +41 +49 +47 +42 +49 +47 +42 +49 +47 +42 +48 +47 +41 +45 +49 +43 +43 +48 +45 +40 +47 +47 +35 +60 +63 +42 +86 +92 +64 +112 +122 +88 +127 +139 +103 +141 +156 +117 +139 +157 +115 +140 +161 +118 +140 +166 +119 +138 +168 +118 +137 +170 +117 +142 +180 +123 +153 +191 +134 +159 +193 +143 +157 +190 +143 +150 +186 +138 +143 +179 +131 +136 +174 +125 +133 +171 +124 +131 +170 +123 +133 +170 +126 +131 +168 +125 +131 +166 +126 +128 +158 +124 +121 +148 +117 +114 +137 +109 +104 +124 +99 +89 +107 +85 +77 +90 +70 +74 +82 +61 +68 +73 +51 +62 +65 +46 +47 +48 +42 +48 +49 +43 +48 +49 +43 +48 +49 +43 +49 +50 +44 +49 +50 +44 +50 +49 +44 +51 +50 +45 +52 +51 +46 +52 +51 +46 +55 +52 +47 +55 +52 +47 +54 +51 +46 +53 +50 +45 +53 +48 +44 +53 +48 +44 +55 +47 +44 +55 +47 +44 +54 +46 +44 +54 +46 +44 +51 +46 +43 +50 +45 +42 +48 +44 +43 +48 +44 +43 +48 +44 +45 +47 +45 +46 +47 +45 +48 +45 +45 +47 +45 +44 +49 +43 +42 +47 +41 +42 +46 +41 +40 +45 +46 +41 +47 +47 +40 +47 +47 +40 +47 +47 +40 +47 +47 +41 +45 +47 +41 +45 +46 +42 +43 +46 +42 +43 +47 +43 +42 +47 +43 +42 +46 +45 +41 +46 +45 +41 +46 +47 +42 +46 +47 +42 +46 +47 +41 +46 +47 +42 +46 +46 +46 +46 +46 +48 +46 +46 +46 +46 +46 +46 +47 +46 +44 +47 +46 +44 +49 +45 +42 +51 +46 +43 +53 +45 +42 +53 +46 +40 +55 +46 +41 +56 +47 +40 +58 +47 +41 +59 +48 +42 +60 +50 +41 +61 +51 +42 +62 +53 +44 +62 +53 +44 +62 +53 +46 +62 +53 +46 +62 +53 +46 +61 +52 +45 +60 +51 +46 +60 +51 +46 +61 +50 +46 +60 +49 +45 +59 +48 +46 +59 +48 +46 +61 +47 +46 +61 +47 +46 +62 +48 +47 +64 +49 +46 +68 +47 +42 +70 +47 +41 +67 +50 +43 +64 +51 +43 +61 +52 +45 +60 +51 +44 +59 +50 +45 +62 +48 +45 +65 +44 +43 +70 +42 +41 +75 +41 +40 +80 +42 +39 +86 +45 +41 +92 +51 +45 +97 +57 +49 +103 +61 +47 +112 +65 +47 +120 +65 +45 +128 +65 +48 +136 +64 +50 +143 +63 +52 +145 +61 +51 +147 +58 +50 +147 +59 +49 +141 +57 +46 +139 +60 +47 +139 +62 +46 +140 +64 +48 +141 +65 +49 +141 +65 +49 +142 +65 +47 +145 +63 +49 +149 +59 +50 +149 +59 +50 +144 +60 +50 +139 +61 +48 +134 +62 +48 +131 +64 +47 +129 +63 +47 +129 +64 +46 +133 +64 +49 +134 +62 +47 +135 +61 +48 +136 +60 +46 +133 +59 +46 +132 +59 +44 +130 +58 +44 +127 +60 +44 +119 +57 +44 +119 +61 +49 +112 +59 +45 +109 +57 +43 +114 +63 +46 +114 +63 +46 +113 +57 +42 +117 +58 +44 +127 +61 +49 +132 +64 +53 +138 +68 +58 +140 +72 +61 +138 +74 +64 +135 +77 +65 +133 +79 +67 +136 +77 +69 +144 +74 +72 +149 +84 +82 +145 +102 +93 +138 +119 +102 +131 +135 +112 +127 +147 +119 +128 +159 +127 +131 +166 +134 +134 +167 +136 +139 +168 +138 +143 +167 +141 +143 +167 +141 +136 +165 +137 +127 +160 +131 +117 +156 +125 +109 +153 +118 +100 +147 +105 +94 +139 +96 +89 +130 +90 +89 +123 +88 +90 +119 +88 +88 +111 +83 +82 +97 +74 +77 +86 +67 +69 +73 +59 +65 +65 +55 +59 +56 +51 +53 +48 +45 +51 +42 +43 +50 +41 +42 +49 +40 +43 +46 +40 +42 +49 +40 +43 +48 +39 +44 +48 +39 +44 +48 +39 +44 +49 +38 +44 +51 +38 +45 +52 +39 +48 +52 +39 +48 +52 +39 +48 +51 +40 +48 +50 +40 +49 +48 +41 +49 +47 +42 +49 +45 +42 +51 +44 +43 +51 +44 +43 +49 +50 +45 +49 +50 +46 +45 +48 +44 +41 +45 +45 +37 +56 +58 +44 +83 +88 +66 +111 +120 +93 +128 +139 +105 +135 +150 +111 +134 +153 +108 +134 +158 +110 +136 +163 +112 +134 +164 +112 +132 +165 +112 +138 +173 +119 +147 +182 +128 +153 +185 +135 +150 +182 +132 +147 +179 +129 +140 +174 +123 +134 +171 +120 +130 +168 +119 +130 +168 +121 +131 +168 +124 +131 +166 +124 +130 +164 +127 +127 +157 +123 +120 +146 +117 +113 +136 +110 +104 +123 +101 +89 +106 +87 +77 +90 +72 +70 +77 +59 +64 +68 +51 +59 +62 +45 +49 +50 +44 +49 +50 +44 +49 +50 +44 +49 +50 +44 +50 +51 +45 +50 +51 +45 +52 +51 +46 +52 +51 +46 +53 +52 +47 +53 +52 +47 +56 +53 +48 +56 +53 +48 +56 +53 +48 +55 +52 +47 +55 +50 +46 +54 +49 +45 +56 +48 +45 +56 +48 +45 +55 +47 +44 +54 +46 +43 +52 +47 +44 +51 +46 +43 +50 +44 +44 +49 +45 +44 +49 +45 +46 +47 +45 +46 +48 +46 +49 +47 +45 +48 +45 +45 +47 +44 +44 +46 +43 +42 +47 +43 +41 +46 +47 +40 +47 +49 +39 +47 +47 +41 +45 +47 +41 +45 +47 +41 +45 +47 +41 +45 +46 +42 +43 +46 +42 +43 +48 +44 +43 +48 +44 +43 +47 +46 +42 +47 +46 +42 +47 +46 +41 +48 +47 +42 +48 +47 +42 +48 +47 +43 +47 +47 +45 +47 +47 +47 +48 +46 +47 +48 +46 +47 +48 +47 +45 +47 +46 +44 +49 +45 +42 +50 +45 +42 +54 +46 +43 +55 +48 +42 +57 +48 +43 +58 +49 +42 +60 +49 +43 +61 +51 +42 +62 +52 +43 +63 +53 +44 +63 +54 +45 +63 +54 +45 +64 +55 +46 +64 +55 +46 +63 +54 +47 +62 +53 +46 +61 +52 +45 +61 +52 +45 +61 +50 +46 +60 +49 +45 +59 +48 +46 +59 +48 +46 +59 +48 +46 +59 +48 +46 +60 +49 +47 +63 +49 +46 +68 +49 +43 +71 +47 +43 +74 +46 +43 +76 +44 +45 +79 +43 +47 +78 +42 +46 +74 +42 +47 +71 +42 +46 +68 +44 +44 +65 +46 +42 +66 +45 +40 +70 +45 +40 +79 +46 +41 +89 +48 +42 +99 +50 +45 +105 +52 +44 +107 +58 +44 +111 +59 +45 +119 +59 +48 +129 +61 +52 +135 +60 +54 +140 +60 +53 +141 +58 +52 +141 +58 +52 +138 +60 +50 +135 +61 +50 +134 +62 +50 +133 +63 +51 +134 +65 +50 +137 +65 +51 +140 +66 +53 +143 +67 +53 +142 +63 +50 +143 +61 +47 +140 +62 +49 +138 +62 +46 +135 +62 +47 +133 +62 +44 +134 +61 +46 +134 +61 +44 +137 +59 +46 +137 +60 +44 +136 +58 +45 +134 +58 +42 +132 +59 +44 +128 +60 +41 +126 +61 +43 +122 +61 +43 +124 +62 +49 +120 +60 +49 +117 +59 +47 +116 +60 +47 +118 +65 +49 +118 +65 +49 +117 +61 +46 +118 +59 +45 +127 +63 +53 +132 +65 +56 +138 +70 +61 +140 +72 +63 +138 +74 +65 +137 +74 +65 +136 +78 +67 +140 +77 +70 +147 +73 +72 +153 +83 +81 +151 +101 +92 +146 +117 +101 +138 +132 +110 +131 +144 +116 +129 +156 +123 +130 +164 +131 +134 +168 +135 +138 +169 +137 +143 +169 +140 +145 +168 +140 +144 +164 +137 +138 +158 +131 +130 +153 +125 +122 +151 +120 +107 +149 +109 +97 +146 +101 +92 +139 +97 +92 +134 +96 +93 +130 +96 +91 +124 +93 +85 +114 +86 +80 +104 +80 +70 +89 +69 +66 +80 +63 +58 +68 +57 +51 +58 +50 +46 +51 +44 +42 +47 +41 +40 +45 +41 +43 +42 +40 +50 +38 +40 +53 +36 +42 +53 +36 +42 +53 +36 +42 +52 +37 +42 +53 +38 +43 +51 +40 +46 +51 +42 +47 +48 +42 +46 +47 +42 +46 +44 +43 +48 +43 +44 +48 +41 +45 +48 +40 +45 +49 +38 +46 +49 +40 +45 +48 +49 +47 +50 +51 +47 +46 +46 +42 +39 +42 +42 +34 +53 +55 +42 +80 +85 +65 +109 +118 +91 +124 +138 +105 +128 +144 +107 +126 +147 +106 +127 +153 +106 +131 +159 +110 +128 +160 +110 +126 +160 +109 +128 +165 +113 +135 +172 +120 +141 +175 +124 +139 +173 +122 +136 +170 +120 +132 +169 +118 +129 +167 +118 +127 +167 +117 +127 +166 +119 +127 +166 +121 +127 +164 +121 +128 +162 +125 +125 +155 +121 +119 +145 +116 +112 +135 +109 +104 +124 +99 +89 +107 +85 +77 +90 +70 +69 +73 +58 +62 +64 +50 +57 +58 +44 +50 +51 +45 +50 +51 +45 +51 +52 +46 +51 +52 +46 +51 +52 +46 +52 +53 +47 +53 +52 +47 +53 +52 +47 +54 +53 +48 +55 +54 +49 +57 +54 +49 +58 +55 +50 +58 +55 +50 +57 +54 +49 +57 +52 +48 +57 +52 +48 +58 +50 +47 +57 +49 +46 +57 +49 +46 +56 +48 +45 +53 +48 +45 +52 +47 +44 +52 +46 +46 +52 +46 +46 +51 +47 +48 +51 +47 +48 +49 +47 +48 +49 +47 +50 +48 +46 +49 +46 +46 +48 +45 +45 +47 +45 +43 +46 +48 +41 +48 +50 +41 +46 +48 +42 +46 +48 +42 +46 +48 +42 +46 +48 +42 +44 +47 +43 +44 +47 +43 +42 +49 +45 +44 +49 +45 +44 +48 +47 +43 +48 +47 +43 +49 +48 +43 +49 +48 +43 +49 +48 +43 +49 +48 +44 +49 +49 +47 +49 +49 +49 +49 +47 +48 +49 +48 +46 +49 +48 +46 +50 +46 +43 +51 +46 +43 +51 +46 +42 +57 +50 +44 +57 +50 +44 +59 +50 +43 +60 +51 +44 +62 +52 +43 +64 +54 +45 +64 +54 +45 +65 +55 +46 +66 +56 +47 +65 +56 +47 +66 +57 +48 +65 +56 +47 +65 +56 +49 +64 +55 +48 +62 +53 +46 +62 +53 +46 +61 +50 +46 +61 +50 +46 +60 +49 +47 +59 +48 +46 +59 +48 +46 +60 +49 +47 +61 +50 +48 +63 +49 +46 +66 +51 +46 +70 +49 +46 +77 +45 +46 +84 +41 +48 +88 +38 +47 +87 +37 +46 +81 +38 +47 +75 +40 +46 +68 +47 +46 +62 +49 +43 +60 +50 +41 +64 +50 +41 +72 +47 +40 +84 +47 +41 +96 +45 +42 +101 +46 +41 +105 +57 +47 +107 +59 +47 +117 +60 +51 +125 +60 +54 +133 +59 +56 +137 +59 +57 +138 +59 +55 +136 +58 +54 +137 +62 +56 +134 +64 +56 +134 +66 +57 +133 +66 +57 +133 +67 +55 +134 +66 +55 +135 +65 +55 +137 +65 +53 +137 +64 +49 +137 +64 +47 +136 +63 +46 +136 +63 +46 +135 +62 +45 +136 +60 +44 +136 +59 +43 +137 +58 +43 +138 +56 +42 +138 +56 +42 +136 +57 +42 +133 +57 +41 +130 +59 +41 +125 +60 +40 +122 +61 +40 +120 +62 +42 +127 +64 +49 +122 +55 +46 +120 +56 +46 +120 +60 +49 +117 +59 +45 +118 +62 +47 +123 +65 +51 +123 +64 +50 +128 +66 +55 +132 +68 +58 +135 +71 +61 +137 +73 +63 +136 +73 +64 +138 +75 +66 +138 +78 +68 +140 +80 +72 +144 +81 +74 +147 +90 +81 +148 +101 +91 +143 +114 +98 +137 +125 +103 +132 +136 +109 +131 +147 +118 +131 +156 +124 +135 +165 +131 +136 +167 +135 +139 +168 +137 +143 +168 +138 +143 +163 +135 +139 +158 +130 +136 +152 +126 +127 +150 +121 +114 +148 +111 +108 +146 +105 +104 +142 +103 +102 +140 +101 +103 +139 +103 +100 +134 +101 +96 +125 +95 +92 +118 +91 +81 +103 +80 +76 +93 +74 +66 +80 +63 +57 +68 +54 +50 +58 +47 +46 +52 +42 +44 +47 +40 +45 +42 +37 +53 +37 +38 +56 +35 +40 +56 +35 +40 +55 +36 +40 +52 +37 +40 +51 +39 +43 +50 +41 +44 +48 +44 +45 +44 +42 +43 +43 +43 +45 +42 +43 +45 +40 +44 +45 +39 +44 +47 +39 +44 +47 +37 +45 +47 +40 +44 +45 +46 +42 +43 +49 +43 +43 +48 +43 +39 +46 +43 +34 +56 +56 +44 +80 +85 +65 +105 +113 +89 +118 +132 +99 +123 +140 +104 +121 +143 +104 +124 +150 +105 +127 +156 +108 +125 +159 +109 +121 +158 +107 +122 +160 +109 +127 +165 +114 +130 +167 +116 +128 +165 +113 +125 +163 +112 +125 +163 +112 +125 +165 +115 +126 +165 +118 +126 +165 +120 +125 +164 +120 +124 +161 +120 +125 +159 +122 +122 +153 +119 +117 +144 +113 +110 +135 +106 +101 +124 +98 +87 +107 +82 +78 +91 +71 +69 +71 +57 +63 +61 +48 +57 +55 +42 +52 +53 +47 +52 +53 +47 +52 +53 +47 +53 +54 +48 +53 +54 +48 +53 +54 +48 +55 +54 +49 +55 +54 +49 +56 +55 +50 +56 +55 +50 +59 +56 +51 +60 +57 +52 +60 +57 +52 +60 +57 +52 +60 +55 +51 +60 +55 +51 +60 +52 +49 +60 +52 +49 +59 +51 +48 +59 +51 +48 +56 +51 +48 +55 +50 +47 +54 +49 +46 +54 +49 +46 +53 +49 +48 +54 +50 +49 +54 +50 +49 +51 +49 +50 +50 +48 +49 +49 +47 +48 +48 +46 +47 +49 +45 +46 +50 +44 +48 +52 +43 +46 +52 +43 +46 +52 +43 +46 +50 +44 +46 +50 +44 +44 +50 +44 +44 +50 +44 +44 +51 +47 +46 +51 +47 +44 +51 +47 +44 +51 +47 +44 +50 +49 +44 +50 +49 +44 +51 +50 +45 +51 +50 +46 +51 +50 +48 +51 +50 +48 +51 +50 +48 +51 +50 +48 +53 +49 +48 +53 +49 +46 +54 +49 +46 +54 +49 +45 +59 +52 +46 +60 +53 +47 +61 +52 +45 +63 +54 +45 +65 +55 +46 +66 +56 +47 +69 +56 +47 +67 +57 +47 +68 +58 +49 +68 +58 +49 +69 +59 +50 +68 +58 +49 +67 +57 +48 +66 +56 +47 +64 +53 +47 +64 +53 +47 +62 +51 +47 +62 +51 +47 +61 +50 +46 +61 +50 +46 +61 +50 +48 +61 +50 +48 +62 +51 +49 +62 +51 +49 +66 +52 +49 +70 +50 +49 +78 +48 +50 +85 +44 +52 +90 +40 +51 +89 +39 +50 +83 +40 +49 +76 +44 +49 +68 +50 +48 +60 +53 +45 +57 +55 +43 +60 +54 +42 +68 +51 +41 +78 +49 +41 +90 +47 +41 +94 +47 +41 +102 +58 +49 +106 +59 +51 +115 +60 +55 +122 +61 +58 +130 +60 +58 +134 +60 +59 +135 +59 +59 +134 +58 +58 +130 +59 +55 +129 +62 +56 +129 +65 +56 +129 +66 +57 +131 +67 +58 +131 +67 +58 +133 +64 +57 +132 +64 +55 +132 +66 +50 +132 +67 +49 +133 +64 +48 +134 +62 +47 +136 +60 +46 +137 +59 +46 +139 +57 +45 +140 +56 +45 +138 +54 +43 +137 +55 +43 +135 +56 +43 +131 +58 +43 +127 +60 +43 +122 +61 +42 +119 +62 +42 +120 +62 +42 +127 +57 +45 +122 +48 +39 +129 +56 +47 +131 +63 +52 +117 +53 +43 +113 +53 +42 +124 +66 +54 +125 +67 +55 +127 +69 +58 +129 +71 +60 +131 +73 +62 +132 +74 +63 +133 +74 +66 +135 +76 +68 +138 +79 +71 +137 +85 +74 +130 +94 +78 +129 +102 +81 +134 +109 +89 +135 +114 +93 +136 +121 +98 +137 +131 +105 +141 +144 +117 +141 +154 +124 +138 +159 +126 +136 +163 +130 +136 +167 +133 +137 +168 +134 +135 +166 +132 +132 +162 +128 +129 +156 +125 +127 +151 +119 +125 +144 +112 +125 +142 +108 +123 +140 +108 +120 +139 +107 +120 +139 +109 +117 +136 +108 +112 +131 +103 +108 +126 +100 +99 +113 +88 +92 +104 +82 +83 +90 +72 +73 +75 +61 +66 +64 +52 +61 +54 +44 +57 +47 +38 +55 +42 +36 +57 +39 +39 +57 +37 +39 +54 +38 +39 +52 +38 +38 +49 +39 +38 +46 +40 +40 +44 +43 +41 +44 +44 +42 +41 +43 +40 +41 +43 +42 +41 +43 +42 +41 +43 +42 +42 +42 +44 +42 +42 +44 +43 +41 +44 +45 +41 +42 +44 +35 +36 +50 +42 +39 +53 +48 +42 +56 +54 +42 +66 +67 +53 +85 +90 +70 +102 +112 +87 +110 +125 +94 +116 +136 +101 +113 +138 +98 +117 +144 +101 +120 +152 +105 +119 +155 +107 +115 +153 +104 +116 +154 +105 +119 +159 +107 +122 +162 +110 +120 +160 +108 +119 +159 +109 +120 +160 +110 +121 +163 +115 +123 +165 +117 +123 +165 +119 +124 +163 +119 +121 +158 +117 +122 +156 +119 +119 +150 +116 +115 +142 +111 +109 +134 +104 +100 +123 +95 +87 +107 +80 +78 +92 +69 +68 +69 +55 +62 +58 +47 +56 +52 +41 +53 +54 +48 +53 +54 +48 +54 +55 +49 +54 +55 +49 +55 +56 +50 +55 +56 +50 +56 +55 +50 +56 +55 +50 +57 +56 +51 +58 +57 +52 +61 +58 +53 +62 +59 +54 +62 +59 +54 +62 +59 +54 +62 +57 +53 +62 +57 +53 +63 +55 +52 +63 +55 +52 +62 +54 +51 +61 +53 +50 +59 +54 +51 +58 +53 +50 +57 +52 +49 +57 +52 +49 +56 +52 +49 +56 +52 +51 +57 +53 +52 +56 +52 +51 +55 +51 +50 +52 +51 +49 +53 +49 +50 +52 +48 +47 +54 +45 +48 +54 +45 +46 +54 +45 +48 +54 +45 +46 +52 +46 +46 +52 +46 +46 +52 +46 +46 +52 +47 +44 +52 +48 +45 +52 +48 +45 +52 +48 +45 +53 +49 +46 +51 +50 +45 +51 +50 +45 +52 +51 +46 +52 +51 +46 +52 +51 +47 +52 +51 +49 +53 +52 +50 +53 +52 +48 +56 +52 +49 +56 +53 +48 +57 +52 +48 +58 +53 +47 +61 +54 +48 +62 +55 +47 +64 +55 +46 +65 +56 +47 +67 +57 +48 +68 +58 +48 +71 +58 +49 +72 +59 +50 +70 +60 +51 +70 +60 +51 +70 +60 +51 +70 +60 +51 +69 +59 +50 +67 +57 +48 +66 +55 +49 +65 +54 +48 +64 +53 +49 +64 +53 +49 +63 +52 +48 +62 +51 +47 +62 +51 +49 +63 +52 +50 +64 +53 +51 +64 +53 +51 +65 +54 +50 +68 +53 +50 +75 +50 +53 +81 +49 +54 +86 +46 +54 +85 +45 +53 +82 +47 +53 +75 +49 +50 +68 +53 +50 +63 +56 +48 +61 +57 +45 +63 +57 +43 +67 +55 +41 +73 +54 +40 +83 +50 +41 +88 +50 +41 +93 +50 +43 +100 +51 +44 +108 +53 +48 +118 +54 +52 +125 +55 +55 +130 +56 +55 +131 +55 +55 +130 +54 +54 +126 +55 +53 +125 +58 +52 +125 +60 +54 +125 +62 +53 +128 +63 +57 +131 +64 +56 +134 +63 +57 +133 +65 +56 +131 +65 +51 +131 +65 +49 +132 +65 +49 +132 +63 +48 +136 +60 +47 +136 +58 +46 +137 +57 +46 +138 +56 +45 +135 +55 +44 +134 +56 +44 +131 +57 +44 +128 +59 +44 +126 +60 +44 +124 +61 +44 +121 +62 +44 +126 +60 +44 +133 +53 +42 +138 +51 +44 +160 +77 +69 +166 +89 +81 +138 +65 +56 +124 +57 +48 +130 +70 +59 +128 +75 +61 +123 +71 +58 +122 +74 +60 +124 +76 +62 +125 +77 +63 +127 +77 +66 +130 +80 +69 +137 +85 +74 +134 +92 +76 +119 +105 +79 +117 +112 +82 +130 +114 +88 +141 +117 +93 +150 +117 +98 +159 +124 +105 +166 +135 +115 +167 +145 +122 +157 +147 +122 +150 +153 +124 +146 +160 +127 +143 +165 +129 +139 +165 +130 +134 +161 +126 +130 +156 +121 +131 +150 +118 +134 +143 +112 +136 +141 +111 +134 +140 +112 +131 +142 +112 +129 +142 +112 +126 +141 +112 +122 +138 +109 +118 +134 +107 +109 +125 +98 +104 +116 +92 +96 +104 +83 +87 +90 +71 +80 +77 +62 +72 +64 +51 +66 +54 +42 +64 +47 +39 +61 +43 +39 +60 +42 +40 +56 +42 +39 +53 +42 +40 +50 +42 +39 +47 +44 +39 +44 +45 +39 +43 +45 +40 +43 +45 +40 +44 +45 +40 +45 +44 +42 +47 +43 +42 +51 +41 +42 +52 +40 +42 +54 +39 +42 +54 +40 +40 +51 +40 +36 +60 +51 +44 +69 +62 +52 +73 +71 +56 +81 +82 +64 +93 +98 +75 +103 +113 +86 +106 +121 +90 +110 +130 +93 +107 +132 +92 +108 +137 +93 +112 +145 +98 +113 +149 +101 +111 +149 +100 +111 +151 +101 +114 +154 +102 +117 +159 +109 +114 +156 +106 +113 +155 +105 +116 +158 +110 +120 +162 +114 +122 +164 +118 +121 +162 +118 +121 +159 +118 +118 +154 +116 +119 +153 +118 +117 +148 +114 +111 +141 +107 +106 +133 +102 +99 +124 +94 +85 +108 +79 +78 +92 +69 +67 +68 +54 +64 +57 +47 +58 +51 +41 +54 +55 +49 +55 +56 +50 +55 +56 +50 +55 +56 +50 +56 +57 +51 +56 +57 +51 +57 +56 +51 +58 +57 +52 +58 +57 +52 +59 +58 +53 +62 +59 +54 +63 +60 +55 +63 +60 +55 +63 +60 +55 +64 +59 +55 +64 +59 +55 +66 +58 +55 +66 +58 +55 +65 +57 +54 +64 +56 +53 +61 +56 +52 +61 +56 +52 +60 +55 +51 +60 +55 +51 +60 +55 +51 +60 +55 +52 +60 +55 +52 +60 +55 +52 +59 +54 +51 +57 +53 +50 +57 +51 +51 +56 +51 +48 +56 +47 +48 +57 +47 +46 +56 +47 +48 +56 +48 +46 +56 +48 +46 +56 +48 +46 +54 +49 +46 +54 +49 +45 +54 +49 +45 +54 +49 +45 +53 +50 +45 +53 +50 +45 +54 +51 +46 +54 +51 +46 +55 +52 +47 +55 +52 +47 +53 +52 +48 +53 +52 +48 +56 +52 +49 +57 +53 +50 +58 +54 +51 +60 +57 +52 +61 +56 +52 +64 +57 +51 +64 +55 +48 +65 +56 +47 +67 +57 +48 +68 +58 +48 +71 +58 +49 +72 +60 +48 +73 +61 +49 +73 +61 +49 +74 +61 +52 +74 +61 +52 +74 +61 +52 +73 +60 +51 +70 +60 +51 +68 +58 +49 +66 +56 +47 +65 +55 +46 +65 +56 +49 +64 +55 +48 +64 +55 +50 +63 +54 +49 +63 +54 +49 +64 +55 +50 +64 +55 +50 +65 +56 +51 +64 +54 +52 +65 +55 +53 +67 +56 +54 +70 +56 +55 +72 +57 +54 +74 +56 +54 +74 +56 +54 +72 +57 +52 +69 +56 +48 +69 +56 +47 +69 +57 +45 +70 +56 +43 +73 +57 +44 +73 +57 +42 +76 +57 +43 +82 +54 +42 +90 +47 +38 +100 +47 +39 +110 +51 +45 +122 +54 +51 +131 +57 +56 +137 +59 +57 +139 +59 +58 +139 +61 +59 +139 +65 +62 +135 +64 +58 +130 +61 +54 +127 +60 +51 +127 +58 +51 +130 +60 +52 +136 +61 +55 +138 +64 +55 +133 +63 +53 +132 +64 +51 +132 +62 +50 +134 +62 +50 +134 +60 +49 +133 +59 +48 +132 +58 +47 +131 +59 +47 +128 +58 +46 +127 +59 +46 +126 +60 +46 +127 +61 +47 +127 +61 +47 +128 +60 +47 +129 +59 +47 +135 +57 +47 +144 +49 +43 +160 +61 +56 +203 +108 +102 +216 +127 +121 +171 +91 +84 +138 +68 +60 +136 +76 +65 +127 +78 +64 +117 +73 +60 +114 +77 +61 +113 +80 +63 +114 +81 +64 +118 +83 +64 +124 +85 +68 +132 +90 +74 +128 +100 +79 +113 +113 +79 +116 +120 +85 +138 +118 +91 +156 +115 +95 +173 +109 +99 +186 +107 +102 +194 +111 +107 +195 +116 +111 +191 +128 +119 +183 +137 +122 +173 +148 +126 +163 +156 +128 +154 +159 +129 +145 +159 +126 +139 +154 +121 +137 +151 +118 +140 +143 +114 +142 +142 +114 +139 +144 +114 +135 +146 +114 +132 +147 +114 +128 +147 +115 +122 +146 +112 +119 +144 +112 +112 +137 +105 +107 +130 +101 +103 +119 +92 +94 +107 +81 +88 +93 +71 +80 +79 +59 +72 +67 +48 +67 +58 +43 +65 +50 +43 +64 +49 +44 +59 +48 +42 +56 +47 +42 +52 +47 +41 +50 +47 +40 +46 +47 +39 +46 +47 +41 +48 +47 +42 +51 +46 +42 +54 +44 +43 +58 +42 +43 +62 +40 +43 +65 +38 +43 +69 +36 +43 +67 +38 +40 +70 +53 +45 +76 +67 +52 +86 +81 +62 +91 +89 +68 +96 +98 +74 +103 +109 +81 +105 +119 +86 +106 +123 +87 +108 +130 +91 +103 +130 +87 +102 +134 +87 +108 +142 +92 +111 +148 +97 +110 +148 +97 +110 +150 +98 +114 +154 +102 +115 +157 +107 +111 +155 +106 +111 +153 +105 +114 +156 +110 +119 +160 +116 +121 +162 +120 +120 +158 +119 +117 +155 +118 +115 +151 +115 +117 +151 +118 +115 +146 +114 +110 +139 +108 +105 +132 +99 +98 +123 +91 +84 +109 +77 +77 +93 +67 +72 +73 +59 +69 +60 +51 +63 +54 +45 +55 +56 +50 +55 +56 +50 +56 +57 +51 +56 +57 +51 +56 +57 +51 +57 +58 +52 +58 +57 +52 +58 +57 +52 +59 +58 +53 +60 +59 +54 +63 +60 +55 +64 +61 +56 +64 +61 +56 +64 +61 +56 +65 +60 +56 +65 +60 +56 +67 +59 +56 +67 +59 +56 +67 +59 +56 +66 +58 +55 +63 +58 +54 +62 +57 +53 +62 +57 +53 +61 +56 +52 +62 +57 +53 +62 +57 +53 +62 +57 +53 +62 +57 +53 +61 +56 +53 +60 +55 +51 +58 +53 +49 +59 +51 +48 +58 +48 +46 +58 +48 +46 +57 +49 +46 +57 +49 +46 +57 +49 +47 +57 +49 +46 +57 +49 +46 +55 +50 +46 +54 +49 +45 +54 +49 +45 +54 +51 +46 +54 +51 +46 +54 +51 +46 +55 +52 +47 +55 +52 +47 +55 +52 +47 +53 +52 +48 +54 +53 +49 +57 +53 +50 +59 +56 +51 +60 +57 +52 +63 +58 +52 +66 +59 +53 +66 +59 +51 +65 +56 +47 +66 +58 +47 +67 +57 +47 +69 +59 +47 +72 +60 +48 +73 +61 +49 +74 +62 +50 +74 +62 +50 +75 +62 +53 +75 +62 +53 +74 +61 +52 +74 +61 +52 +70 +60 +51 +69 +59 +50 +67 +57 +48 +66 +56 +47 +66 +57 +50 +66 +57 +50 +65 +56 +51 +64 +55 +50 +64 +55 +50 +65 +56 +51 +66 +57 +52 +66 +57 +52 +63 +56 +50 +64 +57 +51 +66 +59 +53 +69 +60 +55 +71 +60 +54 +73 +60 +54 +77 +60 +53 +78 +59 +52 +77 +54 +46 +78 +54 +44 +81 +54 +43 +81 +54 +43 +81 +55 +42 +82 +56 +43 +80 +57 +41 +86 +54 +39 +103 +53 +42 +114 +54 +44 +126 +59 +51 +137 +64 +57 +149 +68 +64 +155 +72 +68 +159 +74 +71 +159 +76 +70 +160 +81 +74 +153 +76 +68 +142 +68 +59 +133 +59 +48 +132 +55 +45 +133 +55 +45 +140 +57 +49 +143 +60 +52 +139 +60 +53 +138 +61 +55 +137 +60 +54 +136 +59 +53 +136 +59 +53 +132 +59 +52 +128 +60 +51 +125 +61 +51 +122 +62 +51 +122 +62 +51 +122 +62 +51 +125 +61 +51 +129 +59 +51 +134 +57 +51 +139 +54 +51 +146 +51 +49 +150 +41 +38 +176 +63 +59 +234 +125 +122 +252 +150 +146 +195 +104 +99 +149 +72 +64 +137 +75 +64 +120 +72 +58 +112 +76 +60 +106 +81 +61 +104 +83 +62 +106 +86 +62 +111 +86 +64 +118 +90 +69 +128 +95 +76 +130 +102 +80 +124 +113 +81 +134 +118 +85 +160 +115 +92 +183 +107 +94 +203 +95 +95 +214 +84 +92 +218 +81 +91 +218 +82 +92 +230 +111 +117 +219 +121 +120 +207 +133 +124 +195 +142 +126 +184 +147 +128 +174 +148 +125 +165 +145 +120 +162 +142 +118 +159 +137 +114 +159 +137 +116 +156 +140 +117 +152 +142 +117 +148 +144 +117 +141 +144 +115 +137 +143 +115 +133 +144 +114 +127 +137 +110 +124 +133 +106 +119 +121 +97 +112 +110 +87 +105 +97 +78 +98 +82 +66 +87 +68 +53 +83 +59 +47 +79 +52 +45 +77 +49 +45 +73 +48 +44 +68 +47 +42 +64 +47 +40 +59 +46 +38 +55 +46 +39 +54 +47 +39 +57 +48 +41 +58 +47 +41 +61 +46 +43 +65 +44 +43 +70 +41 +43 +72 +40 +43 +75 +39 +43 +72 +41 +39 +84 +66 +52 +89 +81 +60 +100 +94 +70 +103 +101 +76 +105 +108 +79 +110 +117 +86 +109 +123 +88 +108 +126 +88 +107 +132 +90 +103 +132 +86 +103 +135 +86 +109 +143 +93 +112 +149 +98 +113 +150 +98 +114 +153 +100 +117 +157 +105 +116 +155 +108 +111 +153 +107 +111 +150 +106 +114 +153 +109 +119 +157 +118 +121 +159 +120 +119 +154 +121 +116 +150 +117 +115 +148 +117 +117 +148 +117 +115 +144 +113 +111 +138 +107 +105 +132 +101 +97 +124 +91 +84 +109 +77 +77 +93 +66 +78 +79 +63 +76 +67 +58 +69 +60 +51 +57 +58 +52 +57 +58 +52 +57 +58 +52 +57 +58 +52 +57 +58 +52 +58 +59 +53 +61 +60 +55 +61 +60 +55 +61 +60 +55 +61 +60 +55 +64 +61 +56 +64 +61 +56 +65 +62 +57 +66 +63 +58 +68 +63 +59 +68 +63 +59 +69 +64 +60 +69 +64 +60 +69 +64 +58 +68 +63 +57 +68 +63 +57 +67 +62 +56 +69 +62 +56 +68 +61 +55 +66 +59 +53 +66 +59 +53 +66 +59 +53 +66 +59 +53 +66 +58 +55 +66 +59 +53 +65 +58 +52 +65 +58 +52 +65 +56 +51 +65 +56 +51 +65 +56 +51 +64 +55 +50 +64 +54 +52 +62 +55 +49 +62 +55 +49 +62 +55 +49 +60 +55 +49 +60 +55 +49 +59 +54 +48 +58 +53 +47 +56 +53 +46 +56 +53 +46 +55 +52 +47 +55 +52 +47 +57 +54 +49 +57 +54 +49 +57 +54 +49 +58 +55 +48 +60 +55 +49 +61 +56 +50 +65 +58 +50 +66 +59 +49 +67 +58 +49 +68 +60 +49 +70 +60 +50 +74 +62 +50 +75 +63 +51 +76 +64 +50 +78 +64 +51 +78 +64 +53 +78 +64 +55 +78 +64 +55 +76 +63 +54 +75 +62 +53 +73 +60 +51 +72 +59 +50 +69 +59 +50 +69 +59 +50 +66 +57 +48 +65 +56 +47 +64 +57 +49 +63 +56 +48 +63 +56 +48 +63 +56 +48 +64 +57 +51 +64 +57 +51 +60 +53 +47 +77 +68 +61 +77 +64 +58 +75 +58 +51 +84 +64 +57 +82 +54 +50 +81 +48 +43 +95 +60 +54 +91 +52 +45 +94 +54 +46 +95 +52 +43 +92 +48 +39 +94 +47 +37 +101 +54 +44 +109 +61 +49 +114 +60 +48 +137 +73 +61 +143 +71 +59 +151 +73 +63 +159 +75 +65 +159 +70 +62 +155 +62 +55 +154 +61 +54 +158 +68 +59 +166 +78 +68 +164 +80 +69 +168 +86 +74 +171 +89 +75 +165 +79 +66 +153 +65 +53 +151 +59 +48 +156 +62 +54 +148 +57 +56 +146 +56 +56 +143 +53 +53 +137 +51 +50 +136 +55 +52 +135 +62 +56 +127 +63 +54 +117 +60 +49 +117 +65 +52 +115 +63 +50 +116 +59 +48 +121 +57 +48 +133 +54 +50 +142 +50 +51 +149 +44 +49 +155 +38 +44 +198 +72 +73 +229 +99 +97 +194 +70 +68 +202 +89 +85 +224 +122 +118 +171 +86 +79 +134 +70 +60 +132 +86 +70 +109 +82 +61 +105 +91 +65 +105 +98 +70 +107 +100 +72 +107 +95 +69 +111 +94 +68 +125 +99 +76 +141 +106 +84 +145 +99 +76 +177 +110 +93 +208 +111 +104 +218 +89 +93 +222 +59 +76 +229 +45 +69 +241 +44 +72 +243 +49 +76 +243 +65 +89 +233 +74 +92 +227 +91 +101 +226 +111 +114 +224 +124 +124 +218 +129 +125 +216 +133 +127 +215 +138 +130 +196 +126 +118 +192 +128 +119 +189 +131 +120 +185 +133 +120 +181 +135 +120 +175 +136 +119 +171 +138 +121 +167 +138 +120 +157 +128 +112 +157 +125 +110 +154 +121 +106 +150 +110 +98 +145 +98 +90 +135 +85 +78 +127 +72 +67 +123 +65 +63 +117 +58 +60 +103 +47 +50 +100 +48 +50 +97 +49 +49 +79 +39 +39 +71 +37 +35 +76 +48 +45 +77 +53 +49 +72 +51 +46 +69 +50 +44 +68 +49 +45 +70 +49 +46 +70 +46 +44 +71 +43 +42 +75 +45 +45 +81 +54 +47 +89 +72 +52 +96 +87 +58 +102 +95 +66 +103 +100 +69 +107 +111 +78 +117 +124 +90 +117 +132 +93 +111 +129 +89 +108 +131 +87 +108 +135 +90 +112 +141 +93 +114 +146 +97 +115 +149 +98 +117 +151 +100 +119 +153 +102 +118 +155 +104 +114 +150 +106 +115 +152 +111 +115 +151 +113 +113 +149 +111 +115 +149 +116 +119 +153 +120 +122 +152 +124 +121 +150 +122 +120 +149 +121 +115 +141 +114 +109 +135 +106 +107 +132 +102 +105 +130 +100 +97 +122 +90 +84 +109 +77 +79 +95 +68 +79 +80 +64 +84 +75 +66 +82 +73 +64 +57 +58 +52 +57 +58 +52 +57 +58 +52 +57 +58 +52 +58 +59 +53 +59 +60 +54 +62 +61 +56 +63 +62 +57 +62 +61 +56 +62 +61 +56 +65 +62 +57 +65 +62 +57 +66 +63 +58 +67 +64 +59 +68 +63 +59 +68 +63 +59 +70 +65 +61 +69 +64 +60 +69 +64 +58 +69 +64 +58 +68 +63 +57 +68 +63 +57 +69 +62 +56 +69 +62 +56 +69 +62 +56 +69 +62 +56 +69 +62 +56 +68 +61 +53 +67 +60 +54 +67 +60 +52 +68 +59 +52 +67 +58 +49 +66 +57 +50 +66 +57 +50 +66 +57 +50 +66 +57 +50 +65 +56 +51 +65 +56 +51 +64 +57 +51 +64 +57 +51 +62 +55 +49 +60 +55 +49 +59 +54 +48 +59 +54 +48 +57 +54 +47 +56 +53 +46 +55 +52 +47 +55 +52 +47 +57 +54 +49 +57 +54 +47 +57 +54 +47 +58 +55 +48 +60 +55 +49 +62 +58 +49 +65 +58 +48 +66 +60 +48 +67 +59 +48 +69 +59 +47 +73 +61 +49 +74 +62 +48 +76 +64 +50 +76 +64 +50 +78 +64 +51 +78 +64 +51 +78 +64 +53 +78 +64 +55 +77 +63 +54 +74 +61 +52 +73 +60 +51 +72 +59 +50 +69 +59 +50 +69 +59 +50 +67 +58 +49 +66 +57 +48 +64 +57 +49 +64 +57 +49 +64 +57 +49 +64 +57 +49 +65 +58 +52 +65 +58 +50 +67 +58 +51 +73 +56 +49 +75 +47 +43 +86 +46 +44 +106 +55 +54 +116 +58 +57 +123 +59 +59 +133 +69 +67 +129 +68 +63 +131 +72 +64 +132 +73 +65 +132 +72 +62 +141 +74 +66 +152 +79 +72 +161 +80 +76 +162 +79 +71 +147 +68 +55 +148 +66 +52 +154 +66 +54 +159 +67 +56 +160 +62 +51 +156 +55 +45 +156 +55 +45 +159 +61 +48 +163 +67 +53 +155 +63 +48 +153 +64 +48 +160 +69 +51 +164 +71 +54 +167 +70 +54 +174 +72 +58 +182 +78 +69 +181 +75 +77 +176 +71 +76 +167 +64 +68 +155 +56 +59 +147 +55 +56 +142 +61 +58 +133 +62 +56 +121 +61 +51 +114 +60 +48 +124 +72 +59 +135 +75 +65 +133 +62 +56 +133 +43 +43 +149 +40 +46 +181 +57 +68 +211 +75 +87 +219 +76 +78 +221 +79 +77 +199 +64 +61 +190 +65 +63 +208 +96 +92 +179 +89 +81 +132 +64 +53 +130 +84 +68 +121 +97 +73 +101 +91 +64 +96 +92 +63 +107 +104 +73 +117 +108 +79 +119 +102 +74 +127 +99 +75 +150 +99 +78 +185 +102 +88 +210 +97 +91 +224 +88 +90 +231 +67 +78 +238 +46 +69 +249 +39 +68 +255 +40 +72 +255 +42 +73 +255 +48 +78 +243 +53 +78 +236 +63 +82 +234 +76 +90 +230 +82 +94 +224 +84 +93 +222 +85 +93 +221 +90 +98 +219 +98 +105 +216 +101 +108 +214 +105 +110 +213 +108 +113 +208 +112 +114 +206 +116 +116 +204 +118 +119 +201 +120 +119 +204 +124 +125 +203 +121 +123 +203 +118 +121 +202 +113 +117 +202 +107 +115 +201 +101 +111 +199 +97 +108 +197 +95 +108 +195 +97 +110 +177 +84 +95 +163 +76 +85 +153 +72 +81 +141 +68 +75 +132 +70 +73 +107 +55 +57 +72 +28 +27 +84 +49 +45 +77 +48 +42 +72 +49 +43 +74 +54 +47 +75 +56 +49 +75 +58 +50 +79 +62 +54 +85 +69 +56 +91 +79 +53 +99 +90 +57 +103 +97 +65 +105 +102 +69 +110 +114 +79 +122 +130 +93 +122 +137 +98 +116 +134 +94 +114 +137 +95 +112 +137 +95 +112 +139 +96 +113 +142 +96 +117 +146 +100 +119 +148 +100 +119 +148 +100 +119 +148 +102 +115 +146 +105 +120 +150 +114 +122 +151 +120 +121 +150 +120 +126 +152 +125 +131 +157 +132 +133 +157 +135 +131 +155 +133 +129 +153 +131 +122 +146 +122 +114 +137 +111 +109 +132 +104 +104 +129 +100 +96 +121 +91 +84 +109 +77 +78 +97 +69 +82 +83 +67 +86 +80 +68 +86 +79 +69 +56 +57 +51 +56 +57 +51 +56 +57 +51 +57 +58 +52 +59 +60 +54 +60 +61 +55 +63 +62 +57 +64 +63 +58 +64 +63 +58 +64 +63 +58 +67 +64 +59 +67 +64 +59 +67 +64 +59 +67 +64 +59 +68 +63 +59 +68 +63 +59 +70 +65 +59 +70 +65 +59 +70 +65 +59 +69 +64 +58 +69 +64 +58 +69 +64 +58 +71 +64 +56 +70 +63 +55 +74 +65 +58 +73 +64 +57 +72 +63 +56 +71 +62 +53 +70 +61 +54 +69 +60 +51 +70 +60 +51 +69 +59 +49 +68 +58 +49 +68 +58 +49 +68 +58 +49 +68 +58 +49 +68 +59 +52 +68 +59 +52 +68 +59 +52 +67 +60 +52 +63 +56 +48 +63 +56 +48 +60 +55 +49 +59 +54 +48 +58 +53 +47 +58 +53 +47 +57 +52 +46 +57 +52 +46 +57 +54 +47 +57 +54 +47 +58 +53 +47 +59 +55 +46 +62 +55 +47 +64 +57 +47 +66 +57 +48 +67 +59 +48 +69 +59 +49 +70 +60 +48 +73 +61 +49 +75 +63 +49 +77 +63 +50 +77 +64 +48 +78 +65 +49 +77 +64 +48 +80 +63 +53 +77 +63 +52 +76 +62 +51 +75 +61 +50 +73 +60 +51 +72 +59 +50 +69 +59 +49 +68 +58 +48 +67 +58 +49 +67 +58 +49 +65 +58 +48 +65 +58 +48 +63 +59 +50 +64 +60 +51 +64 +60 +51 +68 +59 +52 +83 +69 +60 +82 +51 +46 +105 +51 +51 +142 +65 +71 +173 +76 +87 +193 +86 +96 +203 +93 +102 +196 +96 +98 +154 +66 +62 +150 +73 +63 +149 +77 +65 +155 +79 +66 +171 +82 +74 +190 +85 +82 +203 +80 +83 +196 +76 +75 +163 +65 +52 +157 +66 +48 +160 +64 +48 +165 +63 +49 +165 +59 +46 +163 +55 +43 +164 +56 +43 +167 +61 +47 +171 +69 +54 +161 +62 +43 +152 +55 +36 +157 +58 +39 +165 +62 +45 +172 +65 +47 +178 +67 +50 +184 +67 +58 +167 +48 +50 +177 +57 +66 +185 +68 +76 +190 +75 +82 +186 +77 +82 +173 +75 +76 +150 +65 +62 +130 +55 +49 +123 +56 +47 +118 +54 +44 +122 +49 +42 +133 +48 +45 +156 +51 +55 +186 +60 +71 +215 +70 +87 +232 +77 +91 +225 +71 +73 +206 +54 +51 +205 +60 +57 +187 +52 +49 +198 +79 +75 +198 +99 +93 +148 +74 +63 +140 +91 +74 +125 +99 +76 +106 +95 +67 +104 +99 +69 +117 +111 +79 +128 +111 +81 +130 +103 +74 +143 +103 +78 +177 +104 +89 +224 +100 +98 +239 +84 +90 +238 +71 +81 +239 +58 +73 +248 +52 +74 +255 +52 +78 +255 +50 +77 +254 +46 +72 +255 +53 +79 +245 +51 +75 +240 +53 +74 +239 +56 +76 +237 +55 +77 +233 +54 +75 +236 +54 +76 +239 +57 +80 +241 +65 +88 +239 +67 +91 +239 +70 +93 +237 +73 +97 +236 +77 +99 +234 +81 +101 +233 +84 +104 +232 +86 +107 +228 +84 +107 +229 +83 +106 +228 +80 +106 +228 +78 +105 +233 +78 +109 +238 +81 +112 +242 +83 +115 +244 +87 +118 +252 +105 +133 +237 +99 +124 +225 +93 +116 +210 +87 +108 +203 +90 +108 +199 +101 +114 +166 +83 +93 +114 +45 +50 +93 +39 +39 +88 +49 +44 +87 +58 +52 +81 +63 +53 +66 +58 +45 +58 +56 +41 +63 +66 +49 +76 +78 +57 +86 +79 +51 +97 +86 +54 +101 +95 +63 +104 +101 +68 +113 +117 +84 +127 +134 +101 +126 +140 +105 +119 +136 +100 +120 +140 +105 +117 +139 +101 +114 +139 +100 +114 +139 +99 +118 +140 +101 +121 +143 +104 +122 +144 +105 +122 +144 +106 +128 +149 +118 +132 +155 +126 +138 +158 +133 +141 +160 +138 +146 +163 +144 +151 +168 +150 +152 +169 +153 +150 +166 +153 +145 +162 +146 +135 +152 +134 +122 +141 +121 +112 +131 +109 +103 +126 +98 +94 +119 +89 +84 +109 +77 +80 +99 +71 +82 +87 +67 +88 +85 +70 +89 +85 +73 +55 +56 +50 +55 +56 +50 +56 +57 +51 +57 +58 +52 +59 +60 +54 +61 +62 +56 +64 +63 +58 +65 +64 +59 +66 +65 +60 +66 +65 +60 +68 +65 +60 +68 +65 +60 +68 +65 +60 +68 +65 +60 +69 +64 +60 +69 +64 +60 +71 +66 +60 +71 +66 +60 +71 +66 +60 +70 +65 +59 +70 +65 +59 +70 +66 +57 +72 +65 +57 +72 +65 +57 +76 +67 +60 +75 +66 +57 +74 +65 +56 +73 +64 +55 +72 +62 +53 +71 +61 +51 +70 +60 +50 +69 +59 +49 +68 +58 +48 +68 +58 +48 +69 +59 +49 +69 +59 +50 +68 +59 +50 +69 +60 +51 +69 +60 +53 +69 +60 +53 +64 +57 +49 +63 +56 +48 +61 +56 +50 +60 +55 +49 +59 +54 +48 +58 +53 +47 +58 +53 +47 +58 +53 +47 +57 +54 +47 +57 +54 +45 +59 +55 +46 +59 +55 +44 +63 +56 +46 +64 +58 +46 +67 +59 +48 +68 +60 +47 +70 +60 +48 +70 +61 +46 +74 +62 +48 +75 +63 +47 +77 +64 +48 +77 +64 +48 +77 +64 +47 +77 +64 +48 +79 +63 +50 +79 +62 +52 +76 +62 +51 +75 +61 +50 +74 +60 +51 +71 +58 +49 +69 +59 +49 +68 +58 +48 +68 +59 +50 +68 +59 +50 +66 +59 +49 +64 +60 +49 +64 +60 +51 +65 +61 +52 +66 +62 +53 +70 +60 +51 +81 +56 +49 +88 +43 +38 +135 +59 +63 +189 +85 +96 +216 +85 +101 +228 +86 +102 +226 +86 +99 +201 +75 +79 +157 +52 +48 +148 +58 +47 +144 +62 +48 +152 +66 +51 +173 +70 +61 +196 +74 +71 +212 +67 +72 +203 +63 +64 +177 +66 +55 +167 +70 +53 +169 +66 +51 +172 +64 +51 +175 +63 +51 +176 +62 +51 +179 +66 +52 +180 +68 +54 +178 +71 +53 +169 +66 +47 +163 +60 +41 +164 +59 +40 +169 +60 +40 +171 +58 +40 +174 +54 +38 +173 +51 +40 +182 +57 +55 +186 +57 +61 +187 +56 +62 +186 +55 +60 +190 +61 +66 +197 +74 +76 +196 +84 +83 +190 +88 +83 +153 +63 +55 +139 +52 +42 +135 +45 +37 +157 +54 +49 +195 +72 +75 +219 +80 +87 +224 +66 +81 +218 +52 +64 +221 +59 +57 +204 +47 +42 +209 +57 +52 +198 +56 +52 +197 +70 +64 +200 +93 +85 +167 +88 +75 +144 +87 +70 +119 +87 +64 +120 +100 +73 +126 +112 +83 +130 +111 +81 +133 +102 +74 +145 +99 +75 +172 +109 +91 +213 +117 +105 +234 +85 +87 +246 +70 +80 +242 +62 +74 +242 +60 +73 +249 +64 +78 +253 +67 +81 +249 +61 +76 +243 +55 +72 +253 +66 +83 +248 +60 +77 +244 +55 +75 +246 +54 +75 +248 +52 +74 +249 +50 +73 +255 +51 +78 +255 +56 +83 +255 +51 +84 +252 +53 +86 +252 +54 +87 +249 +56 +87 +247 +58 +90 +248 +61 +92 +246 +63 +94 +245 +64 +97 +247 +67 +102 +245 +67 +103 +244 +64 +101 +245 +63 +103 +247 +65 +105 +252 +67 +109 +255 +71 +115 +255 +74 +115 +255 +81 +117 +253 +84 +117 +250 +87 +118 +239 +85 +113 +228 +86 +110 +226 +99 +120 +213 +102 +118 +180 +89 +98 +124 +49 +53 +104 +48 +47 +88 +49 +42 +80 +56 +44 +71 +62 +47 +63 +64 +46 +59 +68 +47 +65 +70 +47 +81 +74 +46 +95 +84 +56 +103 +96 +67 +111 +107 +78 +124 +124 +96 +136 +142 +114 +135 +145 +118 +125 +139 +113 +122 +141 +113 +124 +143 +115 +124 +143 +115 +122 +141 +111 +122 +138 +109 +125 +140 +111 +131 +146 +117 +136 +151 +122 +149 +163 +138 +156 +169 +149 +163 +174 +157 +166 +177 +161 +172 +180 +167 +177 +185 +174 +176 +183 +176 +171 +181 +173 +161 +171 +162 +148 +160 +148 +131 +145 +130 +115 +132 +113 +104 +124 +99 +93 +116 +88 +83 +108 +78 +80 +100 +72 +80 +88 +67 +86 +87 +69 +87 +88 +72 +54 +55 +49 +54 +55 +49 +55 +56 +50 +56 +57 +51 +58 +59 +53 +60 +61 +55 +63 +62 +57 +64 +63 +58 +66 +65 +60 +66 +65 +60 +68 +65 +60 +68 +65 +60 +68 +65 +60 +69 +66 +61 +70 +65 +61 +70 +65 +61 +70 +67 +60 +70 +67 +60 +71 +66 +60 +72 +67 +61 +72 +68 +59 +72 +68 +59 +74 +67 +59 +74 +67 +57 +76 +67 +58 +75 +66 +57 +75 +65 +56 +74 +64 +54 +74 +61 +52 +73 +61 +49 +72 +60 +48 +71 +59 +47 +69 +59 +47 +69 +59 +47 +69 +59 +47 +69 +59 +49 +69 +59 +49 +69 +59 +49 +68 +59 +50 +68 +59 +50 +64 +57 +47 +64 +57 +47 +64 +57 +49 +63 +56 +48 +60 +55 +49 +59 +54 +48 +59 +54 +48 +58 +53 +47 +59 +55 +46 +59 +55 +46 +59 +55 +46 +60 +56 +45 +63 +56 +46 +65 +59 +47 +67 +59 +48 +68 +60 +47 +71 +61 +49 +71 +62 +47 +75 +63 +49 +77 +64 +48 +77 +64 +48 +78 +65 +48 +79 +63 +47 +79 +63 +48 +79 +63 +50 +78 +61 +51 +78 +61 +51 +74 +60 +49 +73 +59 +48 +71 +59 +47 +68 +58 +48 +68 +58 +48 +68 +60 +49 +68 +60 +49 +66 +59 +49 +64 +60 +49 +65 +61 +50 +65 +63 +51 +66 +63 +54 +75 +61 +52 +91 +54 +46 +116 +52 +50 +172 +77 +83 +218 +94 +105 +229 +78 +95 +226 +65 +81 +213 +55 +69 +182 +39 +43 +167 +50 +41 +156 +56 +40 +145 +58 +38 +149 +61 +41 +171 +65 +51 +193 +69 +61 +211 +63 +63 +204 +60 +59 +177 +63 +53 +168 +66 +52 +170 +64 +50 +173 +63 +50 +178 +64 +53 +184 +67 +57 +188 +72 +59 +187 +74 +60 +172 +62 +47 +170 +63 +47 +168 +61 +43 +166 +59 +41 +170 +57 +41 +176 +58 +44 +183 +59 +47 +187 +61 +49 +200 +71 +65 +204 +69 +65 +206 +64 +63 +205 +57 +57 +211 +56 +60 +220 +67 +69 +223 +77 +78 +218 +83 +79 +193 +68 +62 +195 +77 +67 +203 +84 +76 +209 +85 +77 +215 +75 +74 +218 +64 +66 +223 +53 +62 +224 +51 +55 +217 +52 +46 +215 +57 +46 +205 +51 +43 +206 +59 +52 +190 +57 +52 +178 +65 +57 +181 +91 +80 +150 +85 +67 +123 +78 +57 +130 +98 +73 +136 +106 +80 +133 +96 +70 +147 +90 +70 +176 +100 +84 +206 +112 +100 +232 +109 +104 +231 +70 +75 +237 +60 +68 +230 +59 +67 +227 +62 +68 +227 +68 +72 +227 +73 +75 +228 +74 +76 +229 +73 +77 +240 +76 +83 +239 +68 +77 +239 +58 +73 +242 +55 +72 +245 +52 +71 +248 +49 +70 +254 +52 +76 +255 +58 +82 +255 +57 +86 +253 +58 +88 +252 +59 +88 +250 +59 +90 +251 +60 +93 +252 +63 +95 +253 +65 +98 +252 +67 +101 +253 +69 +105 +251 +69 +107 +250 +68 +108 +250 +68 +109 +250 +67 +111 +249 +68 +111 +249 +68 +113 +250 +67 +111 +255 +72 +112 +255 +66 +104 +255 +74 +109 +253 +79 +112 +238 +75 +104 +230 +80 +107 +226 +93 +114 +216 +99 +115 +186 +91 +99 +140 +64 +68 +96 +38 +36 +81 +43 +34 +86 +64 +51 +86 +79 +61 +74 +76 +55 +65 +67 +45 +82 +74 +51 +101 +89 +67 +117 +106 +86 +128 +123 +103 +142 +141 +121 +153 +156 +139 +149 +156 +140 +136 +147 +131 +130 +142 +128 +137 +151 +136 +143 +155 +141 +140 +153 +136 +135 +146 +130 +138 +147 +130 +151 +158 +142 +164 +168 +153 +178 +182 +167 +184 +188 +174 +191 +193 +182 +192 +193 +185 +194 +195 +189 +197 +198 +193 +195 +195 +195 +190 +190 +190 +176 +181 +177 +162 +169 +162 +141 +151 +140 +121 +135 +118 +105 +123 +101 +92 +115 +89 +84 +109 +79 +82 +102 +74 +80 +90 +66 +84 +89 +67 +86 +91 +71 +53 +54 +48 +53 +54 +48 +54 +55 +49 +55 +56 +50 +56 +57 +51 +58 +59 +53 +61 +60 +55 +62 +61 +56 +64 +63 +58 +64 +63 +58 +67 +64 +59 +68 +65 +60 +69 +66 +61 +69 +66 +61 +71 +66 +62 +71 +66 +62 +71 +68 +61 +71 +68 +61 +72 +67 +61 +73 +68 +62 +73 +69 +60 +73 +69 +60 +75 +68 +58 +76 +69 +59 +76 +67 +58 +75 +67 +56 +76 +66 +56 +75 +65 +53 +76 +64 +52 +75 +63 +51 +74 +62 +50 +73 +61 +49 +71 +61 +49 +71 +61 +49 +70 +60 +48 +70 +60 +48 +69 +59 +49 +69 +59 +49 +68 +59 +50 +67 +58 +49 +65 +58 +48 +65 +58 +48 +64 +57 +49 +64 +57 +49 +61 +56 +50 +60 +55 +49 +59 +54 +48 +59 +54 +48 +59 +55 +46 +59 +55 +46 +59 +55 +44 +60 +56 +45 +63 +57 +45 +65 +59 +47 +68 +60 +47 +69 +61 +48 +72 +63 +48 +74 +62 +48 +76 +63 +47 +77 +64 +48 +78 +65 +48 +78 +65 +48 +79 +63 +47 +79 +63 +47 +79 +63 +50 +78 +61 +51 +77 +60 +50 +76 +59 +49 +73 +59 +48 +71 +59 +47 +70 +57 +48 +67 +57 +47 +67 +59 +48 +66 +60 +48 +66 +59 +49 +64 +60 +49 +64 +62 +50 +65 +63 +51 +66 +63 +54 +78 +59 +52 +106 +57 +52 +149 +71 +69 +195 +90 +95 +218 +88 +98 +220 +68 +81 +219 +57 +70 +209 +52 +59 +188 +44 +43 +172 +50 +39 +159 +56 +37 +150 +58 +33 +148 +58 +32 +161 +61 +38 +179 +64 +46 +193 +59 +50 +189 +56 +49 +167 +55 +44 +162 +58 +45 +165 +57 +45 +167 +55 +44 +175 +58 +49 +184 +66 +56 +186 +69 +59 +183 +69 +58 +174 +62 +50 +173 +63 +48 +167 +60 +44 +164 +54 +39 +170 +54 +41 +182 +62 +48 +195 +68 +59 +202 +71 +61 +188 +58 +45 +203 +65 +54 +221 +70 +63 +232 +68 +66 +239 +63 +65 +239 +59 +62 +231 +52 +55 +218 +48 +48 +216 +57 +53 +222 +73 +66 +229 +85 +76 +224 +80 +71 +216 +63 +57 +214 +50 +48 +224 +48 +50 +231 +55 +55 +216 +49 +40 +221 +61 +47 +202 +46 +34 +205 +56 +49 +189 +52 +44 +174 +55 +47 +200 +104 +92 +184 +108 +92 +142 +87 +67 +135 +90 +67 +132 +86 +63 +139 +81 +61 +170 +91 +76 +209 +106 +97 +226 +103 +98 +229 +83 +84 +240 +69 +75 +239 +62 +70 +226 +60 +64 +216 +62 +62 +209 +66 +62 +209 +72 +66 +219 +80 +77 +233 +87 +87 +235 +79 +82 +238 +68 +77 +239 +59 +71 +245 +54 +70 +246 +50 +70 +246 +47 +68 +249 +50 +71 +253 +55 +78 +251 +57 +83 +248 +58 +84 +248 +58 +86 +249 +59 +87 +254 +61 +92 +255 +63 +97 +255 +67 +101 +255 +68 +107 +251 +60 +101 +251 +62 +104 +250 +63 +106 +247 +64 +108 +247 +64 +110 +244 +62 +110 +241 +61 +108 +241 +60 +105 +255 +74 +114 +251 +61 +97 +251 +66 +100 +255 +78 +110 +251 +77 +110 +243 +80 +109 +236 +86 +111 +224 +91 +110 +231 +114 +130 +194 +97 +106 +150 +74 +76 +116 +58 +56 +93 +53 +45 +82 +56 +43 +82 +66 +50 +87 +76 +58 +94 +81 +65 +114 +101 +85 +136 +124 +110 +149 +141 +130 +159 +157 +145 +166 +167 +159 +161 +166 +159 +150 +156 +152 +149 +158 +155 +158 +167 +164 +166 +175 +172 +166 +172 +168 +162 +167 +163 +166 +168 +163 +181 +180 +176 +194 +193 +188 +204 +201 +192 +209 +206 +197 +213 +208 +204 +213 +208 +205 +212 +206 +206 +213 +207 +209 +209 +203 +207 +203 +198 +202 +191 +189 +192 +176 +178 +175 +152 +159 +152 +128 +140 +126 +109 +126 +107 +96 +116 +91 +87 +110 +82 +86 +106 +78 +83 +95 +71 +86 +96 +72 +87 +95 +72 +53 +54 +48 +53 +54 +48 +53 +54 +48 +53 +54 +48 +54 +55 +49 +56 +57 +51 +58 +57 +52 +59 +58 +53 +61 +60 +55 +62 +61 +56 +65 +62 +57 +67 +64 +59 +68 +65 +60 +70 +67 +62 +72 +67 +63 +72 +67 +63 +71 +68 +61 +72 +69 +62 +73 +68 +62 +73 +68 +62 +74 +70 +61 +74 +70 +61 +77 +70 +60 +77 +70 +60 +77 +69 +58 +76 +68 +57 +77 +67 +57 +77 +67 +55 +78 +66 +54 +77 +65 +51 +78 +64 +51 +77 +65 +51 +74 +65 +50 +74 +65 +50 +73 +64 +49 +72 +63 +48 +71 +61 +49 +70 +60 +48 +68 +60 +49 +68 +60 +49 +67 +58 +49 +67 +58 +49 +65 +58 +50 +64 +57 +49 +63 +56 +50 +63 +56 +50 +60 +55 +49 +60 +55 +49 +60 +56 +47 +60 +56 +45 +60 +56 +45 +60 +56 +45 +64 +58 +46 +65 +59 +47 +68 +60 +47 +69 +61 +48 +72 +63 +48 +75 +63 +49 +77 +64 +48 +78 +65 +48 +80 +64 +48 +80 +64 +48 +79 +64 +45 +79 +63 +47 +79 +61 +49 +79 +61 +49 +77 +61 +48 +76 +60 +47 +73 +59 +48 +70 +58 +46 +69 +56 +47 +67 +57 +47 +66 +58 +47 +65 +59 +47 +65 +58 +48 +63 +59 +48 +63 +61 +49 +64 +62 +50 +64 +64 +52 +78 +58 +49 +111 +50 +47 +165 +75 +75 +190 +84 +86 +186 +63 +68 +188 +49 +54 +193 +48 +51 +191 +49 +47 +183 +50 +41 +167 +50 +33 +162 +57 +35 +155 +61 +33 +150 +61 +31 +152 +61 +32 +158 +63 +35 +164 +59 +37 +162 +55 +37 +158 +54 +41 +160 +56 +45 +162 +54 +44 +165 +52 +44 +173 +56 +49 +183 +64 +58 +184 +67 +60 +178 +64 +54 +177 +66 +55 +173 +65 +52 +168 +60 +47 +166 +56 +43 +175 +58 +48 +188 +67 +56 +195 +68 +61 +196 +65 +55 +193 +64 +45 +203 +64 +45 +213 +55 +43 +221 +44 +38 +232 +36 +37 +245 +39 +43 +253 +44 +49 +252 +49 +52 +233 +44 +42 +227 +48 +43 +220 +53 +44 +217 +55 +44 +220 +53 +44 +223 +52 +44 +229 +50 +45 +228 +51 +43 +215 +52 +37 +212 +55 +38 +207 +51 +38 +206 +55 +44 +196 +55 +46 +187 +63 +55 +199 +97 +85 +210 +127 +113 +166 +101 +83 +143 +86 +66 +139 +76 +58 +164 +86 +73 +203 +100 +91 +224 +99 +95 +232 +82 +84 +233 +66 +73 +246 +69 +77 +238 +63 +68 +225 +62 +63 +213 +64 +60 +202 +63 +56 +200 +63 +55 +211 +69 +65 +229 +77 +76 +240 +74 +78 +245 +63 +75 +251 +56 +72 +255 +54 +72 +254 +53 +72 +249 +50 +69 +249 +54 +71 +250 +59 +77 +247 +58 +80 +246 +58 +82 +246 +56 +82 +249 +56 +85 +251 +56 +88 +254 +59 +93 +255 +61 +97 +255 +63 +103 +255 +64 +106 +255 +64 +108 +255 +65 +112 +255 +67 +115 +251 +68 +116 +249 +67 +116 +247 +67 +115 +244 +67 +111 +251 +73 +109 +245 +68 +97 +249 +72 +101 +252 +77 +106 +250 +77 +107 +255 +88 +116 +255 +97 +122 +242 +94 +116 +240 +107 +126 +229 +113 +126 +211 +111 +119 +175 +93 +97 +132 +67 +65 +104 +54 +47 +105 +65 +55 +115 +85 +74 +121 +101 +92 +140 +125 +118 +163 +150 +144 +173 +163 +161 +178 +174 +171 +182 +182 +182 +178 +182 +185 +170 +175 +179 +176 +183 +189 +182 +189 +197 +189 +193 +202 +192 +195 +202 +195 +194 +202 +201 +198 +205 +213 +206 +214 +221 +215 +219 +226 +218 +216 +231 +221 +219 +233 +221 +221 +230 +218 +220 +229 +216 +223 +228 +215 +224 +224 +212 +222 +217 +207 +216 +202 +197 +203 +186 +186 +186 +162 +167 +163 +136 +146 +135 +116 +130 +113 +101 +120 +98 +92 +115 +87 +91 +111 +83 +92 +106 +80 +92 +105 +79 +94 +104 +79 +53 +54 +49 +53 +54 +49 +53 +54 +49 +53 +54 +48 +53 +54 +49 +54 +55 +49 +56 +55 +50 +57 +56 +51 +60 +59 +54 +61 +60 +55 +64 +61 +56 +66 +63 +58 +68 +65 +60 +70 +67 +60 +71 +68 +61 +72 +69 +62 +72 +69 +62 +72 +69 +62 +72 +69 +60 +74 +70 +61 +74 +70 +59 +75 +71 +59 +75 +71 +59 +78 +72 +58 +77 +71 +59 +77 +71 +59 +77 +69 +58 +77 +68 +59 +77 +68 +59 +77 +68 +61 +78 +67 +63 +78 +67 +61 +77 +67 +55 +77 +68 +53 +75 +66 +51 +74 +65 +50 +72 +62 +50 +71 +61 +49 +69 +61 +50 +68 +59 +50 +67 +58 +49 +67 +58 +51 +65 +58 +50 +65 +58 +52 +64 +57 +51 +63 +55 +52 +60 +55 +51 +60 +55 +49 +62 +55 +47 +62 +55 +47 +60 +56 +47 +61 +57 +48 +62 +58 +49 +65 +58 +50 +67 +60 +50 +68 +61 +51 +72 +64 +53 +73 +63 +51 +76 +64 +50 +77 +65 +49 +78 +65 +48 +80 +64 +48 +79 +64 +45 +79 +63 +47 +76 +62 +49 +76 +62 +51 +75 +61 +50 +76 +59 +51 +74 +57 +49 +73 +56 +49 +70 +55 +48 +67 +56 +50 +65 +56 +47 +62 +58 +47 +61 +59 +47 +60 +61 +47 +63 +61 +48 +64 +62 +47 +66 +63 +48 +83 +57 +44 +134 +61 +55 +193 +93 +91 +200 +90 +89 +174 +56 +54 +170 +47 +42 +177 +50 +43 +171 +47 +37 +171 +51 +35 +170 +58 +38 +171 +67 +42 +169 +71 +44 +163 +70 +39 +160 +66 +38 +161 +66 +38 +161 +61 +35 +158 +58 +35 +160 +57 +42 +163 +59 +48 +166 +58 +48 +166 +55 +46 +173 +60 +52 +182 +67 +60 +183 +69 +59 +176 +64 +53 +171 +61 +48 +168 +60 +47 +169 +59 +46 +172 +60 +48 +187 +69 +57 +198 +76 +65 +197 +69 +60 +188 +56 +44 +188 +55 +36 +201 +60 +40 +218 +61 +46 +227 +53 +44 +238 +44 +42 +246 +42 +43 +249 +40 +43 +247 +39 +39 +246 +44 +42 +241 +48 +43 +236 +52 +44 +232 +54 +44 +227 +53 +42 +226 +52 +41 +225 +51 +40 +222 +52 +37 +222 +59 +42 +207 +50 +31 +219 +63 +48 +205 +55 +41 +199 +57 +45 +194 +63 +53 +179 +65 +54 +209 +108 +96 +191 +103 +89 +165 +82 +66 +170 +78 +65 +205 +98 +90 +232 +103 +98 +231 +81 +82 +235 +64 +70 +246 +65 +74 +237 +60 +68 +227 +58 +61 +215 +59 +60 +207 +62 +57 +195 +61 +52 +185 +54 +44 +187 +52 +46 +199 +56 +52 +229 +71 +72 +234 +63 +69 +242 +58 +68 +249 +57 +72 +252 +57 +73 +250 +55 +71 +250 +58 +73 +251 +63 +78 +252 +67 +85 +251 +65 +86 +250 +63 +84 +249 +59 +84 +251 +58 +85 +253 +58 +90 +255 +59 +94 +255 +60 +99 +255 +64 +104 +255 +63 +107 +255 +63 +110 +251 +63 +111 +247 +64 +112 +245 +65 +113 +245 +64 +115 +243 +66 +112 +244 +68 +106 +252 +79 +109 +255 +86 +115 +243 +76 +104 +231 +66 +96 +249 +86 +115 +255 +105 +133 +255 +102 +130 +246 +94 +119 +238 +96 +120 +231 +104 +123 +220 +112 +125 +199 +112 +120 +170 +102 +103 +143 +92 +88 +126 +89 +81 +153 +126 +119 +171 +152 +146 +190 +176 +173 +197 +187 +186 +198 +194 +195 +200 +199 +204 +199 +199 +207 +195 +195 +207 +203 +202 +216 +204 +202 +216 +209 +202 +218 +215 +206 +223 +221 +213 +228 +230 +219 +233 +232 +224 +235 +237 +227 +235 +239 +229 +230 +242 +232 +230 +244 +232 +232 +240 +228 +230 +238 +225 +232 +237 +224 +233 +234 +221 +231 +228 +216 +226 +209 +202 +209 +193 +191 +194 +171 +171 +169 +145 +150 +143 +122 +134 +120 +108 +123 +104 +98 +117 +95 +96 +114 +90 +100 +114 +89 +100 +112 +88 +100 +110 +86 +50 +49 +47 +51 +50 +48 +52 +51 +49 +54 +53 +49 +56 +55 +53 +57 +56 +52 +57 +56 +52 +57 +56 +52 +59 +58 +53 +60 +59 +54 +61 +61 +53 +63 +63 +55 +65 +65 +57 +67 +67 +57 +69 +69 +59 +69 +69 +59 +72 +72 +64 +72 +72 +62 +72 +72 +60 +74 +72 +59 +75 +74 +56 +76 +75 +55 +77 +76 +56 +78 +75 +56 +77 +74 +57 +74 +70 +58 +71 +68 +59 +74 +70 +67 +78 +73 +77 +78 +73 +80 +71 +68 +79 +68 +63 +69 +78 +69 +62 +76 +67 +52 +74 +64 +52 +75 +65 +53 +77 +67 +57 +76 +66 +56 +70 +61 +52 +66 +57 +48 +69 +60 +53 +67 +58 +53 +64 +57 +51 +63 +55 +52 +64 +56 +53 +63 +55 +53 +60 +55 +52 +60 +52 +50 +67 +58 +53 +66 +57 +52 +65 +57 +54 +62 +57 +53 +63 +58 +55 +62 +58 +55 +63 +59 +56 +64 +60 +57 +66 +63 +58 +68 +64 +55 +71 +64 +54 +74 +64 +52 +76 +64 +48 +79 +64 +45 +79 +64 +43 +76 +63 +44 +70 +64 +50 +69 +62 +52 +72 +59 +51 +74 +56 +52 +75 +54 +53 +77 +52 +55 +75 +55 +57 +72 +58 +58 +67 +62 +58 +55 +56 +48 +55 +59 +45 +62 +66 +49 +62 +64 +43 +58 +56 +35 +67 +59 +36 +101 +66 +46 +189 +106 +92 +183 +75 +65 +166 +55 +44 +164 +54 +41 +167 +55 +43 +164 +54 +39 +163 +56 +38 +168 +61 +43 +162 +57 +36 +165 +60 +38 +169 +64 +42 +171 +65 +41 +172 +61 +41 +172 +57 +38 +174 +54 +37 +170 +55 +37 +164 +54 +39 +161 +55 +41 +162 +56 +42 +166 +60 +46 +170 +64 +50 +172 +66 +52 +172 +66 +50 +172 +65 +49 +169 +62 +44 +171 +61 +44 +173 +60 +44 +179 +61 +47 +189 +67 +52 +196 +70 +56 +192 +62 +49 +184 +50 +38 +199 +57 +43 +203 +57 +42 +207 +57 +43 +213 +57 +45 +219 +55 +45 +225 +54 +46 +231 +52 +47 +237 +50 +45 +240 +46 +44 +242 +47 +45 +242 +49 +44 +239 +50 +44 +234 +53 +42 +227 +55 +41 +221 +58 +41 +218 +59 +40 +219 +58 +38 +212 +51 +31 +207 +52 +32 +206 +56 +39 +197 +56 +39 +190 +54 +40 +194 +66 +53 +207 +83 +73 +200 +78 +67 +207 +83 +75 +225 +92 +87 +238 +93 +90 +240 +80 +82 +237 +62 +67 +243 +56 +63 +248 +63 +71 +235 +64 +70 +225 +67 +68 +214 +64 +65 +201 +62 +57 +187 +60 +51 +179 +58 +47 +177 +59 +47 +180 +59 +48 +202 +76 +64 +212 +75 +67 +222 +70 +67 +226 +62 +63 +235 +60 +65 +248 +63 +71 +254 +62 +73 +249 +59 +71 +253 +69 +81 +250 +68 +81 +253 +68 +82 +255 +68 +85 +253 +64 +86 +250 +60 +85 +254 +61 +90 +255 +66 +100 +255 +70 +107 +255 +65 +106 +249 +59 +103 +245 +58 +103 +244 +61 +109 +248 +68 +115 +253 +73 +121 +255 +75 +122 +255 +78 +121 +255 +78 +117 +249 +81 +116 +239 +82 +113 +229 +79 +106 +229 +79 +106 +247 +90 +119 +255 +103 +135 +255 +93 +128 +240 +69 +105 +245 +86 +118 +232 +94 +120 +198 +91 +109 +194 +117 +125 +140 +92 +92 +145 +114 +109 +171 +143 +132 +189 +167 +156 +212 +195 +187 +222 +213 +208 +221 +220 +218 +220 +219 +224 +222 +220 +231 +226 +219 +235 +231 +216 +237 +235 +216 +238 +241 +217 +241 +244 +220 +242 +245 +227 +243 +245 +231 +244 +243 +236 +244 +244 +239 +243 +248 +243 +240 +248 +243 +239 +248 +240 +238 +245 +236 +237 +242 +231 +235 +237 +226 +232 +232 +221 +227 +229 +220 +225 +214 +208 +212 +205 +201 +202 +187 +186 +184 +163 +165 +160 +139 +144 +137 +121 +131 +120 +114 +125 +111 +112 +123 +107 +123 +132 +115 +119 +128 +109 +118 +125 +107 +48 +46 +47 +49 +47 +48 +51 +50 +48 +53 +52 +50 +54 +53 +51 +55 +54 +50 +56 +55 +51 +56 +55 +50 +58 +57 +52 +59 +58 +53 +61 +61 +53 +63 +63 +55 +65 +65 +55 +67 +67 +57 +68 +68 +56 +69 +69 +59 +72 +72 +62 +72 +72 +62 +72 +72 +60 +74 +72 +57 +75 +74 +54 +76 +75 +54 +77 +77 +53 +78 +77 +56 +75 +74 +56 +75 +73 +61 +75 +74 +69 +80 +80 +82 +87 +85 +96 +89 +88 +106 +86 +84 +106 +82 +79 +96 +79 +73 +75 +77 +68 +63 +72 +63 +58 +70 +61 +56 +71 +62 +57 +72 +63 +58 +70 +61 +56 +66 +59 +53 +68 +58 +56 +65 +57 +54 +63 +55 +52 +63 +55 +52 +64 +56 +53 +64 +56 +53 +61 +56 +53 +59 +54 +50 +61 +52 +47 +61 +52 +47 +61 +53 +50 +60 +55 +52 +61 +57 +54 +62 +58 +57 +61 +60 +58 +62 +61 +57 +66 +63 +58 +68 +63 +57 +71 +64 +54 +74 +64 +52 +77 +64 +48 +79 +64 +45 +80 +63 +43 +76 +63 +44 +65 +64 +46 +63 +64 +50 +69 +60 +53 +72 +57 +54 +74 +54 +55 +74 +52 +55 +70 +51 +55 +67 +52 +55 +65 +60 +57 +60 +59 +54 +61 +61 +49 +69 +63 +49 +74 +58 +42 +80 +54 +37 +100 +65 +46 +133 +74 +58 +176 +80 +66 +171 +59 +45 +160 +50 +35 +161 +54 +38 +163 +58 +39 +158 +55 +36 +158 +57 +37 +163 +62 +42 +161 +59 +37 +167 +60 +40 +174 +63 +43 +179 +64 +45 +182 +61 +44 +183 +57 +42 +184 +54 +40 +181 +55 +41 +170 +57 +41 +165 +58 +42 +164 +57 +41 +165 +59 +43 +168 +62 +46 +171 +65 +49 +171 +66 +47 +171 +64 +46 +174 +63 +44 +171 +58 +40 +177 +60 +43 +191 +69 +54 +198 +72 +57 +193 +63 +49 +188 +56 +43 +192 +54 +41 +203 +55 +43 +207 +55 +44 +208 +57 +46 +209 +59 +45 +212 +60 +47 +216 +58 +46 +224 +56 +47 +231 +52 +45 +238 +49 +45 +244 +46 +43 +244 +46 +43 +241 +48 +43 +234 +52 +41 +225 +55 +40 +215 +58 +39 +213 +58 +36 +222 +60 +39 +217 +54 +35 +213 +56 +37 +212 +61 +42 +204 +59 +42 +193 +53 +38 +196 +58 +47 +207 +70 +60 +209 +70 +63 +218 +73 +68 +233 +79 +77 +243 +80 +81 +244 +71 +73 +240 +59 +64 +245 +58 +65 +248 +67 +72 +229 +66 +69 +218 +68 +67 +210 +66 +65 +197 +62 +56 +183 +59 +49 +174 +58 +45 +170 +60 +45 +171 +61 +46 +182 +69 +53 +198 +76 +63 +212 +78 +69 +220 +71 +67 +227 +63 +62 +239 +63 +66 +250 +63 +70 +254 +64 +74 +248 +67 +74 +247 +67 +76 +250 +68 +80 +255 +70 +84 +253 +66 +83 +249 +62 +83 +252 +62 +88 +255 +66 +97 +255 +70 +104 +255 +67 +105 +252 +63 +105 +249 +64 +106 +249 +66 +112 +252 +70 +118 +254 +74 +122 +255 +75 +123 +255 +72 +120 +255 +71 +115 +244 +74 +111 +242 +82 +116 +243 +93 +122 +246 +96 +123 +247 +88 +118 +247 +79 +112 +250 +70 +107 +248 +68 +107 +238 +68 +104 +220 +73 +102 +203 +92 +111 +182 +106 +116 +115 +71 +72 +150 +121 +115 +180 +148 +137 +206 +176 +165 +229 +209 +200 +239 +226 +220 +235 +231 +230 +233 +232 +237 +236 +230 +242 +237 +226 +243 +246 +227 +249 +251 +225 +250 +255 +227 +253 +255 +230 +253 +255 +236 +254 +255 +242 +253 +254 +247 +254 +252 +250 +251 +253 +249 +246 +252 +249 +244 +251 +246 +243 +249 +244 +241 +247 +238 +239 +243 +234 +237 +240 +231 +236 +238 +229 +234 +230 +221 +224 +220 +214 +216 +202 +198 +197 +179 +178 +174 +158 +161 +154 +142 +147 +140 +137 +143 +133 +136 +144 +131 +142 +148 +134 +137 +144 +128 +134 +140 +126 +47 +46 +44 +48 +47 +45 +49 +48 +46 +50 +49 +47 +52 +51 +47 +53 +52 +48 +55 +54 +50 +55 +54 +49 +58 +57 +52 +58 +58 +50 +60 +60 +52 +62 +62 +54 +64 +64 +54 +66 +66 +56 +67 +67 +57 +68 +68 +58 +73 +70 +61 +73 +71 +59 +74 +72 +59 +76 +73 +56 +77 +74 +55 +78 +76 +55 +78 +76 +55 +79 +76 +57 +75 +73 +58 +78 +75 +66 +84 +82 +83 +95 +94 +102 +105 +104 +120 +109 +109 +133 +108 +107 +138 +107 +104 +131 +96 +89 +105 +89 +81 +92 +79 +71 +82 +72 +64 +75 +72 +62 +71 +71 +61 +69 +69 +60 +65 +64 +58 +60 +67 +58 +59 +63 +58 +55 +60 +55 +52 +60 +55 +51 +61 +56 +50 +62 +57 +51 +62 +58 +49 +61 +57 +48 +56 +51 +45 +57 +52 +46 +59 +54 +48 +60 +57 +50 +61 +58 +51 +62 +59 +52 +63 +60 +53 +64 +60 +51 +69 +62 +52 +71 +63 +52 +73 +63 +51 +76 +64 +48 +79 +63 +48 +80 +63 +47 +80 +63 +45 +76 +63 +44 +60 +59 +39 +58 +61 +42 +62 +60 +47 +65 +58 +48 +66 +55 +51 +67 +53 +52 +63 +52 +50 +60 +50 +49 +63 +55 +52 +68 +57 +53 +75 +56 +50 +82 +49 +44 +92 +43 +39 +111 +46 +44 +139 +58 +57 +164 +69 +67 +165 +58 +48 +162 +50 +36 +159 +49 +32 +164 +57 +39 +165 +60 +41 +158 +55 +36 +158 +56 +34 +162 +60 +38 +164 +59 +38 +170 +61 +41 +177 +65 +45 +182 +65 +47 +185 +62 +46 +187 +60 +45 +190 +58 +45 +190 +60 +47 +178 +60 +46 +172 +60 +46 +169 +57 +43 +169 +57 +43 +171 +60 +43 +173 +62 +45 +173 +62 +45 +173 +60 +44 +178 +63 +45 +176 +56 +40 +185 +62 +46 +203 +76 +61 +203 +71 +58 +188 +54 +42 +186 +50 +38 +201 +57 +46 +208 +54 +44 +212 +54 +43 +212 +56 +44 +214 +58 +46 +216 +58 +47 +220 +56 +46 +227 +54 +47 +232 +51 +44 +240 +48 +45 +244 +46 +43 +244 +46 +43 +240 +49 +41 +231 +50 +39 +221 +54 +38 +212 +56 +34 +210 +55 +33 +221 +56 +36 +220 +53 +35 +218 +57 +39 +218 +62 +47 +211 +61 +46 +200 +54 +41 +197 +57 +44 +203 +65 +55 +201 +60 +53 +205 +62 +56 +217 +69 +65 +229 +75 +73 +234 +74 +74 +233 +67 +67 +236 +63 +65 +235 +67 +67 +222 +67 +65 +213 +68 +63 +205 +66 +61 +194 +61 +52 +182 +58 +46 +174 +56 +42 +171 +58 +42 +172 +59 +43 +172 +56 +41 +192 +68 +56 +212 +78 +69 +221 +73 +69 +224 +64 +64 +232 +62 +65 +247 +66 +73 +255 +72 +80 +244 +65 +71 +244 +64 +73 +249 +67 +79 +253 +71 +84 +254 +69 +85 +250 +64 +85 +251 +63 +88 +254 +65 +95 +255 +68 +102 +255 +67 +105 +255 +67 +107 +255 +70 +112 +255 +73 +119 +255 +75 +123 +255 +76 +124 +255 +74 +122 +255 +66 +116 +255 +68 +116 +254 +72 +113 +250 +78 +116 +252 +91 +124 +255 +98 +128 +250 +87 +118 +236 +69 +99 +248 +77 +109 +254 +86 +119 +218 +64 +92 +203 +71 +94 +218 +121 +132 +187 +121 +123 +103 +64 +59 +151 +123 +112 +178 +140 +129 +215 +177 +166 +245 +216 +208 +253 +234 +228 +250 +240 +239 +250 +245 +249 +249 +243 +253 +244 +236 +251 +251 +233 +255 +255 +233 +255 +255 +234 +255 +255 +237 +255 +255 +242 +255 +255 +246 +255 +255 +251 +255 +255 +254 +252 +255 +253 +250 +255 +252 +248 +255 +249 +247 +255 +247 +245 +254 +244 +245 +252 +242 +243 +250 +239 +243 +248 +239 +242 +240 +231 +234 +229 +223 +225 +211 +207 +206 +190 +189 +185 +173 +174 +168 +162 +165 +158 +157 +163 +153 +157 +163 +151 +163 +171 +158 +157 +165 +150 +153 +161 +148 +47 +46 +44 +47 +46 +44 +48 +47 +45 +49 +48 +44 +50 +49 +45 +51 +50 +46 +53 +52 +47 +54 +53 +48 +56 +56 +48 +57 +57 +49 +59 +59 +51 +61 +61 +53 +63 +63 +53 +65 +65 +55 +66 +66 +56 +67 +67 +57 +72 +69 +60 +74 +70 +59 +75 +72 +57 +77 +74 +57 +80 +75 +56 +79 +77 +56 +81 +76 +56 +79 +76 +59 +76 +74 +62 +81 +80 +76 +94 +93 +98 +109 +108 +122 +122 +122 +146 +129 +130 +161 +128 +130 +168 +128 +128 +166 +123 +117 +151 +114 +107 +138 +101 +95 +123 +89 +83 +109 +84 +76 +100 +77 +69 +90 +71 +64 +80 +66 +60 +72 +68 +63 +70 +64 +59 +63 +60 +56 +55 +59 +54 +51 +59 +54 +48 +60 +56 +47 +61 +57 +46 +59 +56 +47 +58 +55 +48 +57 +57 +49 +59 +59 +51 +62 +59 +50 +63 +61 +49 +64 +60 +49 +63 +59 +47 +65 +59 +45 +70 +63 +47 +72 +63 +46 +75 +63 +47 +77 +64 +47 +79 +63 +48 +79 +63 +47 +80 +62 +48 +76 +63 +47 +66 +61 +42 +63 +62 +44 +64 +61 +46 +65 +58 +48 +65 +58 +50 +64 +57 +51 +62 +57 +53 +60 +57 +52 +61 +56 +52 +70 +56 +53 +80 +52 +49 +88 +44 +43 +107 +41 +43 +135 +48 +54 +161 +55 +65 +174 +61 +65 +167 +54 +46 +165 +55 +40 +165 +58 +40 +170 +63 +45 +168 +63 +44 +160 +57 +38 +161 +56 +35 +164 +59 +38 +165 +58 +38 +171 +60 +41 +179 +62 +44 +185 +64 +47 +189 +62 +47 +193 +61 +48 +197 +61 +49 +196 +62 +50 +189 +63 +51 +182 +61 +50 +178 +57 +46 +174 +56 +42 +175 +57 +43 +176 +58 +44 +178 +58 +44 +179 +57 +42 +182 +59 +44 +185 +59 +45 +196 +66 +52 +203 +69 +57 +200 +62 +51 +190 +49 +39 +192 +50 +40 +205 +57 +47 +214 +53 +43 +216 +52 +42 +218 +54 +45 +219 +55 +45 +222 +55 +46 +225 +54 +44 +230 +51 +44 +236 +49 +42 +243 +48 +44 +244 +46 +43 +244 +47 +41 +239 +48 +40 +228 +50 +38 +219 +52 +36 +210 +54 +32 +208 +53 +31 +215 +50 +30 +218 +48 +31 +218 +52 +36 +220 +60 +46 +214 +61 +47 +208 +57 +46 +205 +61 +50 +210 +68 +58 +196 +53 +45 +197 +54 +48 +202 +59 +53 +216 +68 +64 +226 +77 +73 +229 +75 +73 +222 +67 +63 +214 +61 +56 +211 +64 +57 +206 +65 +56 +199 +62 +52 +190 +60 +47 +181 +58 +43 +176 +56 +42 +175 +57 +43 +177 +59 +45 +172 +52 +38 +189 +63 +51 +209 +72 +64 +217 +72 +67 +221 +66 +64 +229 +64 +68 +243 +70 +76 +253 +78 +85 +240 +63 +69 +240 +63 +69 +246 +66 +77 +254 +72 +85 +254 +72 +87 +252 +66 +87 +250 +64 +88 +252 +65 +94 +255 +65 +99 +255 +67 +102 +255 +70 +109 +255 +73 +114 +255 +77 +121 +255 +79 +124 +255 +76 +123 +255 +72 +121 +255 +63 +113 +255 +74 +122 +255 +79 +122 +252 +73 +112 +246 +77 +110 +252 +87 +117 +252 +87 +117 +243 +79 +106 +239 +75 +102 +236 +78 +103 +206 +62 +85 +220 +98 +113 +251 +156 +164 +211 +141 +141 +104 +57 +51 +113 +75 +64 +166 +119 +109 +210 +163 +155 +247 +210 +202 +255 +231 +226 +255 +242 +241 +255 +251 +254 +255 +250 +255 +249 +241 +254 +250 +237 +255 +252 +237 +255 +255 +237 +255 +255 +240 +255 +255 +242 +253 +255 +246 +254 +254 +250 +251 +255 +251 +250 +255 +252 +249 +255 +251 +247 +255 +249 +247 +255 +248 +246 +255 +245 +246 +254 +244 +245 +254 +243 +247 +253 +242 +246 +246 +235 +239 +236 +227 +228 +218 +213 +210 +201 +198 +193 +186 +185 +180 +179 +180 +172 +177 +180 +169 +176 +182 +170 +183 +191 +180 +175 +183 +172 +169 +177 +166 +49 +48 +44 +49 +48 +44 +48 +47 +43 +48 +47 +43 +49 +48 +44 +50 +49 +44 +52 +51 +46 +53 +52 +47 +55 +55 +47 +56 +56 +48 +57 +57 +49 +59 +59 +51 +61 +61 +51 +63 +63 +53 +65 +65 +55 +68 +65 +56 +73 +69 +58 +76 +70 +58 +78 +72 +58 +80 +74 +58 +82 +75 +57 +82 +77 +58 +83 +76 +58 +81 +75 +61 +79 +74 +68 +86 +84 +85 +102 +100 +113 +119 +120 +141 +134 +134 +168 +141 +144 +185 +143 +147 +195 +143 +144 +198 +142 +139 +192 +135 +131 +182 +123 +119 +169 +112 +109 +154 +105 +100 +141 +95 +91 +126 +85 +80 +110 +78 +74 +97 +75 +71 +88 +69 +66 +77 +63 +61 +66 +59 +55 +56 +57 +53 +50 +57 +54 +47 +56 +53 +44 +56 +53 +44 +54 +55 +49 +55 +56 +51 +56 +57 +49 +59 +59 +49 +62 +60 +47 +63 +60 +43 +66 +61 +42 +67 +60 +41 +71 +63 +44 +74 +63 +43 +75 +64 +44 +76 +65 +47 +77 +64 +48 +77 +63 +50 +76 +64 +52 +76 +62 +51 +77 +63 +52 +76 +62 +53 +73 +58 +51 +67 +56 +50 +63 +56 +50 +60 +57 +52 +56 +59 +52 +55 +60 +53 +57 +60 +51 +64 +57 +49 +72 +51 +46 +90 +49 +47 +119 +55 +56 +149 +62 +68 +167 +61 +71 +169 +56 +60 +170 +59 +48 +170 +60 +43 +171 +64 +46 +172 +65 +47 +169 +64 +45 +165 +60 +41 +166 +59 +39 +171 +62 +42 +167 +56 +36 +173 +58 +39 +181 +60 +43 +188 +61 +46 +193 +60 +45 +197 +59 +46 +202 +60 +48 +202 +61 +51 +197 +63 +54 +190 +62 +51 +186 +58 +47 +183 +55 +44 +183 +55 +44 +184 +56 +43 +186 +56 +43 +186 +56 +43 +187 +55 +43 +199 +65 +53 +205 +67 +56 +197 +56 +46 +193 +49 +38 +198 +51 +41 +203 +55 +45 +207 +53 +43 +219 +52 +43 +223 +51 +41 +225 +52 +45 +226 +54 +44 +227 +53 +44 +231 +53 +43 +236 +49 +42 +240 +47 +42 +245 +47 +44 +246 +47 +42 +242 +47 +41 +236 +48 +39 +226 +50 +35 +217 +52 +33 +208 +53 +31 +207 +52 +30 +214 +49 +30 +217 +47 +30 +216 +50 +34 +216 +54 +41 +215 +57 +45 +212 +58 +48 +214 +63 +54 +216 +69 +61 +214 +70 +62 +205 +64 +55 +201 +60 +53 +203 +64 +57 +214 +75 +68 +217 +78 +71 +210 +69 +62 +197 +59 +49 +197 +61 +49 +194 +60 +48 +192 +60 +47 +186 +59 +44 +183 +57 +42 +180 +58 +43 +182 +60 +45 +185 +63 +48 +181 +57 +45 +191 +60 +50 +201 +64 +58 +210 +67 +63 +219 +67 +66 +227 +68 +72 +237 +74 +79 +246 +79 +86 +236 +63 +69 +237 +62 +67 +242 +66 +76 +251 +73 +85 +255 +74 +89 +253 +70 +88 +250 +67 +89 +251 +67 +93 +251 +64 +95 +251 +66 +100 +255 +69 +108 +255 +74 +115 +255 +78 +122 +255 +79 +124 +255 +76 +121 +255 +72 +118 +255 +68 +114 +255 +78 +124 +255 +80 +122 +251 +72 +111 +245 +74 +108 +253 +86 +116 +254 +87 +115 +243 +81 +105 +231 +71 +95 +224 +72 +93 +226 +88 +104 +255 +147 +158 +255 +178 +184 +239 +155 +155 +140 +72 +69 +108 +47 +42 +166 +106 +98 +206 +149 +142 +243 +198 +192 +255 +225 +220 +255 +240 +239 +255 +251 +253 +255 +253 +255 +251 +246 +253 +252 +246 +255 +253 +245 +255 +255 +245 +255 +255 +246 +255 +255 +248 +255 +255 +250 +254 +255 +252 +251 +255 +252 +249 +255 +251 +247 +255 +250 +247 +255 +248 +247 +255 +247 +246 +255 +245 +247 +255 +244 +246 +255 +243 +247 +255 +243 +247 +253 +241 +243 +243 +233 +234 +228 +220 +218 +214 +209 +205 +205 +202 +195 +201 +201 +191 +202 +202 +192 +202 +205 +194 +201 +208 +200 +190 +200 +191 +182 +192 +183 +54 +53 +49 +52 +51 +46 +51 +50 +46 +49 +48 +43 +49 +48 +43 +50 +49 +44 +51 +50 +45 +52 +51 +46 +54 +54 +46 +55 +55 +47 +56 +56 +48 +58 +58 +50 +60 +60 +50 +62 +62 +52 +64 +64 +54 +66 +64 +52 +74 +68 +56 +77 +69 +56 +79 +72 +56 +82 +75 +59 +84 +75 +58 +84 +77 +59 +83 +76 +60 +82 +75 +65 +81 +76 +73 +90 +87 +94 +108 +105 +124 +127 +126 +157 +140 +143 +184 +150 +153 +204 +153 +158 +216 +154 +158 +222 +153 +152 +218 +148 +145 +212 +140 +138 +201 +134 +133 +191 +129 +126 +181 +120 +118 +167 +110 +107 +150 +102 +101 +135 +93 +90 +119 +86 +84 +105 +77 +75 +89 +68 +65 +74 +62 +60 +63 +59 +58 +56 +59 +55 +52 +55 +54 +50 +53 +53 +53 +52 +53 +55 +54 +54 +52 +56 +55 +50 +60 +58 +46 +63 +60 +43 +67 +62 +42 +70 +64 +42 +71 +63 +42 +72 +64 +43 +73 +65 +44 +73 +66 +48 +73 +65 +52 +72 +66 +54 +72 +65 +57 +72 +63 +58 +76 +61 +58 +76 +58 +58 +71 +55 +55 +64 +54 +53 +58 +54 +53 +53 +55 +52 +49 +56 +49 +47 +57 +48 +55 +60 +53 +55 +52 +43 +67 +48 +41 +93 +56 +50 +126 +66 +65 +149 +71 +71 +157 +63 +64 +158 +52 +52 +167 +59 +47 +170 +60 +43 +170 +63 +45 +170 +63 +45 +169 +62 +44 +169 +62 +42 +172 +63 +43 +176 +63 +45 +171 +56 +37 +178 +57 +40 +185 +58 +43 +191 +57 +45 +195 +57 +44 +200 +58 +46 +205 +58 +48 +207 +60 +52 +203 +62 +53 +198 +59 +52 +194 +57 +49 +193 +56 +46 +193 +56 +46 +194 +57 +47 +194 +56 +46 +195 +54 +44 +197 +55 +45 +209 +67 +57 +208 +64 +55 +195 +48 +38 +195 +44 +35 +208 +55 +47 +214 +60 +52 +211 +50 +42 +224 +51 +44 +228 +50 +40 +231 +50 +43 +232 +51 +42 +234 +51 +43 +237 +50 +43 +240 +47 +42 +243 +45 +42 +246 +47 +42 +245 +46 +41 +241 +48 +41 +236 +49 +40 +225 +52 +36 +218 +53 +34 +209 +54 +32 +208 +53 +31 +216 +55 +35 +217 +51 +35 +214 +51 +36 +213 +51 +38 +213 +53 +41 +212 +56 +44 +212 +60 +49 +214 +63 +54 +236 +89 +81 +225 +82 +74 +211 +72 +65 +204 +67 +59 +202 +69 +60 +204 +73 +63 +200 +69 +59 +192 +62 +49 +188 +58 +42 +188 +59 +40 +188 +58 +42 +185 +58 +41 +183 +58 +40 +184 +58 +43 +188 +62 +48 +191 +65 +51 +193 +65 +54 +193 +60 +51 +197 +60 +54 +207 +65 +61 +215 +69 +69 +221 +71 +72 +228 +73 +77 +235 +76 +80 +232 +66 +70 +234 +64 +67 +240 +67 +73 +249 +75 +84 +254 +78 +89 +252 +74 +90 +252 +70 +92 +252 +70 +95 +248 +65 +95 +249 +66 +97 +253 +69 +105 +255 +74 +112 +255 +78 +119 +255 +79 +122 +255 +78 +120 +255 +76 +118 +254 +77 +119 +255 +79 +118 +252 +77 +116 +250 +79 +115 +255 +87 +121 +255 +95 +123 +252 +85 +111 +233 +71 +94 +243 +86 +107 +231 +83 +99 +240 +100 +113 +255 +144 +154 +254 +137 +145 +236 +130 +134 +194 +95 +98 +165 +77 +76 +179 +104 +101 +206 +141 +137 +240 +187 +183 +255 +219 +215 +255 +238 +237 +255 +247 +247 +255 +250 +253 +251 +249 +254 +253 +250 +255 +252 +251 +255 +253 +250 +255 +255 +250 +255 +255 +250 +254 +255 +251 +252 +253 +252 +250 +255 +251 +248 +255 +251 +247 +255 +251 +248 +255 +250 +249 +255 +250 +249 +255 +247 +249 +255 +245 +247 +254 +242 +246 +252 +240 +242 +249 +237 +239 +242 +230 +230 +231 +221 +219 +223 +216 +210 +219 +215 +206 +221 +219 +207 +224 +222 +210 +223 +225 +214 +221 +228 +220 +207 +216 +211 +197 +206 +201 +60 +57 +52 +59 +56 +49 +56 +53 +48 +53 +50 +43 +52 +49 +42 +52 +49 +42 +53 +50 +43 +54 +51 +44 +55 +52 +45 +56 +53 +46 +57 +54 +47 +59 +56 +49 +61 +58 +49 +63 +60 +51 +65 +62 +53 +67 +63 +52 +74 +66 +55 +77 +67 +55 +80 +71 +56 +83 +74 +59 +87 +75 +59 +85 +76 +61 +85 +75 +63 +83 +74 +67 +83 +74 +75 +93 +87 +99 +110 +108 +130 +130 +130 +166 +145 +149 +197 +154 +160 +218 +159 +166 +234 +162 +169 +241 +161 +165 +239 +158 +160 +235 +153 +155 +229 +149 +152 +221 +148 +149 +214 +144 +145 +202 +137 +137 +189 +130 +131 +177 +122 +121 +161 +114 +113 +145 +102 +99 +126 +88 +86 +107 +80 +78 +92 +73 +71 +82 +70 +67 +76 +67 +66 +74 +63 +63 +75 +61 +61 +71 +59 +58 +64 +59 +57 +58 +60 +57 +52 +63 +59 +47 +67 +61 +45 +69 +64 +44 +70 +64 +42 +70 +65 +43 +69 +66 +47 +69 +67 +52 +67 +67 +55 +66 +67 +59 +65 +67 +62 +65 +65 +65 +69 +59 +67 +71 +61 +70 +71 +64 +72 +71 +68 +75 +70 +71 +76 +67 +72 +75 +63 +72 +71 +62 +71 +66 +67 +72 +65 +65 +61 +52 +75 +58 +48 +102 +70 +59 +128 +80 +70 +138 +74 +64 +140 +63 +53 +146 +56 +45 +164 +62 +47 +169 +62 +44 +171 +62 +42 +172 +63 +43 +173 +64 +44 +175 +64 +45 +176 +63 +45 +177 +60 +42 +177 +56 +39 +182 +56 +41 +189 +57 +42 +195 +57 +44 +200 +56 +45 +204 +56 +46 +210 +57 +49 +212 +59 +53 +207 +58 +52 +205 +58 +51 +203 +56 +49 +203 +56 +49 +204 +57 +50 +205 +58 +50 +204 +55 +48 +203 +54 +47 +211 +60 +53 +213 +62 +53 +210 +57 +49 +204 +50 +40 +206 +52 +42 +216 +59 +50 +218 +60 +51 +215 +51 +42 +228 +49 +42 +233 +49 +39 +236 +49 +42 +238 +50 +41 +240 +49 +41 +242 +47 +41 +244 +45 +40 +246 +44 +40 +247 +45 +41 +244 +47 +41 +240 +49 +41 +233 +51 +40 +226 +53 +39 +217 +54 +37 +210 +55 +33 +207 +55 +32 +212 +57 +37 +213 +56 +37 +211 +54 +37 +209 +52 +37 +210 +52 +40 +211 +55 +43 +210 +56 +46 +208 +55 +47 +227 +78 +71 +232 +88 +80 +231 +90 +83 +218 +81 +73 +204 +71 +62 +196 +68 +57 +191 +64 +55 +185 +62 +47 +185 +60 +42 +185 +60 +38 +185 +60 +40 +185 +58 +39 +184 +57 +40 +186 +59 +42 +192 +62 +48 +195 +65 +52 +201 +68 +59 +198 +64 +55 +201 +64 +58 +209 +70 +67 +213 +73 +72 +214 +72 +71 +216 +71 +74 +223 +73 +75 +230 +70 +72 +232 +66 +68 +237 +68 +73 +245 +76 +83 +252 +81 +90 +251 +79 +93 +251 +76 +93 +251 +75 +96 +246 +68 +94 +247 +68 +97 +249 +70 +102 +253 +73 +108 +255 +78 +117 +255 +79 +120 +255 +79 +120 +255 +80 +119 +246 +85 +119 +242 +84 +117 +244 +84 +118 +250 +89 +120 +255 +93 +123 +255 +92 +119 +247 +83 +107 +236 +74 +95 +246 +89 +106 +239 +87 +102 +227 +79 +93 +239 +94 +107 +218 +78 +89 +223 +86 +96 +222 +86 +96 +210 +89 +96 +191 +99 +100 +199 +128 +124 +230 +169 +166 +255 +208 +207 +255 +233 +231 +255 +241 +240 +255 +246 +247 +254 +252 +253 +251 +252 +255 +249 +253 +255 +248 +252 +255 +250 +251 +253 +250 +250 +252 +249 +249 +249 +250 +249 +247 +252 +248 +245 +255 +250 +246 +255 +250 +247 +255 +251 +250 +255 +250 +249 +255 +247 +247 +254 +242 +242 +252 +237 +240 +249 +234 +237 +240 +225 +228 +233 +221 +221 +228 +217 +213 +226 +217 +210 +230 +223 +213 +235 +231 +219 +241 +237 +225 +241 +241 +229 +236 +243 +236 +220 +231 +227 +208 +219 +215 +64 +61 +54 +61 +58 +51 +58 +55 +48 +55 +52 +45 +53 +50 +43 +53 +50 +43 +53 +50 +43 +54 +51 +44 +55 +52 +45 +55 +52 +45 +57 +54 +47 +59 +56 +49 +61 +58 +49 +63 +60 +51 +64 +61 +52 +66 +62 +51 +74 +66 +55 +77 +67 +55 +82 +70 +56 +86 +74 +58 +87 +75 +59 +88 +76 +60 +87 +75 +63 +84 +73 +67 +83 +74 +77 +94 +88 +102 +112 +109 +136 +130 +132 +171 +145 +151 +203 +156 +164 +227 +163 +173 +245 +167 +176 +253 +170 +177 +255 +166 +172 +250 +161 +167 +243 +160 +164 +238 +159 +163 +234 +157 +161 +225 +153 +155 +214 +149 +150 +204 +146 +146 +196 +137 +136 +180 +121 +121 +159 +106 +105 +139 +96 +93 +124 +88 +85 +112 +82 +80 +104 +79 +77 +101 +78 +74 +99 +75 +71 +94 +70 +66 +83 +64 +61 +72 +63 +58 +62 +63 +58 +54 +64 +60 +49 +65 +62 +47 +67 +64 +47 +67 +66 +48 +66 +67 +51 +66 +68 +55 +63 +68 +61 +62 +68 +64 +60 +69 +68 +59 +66 +72 +65 +67 +82 +71 +72 +92 +80 +81 +99 +89 +91 +106 +95 +97 +110 +99 +99 +109 +99 +98 +104 +101 +95 +97 +102 +88 +87 +95 +74 +69 +106 +72 +63 +130 +83 +73 +146 +88 +76 +143 +76 +60 +142 +65 +49 +150 +63 +46 +167 +66 +48 +174 +64 +47 +174 +65 +45 +175 +64 +45 +176 +65 +46 +180 +65 +47 +178 +61 +43 +176 +55 +38 +181 +55 +40 +188 +56 +43 +194 +56 +43 +200 +56 +45 +205 +54 +45 +209 +55 +47 +213 +56 +49 +216 +59 +52 +210 +55 +50 +208 +55 +50 +208 +55 +50 +209 +56 +50 +212 +57 +52 +212 +57 +52 +211 +56 +51 +211 +54 +47 +222 +65 +58 +213 +56 +47 +209 +51 +42 +214 +56 +47 +222 +61 +53 +222 +61 +53 +218 +57 +49 +220 +53 +44 +231 +50 +41 +235 +48 +39 +239 +48 +40 +241 +48 +41 +244 +47 +41 +247 +45 +41 +247 +44 +40 +247 +44 +40 +247 +45 +41 +244 +47 +41 +238 +50 +41 +233 +52 +41 +225 +53 +39 +218 +55 +38 +212 +55 +36 +207 +56 +35 +206 +55 +34 +207 +56 +37 +206 +55 +36 +207 +54 +38 +208 +55 +41 +210 +57 +43 +209 +55 +43 +206 +52 +42 +203 +52 +43 +227 +78 +71 +243 +100 +92 +235 +96 +89 +213 +79 +70 +196 +65 +55 +186 +59 +50 +181 +57 +45 +184 +62 +41 +184 +62 +39 +185 +60 +38 +185 +59 +37 +186 +57 +38 +189 +57 +42 +192 +60 +47 +196 +62 +50 +202 +68 +57 +202 +65 +57 +206 +69 +63 +213 +75 +72 +211 +76 +73 +206 +71 +68 +205 +69 +69 +214 +72 +71 +227 +73 +73 +230 +67 +68 +232 +69 +72 +242 +77 +83 +248 +83 +90 +249 +82 +92 +247 +79 +94 +250 +79 +97 +244 +72 +94 +245 +71 +96 +248 +71 +100 +251 +73 +105 +255 +78 +114 +255 +81 +120 +255 +82 +121 +255 +84 +122 +239 +84 +116 +239 +90 +119 +249 +96 +126 +253 +96 +125 +249 +86 +113 +242 +78 +103 +245 +81 +105 +253 +90 +109 +251 +93 +108 +255 +102 +116 +235 +80 +94 +243 +88 +102 +238 +83 +97 +246 +90 +104 +237 +79 +94 +223 +83 +94 +190 +92 +93 +188 +114 +111 +216 +152 +150 +249 +198 +195 +255 +226 +225 +255 +235 +233 +254 +242 +242 +255 +255 +253 +252 +255 +255 +251 +255 +255 +248 +255 +255 +249 +255 +253 +249 +253 +252 +250 +252 +249 +252 +251 +247 +253 +249 +246 +253 +248 +244 +255 +248 +245 +255 +249 +248 +255 +249 +248 +255 +245 +245 +251 +239 +239 +247 +232 +235 +243 +229 +229 +235 +221 +221 +232 +218 +217 +228 +217 +211 +232 +222 +213 +240 +232 +221 +249 +243 +229 +255 +250 +236 +254 +254 +242 +244 +250 +246 +227 +237 +236 +214 +224 +223 +66 +62 +53 +65 +61 +52 +64 +60 +51 +62 +58 +49 +60 +56 +47 +58 +54 +45 +56 +52 +43 +55 +51 +42 +54 +50 +41 +54 +50 +41 +55 +51 +42 +56 +52 +43 +59 +54 +48 +62 +57 +51 +65 +60 +54 +69 +62 +54 +73 +64 +55 +77 +67 +55 +82 +70 +56 +85 +73 +57 +87 +74 +58 +88 +75 +59 +90 +76 +65 +91 +78 +72 +84 +73 +77 +88 +82 +96 +103 +100 +129 +124 +126 +167 +141 +146 +202 +151 +160 +227 +158 +170 +246 +165 +176 +255 +170 +179 +255 +171 +178 +255 +172 +180 +255 +172 +178 +252 +170 +177 +249 +170 +175 +243 +168 +172 +236 +169 +171 +232 +159 +161 +218 +153 +154 +210 +141 +141 +193 +129 +127 +177 +116 +114 +161 +104 +101 +146 +93 +90 +135 +88 +82 +126 +88 +81 +122 +89 +81 +118 +86 +79 +110 +77 +72 +95 +67 +63 +77 +63 +58 +64 +63 +59 +58 +66 +63 +56 +62 +62 +52 +64 +66 +53 +66 +69 +58 +63 +68 +61 +60 +66 +62 +58 +67 +66 +62 +70 +72 +65 +75 +84 +70 +85 +106 +85 +101 +126 +101 +113 +137 +108 +114 +136 +119 +117 +139 +131 +119 +139 +132 +111 +126 +128 +95 +106 +137 +91 +101 +144 +88 +91 +157 +87 +87 +164 +87 +81 +162 +78 +68 +154 +65 +51 +151 +58 +40 +158 +59 +40 +167 +60 +42 +172 +61 +42 +174 +63 +44 +177 +64 +46 +179 +64 +45 +180 +63 +45 +182 +61 +44 +185 +59 +44 +186 +54 +39 +190 +54 +40 +196 +54 +42 +203 +55 +45 +209 +55 +45 +214 +56 +47 +218 +57 +49 +218 +56 +51 +215 +56 +52 +216 +57 +53 +217 +58 +54 +216 +57 +51 +216 +54 +49 +216 +54 +49 +218 +56 +51 +221 +58 +51 +230 +67 +60 +224 +61 +54 +218 +55 +48 +227 +64 +55 +254 +91 +82 +255 +108 +99 +255 +93 +84 +231 +63 +54 +229 +51 +41 +237 +50 +41 +241 +50 +42 +244 +47 +41 +244 +42 +38 +245 +40 +37 +248 +40 +38 +248 +43 +40 +247 +45 +43 +243 +48 +44 +237 +50 +43 +227 +49 +39 +218 +48 +35 +212 +49 +34 +212 +52 +36 +211 +58 +40 +204 +59 +38 +202 +60 +40 +205 +60 +41 +207 +60 +42 +210 +58 +44 +210 +57 +43 +210 +56 +44 +209 +55 +45 +218 +64 +56 +207 +56 +49 +220 +71 +65 +244 +99 +94 +229 +88 +81 +203 +66 +60 +197 +64 +59 +183 +52 +42 +183 +58 +38 +182 +60 +36 +185 +60 +38 +186 +60 +38 +189 +58 +40 +191 +58 +43 +196 +60 +48 +198 +62 +50 +199 +62 +52 +204 +67 +59 +217 +80 +74 +223 +88 +82 +212 +79 +74 +195 +63 +58 +192 +63 +58 +207 +72 +68 +222 +72 +71 +226 +71 +69 +230 +74 +75 +239 +80 +84 +241 +82 +87 +239 +78 +86 +237 +75 +88 +241 +76 +92 +249 +82 +102 +248 +79 +102 +247 +75 +101 +247 +74 +102 +252 +77 +108 +255 +81 +115 +255 +82 +118 +253 +82 +118 +245 +88 +119 +239 +89 +118 +243 +89 +117 +251 +92 +120 +255 +93 +120 +255 +91 +115 +254 +88 +110 +252 +86 +106 +255 +101 +117 +247 +89 +103 +253 +95 +109 +252 +94 +108 +234 +73 +88 +235 +73 +88 +251 +84 +101 +233 +88 +101 +198 +102 +103 +173 +103 +101 +203 +142 +139 +232 +181 +178 +249 +209 +207 +255 +234 +231 +254 +238 +238 +252 +248 +247 +246 +250 +249 +247 +255 +253 +247 +255 +254 +246 +255 +252 +248 +254 +252 +253 +255 +252 +253 +252 +248 +251 +247 +244 +255 +250 +246 +255 +250 +246 +255 +247 +244 +253 +243 +241 +255 +244 +244 +255 +243 +243 +246 +232 +232 +231 +217 +217 +228 +214 +213 +223 +209 +206 +225 +214 +208 +241 +231 +222 +252 +244 +231 +253 +247 +231 +255 +251 +232 +255 +255 +243 +249 +254 +248 +231 +240 +239 +218 +227 +226 +67 +63 +54 +66 +62 +51 +65 +61 +52 +63 +59 +50 +61 +57 +48 +59 +55 +46 +58 +54 +45 +57 +53 +44 +55 +51 +42 +55 +51 +42 +55 +51 +42 +56 +52 +43 +58 +53 +47 +61 +56 +50 +64 +59 +53 +68 +61 +53 +72 +63 +54 +76 +66 +54 +81 +69 +55 +84 +72 +56 +86 +73 +56 +87 +74 +57 +89 +75 +62 +90 +77 +69 +85 +74 +78 +87 +81 +95 +101 +98 +127 +121 +123 +164 +138 +143 +201 +148 +157 +226 +155 +166 +245 +163 +174 +254 +171 +180 +255 +172 +181 +255 +174 +182 +255 +175 +183 +255 +176 +183 +255 +175 +182 +252 +175 +180 +248 +175 +178 +245 +169 +170 +235 +162 +163 +227 +152 +152 +216 +140 +138 +201 +128 +127 +187 +117 +113 +174 +105 +101 +160 +99 +94 +152 +96 +87 +142 +96 +86 +136 +93 +84 +127 +86 +80 +116 +77 +73 +98 +70 +67 +84 +66 +65 +73 +65 +65 +67 +60 +60 +58 +65 +66 +61 +70 +69 +65 +67 +68 +63 +65 +63 +64 +68 +66 +69 +79 +77 +82 +88 +86 +99 +102 +103 +131 +116 +116 +150 +130 +125 +157 +138 +125 +155 +149 +124 +154 +160 +124 +150 +165 +113 +136 +164 +96 +117 +172 +89 +107 +180 +87 +98 +185 +81 +88 +181 +73 +71 +173 +64 +57 +168 +60 +47 +168 +61 +41 +169 +63 +41 +167 +56 +37 +168 +55 +37 +171 +56 +38 +174 +57 +40 +176 +56 +39 +178 +57 +40 +181 +55 +40 +184 +54 +40 +187 +51 +37 +194 +52 +40 +202 +55 +45 +211 +58 +50 +217 +60 +51 +222 +61 +53 +223 +60 +53 +223 +60 +53 +225 +62 +57 +223 +60 +55 +223 +60 +55 +225 +62 +57 +229 +66 +61 +232 +67 +61 +231 +66 +60 +230 +65 +59 +229 +64 +58 +230 +66 +57 +228 +64 +55 +220 +56 +47 +213 +49 +40 +216 +54 +43 +235 +73 +62 +255 +91 +79 +241 +64 +54 +238 +54 +44 +234 +43 +35 +238 +41 +35 +248 +45 +41 +255 +47 +45 +254 +44 +43 +246 +40 +40 +250 +48 +46 +245 +52 +47 +239 +54 +49 +231 +54 +46 +222 +51 +41 +214 +50 +38 +212 +50 +37 +207 +54 +38 +203 +58 +39 +200 +59 +39 +202 +60 +40 +205 +58 +40 +207 +57 +42 +208 +55 +41 +209 +53 +41 +208 +52 +40 +211 +57 +47 +207 +53 +45 +212 +61 +54 +229 +80 +74 +229 +84 +81 +219 +76 +72 +205 +66 +63 +183 +49 +40 +188 +59 +40 +187 +61 +38 +189 +60 +39 +190 +59 +39 +190 +57 +40 +192 +56 +40 +194 +58 +44 +196 +58 +47 +200 +62 +52 +203 +66 +56 +213 +79 +70 +220 +87 +80 +210 +82 +73 +195 +68 +61 +191 +67 +59 +204 +72 +67 +219 +76 +72 +223 +74 +70 +229 +77 +76 +235 +83 +82 +237 +84 +87 +235 +80 +86 +233 +78 +86 +236 +79 +90 +247 +86 +102 +248 +85 +104 +249 +83 +105 +250 +82 +107 +252 +82 +109 +255 +83 +113 +255 +83 +116 +254 +83 +117 +241 +76 +108 +245 +84 +115 +255 +92 +121 +255 +96 +123 +255 +91 +117 +253 +85 +110 +250 +82 +105 +249 +84 +101 +249 +87 +102 +242 +84 +98 +249 +93 +104 +249 +93 +104 +236 +82 +94 +241 +87 +99 +247 +93 +105 +217 +86 +94 +182 +96 +95 +153 +92 +87 +185 +127 +125 +218 +169 +165 +239 +199 +197 +254 +224 +222 +251 +233 +233 +253 +248 +245 +248 +250 +247 +247 +255 +253 +247 +255 +254 +245 +255 +252 +248 +254 +252 +253 +255 +252 +254 +253 +251 +252 +248 +245 +253 +250 +245 +254 +249 +245 +252 +247 +243 +252 +244 +241 +255 +245 +244 +255 +244 +244 +245 +233 +233 +234 +220 +219 +229 +215 +212 +222 +209 +203 +223 +213 +204 +239 +229 +219 +252 +245 +229 +255 +249 +231 +255 +252 +232 +255 +255 +239 +248 +253 +246 +232 +241 +238 +221 +227 +225 +69 +65 +54 +69 +65 +53 +67 +63 +52 +65 +61 +50 +63 +59 +48 +61 +57 +46 +60 +56 +45 +59 +55 +44 +56 +52 +43 +56 +52 +43 +55 +51 +42 +56 +52 +43 +58 +53 +47 +61 +56 +50 +63 +58 +52 +67 +60 +52 +71 +62 +53 +74 +66 +55 +78 +68 +56 +82 +70 +54 +84 +71 +54 +87 +71 +55 +89 +73 +60 +89 +74 +67 +87 +75 +75 +88 +80 +93 +98 +94 +121 +115 +117 +156 +133 +138 +194 +144 +153 +220 +152 +164 +240 +160 +171 +250 +170 +179 +254 +173 +181 +254 +175 +183 +255 +177 +185 +255 +179 +186 +255 +180 +187 +255 +181 +185 +255 +181 +185 +255 +175 +178 +249 +172 +172 +244 +163 +163 +235 +153 +151 +224 +142 +141 +211 +131 +128 +199 +120 +117 +188 +115 +109 +179 +107 +96 +162 +105 +93 +155 +99 +90 +145 +93 +87 +133 +86 +82 +119 +78 +75 +104 +69 +68 +86 +64 +64 +76 +56 +53 +60 +65 +60 +64 +75 +65 +66 +76 +64 +66 +81 +62 +66 +90 +69 +74 +112 +87 +93 +130 +99 +115 +152 +115 +149 +165 +122 +165 +175 +127 +167 +178 +123 +162 +184 +118 +154 +192 +112 +147 +194 +99 +131 +192 +84 +110 +193 +71 +94 +207 +76 +92 +207 +73 +82 +195 +61 +62 +183 +54 +48 +180 +58 +43 +178 +61 +41 +173 +61 +39 +175 +60 +41 +176 +59 +41 +178 +58 +41 +180 +59 +42 +183 +60 +44 +187 +60 +45 +192 +60 +45 +196 +60 +46 +196 +54 +42 +203 +56 +46 +211 +60 +49 +217 +63 +53 +223 +65 +56 +225 +62 +55 +224 +60 +51 +223 +58 +52 +220 +55 +49 +217 +52 +46 +216 +51 +45 +222 +57 +51 +230 +65 +59 +236 +69 +63 +233 +66 +60 +228 +61 +53 +227 +60 +52 +219 +52 +44 +216 +52 +43 +219 +55 +45 +212 +50 +39 +204 +44 +32 +214 +54 +42 +233 +71 +58 +245 +75 +62 +242 +64 +54 +239 +52 +45 +240 +45 +41 +246 +44 +42 +250 +44 +44 +252 +44 +44 +248 +42 +44 +240 +42 +41 +236 +47 +43 +232 +50 +46 +227 +53 +46 +220 +52 +43 +216 +49 +40 +213 +49 +39 +209 +51 +39 +205 +55 +40 +203 +58 +41 +205 +58 +40 +208 +58 +41 +210 +59 +42 +211 +58 +42 +212 +56 +43 +212 +56 +44 +209 +52 +43 +214 +60 +52 +213 +58 +53 +213 +60 +55 +229 +79 +78 +237 +89 +87 +217 +69 +69 +194 +51 +47 +192 +59 +44 +191 +60 +40 +192 +59 +42 +191 +58 +41 +193 +57 +41 +192 +56 +40 +192 +56 +42 +192 +56 +44 +198 +61 +51 +199 +65 +54 +207 +74 +65 +216 +85 +75 +210 +82 +71 +198 +71 +62 +192 +68 +58 +199 +71 +62 +214 +75 +68 +216 +73 +67 +221 +76 +73 +228 +83 +80 +229 +83 +84 +226 +80 +83 +226 +77 +83 +229 +78 +87 +242 +88 +100 +246 +90 +104 +253 +91 +112 +254 +90 +114 +252 +86 +110 +250 +82 +108 +251 +81 +108 +255 +81 +112 +248 +70 +106 +255 +79 +116 +255 +89 +123 +255 +90 +121 +255 +86 +113 +252 +84 +107 +254 +87 +107 +255 +92 +109 +250 +89 +104 +247 +91 +104 +248 +98 +109 +242 +98 +107 +231 +96 +103 +234 +105 +110 +229 +106 +109 +197 +94 +95 +160 +93 +87 +126 +77 +70 +155 +108 +102 +195 +151 +148 +223 +185 +182 +241 +211 +209 +244 +224 +223 +255 +245 +244 +249 +249 +247 +249 +255 +253 +247 +255 +255 +245 +255 +252 +248 +254 +252 +253 +255 +254 +255 +252 +253 +252 +248 +247 +252 +249 +244 +252 +249 +242 +250 +247 +242 +251 +246 +242 +255 +247 +244 +255 +246 +244 +249 +238 +236 +239 +228 +226 +230 +219 +215 +220 +209 +203 +221 +211 +201 +238 +228 +216 +253 +246 +228 +255 +251 +232 +255 +253 +231 +255 +255 +236 +248 +251 +242 +233 +239 +235 +224 +229 +225 +73 +69 +57 +72 +68 +56 +70 +66 +54 +68 +64 +52 +66 +62 +51 +64 +60 +49 +63 +59 +48 +62 +58 +47 +58 +54 +45 +57 +53 +44 +57 +53 +44 +57 +53 +44 +58 +53 +47 +60 +55 +49 +62 +57 +51 +64 +59 +53 +69 +62 +54 +73 +64 +55 +76 +68 +55 +79 +70 +53 +82 +69 +52 +85 +69 +53 +87 +71 +56 +87 +73 +62 +88 +77 +75 +88 +78 +87 +94 +90 +113 +112 +112 +150 +128 +134 +186 +140 +150 +212 +149 +161 +233 +157 +169 +245 +168 +176 +249 +169 +177 +249 +173 +179 +253 +176 +183 +255 +177 +183 +255 +178 +185 +255 +180 +184 +255 +180 +184 +255 +175 +177 +252 +171 +173 +248 +165 +167 +242 +159 +158 +234 +151 +150 +226 +140 +139 +215 +130 +129 +205 +125 +121 +197 +117 +109 +182 +112 +103 +170 +102 +96 +158 +95 +90 +144 +89 +88 +132 +81 +81 +117 +71 +71 +99 +65 +62 +81 +61 +53 +68 +72 +56 +66 +84 +61 +67 +96 +64 +69 +110 +67 +74 +128 +79 +85 +150 +93 +100 +170 +103 +120 +189 +108 +141 +201 +110 +153 +203 +111 +152 +201 +105 +143 +198 +97 +131 +199 +88 +120 +198 +73 +103 +196 +59 +85 +197 +51 +72 +216 +65 +80 +223 +69 +79 +208 +60 +60 +195 +56 +49 +194 +64 +50 +186 +65 +44 +175 +59 +36 +173 +54 +34 +173 +53 +36 +174 +53 +36 +179 +53 +38 +182 +55 +40 +188 +56 +43 +195 +59 +45 +200 +60 +47 +211 +64 +54 +215 +64 +55 +218 +64 +54 +220 +63 +54 +222 +61 +53 +222 +57 +51 +221 +54 +46 +219 +52 +44 +211 +46 +40 +210 +45 +39 +211 +46 +40 +216 +51 +45 +225 +58 +52 +227 +60 +52 +225 +56 +49 +220 +53 +45 +220 +53 +45 +208 +44 +34 +205 +41 +31 +217 +55 +44 +226 +66 +54 +220 +63 +48 +208 +52 +37 +203 +46 +31 +233 +70 +55 +243 +73 +60 +253 +72 +63 +252 +60 +55 +244 +45 +42 +241 +35 +37 +245 +39 +41 +251 +47 +50 +241 +45 +46 +235 +47 +46 +228 +50 +46 +222 +51 +44 +218 +49 +42 +215 +48 +42 +214 +47 +41 +211 +48 +39 +211 +55 +42 +210 +57 +43 +214 +58 +43 +216 +60 +45 +218 +62 +47 +219 +63 +48 +220 +64 +51 +220 +64 +51 +210 +54 +42 +230 +76 +66 +229 +74 +69 +206 +53 +48 +223 +71 +70 +243 +90 +92 +223 +73 +75 +213 +65 +63 +200 +60 +47 +196 +59 +43 +195 +58 +42 +195 +58 +42 +194 +58 +42 +194 +58 +42 +193 +57 +43 +190 +57 +42 +194 +60 +48 +194 +62 +50 +200 +70 +57 +207 +79 +66 +206 +80 +68 +198 +72 +60 +191 +67 +55 +193 +67 +55 +206 +72 +63 +209 +70 +63 +213 +74 +69 +219 +80 +75 +221 +82 +79 +217 +77 +76 +218 +75 +77 +220 +75 +80 +235 +88 +96 +243 +91 +103 +252 +97 +113 +255 +97 +117 +250 +88 +109 +245 +79 +103 +245 +77 +103 +253 +78 +107 +255 +76 +112 +255 +79 +116 +255 +83 +115 +255 +82 +110 +250 +84 +108 +252 +90 +111 +255 +99 +117 +255 +105 +120 +255 +102 +117 +250 +98 +111 +244 +98 +109 +236 +101 +108 +224 +103 +108 +212 +106 +106 +200 +106 +104 +177 +104 +97 +141 +94 +84 +104 +70 +60 +130 +93 +85 +172 +135 +129 +206 +171 +169 +229 +199 +197 +239 +218 +217 +255 +243 +243 +251 +247 +246 +249 +253 +252 +248 +255 +255 +245 +255 +254 +248 +254 +254 +255 +255 +255 +255 +251 +255 +254 +248 +248 +251 +250 +245 +250 +250 +242 +249 +248 +243 +253 +250 +245 +255 +251 +247 +255 +250 +247 +253 +243 +241 +247 +236 +232 +235 +224 +218 +223 +213 +204 +222 +212 +202 +237 +230 +214 +254 +247 +228 +255 +254 +232 +255 +254 +229 +255 +254 +233 +247 +249 +238 +234 +239 +232 +228 +231 +224 +78 +72 +58 +77 +71 +57 +76 +70 +56 +74 +68 +54 +72 +66 +54 +70 +64 +52 +68 +61 +51 +67 +60 +50 +63 +56 +48 +62 +55 +47 +61 +54 +46 +61 +54 +46 +61 +54 +48 +62 +55 +49 +64 +57 +51 +63 +58 +52 +67 +62 +56 +69 +65 +56 +75 +67 +56 +78 +69 +54 +81 +68 +51 +82 +69 +50 +86 +70 +54 +86 +72 +59 +90 +77 +71 +86 +77 +82 +91 +87 +104 +108 +107 +139 +126 +130 +177 +138 +147 +206 +146 +159 +227 +154 +166 +238 +166 +174 +247 +169 +175 +249 +173 +176 +253 +175 +179 +253 +176 +179 +255 +176 +180 +254 +176 +179 +255 +175 +179 +253 +171 +174 +251 +168 +171 +248 +164 +167 +244 +160 +162 +239 +154 +156 +233 +147 +149 +226 +138 +140 +217 +134 +133 +209 +131 +127 +201 +123 +117 +187 +109 +107 +172 +100 +101 +158 +95 +97 +146 +89 +91 +132 +82 +81 +115 +78 +72 +98 +87 +70 +89 +95 +67 +81 +109 +66 +76 +129 +69 +77 +152 +77 +84 +172 +85 +93 +188 +91 +98 +202 +90 +104 +214 +84 +112 +223 +83 +118 +222 +84 +117 +215 +80 +110 +208 +74 +99 +203 +67 +89 +198 +57 +74 +194 +47 +63 +211 +57 +69 +225 +68 +77 +228 +72 +75 +215 +63 +60 +205 +62 +54 +203 +71 +58 +194 +73 +52 +182 +63 +41 +183 +62 +43 +184 +61 +45 +186 +60 +45 +189 +62 +47 +195 +63 +48 +202 +66 +52 +208 +68 +55 +213 +69 +58 +217 +69 +57 +218 +66 +55 +219 +62 +53 +217 +59 +50 +217 +54 +45 +217 +53 +44 +218 +51 +43 +215 +51 +42 +212 +49 +42 +215 +52 +45 +218 +55 +46 +221 +57 +48 +223 +56 +48 +222 +55 +47 +221 +54 +46 +220 +53 +44 +214 +47 +38 +217 +53 +43 +215 +55 +43 +207 +50 +35 +205 +49 +34 +210 +57 +41 +213 +62 +45 +212 +59 +41 +216 +60 +45 +230 +68 +55 +248 +74 +65 +253 +68 +63 +249 +54 +52 +245 +42 +45 +246 +42 +45 +247 +47 +50 +247 +54 +55 +237 +53 +53 +226 +51 +48 +218 +49 +44 +215 +48 +42 +215 +47 +44 +217 +48 +45 +217 +48 +43 +227 +56 +49 +228 +57 +49 +226 +58 +49 +226 +59 +50 +224 +60 +48 +223 +61 +48 +220 +63 +48 +218 +62 +49 +209 +55 +43 +239 +87 +76 +248 +97 +90 +211 +59 +54 +209 +59 +58 +230 +80 +81 +220 +70 +72 +230 +80 +81 +207 +60 +52 +202 +58 +47 +198 +56 +44 +197 +57 +44 +196 +58 +45 +196 +60 +46 +195 +59 +45 +192 +59 +44 +190 +58 +45 +190 +60 +46 +195 +65 +51 +199 +72 +57 +199 +73 +59 +194 +68 +54 +190 +64 +50 +188 +62 +48 +201 +70 +60 +202 +69 +60 +206 +73 +66 +213 +80 +73 +215 +82 +77 +213 +78 +75 +211 +75 +75 +215 +76 +79 +233 +90 +96 +240 +94 +104 +252 +102 +114 +255 +104 +120 +252 +93 +113 +242 +80 +101 +243 +77 +101 +252 +79 +107 +255 +83 +117 +255 +82 +116 +254 +81 +111 +244 +82 +106 +243 +92 +111 +250 +103 +119 +253 +105 +119 +249 +101 +115 +253 +101 +116 +245 +94 +109 +239 +94 +107 +236 +106 +114 +221 +115 +117 +192 +107 +102 +168 +101 +92 +156 +110 +97 +127 +101 +86 +89 +71 +57 +110 +86 +74 +150 +123 +114 +190 +159 +156 +223 +193 +193 +238 +214 +214 +254 +238 +239 +254 +245 +246 +252 +252 +252 +249 +255 +255 +246 +255 +254 +249 +253 +254 +255 +255 +255 +255 +251 +255 +254 +248 +250 +253 +254 +248 +250 +253 +244 +250 +251 +245 +254 +253 +248 +255 +255 +250 +255 +253 +249 +255 +250 +244 +255 +246 +241 +242 +233 +226 +229 +221 +210 +225 +217 +204 +240 +233 +215 +255 +250 +228 +255 +255 +230 +255 +254 +229 +255 +254 +233 +246 +248 +234 +237 +240 +231 +232 +233 +225 +81 +75 +61 +80 +74 +60 +79 +73 +59 +77 +71 +57 +75 +69 +57 +73 +67 +55 +71 +64 +54 +71 +64 +54 +66 +59 +51 +65 +58 +50 +64 +57 +49 +63 +56 +48 +63 +56 +50 +63 +56 +50 +65 +58 +52 +64 +59 +53 +66 +63 +56 +69 +66 +57 +75 +69 +57 +77 +70 +54 +80 +69 +51 +82 +69 +50 +85 +70 +51 +85 +72 +55 +89 +76 +67 +85 +75 +76 +90 +83 +99 +105 +105 +133 +124 +129 +171 +137 +147 +200 +147 +158 +222 +154 +164 +235 +166 +172 +248 +169 +172 +251 +172 +173 +253 +173 +176 +255 +174 +177 +255 +174 +177 +254 +173 +176 +253 +173 +176 +253 +169 +172 +249 +167 +170 +247 +164 +168 +242 +162 +166 +240 +159 +163 +237 +154 +158 +232 +149 +153 +227 +146 +148 +222 +146 +146 +218 +137 +138 +205 +124 +128 +192 +115 +120 +178 +111 +117 +169 +109 +112 +157 +105 +103 +142 +106 +95 +125 +121 +95 +120 +130 +87 +106 +142 +80 +95 +163 +79 +92 +187 +83 +92 +205 +84 +93 +214 +80 +87 +218 +72 +83 +224 +65 +83 +228 +65 +84 +224 +69 +85 +217 +69 +81 +210 +69 +77 +204 +65 +70 +199 +59 +60 +198 +54 +54 +227 +74 +76 +229 +73 +74 +224 +66 +65 +211 +56 +52 +206 +57 +50 +206 +65 +55 +200 +68 +53 +190 +63 +46 +195 +69 +54 +195 +69 +54 +197 +70 +55 +201 +69 +56 +206 +70 +56 +209 +71 +58 +215 +71 +60 +218 +71 +61 +214 +62 +51 +213 +59 +49 +214 +56 +47 +213 +52 +44 +214 +51 +42 +216 +52 +43 +219 +52 +44 +218 +54 +45 +219 +56 +49 +221 +60 +52 +224 +61 +52 +223 +60 +51 +221 +57 +48 +220 +53 +45 +220 +53 +44 +219 +55 +45 +210 +46 +36 +221 +59 +48 +218 +61 +46 +205 +49 +34 +198 +45 +29 +206 +55 +38 +210 +61 +41 +205 +58 +38 +204 +57 +39 +212 +56 +41 +226 +58 +47 +243 +61 +57 +255 +64 +64 +255 +60 +62 +254 +51 +55 +243 +44 +47 +234 +44 +46 +225 +43 +42 +216 +42 +41 +212 +43 +40 +215 +47 +44 +222 +52 +52 +228 +56 +56 +233 +57 +57 +239 +55 +53 +240 +55 +52 +238 +55 +51 +232 +55 +49 +227 +55 +45 +220 +54 +42 +215 +53 +40 +209 +53 +38 +205 +53 +40 +231 +80 +69 +255 +109 +99 +219 +72 +65 +200 +52 +50 +215 +67 +67 +211 +62 +66 +234 +86 +86 +217 +65 +60 +210 +62 +52 +203 +56 +46 +198 +54 +43 +198 +58 +45 +198 +60 +47 +195 +62 +47 +193 +61 +46 +187 +57 +43 +187 +60 +45 +190 +63 +48 +192 +65 +50 +191 +65 +50 +189 +64 +46 +188 +61 +46 +187 +60 +45 +195 +67 +54 +196 +68 +57 +200 +72 +63 +208 +80 +71 +211 +82 +76 +208 +79 +73 +210 +78 +76 +213 +79 +78 +233 +94 +99 +238 +97 +103 +251 +105 +116 +255 +110 +122 +255 +100 +117 +245 +86 +106 +245 +81 +105 +254 +86 +111 +255 +86 +115 +255 +86 +113 +245 +87 +110 +238 +93 +110 +241 +109 +120 +247 +117 +127 +240 +106 +115 +227 +87 +98 +243 +95 +109 +245 +94 +109 +241 +96 +111 +241 +114 +125 +238 +135 +138 +206 +128 +124 +169 +117 +104 +151 +122 +106 +117 +106 +88 +82 +77 +58 +97 +85 +71 +132 +112 +103 +177 +149 +146 +221 +191 +191 +239 +213 +216 +253 +233 +235 +254 +244 +245 +252 +250 +251 +250 +254 +255 +248 +254 +254 +252 +253 +255 +255 +254 +255 +255 +250 +255 +255 +249 +253 +255 +255 +251 +248 +254 +244 +250 +253 +246 +255 +255 +250 +255 +255 +250 +255 +255 +248 +255 +252 +246 +255 +253 +245 +250 +241 +232 +238 +230 +219 +234 +226 +213 +245 +240 +221 +255 +251 +229 +255 +254 +229 +255 +254 +226 +255 +255 +231 +249 +250 +234 +242 +244 +231 +238 +240 +229 +83 +77 +61 +82 +76 +60 +81 +75 +61 +79 +73 +59 +77 +71 +57 +75 +69 +55 +74 +68 +56 +73 +67 +55 +69 +62 +52 +68 +61 +51 +66 +59 +51 +65 +58 +50 +64 +57 +51 +65 +58 +52 +65 +57 +54 +64 +59 +55 +65 +64 +59 +67 +67 +59 +73 +69 +57 +77 +71 +55 +79 +71 +50 +82 +70 +48 +85 +70 +49 +85 +72 +53 +87 +75 +63 +82 +72 +70 +88 +82 +94 +106 +103 +130 +125 +129 +167 +137 +147 +196 +146 +158 +218 +152 +162 +231 +164 +167 +246 +166 +167 +250 +171 +169 +252 +171 +172 +254 +172 +173 +255 +173 +174 +254 +172 +174 +251 +172 +174 +251 +168 +172 +246 +166 +170 +244 +164 +168 +241 +163 +167 +240 +161 +168 +238 +160 +167 +237 +157 +164 +232 +155 +162 +230 +153 +158 +226 +146 +154 +219 +139 +147 +210 +134 +143 +202 +131 +141 +194 +132 +136 +183 +131 +129 +168 +136 +121 +154 +143 +109 +136 +154 +99 +122 +169 +88 +105 +187 +81 +95 +207 +77 +89 +224 +73 +82 +232 +65 +73 +232 +62 +65 +228 +62 +62 +222 +65 +60 +216 +69 +61 +210 +74 +60 +202 +75 +60 +194 +71 +53 +191 +68 +50 +195 +65 +49 +226 +86 +73 +223 +72 +63 +217 +60 +55 +216 +54 +51 +218 +56 +53 +216 +59 +54 +210 +57 +52 +200 +56 +48 +192 +58 +46 +190 +60 +46 +191 +59 +46 +192 +58 +46 +194 +56 +43 +195 +55 +42 +198 +52 +39 +198 +50 +38 +206 +52 +42 +208 +51 +42 +209 +51 +40 +212 +51 +41 +214 +51 +42 +217 +53 +44 +221 +54 +46 +220 +56 +47 +222 +61 +51 +219 +61 +50 +220 +59 +49 +219 +56 +47 +219 +55 +45 +218 +54 +44 +216 +52 +42 +215 +51 +41 +213 +51 +38 +211 +51 +37 +208 +52 +37 +207 +54 +38 +210 +61 +41 +209 +62 +42 +202 +57 +36 +192 +50 +28 +200 +58 +38 +202 +52 +37 +213 +49 +39 +231 +53 +49 +250 +60 +60 +255 +61 +64 +255 +55 +61 +247 +51 +55 +234 +45 +49 +225 +45 +46 +217 +45 +45 +215 +47 +46 +220 +52 +51 +227 +57 +58 +233 +59 +61 +240 +57 +61 +246 +50 +54 +248 +48 +51 +244 +48 +49 +237 +49 +47 +228 +49 +42 +222 +50 +40 +213 +49 +37 +207 +51 +36 +201 +49 +36 +209 +61 +49 +250 +106 +95 +228 +84 +76 +200 +57 +53 +208 +64 +63 +203 +58 +61 +228 +82 +83 +228 +74 +72 +220 +67 +61 +209 +58 +51 +201 +54 +46 +198 +56 +46 +197 +59 +48 +194 +60 +48 +191 +61 +47 +186 +59 +42 +188 +63 +45 +189 +64 +46 +188 +63 +45 +186 +59 +42 +186 +59 +40 +189 +59 +43 +190 +60 +44 +188 +62 +48 +188 +62 +50 +192 +68 +56 +200 +76 +66 +204 +80 +72 +202 +78 +70 +204 +76 +73 +208 +78 +76 +232 +97 +101 +236 +97 +102 +248 +104 +114 +255 +111 +123 +255 +104 +120 +247 +90 +107 +247 +85 +106 +253 +91 +114 +249 +91 +114 +244 +95 +115 +233 +98 +113 +227 +107 +116 +234 +125 +128 +242 +133 +136 +234 +118 +121 +222 +92 +100 +246 +101 +116 +255 +107 +124 +247 +98 +117 +238 +106 +119 +249 +144 +149 +239 +161 +159 +196 +148 +138 +163 +140 +124 +106 +105 +85 +73 +81 +60 +88 +85 +70 +117 +103 +92 +165 +140 +136 +220 +190 +190 +242 +213 +217 +249 +227 +230 +255 +242 +245 +255 +249 +251 +252 +253 +255 +249 +253 +255 +252 +253 +255 +255 +253 +255 +255 +251 +255 +255 +248 +253 +254 +255 +251 +247 +253 +243 +247 +253 +243 +253 +255 +247 +255 +255 +248 +255 +253 +246 +255 +251 +245 +255 +255 +246 +255 +250 +240 +246 +240 +226 +242 +236 +220 +251 +246 +226 +255 +252 +230 +254 +252 +227 +254 +253 +225 +255 +255 +230 +253 +254 +236 +248 +249 +235 +246 +246 +234 +86 +79 +63 +84 +78 +62 +83 +75 +62 +80 +74 +60 +79 +71 +58 +76 +70 +56 +76 +68 +55 +74 +68 +56 +72 +64 +53 +70 +64 +52 +69 +60 +51 +66 +59 +49 +66 +57 +50 +65 +58 +50 +67 +58 +51 +65 +60 +54 +67 +64 +57 +68 +68 +58 +74 +70 +58 +77 +71 +55 +79 +71 +50 +81 +70 +48 +84 +72 +50 +85 +72 +53 +85 +73 +61 +81 +71 +69 +87 +81 +93 +106 +104 +128 +126 +130 +168 +140 +148 +197 +147 +157 +216 +153 +162 +231 +159 +160 +242 +164 +160 +247 +166 +163 +250 +169 +166 +253 +169 +169 +255 +169 +171 +254 +169 +172 +253 +169 +172 +251 +165 +171 +245 +163 +170 +242 +163 +167 +238 +162 +167 +235 +164 +169 +237 +165 +170 +238 +165 +168 +237 +163 +167 +238 +152 +161 +230 +150 +161 +227 +148 +159 +221 +148 +159 +213 +149 +155 +203 +152 +150 +190 +158 +141 +175 +168 +132 +160 +164 +102 +127 +178 +93 +114 +193 +82 +99 +206 +74 +88 +218 +66 +78 +228 +62 +72 +235 +60 +67 +235 +61 +62 +231 +64 +58 +223 +67 +55 +216 +70 +55 +209 +74 +55 +199 +74 +52 +191 +71 +47 +189 +67 +44 +193 +64 +45 +225 +83 +69 +221 +68 +60 +221 +57 +55 +230 +62 +61 +236 +68 +67 +230 +64 +64 +219 +56 +57 +207 +53 +51 +205 +67 +57 +200 +68 +56 +201 +67 +56 +199 +65 +53 +198 +62 +50 +195 +57 +44 +194 +54 +41 +194 +50 +39 +198 +50 +40 +203 +51 +40 +206 +52 +42 +211 +53 +44 +216 +53 +46 +217 +52 +46 +219 +52 +46 +219 +52 +44 +228 +66 +55 +222 +60 +49 +218 +54 +44 +218 +54 +44 +223 +57 +45 +223 +57 +45 +219 +53 +41 +213 +49 +37 +216 +56 +40 +206 +49 +32 +202 +49 +33 +208 +57 +40 +206 +56 +39 +199 +52 +34 +202 +55 +37 +212 +67 +48 +200 +55 +38 +206 +56 +42 +215 +54 +44 +222 +53 +46 +230 +51 +47 +238 +53 +51 +246 +58 +57 +251 +63 +62 +255 +76 +75 +250 +72 +70 +242 +66 +66 +236 +62 +61 +234 +60 +61 +231 +55 +58 +229 +50 +54 +230 +44 +49 +244 +43 +49 +248 +41 +47 +244 +44 +46 +239 +47 +46 +232 +49 +43 +224 +52 +42 +217 +53 +41 +211 +55 +40 +198 +48 +33 +192 +46 +31 +244 +100 +89 +235 +93 +83 +207 +64 +58 +212 +68 +67 +203 +59 +59 +223 +77 +77 +234 +82 +81 +224 +72 +69 +211 +59 +54 +201 +54 +47 +198 +56 +46 +198 +57 +47 +195 +59 +45 +190 +58 +43 +190 +60 +44 +193 +64 +45 +192 +65 +46 +187 +60 +41 +183 +56 +37 +184 +57 +38 +189 +60 +41 +190 +63 +46 +181 +55 +41 +179 +55 +43 +184 +62 +49 +193 +71 +58 +197 +75 +64 +197 +73 +65 +200 +73 +66 +203 +74 +69 +229 +97 +95 +230 +94 +96 +241 +100 +106 +254 +110 +119 +254 +107 +117 +243 +93 +105 +240 +88 +101 +246 +94 +109 +248 +97 +116 +241 +100 +116 +229 +104 +112 +223 +110 +114 +233 +127 +127 +249 +141 +139 +247 +131 +132 +239 +110 +115 +253 +112 +121 +255 +120 +134 +245 +97 +113 +223 +88 +102 +246 +136 +145 +255 +180 +180 +211 +173 +162 +164 +153 +135 +96 +104 +80 +69 +81 +57 +82 +84 +63 +107 +97 +85 +156 +136 +129 +220 +192 +191 +244 +215 +217 +246 +224 +227 +255 +241 +244 +255 +248 +251 +253 +253 +255 +251 +252 +255 +252 +253 +255 +255 +253 +255 +255 +252 +255 +254 +249 +253 +250 +255 +249 +242 +254 +240 +242 +252 +241 +249 +255 +244 +253 +255 +247 +250 +252 +241 +254 +251 +242 +255 +255 +244 +255 +255 +243 +252 +246 +232 +248 +242 +226 +254 +249 +229 +255 +253 +231 +253 +251 +226 +253 +252 +224 +255 +255 +233 +255 +255 +241 +252 +252 +240 +251 +251 +239 +88 +79 +64 +87 +80 +64 +87 +78 +63 +85 +78 +62 +84 +75 +60 +82 +75 +59 +82 +73 +58 +80 +72 +59 +77 +67 +55 +75 +67 +54 +75 +65 +53 +72 +64 +51 +72 +62 +50 +71 +63 +50 +72 +62 +50 +70 +64 +52 +71 +67 +58 +71 +69 +57 +74 +71 +56 +78 +73 +54 +82 +74 +53 +85 +74 +52 +85 +74 +52 +86 +75 +57 +88 +78 +68 +85 +76 +77 +90 +84 +98 +107 +104 +131 +123 +126 +167 +137 +143 +195 +145 +153 +215 +152 +159 +231 +166 +162 +246 +167 +161 +249 +165 +160 +252 +164 +161 +252 +162 +163 +255 +163 +167 +255 +164 +170 +255 +164 +173 +252 +161 +170 +245 +161 +169 +241 +161 +168 +236 +164 +169 +237 +167 +170 +239 +172 +170 +243 +174 +170 +246 +171 +170 +246 +161 +168 +246 +156 +166 +238 +149 +160 +222 +152 +159 +211 +166 +164 +203 +180 +160 +188 +180 +135 +155 +179 +105 +120 +186 +78 +93 +205 +70 +84 +219 +65 +77 +227 +61 +73 +228 +61 +71 +227 +62 +69 +223 +64 +69 +223 +64 +68 +226 +61 +65 +221 +61 +61 +219 +70 +66 +200 +59 +52 +202 +68 +59 +202 +69 +60 +186 +49 +41 +219 +74 +69 +230 +75 +73 +233 +67 +69 +235 +62 +66 +232 +59 +63 +230 +60 +63 +225 +61 +62 +219 +59 +59 +212 +60 +57 +207 +66 +59 +200 +63 +55 +202 +68 +59 +209 +77 +65 +205 +75 +62 +191 +61 +48 +184 +54 +41 +189 +57 +44 +191 +55 +43 +195 +54 +44 +200 +53 +45 +203 +50 +42 +209 +47 +42 +212 +47 +43 +219 +50 +47 +224 +53 +46 +231 +65 +53 +224 +56 +43 +219 +49 +36 +222 +50 +38 +230 +57 +43 +231 +59 +45 +225 +55 +38 +215 +50 +31 +209 +50 +31 +206 +51 +31 +203 +52 +33 +201 +51 +34 +201 +51 +34 +203 +51 +37 +206 +53 +39 +207 +53 +41 +202 +48 +38 +207 +50 +41 +209 +53 +41 +210 +54 +42 +210 +52 +40 +213 +51 +38 +215 +51 +39 +220 +52 +41 +224 +50 +41 +230 +51 +46 +235 +53 +50 +235 +51 +51 +233 +47 +50 +231 +45 +50 +232 +45 +52 +237 +46 +53 +246 +45 +51 +246 +43 +47 +239 +43 +44 +236 +47 +45 +234 +53 +46 +227 +57 +44 +217 +55 +40 +208 +52 +37 +195 +45 +28 +196 +51 +34 +231 +88 +72 +233 +89 +78 +203 +59 +51 +223 +78 +73 +197 +52 +49 +218 +72 +72 +225 +79 +80 +220 +74 +74 +212 +67 +64 +204 +59 +54 +200 +56 +48 +198 +56 +44 +199 +57 +43 +200 +60 +43 +197 +60 +42 +194 +59 +40 +190 +57 +38 +188 +59 +40 +187 +60 +41 +186 +61 +41 +186 +61 +43 +183 +60 +44 +180 +56 +44 +181 +59 +48 +185 +61 +49 +187 +63 +51 +187 +63 +51 +190 +64 +52 +192 +64 +53 +196 +65 +55 +239 +106 +97 +245 +112 +105 +234 +99 +95 +244 +109 +106 +251 +113 +113 +236 +97 +100 +244 +103 +109 +255 +112 +121 +255 +107 +122 +251 +104 +120 +234 +103 +111 +226 +101 +105 +229 +103 +106 +237 +109 +110 +243 +110 +111 +245 +109 +111 +255 +119 +123 +255 +126 +133 +241 +95 +108 +241 +105 +119 +214 +103 +112 +248 +174 +175 +189 +167 +154 +133 +141 +117 +97 +112 +81 +74 +89 +58 +77 +81 +56 +115 +110 +90 +165 +149 +136 +205 +182 +176 +237 +213 +211 +255 +238 +240 +255 +244 +245 +255 +245 +249 +252 +247 +251 +251 +251 +253 +253 +254 +255 +254 +255 +255 +255 +254 +255 +251 +255 +254 +239 +255 +243 +229 +252 +232 +231 +249 +233 +240 +254 +237 +248 +255 +245 +252 +255 +244 +253 +255 +242 +255 +253 +240 +255 +253 +241 +255 +251 +238 +255 +250 +234 +255 +250 +230 +254 +249 +227 +252 +250 +225 +252 +250 +225 +251 +250 +229 +253 +253 +241 +255 +255 +250 +255 +255 +250 +89 +80 +65 +88 +79 +64 +88 +79 +64 +86 +77 +62 +85 +76 +61 +84 +75 +60 +83 +74 +59 +82 +73 +58 +78 +69 +54 +77 +68 +53 +76 +67 +52 +75 +66 +51 +74 +65 +50 +74 +65 +50 +74 +65 +50 +73 +65 +52 +71 +67 +56 +72 +68 +57 +76 +70 +56 +79 +72 +54 +82 +74 +53 +83 +75 +52 +86 +75 +55 +84 +75 +58 +88 +78 +69 +85 +76 +77 +89 +85 +99 +107 +104 +131 +123 +125 +166 +134 +140 +192 +141 +149 +211 +150 +154 +225 +161 +156 +236 +163 +155 +241 +161 +157 +244 +161 +158 +249 +160 +161 +253 +160 +165 +255 +162 +170 +255 +161 +172 +251 +160 +172 +244 +160 +171 +237 +158 +167 +232 +161 +166 +232 +164 +164 +234 +166 +164 +237 +166 +162 +238 +163 +160 +237 +163 +166 +243 +160 +164 +235 +160 +160 +220 +165 +155 +205 +177 +153 +189 +188 +143 +166 +189 +115 +130 +191 +87 +98 +204 +70 +77 +220 +63 +70 +230 +59 +67 +233 +58 +65 +230 +59 +67 +225 +62 +67 +219 +64 +68 +218 +65 +70 +224 +60 +67 +218 +57 +63 +218 +65 +68 +203 +59 +59 +204 +66 +63 +202 +64 +61 +193 +51 +49 +229 +79 +80 +230 +67 +70 +232 +63 +68 +234 +59 +66 +231 +56 +63 +226 +56 +59 +219 +56 +57 +213 +58 +56 +207 +59 +55 +212 +69 +63 +198 +61 +53 +197 +60 +52 +204 +71 +62 +204 +76 +65 +193 +67 +53 +184 +58 +44 +183 +57 +43 +185 +55 +42 +191 +55 +43 +198 +54 +45 +203 +52 +45 +209 +50 +46 +216 +51 +47 +225 +53 +51 +228 +56 +52 +229 +61 +50 +226 +58 +45 +225 +53 +41 +225 +52 +38 +228 +52 +39 +226 +53 +39 +221 +51 +34 +213 +50 +31 +211 +56 +36 +205 +56 +34 +201 +56 +37 +200 +58 +38 +204 +58 +43 +206 +58 +44 +207 +55 +44 +208 +51 +42 +213 +51 +46 +214 +53 +45 +211 +55 +43 +207 +55 +41 +201 +54 +38 +199 +52 +34 +203 +52 +33 +207 +52 +34 +216 +50 +36 +222 +50 +38 +227 +48 +43 +230 +46 +44 +230 +44 +45 +230 +44 +47 +230 +45 +50 +232 +46 +51 +236 +43 +46 +237 +44 +45 +236 +48 +46 +232 +50 +46 +224 +52 +42 +219 +53 +39 +213 +56 +39 +210 +57 +39 +213 +63 +46 +187 +42 +25 +214 +68 +53 +208 +62 +49 +217 +70 +62 +235 +86 +80 +218 +66 +63 +216 +66 +65 +231 +85 +86 +226 +82 +82 +220 +75 +72 +212 +67 +62 +205 +61 +53 +201 +57 +46 +200 +57 +43 +199 +56 +40 +200 +59 +42 +196 +59 +40 +191 +58 +39 +189 +60 +41 +189 +62 +43 +186 +63 +45 +185 +64 +47 +182 +62 +46 +178 +58 +44 +180 +59 +48 +183 +61 +48 +184 +62 +49 +186 +63 +48 +189 +63 +49 +193 +66 +51 +197 +67 +53 +235 +105 +92 +242 +109 +100 +231 +98 +91 +240 +107 +102 +245 +111 +108 +232 +98 +97 +241 +107 +108 +254 +115 +120 +255 +111 +126 +255 +110 +124 +242 +107 +114 +228 +97 +102 +228 +92 +96 +239 +99 +102 +253 +110 +112 +255 +119 +120 +253 +117 +119 +255 +121 +126 +235 +89 +100 +237 +99 +112 +215 +99 +110 +242 +168 +169 +178 +162 +147 +118 +134 +107 +94 +114 +79 +78 +95 +59 +83 +90 +59 +117 +115 +92 +169 +157 +141 +214 +196 +184 +246 +225 +220 +255 +245 +241 +255 +248 +248 +255 +248 +249 +253 +249 +250 +251 +251 +251 +250 +254 +253 +251 +255 +254 +250 +254 +255 +246 +255 +250 +237 +255 +242 +227 +255 +232 +227 +251 +229 +235 +254 +234 +244 +255 +240 +249 +255 +241 +252 +255 +241 +255 +255 +240 +255 +253 +239 +255 +253 +237 +255 +251 +233 +254 +247 +229 +249 +244 +224 +248 +243 +221 +250 +245 +223 +250 +247 +228 +249 +249 +239 +251 +252 +246 +254 +253 +249 +92 +80 +66 +91 +79 +65 +91 +79 +65 +89 +77 +63 +88 +76 +62 +87 +75 +61 +86 +74 +60 +86 +74 +60 +83 +71 +57 +82 +70 +56 +81 +69 +55 +79 +67 +53 +79 +67 +53 +79 +67 +53 +79 +67 +53 +77 +67 +55 +74 +67 +57 +74 +70 +59 +77 +71 +57 +80 +73 +55 +83 +75 +54 +86 +75 +53 +86 +75 +55 +84 +75 +58 +87 +77 +67 +86 +77 +78 +90 +87 +98 +107 +105 +129 +121 +123 +161 +133 +137 +185 +139 +145 +203 +146 +150 +214 +153 +152 +222 +155 +151 +227 +155 +152 +233 +155 +156 +238 +157 +159 +244 +158 +163 +247 +160 +167 +248 +160 +169 +244 +160 +170 +239 +157 +168 +232 +155 +165 +227 +156 +162 +224 +156 +160 +224 +157 +158 +225 +156 +154 +227 +155 +153 +226 +153 +154 +221 +158 +152 +214 +168 +147 +204 +178 +140 +189 +191 +131 +169 +198 +115 +145 +197 +91 +111 +194 +70 +81 +209 +68 +76 +218 +65 +68 +223 +63 +65 +225 +62 +63 +225 +62 +65 +225 +62 +67 +223 +62 +68 +223 +62 +70 +224 +60 +67 +215 +56 +61 +213 +63 +65 +207 +65 +64 +202 +67 +63 +195 +60 +56 +196 +57 +54 +233 +87 +87 +224 +66 +67 +228 +62 +66 +232 +59 +63 +227 +57 +60 +220 +54 +56 +214 +54 +54 +209 +57 +54 +204 +59 +54 +213 +72 +65 +196 +59 +49 +190 +53 +43 +197 +65 +53 +205 +75 +62 +198 +72 +58 +187 +61 +47 +183 +56 +41 +186 +54 +41 +191 +55 +41 +199 +55 +44 +207 +54 +46 +215 +53 +48 +222 +55 +49 +230 +57 +53 +233 +61 +57 +217 +50 +42 +218 +51 +42 +221 +53 +42 +223 +52 +42 +223 +52 +42 +222 +54 +41 +220 +57 +42 +217 +62 +44 +198 +51 +33 +192 +51 +31 +187 +52 +33 +186 +53 +34 +191 +55 +41 +191 +55 +41 +191 +50 +40 +193 +44 +37 +227 +64 +59 +229 +62 +56 +222 +61 +51 +213 +60 +46 +204 +57 +41 +200 +55 +36 +200 +55 +34 +204 +55 +35 +210 +55 +37 +213 +51 +36 +215 +47 +38 +217 +46 +39 +219 +46 +42 +220 +46 +45 +219 +47 +47 +220 +46 +47 +219 +44 +41 +223 +48 +43 +224 +53 +45 +220 +53 +44 +213 +51 +38 +208 +52 +37 +208 +57 +38 +209 +62 +42 +212 +65 +47 +194 +49 +32 +231 +83 +69 +210 +59 +48 +218 +65 +59 +222 +67 +63 +232 +74 +73 +240 +84 +85 +237 +85 +84 +231 +83 +81 +227 +79 +77 +221 +74 +67 +214 +67 +59 +207 +60 +50 +202 +56 +43 +197 +54 +38 +196 +55 +38 +192 +55 +37 +188 +55 +38 +185 +58 +39 +185 +60 +42 +183 +62 +45 +181 +61 +44 +178 +61 +44 +176 +58 +44 +177 +59 +47 +180 +60 +46 +181 +61 +47 +183 +61 +46 +185 +63 +48 +190 +67 +52 +195 +69 +55 +220 +92 +81 +234 +103 +93 +228 +97 +89 +240 +108 +103 +246 +112 +109 +231 +97 +96 +236 +102 +103 +245 +106 +113 +228 +80 +94 +240 +94 +107 +240 +106 +113 +235 +104 +109 +235 +99 +103 +242 +102 +105 +254 +111 +113 +255 +117 +119 +253 +114 +117 +252 +111 +117 +231 +81 +93 +232 +90 +104 +217 +97 +109 +237 +158 +161 +170 +152 +138 +108 +122 +96 +89 +109 +72 +79 +100 +61 +87 +96 +65 +119 +119 +93 +173 +165 +146 +225 +209 +194 +255 +238 +230 +255 +248 +241 +255 +251 +247 +255 +252 +248 +252 +253 +248 +250 +255 +251 +251 +255 +253 +251 +255 +253 +249 +255 +251 +244 +255 +246 +233 +255 +237 +222 +252 +226 +220 +246 +221 +225 +247 +224 +233 +251 +229 +239 +251 +231 +245 +252 +234 +252 +255 +236 +253 +250 +233 +255 +250 +234 +255 +248 +230 +249 +242 +224 +241 +234 +216 +239 +232 +213 +243 +236 +217 +247 +242 +223 +251 +248 +239 +252 +252 +244 +255 +254 +249 +92 +80 +66 +92 +80 +66 +91 +79 +65 +90 +78 +64 +89 +77 +63 +89 +77 +63 +88 +76 +62 +88 +76 +62 +85 +73 +59 +84 +72 +58 +83 +71 +57 +82 +70 +56 +82 +70 +56 +82 +70 +56 +82 +70 +56 +80 +70 +58 +76 +69 +59 +75 +71 +60 +79 +73 +59 +82 +75 +57 +84 +76 +55 +87 +76 +54 +87 +76 +56 +87 +75 +59 +86 +76 +66 +85 +77 +75 +92 +86 +96 +106 +104 +126 +121 +121 +155 +130 +133 +178 +138 +141 +194 +143 +148 +206 +148 +148 +210 +149 +148 +214 +149 +149 +219 +150 +152 +227 +152 +155 +232 +152 +158 +236 +155 +161 +237 +155 +163 +235 +156 +165 +232 +152 +162 +223 +150 +159 +218 +149 +155 +213 +147 +153 +213 +147 +151 +214 +146 +147 +214 +145 +144 +210 +136 +131 +189 +148 +130 +182 +168 +124 +175 +184 +115 +162 +199 +102 +143 +207 +88 +120 +210 +72 +97 +208 +62 +75 +217 +68 +74 +218 +68 +67 +218 +69 +65 +220 +68 +65 +222 +66 +67 +225 +64 +69 +229 +62 +70 +229 +62 +70 +227 +63 +70 +214 +58 +62 +209 +63 +64 +209 +69 +68 +198 +65 +60 +186 +54 +49 +197 +62 +58 +234 +90 +89 +221 +65 +66 +227 +64 +67 +230 +61 +64 +227 +58 +61 +219 +56 +57 +211 +57 +55 +208 +60 +56 +206 +65 +56 +207 +69 +59 +194 +58 +46 +187 +50 +40 +192 +60 +47 +199 +69 +55 +196 +69 +54 +189 +62 +47 +184 +57 +40 +189 +56 +41 +194 +57 +41 +203 +56 +46 +210 +58 +47 +217 +56 +48 +224 +57 +49 +232 +59 +55 +235 +62 +56 +217 +48 +43 +218 +49 +42 +222 +51 +44 +224 +51 +44 +225 +52 +45 +225 +54 +46 +220 +56 +46 +217 +59 +47 +202 +54 +40 +199 +58 +41 +195 +59 +43 +192 +59 +44 +192 +58 +46 +195 +58 +48 +198 +59 +54 +208 +56 +53 +236 +67 +64 +237 +64 +60 +228 +64 +55 +217 +61 +49 +207 +57 +42 +199 +57 +37 +200 +58 +38 +201 +59 +37 +207 +60 +40 +208 +55 +39 +207 +49 +37 +209 +49 +37 +212 +49 +40 +214 +51 +44 +212 +49 +44 +209 +47 +42 +211 +50 +42 +211 +53 +44 +211 +55 +43 +208 +55 +41 +205 +53 +39 +202 +55 +37 +204 +59 +40 +204 +62 +42 +204 +59 +40 +207 +60 +44 +244 +94 +80 +224 +70 +60 +210 +51 +47 +210 +46 +44 +230 +64 +64 +251 +87 +88 +255 +117 +115 +255 +114 +111 +255 +106 +103 +246 +94 +89 +231 +80 +71 +213 +65 +55 +199 +53 +40 +189 +46 +32 +196 +56 +39 +192 +56 +40 +187 +56 +38 +184 +59 +41 +183 +60 +44 +181 +61 +45 +178 +61 +44 +176 +60 +45 +175 +59 +46 +173 +60 +46 +176 +60 +47 +176 +60 +45 +177 +59 +45 +182 +62 +46 +188 +66 +51 +192 +70 +55 +203 +77 +65 +223 +96 +87 +226 +97 +91 +244 +112 +108 +248 +116 +114 +230 +96 +97 +228 +93 +97 +232 +93 +100 +218 +70 +84 +234 +88 +101 +239 +105 +114 +236 +107 +111 +240 +104 +108 +249 +109 +112 +255 +113 +118 +255 +115 +118 +254 +111 +115 +248 +103 +110 +229 +74 +88 +229 +82 +98 +218 +93 +107 +230 +148 +150 +168 +145 +131 +106 +116 +89 +85 +106 +67 +83 +104 +63 +92 +103 +69 +121 +124 +95 +176 +170 +148 +231 +220 +202 +255 +245 +232 +255 +249 +240 +255 +249 +239 +252 +252 +242 +251 +254 +245 +250 +255 +249 +249 +255 +250 +246 +255 +248 +242 +252 +243 +234 +251 +235 +219 +247 +222 +208 +241 +210 +205 +234 +204 +209 +235 +206 +217 +237 +210 +223 +239 +213 +233 +243 +219 +242 +247 +225 +244 +246 +225 +249 +246 +227 +251 +246 +227 +244 +237 +219 +234 +227 +209 +231 +222 +205 +235 +226 +209 +240 +233 +217 +251 +244 +234 +251 +246 +240 +254 +249 +243 +92 +80 +66 +92 +80 +66 +91 +79 +65 +91 +79 +65 +90 +78 +64 +89 +77 +63 +89 +77 +63 +89 +77 +63 +87 +75 +61 +86 +74 +60 +85 +73 +59 +85 +73 +59 +84 +72 +58 +85 +73 +59 +85 +73 +59 +83 +73 +61 +79 +71 +60 +79 +73 +61 +81 +73 +60 +83 +76 +58 +85 +77 +56 +88 +77 +55 +89 +76 +57 +88 +76 +60 +85 +75 +65 +85 +75 +73 +92 +85 +93 +104 +101 +120 +117 +116 +147 +124 +126 +165 +133 +135 +183 +140 +143 +194 +141 +144 +195 +142 +145 +200 +142 +146 +207 +144 +148 +212 +146 +149 +220 +147 +151 +224 +148 +152 +223 +147 +154 +222 +149 +157 +220 +146 +155 +214 +142 +148 +206 +137 +144 +199 +133 +139 +197 +129 +135 +195 +126 +130 +193 +129 +125 +184 +128 +115 +159 +145 +110 +150 +170 +102 +143 +193 +92 +134 +214 +78 +118 +225 +65 +101 +229 +59 +85 +230 +59 +75 +226 +67 +71 +220 +71 +67 +216 +73 +65 +216 +73 +65 +220 +71 +67 +227 +66 +71 +236 +62 +72 +237 +61 +72 +230 +66 +73 +215 +62 +64 +208 +64 +63 +208 +73 +69 +191 +62 +56 +179 +50 +44 +200 +67 +60 +224 +85 +80 +220 +68 +67 +225 +65 +67 +227 +63 +64 +225 +62 +63 +218 +63 +61 +212 +64 +60 +209 +68 +59 +207 +70 +60 +199 +61 +50 +192 +56 +42 +189 +53 +41 +189 +57 +42 +191 +61 +45 +191 +61 +45 +189 +59 +43 +189 +60 +41 +194 +58 +42 +199 +59 +42 +207 +59 +47 +213 +59 +47 +219 +56 +47 +224 +56 +47 +231 +56 +51 +235 +57 +53 +231 +56 +53 +230 +52 +50 +229 +49 +48 +232 +50 +49 +233 +51 +50 +231 +52 +48 +222 +49 +43 +214 +47 +39 +205 +48 +39 +205 +54 +45 +201 +57 +48 +197 +54 +46 +194 +51 +45 +196 +51 +48 +206 +57 +59 +222 +62 +64 +235 +56 +59 +237 +55 +54 +228 +55 +49 +216 +53 +44 +204 +52 +38 +198 +53 +34 +196 +55 +35 +197 +58 +37 +203 +61 +41 +203 +56 +38 +204 +52 +38 +206 +53 +39 +212 +56 +44 +212 +58 +48 +211 +57 +47 +208 +56 +45 +208 +62 +49 +202 +59 +45 +197 +56 +39 +196 +55 +37 +198 +57 +39 +199 +60 +41 +199 +60 +41 +199 +58 +40 +205 +62 +45 +205 +58 +42 +216 +62 +50 +225 +67 +58 +212 +47 +45 +228 +58 +58 +224 +50 +52 +223 +53 +54 +215 +53 +51 +214 +59 +54 +222 +67 +62 +229 +75 +67 +234 +81 +73 +234 +83 +72 +232 +84 +72 +228 +85 +71 +203 +63 +48 +196 +63 +46 +190 +60 +44 +184 +61 +45 +183 +62 +45 +180 +63 +46 +176 +63 +47 +174 +62 +48 +172 +60 +46 +172 +60 +46 +172 +60 +46 +172 +61 +44 +173 +60 +44 +177 +61 +46 +183 +65 +51 +186 +68 +54 +198 +76 +65 +222 +98 +88 +226 +99 +93 +240 +110 +108 +244 +114 +114 +229 +96 +99 +229 +96 +101 +232 +95 +103 +251 +105 +118 +254 +109 +122 +241 +110 +118 +229 +100 +104 +234 +98 +102 +252 +109 +113 +255 +117 +123 +255 +118 +124 +254 +107 +115 +245 +95 +106 +232 +71 +87 +228 +75 +93 +221 +90 +104 +226 +137 +141 +172 +142 +131 +115 +121 +93 +93 +114 +73 +94 +117 +73 +104 +119 +80 +129 +136 +102 +179 +178 +150 +232 +226 +204 +255 +250 +233 +255 +253 +237 +254 +252 +237 +251 +255 +240 +249 +255 +242 +247 +255 +243 +244 +255 +241 +237 +251 +234 +227 +241 +224 +218 +237 +215 +201 +232 +200 +191 +227 +189 +187 +221 +186 +192 +222 +188 +200 +224 +192 +207 +226 +196 +217 +230 +204 +227 +235 +211 +235 +239 +216 +243 +242 +222 +247 +242 +223 +242 +235 +217 +234 +225 +210 +231 +219 +205 +233 +221 +207 +238 +226 +214 +241 +231 +222 +240 +231 +224 +242 +233 +226 +91 +79 +65 +91 +79 +65 +91 +79 +65 +90 +78 +64 +90 +78 +64 +89 +77 +63 +89 +77 +63 +89 +77 +63 +88 +76 +62 +88 +76 +62 +87 +75 +61 +86 +74 +60 +86 +74 +60 +87 +75 +61 +87 +75 +61 +88 +76 +62 +81 +73 +62 +81 +73 +62 +83 +75 +62 +85 +76 +59 +88 +77 +57 +88 +77 +55 +89 +76 +57 +88 +77 +59 +87 +75 +63 +85 +76 +71 +89 +83 +87 +101 +94 +110 +110 +106 +131 +117 +116 +150 +126 +125 +165 +131 +134 +177 +133 +138 +180 +132 +139 +185 +135 +141 +193 +137 +142 +200 +139 +143 +207 +140 +143 +212 +141 +144 +213 +141 +144 +211 +144 +148 +211 +139 +144 +202 +131 +136 +192 +126 +129 +184 +120 +123 +178 +114 +116 +173 +108 +110 +171 +111 +104 +156 +131 +105 +140 +148 +98 +123 +175 +88 +120 +203 +79 +113 +227 +65 +102 +239 +56 +87 +243 +53 +78 +244 +58 +72 +235 +66 +69 +225 +72 +66 +217 +76 +66 +215 +77 +66 +222 +73 +69 +229 +69 +71 +240 +63 +73 +240 +62 +74 +228 +67 +72 +215 +67 +67 +204 +65 +62 +206 +73 +68 +186 +59 +52 +176 +52 +44 +201 +73 +64 +213 +76 +70 +216 +66 +65 +218 +63 +61 +219 +59 +59 +218 +60 +59 +216 +64 +61 +212 +69 +63 +205 +71 +60 +203 +71 +58 +192 +56 +42 +193 +56 +40 +192 +56 +42 +190 +57 +40 +188 +57 +39 +187 +56 +38 +189 +58 +40 +192 +59 +40 +196 +59 +41 +202 +61 +44 +210 +60 +46 +215 +59 +46 +220 +56 +46 +225 +54 +46 +228 +54 +47 +232 +53 +48 +234 +50 +50 +234 +46 +47 +234 +43 +48 +240 +47 +50 +246 +51 +55 +247 +54 +55 +240 +52 +53 +230 +50 +49 +219 +46 +42 +216 +51 +47 +215 +53 +50 +210 +50 +50 +209 +46 +49 +211 +46 +52 +220 +53 +61 +235 +58 +68 +237 +48 +54 +238 +48 +50 +230 +51 +47 +220 +51 +44 +209 +53 +41 +202 +55 +39 +200 +57 +40 +201 +60 +40 +198 +56 +36 +201 +54 +36 +206 +54 +40 +211 +58 +44 +218 +62 +50 +221 +65 +53 +221 +65 +53 +216 +65 +54 +211 +71 +56 +201 +65 +49 +194 +59 +40 +192 +57 +38 +195 +60 +41 +198 +61 +42 +197 +60 +42 +197 +56 +38 +204 +58 +43 +205 +55 +41 +205 +48 +39 +230 +67 +60 +219 +50 +47 +239 +63 +65 +227 +47 +50 +218 +42 +44 +213 +49 +47 +210 +53 +46 +213 +56 +49 +214 +57 +48 +210 +56 +46 +204 +53 +42 +198 +50 +38 +192 +49 +35 +206 +69 +53 +198 +65 +50 +188 +61 +46 +181 +58 +42 +177 +57 +41 +175 +57 +43 +171 +58 +44 +170 +58 +44 +171 +59 +47 +171 +61 +48 +172 +62 +47 +172 +60 +46 +171 +60 +43 +173 +60 +44 +178 +62 +47 +181 +65 +50 +201 +83 +71 +224 +103 +94 +224 +99 +95 +234 +106 +105 +238 +110 +111 +230 +99 +104 +240 +106 +113 +246 +110 +120 +255 +110 +123 +255 +114 +126 +241 +112 +117 +231 +102 +107 +240 +103 +110 +255 +116 +122 +255 +117 +126 +255 +110 +117 +253 +103 +112 +244 +90 +102 +237 +72 +89 +229 +72 +91 +222 +87 +102 +220 +128 +131 +180 +146 +134 +133 +136 +107 +113 +134 +93 +111 +137 +90 +121 +138 +96 +141 +151 +114 +182 +183 +152 +223 +222 +194 +249 +244 +222 +252 +250 +229 +255 +255 +239 +250 +255 +238 +244 +255 +238 +238 +255 +234 +230 +249 +227 +220 +239 +217 +208 +227 +205 +197 +222 +193 +178 +213 +173 +172 +211 +167 +172 +209 +168 +178 +210 +171 +185 +213 +175 +190 +214 +178 +201 +218 +186 +210 +223 +193 +224 +230 +204 +232 +234 +212 +240 +237 +218 +241 +234 +216 +236 +227 +212 +233 +221 +209 +232 +218 +207 +234 +220 +211 +232 +219 +211 +230 +217 +211 +229 +216 +210 +91 +78 +62 +91 +78 +62 +91 +78 +62 +91 +78 +62 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +89 +76 +60 +89 +76 +60 +88 +75 +59 +88 +75 +59 +88 +75 +59 +89 +76 +60 +89 +76 +60 +89 +77 +63 +83 +73 +63 +84 +74 +62 +85 +76 +61 +88 +76 +60 +89 +78 +58 +90 +77 +58 +90 +77 +58 +89 +78 +60 +89 +77 +63 +85 +76 +69 +88 +79 +82 +95 +87 +98 +100 +95 +115 +106 +102 +129 +115 +111 +144 +121 +121 +157 +122 +128 +164 +122 +130 +169 +127 +131 +178 +130 +133 +188 +133 +134 +198 +135 +136 +203 +136 +137 +204 +136 +137 +202 +136 +136 +200 +131 +131 +191 +125 +124 +181 +121 +118 +173 +115 +112 +167 +110 +107 +164 +105 +101 +160 +111 +95 +142 +132 +94 +117 +151 +85 +97 +179 +78 +96 +210 +74 +98 +236 +64 +90 +246 +54 +79 +251 +52 +71 +252 +58 +69 +240 +64 +64 +231 +70 +62 +222 +74 +64 +219 +75 +66 +224 +72 +69 +231 +68 +71 +240 +63 +73 +239 +63 +74 +221 +65 +68 +212 +70 +68 +200 +65 +61 +201 +72 +66 +180 +58 +47 +177 +55 +44 +206 +79 +70 +201 +66 +60 +206 +61 +56 +208 +54 +52 +207 +49 +48 +208 +53 +49 +211 +62 +56 +207 +69 +59 +200 +70 +57 +195 +68 +53 +190 +57 +40 +195 +58 +40 +194 +58 +42 +191 +58 +39 +189 +56 +37 +190 +57 +38 +191 +58 +39 +193 +58 +38 +196 +57 +38 +203 +58 +41 +211 +58 +44 +217 +57 +43 +221 +55 +43 +225 +53 +43 +228 +51 +43 +234 +51 +45 +235 +42 +43 +241 +42 +45 +248 +45 +51 +253 +46 +52 +255 +49 +55 +255 +50 +55 +255 +51 +56 +253 +53 +56 +250 +55 +59 +246 +55 +60 +243 +57 +62 +243 +56 +65 +246 +56 +68 +247 +55 +70 +252 +53 +72 +254 +53 +69 +246 +42 +53 +244 +45 +50 +237 +49 +50 +227 +52 +47 +217 +54 +45 +208 +56 +42 +206 +59 +43 +206 +61 +44 +203 +53 +38 +209 +56 +42 +217 +59 +47 +223 +61 +50 +226 +62 +52 +228 +61 +52 +229 +62 +53 +223 +65 +54 +217 +74 +60 +207 +71 +55 +201 +65 +49 +196 +60 +44 +194 +57 +41 +194 +57 +39 +198 +56 +42 +200 +57 +41 +201 +50 +39 +211 +57 +47 +225 +64 +56 +235 +68 +62 +222 +48 +47 +224 +46 +46 +235 +52 +54 +232 +54 +54 +216 +51 +45 +213 +55 +46 +215 +57 +48 +215 +58 +49 +213 +59 +49 +210 +59 +48 +205 +58 +48 +201 +59 +47 +214 +76 +63 +204 +70 +58 +191 +64 +49 +180 +57 +42 +176 +54 +41 +172 +54 +40 +171 +55 +42 +169 +56 +42 +172 +59 +45 +173 +61 +47 +174 +62 +48 +173 +61 +47 +171 +60 +43 +171 +60 +43 +173 +60 +46 +177 +61 +48 +192 +75 +65 +218 +100 +90 +222 +99 +94 +232 +107 +105 +240 +111 +115 +234 +105 +110 +245 +114 +122 +253 +117 +127 +241 +101 +112 +248 +111 +121 +245 +116 +121 +237 +111 +115 +248 +111 +118 +255 +120 +127 +255 +116 +125 +255 +101 +111 +252 +98 +110 +242 +84 +98 +241 +72 +91 +231 +68 +89 +222 +81 +97 +217 +118 +123 +189 +149 +137 +152 +153 +122 +129 +150 +107 +123 +151 +102 +130 +149 +104 +145 +157 +117 +172 +178 +142 +203 +204 +173 +224 +224 +196 +233 +236 +209 +236 +244 +220 +227 +241 +215 +215 +235 +207 +205 +228 +199 +196 +221 +191 +187 +212 +182 +180 +203 +174 +172 +199 +164 +156 +193 +149 +152 +194 +144 +156 +195 +148 +163 +201 +154 +170 +203 +158 +175 +203 +162 +184 +206 +168 +194 +211 +177 +206 +217 +187 +216 +222 +196 +228 +227 +206 +235 +229 +213 +236 +226 +214 +233 +219 +210 +229 +212 +205 +226 +209 +202 +223 +205 +201 +218 +203 +198 +213 +198 +193 +91 +78 +62 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +89 +76 +60 +89 +76 +60 +90 +77 +61 +89 +76 +60 +89 +76 +60 +88 +75 +59 +88 +75 +59 +89 +76 +60 +90 +77 +61 +90 +76 +63 +86 +74 +62 +86 +74 +62 +88 +76 +62 +89 +78 +60 +90 +77 +60 +90 +77 +58 +90 +77 +58 +90 +77 +60 +91 +79 +65 +87 +77 +68 +87 +77 +76 +92 +82 +90 +94 +88 +102 +98 +93 +113 +106 +102 +127 +113 +113 +141 +116 +119 +150 +116 +122 +156 +120 +125 +167 +125 +128 +181 +129 +129 +191 +132 +131 +197 +133 +132 +200 +135 +132 +199 +130 +125 +191 +127 +121 +183 +125 +116 +173 +122 +111 +167 +122 +109 +165 +120 +105 +162 +116 +101 +160 +124 +95 +141 +133 +79 +93 +152 +72 +75 +178 +69 +75 +211 +71 +82 +237 +66 +82 +246 +58 +73 +252 +54 +67 +253 +58 +64 +244 +62 +61 +235 +66 +59 +228 +69 +63 +225 +70 +65 +227 +69 +66 +230 +67 +70 +237 +63 +72 +234 +64 +73 +214 +64 +65 +209 +71 +68 +197 +65 +60 +195 +71 +63 +178 +57 +46 +179 +58 +47 +209 +85 +75 +195 +62 +53 +201 +56 +51 +199 +47 +44 +197 +42 +38 +200 +47 +42 +205 +58 +51 +204 +67 +57 +195 +67 +54 +188 +62 +47 +192 +59 +42 +196 +59 +41 +195 +60 +41 +193 +58 +39 +194 +59 +40 +195 +60 +41 +194 +59 +39 +195 +56 +37 +196 +53 +36 +202 +55 +37 +212 +56 +41 +217 +55 +42 +221 +53 +42 +225 +51 +42 +229 +51 +41 +234 +50 +42 +245 +51 +51 +254 +54 +56 +255 +56 +60 +255 +52 +58 +255 +45 +50 +255 +40 +45 +255 +40 +45 +254 +43 +49 +254 +45 +51 +246 +41 +48 +242 +38 +49 +247 +41 +54 +255 +44 +63 +255 +42 +65 +252 +32 +57 +244 +25 +47 +246 +34 +48 +243 +40 +46 +237 +44 +49 +230 +48 +47 +218 +49 +44 +212 +51 +43 +209 +53 +41 +208 +54 +42 +212 +54 +43 +221 +57 +48 +230 +61 +54 +235 +62 +55 +235 +58 +52 +232 +55 +49 +232 +53 +48 +226 +57 +50 +223 +72 +61 +215 +75 +60 +211 +69 +55 +203 +61 +47 +196 +54 +40 +194 +51 +37 +200 +54 +41 +207 +56 +45 +206 +52 +42 +212 +54 +45 +230 +67 +60 +223 +56 +50 +224 +50 +49 +210 +32 +32 +236 +56 +57 +229 +54 +51 +213 +49 +40 +210 +52 +41 +210 +52 +41 +207 +53 +41 +206 +54 +43 +202 +54 +42 +200 +53 +43 +197 +55 +43 +227 +89 +78 +216 +82 +70 +202 +72 +59 +190 +64 +50 +183 +59 +47 +181 +59 +46 +181 +60 +49 +181 +60 +49 +175 +57 +45 +177 +59 +47 +177 +61 +48 +177 +61 +46 +175 +59 +44 +173 +57 +42 +173 +57 +44 +174 +58 +45 +177 +60 +50 +208 +89 +81 +220 +98 +93 +236 +112 +112 +244 +118 +121 +238 +109 +114 +245 +113 +124 +248 +114 +125 +255 +121 +131 +255 +127 +137 +250 +124 +128 +235 +109 +113 +241 +104 +112 +255 +114 +124 +255 +115 +127 +255 +105 +116 +250 +92 +106 +243 +80 +97 +245 +71 +94 +232 +64 +87 +220 +78 +94 +215 +112 +116 +196 +152 +139 +164 +163 +132 +134 +156 +110 +126 +154 +103 +129 +151 +104 +141 +156 +113 +161 +169 +130 +180 +186 +150 +200 +205 +173 +213 +220 +189 +202 +215 +185 +191 +210 +178 +176 +202 +167 +166 +193 +158 +157 +187 +151 +154 +182 +144 +150 +178 +140 +145 +176 +134 +140 +180 +130 +138 +181 +127 +143 +186 +133 +152 +192 +140 +158 +195 +144 +162 +196 +146 +170 +197 +154 +179 +201 +162 +190 +206 +170 +201 +210 +181 +216 +218 +196 +227 +224 +205 +232 +222 +210 +230 +216 +207 +223 +205 +201 +218 +199 +195 +211 +193 +189 +206 +188 +184 +200 +182 +180 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +88 +75 +59 +88 +75 +59 +88 +75 +59 +89 +76 +60 +89 +76 +60 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +76 +63 +90 +76 +63 +90 +77 +61 +91 +78 +61 +93 +77 +61 +94 +79 +60 +92 +79 +60 +92 +79 +62 +89 +77 +61 +87 +77 +67 +87 +76 +72 +88 +78 +79 +90 +80 +88 +93 +85 +98 +96 +89 +105 +96 +93 +114 +103 +103 +129 +106 +109 +142 +112 +114 +155 +114 +116 +167 +120 +119 +179 +129 +126 +193 +137 +131 +201 +138 +131 +199 +137 +126 +192 +140 +126 +188 +138 +120 +178 +135 +112 +168 +139 +112 +167 +145 +114 +171 +139 +106 +163 +137 +90 +132 +143 +71 +82 +161 +66 +60 +179 +65 +64 +202 +68 +67 +220 +64 +67 +231 +58 +62 +243 +60 +62 +254 +68 +69 +246 +62 +60 +241 +62 +58 +236 +62 +61 +233 +65 +64 +233 +67 +67 +233 +68 +72 +233 +66 +73 +226 +67 +72 +207 +63 +62 +197 +64 +57 +190 +63 +54 +183 +62 +51 +176 +60 +47 +178 +60 +48 +192 +68 +56 +210 +77 +68 +199 +54 +49 +212 +59 +54 +205 +50 +46 +204 +51 +46 +214 +67 +59 +199 +63 +51 +181 +54 +39 +187 +62 +44 +186 +55 +37 +193 +58 +39 +195 +60 +41 +194 +59 +40 +192 +57 +37 +194 +57 +38 +197 +58 +39 +199 +58 +40 +203 +58 +39 +208 +57 +40 +214 +54 +40 +216 +50 +36 +218 +46 +34 +224 +47 +37 +236 +55 +46 +245 +61 +53 +246 +57 +51 +247 +54 +49 +248 +49 +46 +249 +43 +43 +250 +40 +41 +252 +38 +40 +252 +38 +40 +252 +38 +40 +251 +38 +42 +247 +33 +41 +248 +34 +46 +255 +39 +55 +255 +41 +62 +255 +33 +59 +255 +24 +54 +255 +23 +49 +254 +37 +54 +238 +34 +43 +229 +34 +42 +227 +43 +45 +221 +45 +45 +211 +42 +39 +209 +44 +40 +218 +50 +47 +226 +54 +50 +232 +54 +52 +238 +54 +54 +242 +54 +53 +242 +49 +50 +239 +46 +47 +238 +44 +44 +229 +47 +44 +220 +57 +50 +209 +58 +49 +210 +57 +49 +236 +83 +75 +187 +34 +26 +196 +43 +35 +223 +70 +62 +200 +46 +38 +205 +46 +40 +222 +60 +55 +232 +69 +64 +226 +58 +55 +216 +47 +42 +218 +46 +42 +226 +53 +49 +229 +60 +55 +223 +62 +52 +213 +60 +46 +207 +53 +41 +203 +51 +38 +204 +53 +42 +205 +59 +46 +203 +59 +48 +197 +56 +46 +236 +98 +88 +224 +90 +79 +200 +67 +58 +185 +54 +44 +186 +58 +47 +184 +56 +45 +177 +51 +39 +180 +54 +42 +176 +48 +37 +176 +50 +38 +174 +50 +38 +175 +52 +37 +176 +54 +39 +178 +58 +42 +180 +60 +46 +179 +61 +49 +176 +58 +48 +186 +67 +59 +214 +92 +87 +236 +112 +112 +241 +115 +118 +246 +120 +124 +251 +121 +131 +245 +113 +124 +255 +122 +132 +253 +119 +128 +242 +117 +123 +244 +118 +122 +253 +116 +124 +255 +114 +124 +255 +107 +120 +255 +100 +115 +255 +94 +110 +241 +74 +92 +245 +69 +92 +239 +70 +91 +217 +70 +86 +208 +103 +107 +190 +144 +128 +158 +155 +122 +134 +156 +109 +125 +153 +102 +126 +148 +99 +135 +151 +106 +148 +159 +119 +158 +166 +129 +160 +168 +131 +156 +168 +132 +146 +163 +127 +138 +163 +124 +128 +159 +118 +122 +154 +113 +121 +154 +111 +124 +157 +114 +129 +160 +118 +131 +164 +117 +132 +172 +119 +134 +177 +121 +140 +183 +127 +147 +188 +132 +149 +190 +134 +152 +189 +135 +157 +189 +140 +162 +189 +144 +167 +188 +147 +175 +189 +154 +189 +195 +167 +206 +205 +185 +220 +212 +199 +224 +211 +202 +218 +200 +196 +211 +192 +188 +203 +185 +183 +192 +177 +174 +184 +168 +168 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +88 +75 +59 +88 +75 +59 +88 +75 +59 +89 +76 +60 +89 +76 +60 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +76 +63 +90 +77 +61 +92 +76 +61 +93 +77 +61 +93 +78 +59 +94 +79 +60 +92 +79 +60 +92 +79 +62 +93 +80 +64 +91 +79 +67 +91 +78 +70 +89 +78 +74 +90 +80 +81 +92 +83 +88 +95 +85 +94 +94 +88 +102 +97 +93 +116 +101 +100 +131 +107 +105 +145 +110 +108 +157 +117 +113 +172 +127 +122 +188 +135 +128 +196 +139 +128 +196 +143 +128 +193 +145 +125 +186 +143 +116 +171 +143 +108 +162 +154 +111 +164 +165 +115 +168 +158 +103 +158 +154 +86 +125 +156 +61 +69 +166 +55 +46 +175 +54 +46 +192 +61 +53 +208 +65 +59 +218 +63 +58 +231 +64 +58 +243 +65 +61 +245 +61 +61 +245 +59 +60 +244 +60 +62 +241 +62 +65 +236 +66 +69 +231 +66 +70 +225 +66 +70 +216 +66 +67 +199 +60 +55 +189 +61 +52 +182 +60 +49 +177 +59 +47 +171 +58 +44 +174 +58 +43 +189 +65 +53 +208 +74 +65 +218 +71 +64 +220 +65 +61 +212 +54 +51 +208 +53 +49 +213 +64 +57 +205 +67 +56 +187 +57 +43 +178 +53 +35 +189 +56 +39 +194 +59 +40 +196 +61 +42 +196 +61 +42 +196 +59 +40 +198 +59 +40 +199 +58 +40 +202 +57 +40 +207 +57 +40 +207 +54 +38 +212 +50 +37 +218 +50 +37 +227 +53 +42 +234 +56 +46 +239 +56 +48 +240 +57 +49 +231 +50 +39 +231 +49 +38 +235 +47 +38 +240 +45 +39 +246 +44 +40 +250 +45 +42 +254 +46 +44 +255 +46 +47 +251 +42 +45 +248 +37 +43 +250 +36 +46 +255 +39 +55 +255 +37 +59 +255 +29 +55 +255 +20 +51 +252 +19 +48 +244 +29 +47 +245 +45 +56 +244 +50 +59 +228 +41 +48 +218 +39 +43 +219 +45 +47 +221 +47 +49 +218 +42 +45 +241 +58 +62 +244 +55 +61 +247 +52 +58 +246 +50 +54 +246 +47 +52 +248 +48 +51 +249 +50 +53 +244 +56 +55 +219 +50 +45 +218 +59 +53 +215 +56 +50 +228 +69 +63 +228 +69 +63 +206 +47 +43 +209 +50 +46 +193 +34 +30 +212 +53 +49 +225 +63 +58 +232 +69 +64 +224 +61 +56 +216 +51 +45 +217 +50 +44 +221 +54 +48 +221 +58 +49 +212 +58 +46 +207 +57 +42 +201 +53 +39 +199 +53 +40 +200 +57 +43 +202 +60 +48 +202 +60 +50 +198 +57 +47 +237 +99 +89 +225 +88 +78 +201 +64 +56 +186 +52 +43 +194 +57 +49 +195 +58 +48 +191 +54 +44 +194 +57 +47 +191 +53 +43 +190 +52 +42 +189 +52 +42 +187 +53 +41 +184 +54 +41 +181 +53 +40 +180 +54 +40 +176 +54 +41 +180 +59 +48 +187 +66 +57 +211 +89 +84 +232 +108 +106 +239 +113 +116 +246 +120 +124 +254 +124 +132 +249 +117 +128 +255 +122 +132 +253 +119 +128 +244 +119 +125 +245 +118 +125 +254 +117 +125 +255 +111 +123 +255 +104 +118 +255 +97 +113 +255 +93 +110 +242 +75 +93 +246 +68 +92 +242 +70 +92 +221 +73 +89 +208 +102 +104 +183 +138 +119 +149 +146 +111 +127 +147 +98 +117 +146 +92 +120 +142 +93 +127 +144 +99 +138 +149 +107 +141 +152 +112 +139 +149 +112 +133 +148 +109 +112 +135 +93 +108 +137 +93 +104 +137 +92 +103 +141 +94 +107 +143 +95 +113 +149 +101 +121 +155 +105 +124 +158 +107 +132 +171 +116 +133 +177 +118 +139 +183 +124 +142 +186 +125 +146 +187 +127 +148 +187 +130 +151 +188 +134 +155 +187 +137 +155 +181 +134 +161 +179 +139 +172 +183 +151 +188 +190 +168 +205 +199 +183 +213 +200 +191 +212 +195 +188 +206 +188 +186 +197 +181 +181 +186 +172 +172 +177 +163 +163 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +61 +92 +76 +61 +93 +75 +61 +93 +77 +61 +93 +78 +59 +94 +79 +60 +94 +79 +60 +92 +79 +60 +95 +82 +65 +93 +81 +65 +92 +80 +68 +91 +78 +70 +90 +79 +75 +91 +80 +78 +93 +81 +83 +92 +82 +90 +93 +84 +103 +98 +89 +118 +101 +95 +133 +105 +99 +145 +113 +108 +164 +125 +119 +181 +132 +126 +190 +137 +125 +189 +152 +132 +193 +155 +128 +183 +156 +118 +169 +160 +111 +158 +177 +115 +162 +189 +117 +165 +183 +104 +152 +177 +81 +118 +181 +61 +70 +186 +54 +49 +182 +54 +45 +189 +61 +50 +200 +68 +56 +210 +69 +59 +219 +66 +58 +228 +63 +57 +241 +61 +62 +247 +58 +62 +249 +58 +63 +247 +61 +66 +239 +64 +69 +229 +66 +69 +215 +65 +66 +205 +66 +63 +192 +59 +52 +184 +57 +48 +177 +57 +43 +173 +57 +42 +169 +56 +40 +173 +57 +42 +187 +63 +51 +207 +70 +60 +217 +68 +62 +215 +57 +54 +217 +55 +52 +218 +59 +55 +220 +67 +61 +221 +79 +69 +206 +72 +60 +181 +51 +35 +190 +57 +40 +193 +58 +39 +196 +59 +41 +198 +61 +43 +201 +61 +44 +200 +60 +43 +201 +58 +41 +204 +57 +41 +207 +55 +41 +207 +50 +35 +211 +47 +35 +223 +52 +42 +238 +61 +51 +244 +63 +54 +241 +57 +49 +233 +52 +43 +224 +54 +39 +221 +54 +38 +226 +50 +37 +230 +48 +37 +234 +46 +37 +238 +45 +38 +239 +44 +40 +242 +44 +41 +242 +44 +45 +239 +40 +43 +240 +39 +47 +247 +41 +54 +253 +37 +58 +252 +30 +55 +251 +22 +51 +248 +24 +51 +244 +37 +55 +241 +47 +58 +242 +52 +64 +239 +53 +64 +238 +57 +66 +238 +58 +67 +233 +53 +62 +229 +45 +55 +240 +50 +60 +243 +47 +59 +246 +46 +57 +246 +45 +55 +245 +46 +51 +245 +46 +49 +243 +47 +49 +237 +52 +50 +220 +48 +44 +226 +61 +57 +218 +54 +52 +223 +59 +57 +255 +109 +106 +229 +67 +65 +209 +47 +45 +206 +47 +44 +217 +58 +55 +223 +64 +60 +224 +65 +59 +219 +60 +54 +213 +55 +46 +214 +53 +45 +214 +53 +43 +210 +54 +42 +200 +54 +39 +195 +54 +37 +194 +54 +39 +196 +56 +41 +197 +59 +46 +198 +60 +49 +198 +60 +49 +197 +59 +49 +235 +96 +89 +225 +84 +77 +201 +60 +51 +191 +48 +40 +203 +59 +51 +209 +62 +54 +206 +59 +51 +210 +61 +54 +216 +61 +56 +215 +60 +55 +212 +61 +54 +207 +60 +50 +201 +59 +49 +195 +57 +46 +188 +54 +42 +182 +54 +41 +185 +59 +47 +188 +64 +54 +207 +84 +77 +227 +103 +101 +237 +111 +114 +248 +122 +126 +255 +129 +136 +253 +123 +131 +255 +122 +131 +252 +121 +129 +245 +122 +127 +246 +121 +127 +254 +117 +127 +255 +110 +124 +255 +99 +117 +255 +92 +111 +255 +89 +109 +242 +73 +94 +245 +65 +90 +242 +70 +92 +224 +76 +90 +203 +97 +97 +167 +122 +101 +130 +128 +90 +110 +130 +81 +104 +133 +79 +109 +131 +82 +116 +133 +88 +123 +136 +93 +125 +136 +94 +120 +132 +92 +113 +130 +88 +96 +122 +77 +95 +127 +80 +97 +133 +85 +101 +141 +89 +110 +149 +96 +117 +156 +103 +125 +160 +106 +128 +163 +109 +132 +171 +114 +135 +176 +116 +139 +180 +120 +142 +184 +121 +140 +184 +121 +143 +185 +122 +146 +186 +126 +148 +186 +129 +147 +177 +127 +149 +172 +128 +154 +170 +134 +168 +174 +146 +184 +181 +162 +196 +186 +174 +200 +185 +178 +198 +183 +180 +183 +171 +173 +169 +160 +165 +159 +150 +155 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +92 +76 +60 +93 +75 +61 +93 +75 +61 +93 +76 +60 +94 +77 +61 +94 +77 +59 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +81 +64 +94 +81 +64 +93 +79 +66 +91 +79 +67 +92 +78 +69 +91 +78 +70 +92 +79 +73 +91 +79 +79 +94 +80 +95 +98 +84 +109 +100 +89 +123 +103 +94 +137 +111 +104 +156 +122 +117 +173 +132 +124 +183 +136 +123 +179 +155 +132 +186 +166 +133 +180 +175 +128 +170 +184 +122 +161 +200 +120 +159 +211 +116 +156 +204 +99 +140 +198 +77 +108 +216 +72 +82 +217 +67 +66 +209 +67 +63 +203 +70 +61 +201 +73 +60 +204 +72 +59 +211 +69 +59 +222 +65 +60 +238 +64 +65 +245 +60 +65 +251 +60 +68 +249 +62 +69 +240 +65 +72 +226 +66 +68 +209 +65 +64 +197 +64 +59 +191 +63 +54 +182 +60 +49 +175 +57 +43 +171 +58 +42 +170 +57 +41 +174 +56 +42 +188 +62 +48 +206 +68 +58 +213 +60 +55 +213 +51 +49 +224 +59 +57 +229 +65 +63 +225 +68 +63 +232 +83 +76 +223 +85 +74 +191 +58 +43 +193 +57 +41 +190 +55 +36 +192 +55 +37 +196 +59 +41 +201 +61 +44 +202 +61 +44 +203 +57 +42 +206 +56 +41 +205 +52 +38 +210 +50 +38 +217 +50 +41 +229 +57 +47 +241 +62 +55 +245 +62 +54 +240 +53 +46 +228 +47 +38 +222 +54 +41 +221 +55 +41 +224 +52 +42 +228 +50 +40 +231 +46 +41 +233 +46 +41 +236 +44 +41 +236 +44 +43 +232 +42 +44 +230 +39 +44 +234 +40 +49 +240 +42 +57 +245 +39 +60 +246 +34 +59 +250 +31 +61 +251 +37 +65 +253 +56 +74 +228 +40 +54 +229 +44 +58 +255 +77 +89 +255 +93 +105 +255 +78 +90 +242 +60 +73 +244 +58 +72 +232 +41 +56 +237 +42 +56 +241 +45 +57 +244 +48 +58 +241 +50 +55 +234 +48 +49 +225 +43 +42 +215 +40 +37 +216 +48 +45 +218 +55 +50 +212 +50 +47 +229 +67 +64 +255 +115 +112 +245 +86 +83 +221 +62 +59 +229 +71 +68 +219 +61 +58 +218 +60 +57 +213 +58 +53 +210 +56 +48 +209 +55 +45 +208 +54 +42 +205 +52 +38 +198 +51 +35 +190 +53 +35 +185 +54 +36 +187 +56 +38 +191 +59 +44 +192 +60 +47 +191 +57 +45 +192 +58 +47 +197 +60 +50 +229 +88 +81 +220 +77 +71 +202 +55 +48 +199 +48 +41 +215 +60 +55 +222 +65 +58 +218 +59 +53 +223 +60 +53 +231 +62 +57 +233 +61 +57 +230 +63 +57 +225 +64 +56 +217 +63 +53 +208 +60 +50 +200 +58 +46 +193 +57 +45 +187 +57 +44 +187 +61 +49 +203 +78 +72 +224 +99 +95 +236 +110 +111 +250 +124 +127 +255 +132 +136 +255 +125 +133 +252 +118 +127 +250 +119 +127 +245 +122 +127 +247 +122 +128 +255 +118 +128 +255 +109 +123 +255 +98 +116 +254 +91 +110 +250 +84 +104 +240 +71 +92 +241 +61 +86 +240 +68 +90 +225 +79 +92 +195 +91 +90 +146 +104 +82 +111 +109 +71 +95 +115 +66 +92 +121 +67 +100 +122 +73 +108 +125 +80 +116 +129 +86 +118 +131 +88 +114 +129 +88 +111 +129 +87 +109 +135 +90 +108 +142 +92 +111 +149 +98 +117 +157 +104 +123 +164 +108 +129 +168 +111 +132 +170 +113 +135 +170 +112 +134 +172 +113 +136 +176 +116 +139 +179 +117 +140 +182 +118 +138 +183 +118 +138 +183 +118 +139 +184 +119 +144 +184 +122 +145 +180 +124 +143 +171 +123 +144 +165 +124 +154 +165 +133 +170 +172 +150 +187 +180 +164 +197 +184 +175 +198 +184 +181 +177 +171 +175 +161 +158 +165 +151 +146 +153 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +92 +76 +60 +93 +76 +60 +94 +75 +60 +94 +75 +60 +94 +77 +61 +94 +77 +59 +95 +78 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +78 +62 +94 +78 +62 +92 +79 +63 +94 +78 +65 +93 +79 +66 +94 +80 +69 +94 +79 +74 +98 +78 +89 +99 +80 +100 +99 +84 +113 +101 +89 +125 +108 +101 +145 +120 +114 +162 +127 +119 +168 +131 +118 +164 +148 +125 +167 +172 +134 +171 +194 +137 +169 +206 +130 +158 +218 +119 +148 +223 +108 +137 +218 +89 +119 +216 +69 +95 +236 +70 +84 +242 +73 +78 +233 +77 +78 +219 +76 +72 +205 +71 +62 +202 +69 +60 +210 +69 +62 +219 +67 +62 +234 +66 +66 +242 +63 +67 +248 +63 +71 +246 +65 +74 +237 +68 +73 +222 +68 +70 +205 +66 +63 +192 +63 +57 +189 +65 +55 +181 +61 +47 +174 +58 +43 +171 +58 +42 +170 +57 +41 +174 +56 +42 +187 +59 +46 +204 +63 +54 +225 +70 +65 +226 +61 +59 +238 +66 +66 +235 +65 +65 +222 +59 +54 +227 +74 +66 +230 +88 +76 +213 +75 +62 +200 +64 +50 +192 +56 +40 +188 +51 +35 +193 +56 +40 +200 +60 +45 +201 +58 +42 +203 +55 +41 +208 +56 +43 +206 +48 +37 +215 +51 +41 +224 +56 +47 +233 +59 +52 +237 +58 +53 +237 +54 +48 +235 +48 +43 +229 +44 +39 +223 +48 +43 +223 +50 +44 +229 +49 +48 +235 +50 +48 +241 +51 +53 +244 +51 +54 +246 +53 +56 +244 +53 +58 +235 +46 +53 +232 +45 +54 +235 +47 +61 +240 +49 +67 +242 +46 +70 +245 +42 +71 +252 +44 +78 +255 +52 +82 +245 +58 +77 +229 +51 +63 +238 +62 +75 +255 +92 +105 +255 +104 +118 +255 +85 +100 +245 +67 +83 +247 +64 +82 +238 +51 +68 +237 +51 +65 +237 +51 +62 +233 +54 +60 +227 +57 +57 +219 +56 +51 +206 +52 +42 +199 +47 +36 +203 +50 +42 +199 +46 +40 +208 +55 +50 +242 +89 +84 +246 +92 +90 +242 +88 +86 +219 +65 +63 +226 +72 +70 +220 +66 +64 +212 +60 +55 +206 +55 +48 +205 +54 +45 +207 +56 +45 +207 +57 +43 +202 +55 +39 +194 +53 +35 +185 +56 +35 +179 +57 +36 +181 +58 +40 +184 +61 +45 +185 +59 +44 +182 +54 +41 +188 +55 +46 +198 +61 +53 +219 +78 +71 +217 +69 +65 +206 +53 +48 +208 +49 +45 +225 +62 +57 +231 +64 +58 +227 +56 +49 +231 +53 +49 +235 +50 +48 +238 +50 +49 +235 +53 +50 +231 +56 +51 +225 +58 +50 +216 +58 +47 +208 +57 +46 +200 +58 +46 +190 +54 +42 +186 +56 +43 +200 +73 +66 +220 +95 +89 +235 +110 +108 +251 +125 +128 +255 +133 +137 +255 +126 +131 +247 +116 +124 +248 +118 +126 +245 +122 +127 +248 +123 +129 +254 +116 +129 +255 +108 +124 +255 +97 +117 +255 +90 +112 +247 +81 +101 +241 +72 +93 +240 +62 +86 +238 +69 +90 +227 +83 +93 +188 +86 +82 +131 +91 +66 +98 +98 +60 +92 +112 +63 +91 +118 +67 +102 +121 +75 +110 +126 +81 +116 +129 +86 +120 +133 +90 +121 +136 +95 +119 +140 +97 +121 +149 +101 +120 +154 +104 +122 +160 +109 +124 +167 +113 +129 +170 +114 +132 +171 +114 +133 +171 +112 +134 +169 +111 +137 +172 +114 +139 +174 +116 +138 +178 +116 +138 +180 +116 +136 +181 +116 +135 +182 +114 +137 +184 +116 +139 +184 +119 +143 +183 +123 +140 +173 +120 +141 +164 +120 +151 +165 +130 +170 +174 +149 +191 +186 +167 +203 +193 +181 +207 +198 +193 +188 +186 +191 +168 +170 +182 +156 +156 +168 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +93 +76 +60 +94 +75 +60 +94 +75 +60 +94 +75 +60 +95 +76 +61 +94 +77 +59 +95 +78 +60 +94 +79 +60 +94 +79 +60 +93 +78 +59 +93 +78 +59 +94 +79 +60 +95 +79 +63 +95 +79 +63 +96 +80 +64 +97 +81 +65 +98 +80 +70 +101 +76 +80 +101 +77 +93 +97 +79 +101 +98 +85 +115 +104 +96 +133 +116 +111 +151 +123 +116 +157 +125 +113 +151 +143 +118 +150 +174 +131 +159 +203 +140 +161 +218 +131 +150 +227 +116 +133 +232 +101 +117 +230 +81 +100 +228 +63 +80 +242 +55 +72 +252 +64 +78 +244 +73 +81 +227 +71 +74 +209 +65 +64 +203 +66 +60 +209 +67 +63 +217 +67 +66 +230 +67 +70 +235 +64 +70 +239 +64 +71 +239 +66 +72 +231 +68 +73 +218 +68 +69 +201 +66 +62 +190 +63 +54 +186 +64 +53 +177 +59 +45 +169 +56 +40 +168 +57 +40 +170 +57 +41 +176 +56 +42 +188 +58 +45 +202 +59 +51 +232 +73 +69 +233 +63 +63 +235 +61 +62 +229 +55 +56 +218 +50 +47 +222 +65 +58 +238 +90 +80 +244 +104 +91 +218 +80 +67 +201 +65 +51 +190 +53 +37 +194 +54 +39 +199 +57 +43 +200 +57 +43 +203 +55 +43 +210 +56 +44 +209 +48 +38 +218 +54 +45 +230 +59 +52 +233 +59 +52 +234 +52 +48 +232 +47 +44 +234 +45 +43 +235 +45 +45 +241 +52 +56 +243 +52 +59 +247 +51 +61 +250 +50 +60 +251 +49 +61 +253 +49 +61 +250 +48 +60 +247 +49 +62 +244 +49 +65 +241 +50 +66 +242 +53 +75 +243 +53 +78 +242 +49 +78 +244 +46 +79 +254 +49 +88 +255 +62 +95 +230 +51 +72 +248 +78 +91 +255 +95 +108 +255 +92 +107 +252 +84 +99 +250 +79 +95 +244 +68 +88 +233 +56 +74 +243 +65 +81 +234 +58 +71 +221 +50 +58 +210 +47 +50 +202 +50 +45 +194 +56 +45 +189 +59 +43 +188 +58 +42 +196 +58 +47 +192 +50 +40 +217 +74 +66 +250 +107 +99 +221 +76 +71 +225 +80 +75 +207 +59 +57 +207 +59 +57 +224 +76 +74 +212 +64 +60 +202 +55 +48 +202 +55 +45 +206 +60 +47 +205 +60 +43 +203 +58 +41 +196 +59 +40 +180 +59 +38 +173 +58 +37 +175 +60 +41 +179 +62 +45 +177 +57 +41 +175 +51 +39 +186 +58 +47 +202 +68 +59 +214 +71 +65 +216 +67 +61 +212 +55 +50 +215 +50 +46 +231 +59 +55 +236 +58 +54 +232 +50 +46 +237 +50 +45 +242 +44 +45 +244 +44 +44 +242 +46 +47 +239 +51 +49 +232 +55 +49 +226 +58 +49 +218 +60 +49 +210 +62 +50 +194 +54 +41 +186 +52 +41 +197 +66 +58 +215 +88 +82 +231 +106 +104 +250 +124 +125 +255 +134 +137 +255 +127 +132 +248 +117 +125 +249 +119 +127 +246 +123 +128 +247 +122 +128 +252 +114 +127 +253 +105 +121 +255 +94 +115 +255 +89 +111 +245 +79 +99 +244 +75 +96 +242 +64 +88 +239 +70 +91 +229 +85 +95 +182 +83 +78 +121 +84 +58 +94 +96 +56 +96 +115 +69 +97 +124 +73 +110 +129 +83 +118 +134 +89 +123 +136 +93 +126 +139 +96 +129 +144 +103 +130 +151 +108 +128 +156 +108 +125 +159 +109 +124 +164 +111 +125 +168 +112 +128 +169 +111 +130 +170 +110 +131 +169 +108 +133 +169 +108 +137 +170 +113 +139 +173 +113 +137 +175 +114 +136 +178 +114 +133 +178 +111 +133 +180 +112 +135 +182 +114 +137 +184 +116 +139 +181 +118 +135 +173 +116 +140 +166 +119 +153 +169 +132 +175 +181 +153 +198 +196 +175 +213 +206 +190 +217 +210 +204 +194 +194 +202 +172 +178 +192 +155 +161 +175 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +91 +76 +57 +91 +76 +57 +92 +77 +58 +92 +77 +58 +93 +76 +58 +94 +75 +60 +96 +74 +60 +94 +75 +60 +95 +76 +61 +94 +77 +59 +95 +78 +60 +94 +79 +60 +94 +79 +60 +94 +79 +58 +95 +80 +59 +96 +79 +59 +97 +80 +62 +97 +80 +62 +97 +80 +62 +97 +80 +60 +100 +78 +65 +104 +75 +77 +103 +75 +87 +99 +78 +95 +98 +84 +109 +106 +97 +128 +118 +112 +146 +124 +118 +152 +128 +115 +145 +143 +117 +142 +173 +128 +148 +205 +134 +148 +222 +127 +135 +237 +113 +121 +246 +101 +108 +246 +82 +91 +244 +62 +75 +248 +47 +66 +255 +55 +75 +251 +65 +79 +235 +64 +73 +219 +63 +67 +214 +66 +66 +213 +67 +67 +215 +65 +66 +224 +65 +69 +227 +64 +69 +230 +63 +70 +228 +65 +70 +223 +67 +70 +212 +66 +66 +199 +64 +60 +189 +62 +53 +184 +62 +51 +175 +57 +43 +168 +55 +39 +169 +58 +41 +173 +60 +42 +180 +60 +44 +193 +61 +49 +207 +63 +55 +223 +61 +58 +229 +57 +57 +227 +48 +51 +226 +47 +50 +224 +52 +50 +219 +57 +52 +230 +77 +69 +252 +108 +97 +242 +104 +91 +217 +81 +67 +198 +60 +47 +198 +58 +45 +200 +58 +46 +201 +55 +42 +205 +54 +43 +213 +56 +47 +213 +52 +44 +222 +55 +47 +230 +57 +51 +232 +54 +50 +233 +49 +47 +232 +47 +44 +238 +49 +47 +245 +49 +53 +255 +50 +66 +255 +48 +68 +255 +45 +69 +255 +43 +65 +255 +38 +63 +255 +35 +60 +250 +32 +56 +244 +32 +55 +246 +39 +65 +243 +43 +69 +242 +47 +77 +242 +49 +80 +240 +44 +80 +243 +42 +84 +254 +51 +96 +255 +66 +104 +240 +67 +87 +255 +95 +108 +255 +103 +116 +247 +85 +100 +236 +74 +89 +239 +74 +90 +234 +65 +84 +217 +49 +66 +235 +64 +82 +221 +55 +67 +201 +45 +49 +186 +40 +40 +177 +46 +36 +171 +56 +38 +165 +63 +38 +168 +64 +39 +184 +63 +46 +188 +58 +44 +221 +89 +77 +225 +93 +81 +205 +71 +62 +205 +68 +62 +193 +54 +51 +201 +59 +55 +228 +85 +81 +213 +70 +64 +201 +57 +49 +200 +56 +45 +201 +58 +44 +200 +57 +40 +200 +57 +40 +196 +61 +41 +177 +63 +39 +166 +60 +38 +168 +59 +38 +172 +61 +42 +171 +55 +40 +172 +51 +40 +188 +61 +52 +211 +76 +70 +214 +71 +65 +221 +69 +64 +219 +57 +54 +220 +51 +48 +233 +55 +51 +236 +53 +49 +235 +48 +43 +244 +49 +45 +253 +44 +47 +255 +43 +45 +250 +46 +47 +244 +49 +47 +237 +52 +47 +230 +56 +49 +223 +59 +49 +216 +62 +50 +201 +57 +46 +189 +51 +40 +192 +59 +50 +207 +78 +72 +225 +97 +94 +247 +121 +122 +255 +136 +138 +255 +131 +135 +252 +121 +129 +252 +122 +130 +248 +124 +132 +247 +122 +130 +249 +111 +124 +249 +101 +117 +252 +90 +111 +252 +86 +108 +238 +75 +96 +242 +74 +97 +240 +64 +87 +236 +69 +89 +225 +84 +93 +174 +77 +71 +112 +77 +49 +92 +94 +54 +95 +114 +68 +102 +126 +78 +117 +136 +91 +127 +142 +99 +132 +144 +104 +134 +146 +106 +136 +151 +110 +137 +158 +115 +136 +164 +116 +132 +166 +116 +127 +167 +114 +125 +168 +112 +127 +168 +110 +129 +169 +109 +131 +169 +108 +134 +168 +108 +136 +167 +110 +138 +169 +110 +136 +172 +111 +134 +174 +111 +130 +175 +108 +130 +177 +107 +131 +181 +110 +133 +183 +114 +135 +179 +116 +134 +173 +116 +140 +168 +119 +155 +173 +133 +176 +185 +154 +199 +199 +175 +214 +207 +189 +215 +210 +204 +188 +192 +201 +165 +174 +189 +147 +156 +171 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +91 +76 +57 +92 +75 +57 +92 +77 +58 +93 +76 +58 +93 +76 +58 +94 +75 +60 +94 +75 +60 +94 +75 +60 +94 +77 +61 +94 +77 +61 +94 +79 +60 +94 +79 +60 +92 +79 +60 +96 +81 +62 +97 +82 +61 +97 +82 +63 +98 +81 +63 +98 +81 +63 +97 +80 +62 +97 +79 +59 +98 +76 +63 +107 +77 +75 +106 +76 +84 +101 +79 +92 +100 +87 +107 +107 +101 +127 +120 +117 +148 +125 +124 +156 +127 +120 +151 +145 +122 +148 +171 +129 +149 +198 +132 +144 +217 +126 +133 +238 +117 +122 +252 +109 +111 +253 +90 +91 +249 +70 +76 +247 +52 +69 +255 +58 +78 +251 +64 +81 +238 +63 +76 +229 +65 +74 +225 +69 +73 +221 +66 +70 +215 +60 +64 +222 +63 +68 +223 +62 +67 +225 +62 +67 +222 +64 +65 +218 +66 +65 +208 +65 +61 +197 +62 +56 +188 +61 +52 +181 +63 +49 +172 +59 +43 +169 +56 +40 +173 +60 +44 +180 +63 +46 +187 +64 +49 +202 +65 +55 +216 +67 +61 +217 +55 +52 +225 +56 +53 +222 +46 +46 +226 +51 +48 +230 +58 +54 +211 +48 +39 +207 +53 +41 +235 +85 +71 +255 +119 +106 +235 +91 +80 +209 +67 +55 +202 +60 +48 +203 +59 +48 +201 +55 +42 +205 +54 +43 +212 +58 +48 +218 +55 +48 +223 +56 +50 +229 +54 +51 +231 +51 +50 +234 +48 +49 +237 +49 +50 +244 +51 +54 +252 +53 +60 +252 +37 +53 +255 +35 +56 +255 +34 +56 +255 +33 +56 +255 +32 +55 +255 +31 +53 +251 +29 +52 +246 +30 +53 +237 +28 +50 +236 +32 +57 +237 +39 +66 +238 +41 +71 +237 +39 +74 +239 +41 +77 +253 +53 +92 +255 +70 +104 +255 +96 +115 +254 +94 +106 +247 +85 +98 +242 +80 +93 +242 +80 +93 +240 +75 +89 +227 +62 +76 +210 +48 +59 +218 +61 +70 +205 +54 +59 +187 +47 +46 +175 +46 +40 +168 +52 +39 +162 +59 +40 +155 +63 +38 +157 +61 +37 +170 +57 +39 +178 +56 +43 +210 +86 +74 +187 +59 +50 +196 +63 +56 +190 +52 +49 +189 +50 +47 +206 +67 +64 +229 +87 +83 +213 +72 +65 +200 +57 +49 +196 +54 +42 +197 +54 +40 +196 +53 +37 +198 +53 +36 +195 +58 +40 +177 +60 +40 +167 +58 +38 +168 +55 +37 +173 +57 +42 +172 +52 +38 +175 +49 +37 +194 +63 +53 +219 +82 +74 +217 +73 +65 +225 +72 +66 +222 +59 +54 +222 +50 +46 +234 +52 +49 +237 +49 +47 +239 +45 +43 +252 +50 +50 +254 +44 +47 +253 +43 +46 +249 +43 +45 +243 +43 +43 +237 +45 +42 +230 +49 +42 +223 +52 +44 +214 +56 +44 +209 +61 +49 +191 +50 +40 +188 +55 +46 +200 +73 +66 +217 +92 +88 +243 +119 +119 +255 +137 +139 +255 +134 +138 +253 +126 +133 +255 +125 +133 +252 +125 +134 +253 +119 +130 +252 +107 +122 +249 +96 +114 +249 +87 +108 +249 +83 +105 +234 +68 +92 +240 +71 +94 +236 +59 +85 +228 +65 +86 +215 +81 +90 +162 +73 +67 +102 +70 +45 +88 +93 +53 +90 +109 +63 +98 +125 +74 +116 +140 +92 +128 +150 +103 +135 +152 +108 +136 +155 +110 +138 +160 +114 +139 +165 +118 +140 +172 +122 +134 +171 +119 +129 +170 +114 +126 +167 +109 +124 +165 +105 +125 +165 +103 +129 +165 +103 +131 +165 +105 +131 +164 +107 +133 +166 +109 +132 +170 +109 +130 +172 +108 +128 +173 +104 +128 +175 +105 +129 +179 +106 +132 +182 +111 +137 +182 +115 +136 +176 +114 +140 +173 +120 +153 +176 +132 +172 +188 +152 +189 +198 +169 +201 +203 +181 +203 +205 +194 +182 +191 +196 +159 +171 +183 +140 +152 +164 +93 +75 +55 +92 +75 +55 +93 +75 +55 +92 +75 +55 +93 +75 +55 +92 +75 +55 +93 +75 +55 +92 +75 +55 +94 +76 +56 +93 +76 +56 +94 +76 +56 +93 +76 +56 +94 +76 +56 +93 +76 +56 +94 +76 +56 +93 +76 +58 +93 +74 +60 +93 +75 +61 +94 +76 +62 +92 +76 +60 +92 +76 +60 +91 +78 +61 +93 +80 +63 +94 +83 +65 +96 +83 +66 +95 +82 +63 +96 +80 +64 +98 +81 +65 +99 +82 +66 +100 +81 +66 +100 +78 +65 +100 +76 +66 +107 +75 +76 +104 +75 +80 +101 +79 +91 +102 +91 +108 +110 +107 +134 +120 +123 +156 +129 +133 +170 +137 +137 +173 +143 +132 +166 +165 +136 +166 +190 +136 +159 +208 +130 +144 +225 +121 +128 +240 +114 +115 +249 +106 +102 +255 +97 +96 +244 +77 +87 +237 +65 +79 +231 +61 +74 +233 +66 +76 +235 +69 +79 +231 +65 +75 +228 +61 +69 +229 +62 +70 +226 +59 +66 +224 +59 +63 +221 +58 +61 +217 +59 +58 +212 +60 +57 +204 +59 +54 +196 +58 +48 +185 +57 +44 +167 +54 +38 +175 +65 +48 +173 +60 +44 +172 +54 +40 +191 +65 +53 +204 +70 +61 +204 +61 +53 +208 +55 +50 +218 +56 +53 +220 +55 +49 +222 +53 +46 +222 +54 +45 +222 +56 +42 +221 +60 +42 +215 +58 +39 +211 +54 +37 +217 +59 +48 +240 +83 +76 +242 +90 +79 +217 +69 +57 +199 +56 +42 +205 +62 +46 +212 +66 +51 +210 +58 +45 +211 +50 +42 +240 +71 +66 +225 +47 +47 +239 +54 +59 +244 +55 +62 +239 +45 +56 +255 +66 +77 +240 +40 +51 +250 +38 +50 +255 +41 +50 +255 +41 +50 +249 +29 +39 +253 +34 +42 +255 +39 +47 +254 +39 +47 +240 +29 +38 +238 +31 +41 +248 +44 +55 +233 +33 +46 +235 +38 +55 +240 +44 +64 +227 +33 +57 +255 +86 +112 +229 +43 +66 +255 +92 +108 +255 +94 +105 +255 +89 +99 +251 +84 +92 +246 +79 +87 +236 +71 +77 +222 +62 +64 +208 +54 +52 +204 +61 +55 +197 +64 +55 +184 +62 +49 +167 +54 +38 +156 +49 +33 +154 +53 +35 +157 +58 +39 +160 +59 +41 +167 +56 +45 +174 +55 +47 +194 +69 +63 +191 +59 +55 +189 +51 +49 +196 +54 +52 +197 +53 +52 +212 +68 +67 +219 +76 +72 +218 +75 +69 +209 +68 +59 +200 +58 +48 +196 +52 +41 +199 +53 +40 +203 +52 +41 +197 +53 +42 +188 +60 +47 +179 +57 +44 +173 +47 +35 +171 +40 +30 +179 +45 +36 +195 +57 +47 +210 +67 +59 +216 +72 +63 +228 +80 +70 +223 +69 +61 +218 +55 +48 +221 +48 +42 +231 +48 +44 +242 +50 +49 +249 +49 +51 +253 +49 +52 +247 +47 +49 +246 +48 +49 +246 +48 +49 +243 +48 +46 +242 +48 +46 +237 +50 +45 +230 +53 +45 +221 +57 +47 +213 +61 +48 +190 +50 +37 +192 +62 +49 +185 +61 +51 +214 +95 +89 +233 +115 +113 +255 +143 +143 +251 +132 +134 +255 +135 +140 +255 +132 +141 +255 +120 +135 +253 +104 +123 +252 +95 +116 +254 +92 +115 +250 +86 +110 +243 +77 +101 +242 +72 +99 +235 +60 +89 +237 +62 +91 +224 +66 +89 +216 +94 +105 +141 +63 +59 +92 +67 +45 +83 +91 +54 +92 +116 +66 +103 +134 +77 +119 +150 +93 +125 +156 +99 +127 +157 +103 +128 +161 +106 +131 +166 +110 +130 +168 +111 +128 +167 +110 +127 +166 +109 +126 +165 +108 +125 +165 +105 +124 +164 +104 +125 +163 +102 +127 +163 +101 +127 +163 +102 +127 +165 +108 +127 +166 +109 +129 +171 +108 +127 +172 +107 +126 +173 +103 +127 +174 +102 +129 +177 +103 +131 +179 +105 +135 +181 +109 +139 +180 +114 +139 +177 +118 +142 +174 +124 +153 +180 +137 +167 +189 +153 +175 +194 +164 +178 +193 +174 +163 +175 +173 +141 +152 +158 +124 +135 +141 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +75 +58 +92 +75 +59 +94 +76 +62 +95 +77 +63 +94 +78 +62 +91 +78 +61 +91 +78 +61 +92 +81 +63 +94 +82 +66 +95 +83 +67 +93 +81 +65 +93 +79 +66 +95 +79 +66 +96 +78 +68 +98 +80 +70 +99 +79 +72 +101 +77 +73 +105 +76 +78 +103 +78 +84 +101 +83 +97 +103 +95 +116 +110 +111 +142 +121 +126 +166 +128 +136 +183 +135 +139 +187 +158 +150 +199 +163 +140 +182 +171 +127 +160 +185 +120 +142 +211 +121 +133 +234 +124 +125 +244 +117 +111 +244 +105 +100 +245 +94 +99 +238 +81 +90 +233 +71 +82 +238 +74 +83 +243 +76 +86 +242 +71 +80 +238 +64 +74 +234 +60 +69 +228 +57 +63 +224 +58 +60 +220 +57 +58 +215 +60 +56 +210 +61 +55 +203 +60 +52 +196 +58 +47 +186 +59 +44 +171 +60 +43 +170 +63 +45 +169 +56 +40 +178 +58 +44 +193 +65 +54 +197 +60 +52 +199 +54 +49 +212 +60 +55 +210 +53 +48 +214 +53 +45 +215 +53 +42 +216 +52 +40 +217 +56 +38 +219 +58 +38 +219 +59 +37 +218 +57 +39 +221 +54 +46 +230 +65 +59 +235 +77 +68 +225 +73 +60 +208 +62 +47 +199 +56 +40 +202 +56 +41 +211 +59 +46 +221 +58 +51 +245 +73 +69 +228 +48 +49 +241 +55 +60 +246 +54 +65 +241 +46 +60 +255 +63 +77 +237 +37 +50 +243 +36 +44 +247 +37 +40 +251 +41 +44 +253 +43 +44 +252 +42 +43 +248 +40 +40 +246 +40 +40 +247 +43 +44 +239 +36 +39 +237 +37 +40 +234 +37 +44 +253 +59 +68 +216 +26 +38 +238 +50 +65 +250 +63 +80 +213 +35 +51 +255 +104 +117 +255 +97 +106 +255 +90 +97 +253 +86 +93 +247 +78 +83 +231 +65 +67 +218 +59 +56 +210 +61 +54 +193 +55 +44 +194 +66 +53 +188 +71 +54 +172 +61 +44 +154 +47 +31 +147 +39 +26 +146 +38 +25 +147 +39 +27 +158 +45 +37 +176 +58 +54 +209 +84 +80 +206 +72 +71 +195 +53 +52 +198 +52 +53 +209 +61 +61 +235 +87 +85 +216 +71 +66 +214 +71 +63 +208 +65 +57 +199 +57 +47 +198 +51 +41 +202 +54 +44 +208 +55 +47 +206 +55 +48 +199 +61 +51 +194 +57 +49 +194 +53 +46 +195 +50 +45 +201 +52 +46 +209 +56 +51 +216 +63 +57 +222 +69 +61 +228 +74 +64 +222 +65 +56 +218 +54 +45 +221 +48 +42 +231 +48 +44 +242 +50 +49 +251 +48 +51 +251 +48 +51 +244 +48 +50 +243 +49 +50 +244 +48 +49 +243 +47 +48 +243 +48 +46 +238 +49 +45 +231 +52 +45 +223 +57 +45 +215 +61 +49 +191 +51 +36 +190 +60 +47 +183 +61 +50 +211 +94 +87 +233 +118 +115 +255 +144 +144 +249 +133 +136 +253 +134 +140 +255 +128 +138 +255 +115 +132 +255 +100 +121 +255 +92 +116 +255 +89 +114 +252 +84 +110 +246 +76 +103 +243 +68 +97 +236 +61 +90 +236 +66 +95 +223 +74 +96 +194 +83 +92 +128 +61 +55 +88 +67 +46 +82 +92 +57 +91 +118 +67 +101 +135 +75 +115 +149 +89 +120 +156 +95 +119 +157 +98 +123 +161 +102 +125 +165 +105 +125 +166 +106 +124 +165 +105 +124 +165 +105 +124 +164 +104 +123 +163 +101 +123 +161 +100 +123 +161 +100 +125 +161 +99 +126 +162 +101 +124 +163 +106 +125 +166 +108 +125 +169 +108 +125 +170 +105 +124 +171 +101 +125 +173 +99 +127 +175 +99 +130 +177 +99 +133 +176 +104 +135 +178 +107 +136 +175 +112 +136 +171 +115 +139 +171 +124 +144 +172 +132 +144 +170 +135 +140 +162 +139 +118 +133 +126 +99 +111 +111 +83 +95 +95 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +94 +75 +58 +95 +78 +62 +97 +80 +64 +96 +80 +64 +93 +80 +63 +92 +79 +62 +91 +79 +63 +91 +82 +67 +91 +81 +69 +91 +81 +71 +92 +79 +71 +92 +79 +73 +95 +80 +77 +99 +81 +79 +102 +84 +84 +103 +84 +86 +103 +84 +88 +103 +86 +96 +104 +92 +112 +108 +105 +134 +115 +118 +161 +124 +131 +185 +130 +138 +201 +138 +142 +206 +152 +146 +210 +160 +139 +196 +170 +131 +178 +185 +125 +159 +207 +128 +147 +228 +131 +138 +238 +126 +122 +242 +115 +109 +248 +102 +105 +242 +85 +92 +234 +73 +81 +237 +72 +79 +243 +73 +82 +245 +71 +81 +242 +65 +75 +238 +61 +69 +228 +55 +61 +224 +55 +58 +219 +56 +57 +213 +60 +55 +207 +63 +55 +201 +63 +52 +193 +61 +48 +184 +61 +45 +174 +61 +45 +170 +60 +43 +171 +58 +44 +184 +66 +54 +199 +72 +63 +192 +59 +50 +187 +48 +41 +202 +58 +50 +205 +54 +47 +208 +54 +46 +213 +55 +44 +216 +56 +44 +217 +55 +40 +217 +56 +38 +220 +57 +38 +224 +58 +42 +221 +52 +45 +219 +52 +46 +226 +65 +57 +233 +79 +67 +222 +72 +58 +200 +53 +37 +200 +50 +35 +217 +64 +50 +226 +62 +53 +245 +72 +68 +231 +48 +50 +242 +53 +59 +248 +54 +63 +245 +49 +61 +255 +66 +80 +244 +46 +59 +240 +41 +48 +235 +35 +38 +236 +36 +39 +249 +49 +51 +245 +45 +47 +239 +39 +39 +236 +38 +37 +245 +49 +50 +234 +40 +41 +245 +55 +57 +231 +42 +48 +225 +40 +48 +234 +50 +60 +255 +81 +93 +237 +59 +73 +255 +89 +101 +255 +94 +102 +242 +85 +92 +239 +78 +84 +241 +76 +82 +235 +69 +73 +222 +58 +59 +214 +55 +52 +214 +62 +57 +194 +53 +44 +194 +62 +50 +189 +65 +53 +181 +60 +49 +173 +55 +45 +168 +49 +41 +162 +43 +35 +157 +38 +32 +155 +36 +30 +169 +47 +42 +199 +69 +67 +194 +58 +58 +188 +44 +44 +200 +51 +53 +215 +65 +66 +244 +94 +93 +208 +63 +58 +210 +67 +59 +208 +65 +57 +203 +61 +51 +204 +57 +47 +212 +61 +52 +218 +64 +56 +219 +64 +59 +219 +64 +60 +216 +61 +59 +221 +62 +59 +227 +65 +63 +228 +62 +62 +224 +58 +58 +227 +63 +61 +235 +73 +68 +224 +66 +57 +221 +60 +52 +217 +53 +44 +221 +50 +43 +231 +49 +45 +240 +51 +49 +245 +49 +50 +248 +48 +50 +244 +48 +50 +244 +48 +50 +244 +48 +49 +243 +47 +48 +243 +48 +46 +238 +49 +45 +231 +52 +45 +223 +57 +45 +216 +62 +50 +192 +52 +37 +186 +56 +43 +181 +59 +48 +208 +91 +84 +237 +122 +119 +255 +147 +146 +251 +135 +138 +253 +129 +137 +255 +124 +137 +255 +113 +129 +253 +100 +120 +254 +90 +114 +255 +85 +111 +252 +79 +107 +250 +73 +102 +244 +65 +95 +238 +63 +92 +234 +71 +98 +223 +84 +103 +165 +64 +72 +117 +56 +51 +88 +70 +50 +85 +95 +60 +95 +119 +69 +102 +135 +78 +114 +147 +90 +117 +152 +94 +116 +154 +95 +120 +158 +99 +123 +163 +103 +123 +163 +103 +121 +162 +102 +121 +162 +102 +121 +161 +99 +120 +160 +98 +121 +159 +98 +121 +160 +97 +124 +160 +98 +122 +160 +99 +122 +162 +102 +123 +164 +104 +123 +167 +104 +123 +168 +101 +123 +169 +97 +123 +169 +96 +125 +171 +96 +127 +174 +96 +135 +178 +106 +138 +181 +110 +139 +178 +115 +137 +172 +116 +134 +166 +119 +130 +158 +117 +121 +147 +110 +111 +134 +108 +81 +99 +87 +64 +79 +76 +50 +65 +62 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +76 +56 +96 +78 +58 +97 +80 +60 +96 +81 +62 +93 +80 +63 +90 +78 +62 +89 +79 +67 +88 +80 +69 +88 +79 +72 +91 +81 +79 +95 +85 +84 +98 +88 +89 +101 +88 +95 +105 +89 +99 +108 +92 +102 +107 +94 +104 +108 +96 +108 +108 +99 +116 +111 +107 +134 +114 +116 +155 +121 +126 +181 +127 +135 +200 +133 +141 +214 +140 +143 +220 +142 +135 +212 +159 +139 +208 +173 +138 +194 +179 +129 +167 +189 +121 +144 +204 +123 +130 +222 +129 +124 +241 +130 +123 +254 +116 +116 +253 +100 +103 +244 +88 +92 +242 +79 +84 +242 +73 +80 +242 +68 +77 +240 +63 +71 +239 +60 +66 +229 +54 +59 +225 +55 +56 +219 +57 +55 +213 +60 +55 +206 +64 +54 +198 +64 +52 +191 +64 +49 +184 +63 +46 +173 +57 +42 +173 +62 +45 +177 +61 +48 +188 +70 +58 +204 +82 +71 +199 +72 +63 +186 +53 +46 +186 +49 +41 +200 +57 +49 +205 +56 +49 +211 +59 +48 +217 +61 +49 +219 +59 +45 +217 +54 +39 +220 +54 +38 +224 +56 +43 +224 +53 +45 +219 +50 +43 +224 +61 +52 +236 +78 +66 +227 +75 +61 +210 +58 +44 +209 +56 +42 +224 +66 +54 +222 +54 +45 +240 +62 +58 +233 +47 +48 +239 +48 +53 +245 +50 +58 +248 +52 +62 +255 +74 +86 +255 +70 +79 +253 +62 +69 +242 +51 +56 +226 +36 +38 +237 +47 +49 +234 +44 +44 +240 +50 +50 +232 +42 +42 +235 +47 +46 +241 +57 +57 +209 +26 +28 +229 +50 +54 +220 +43 +49 +231 +56 +63 +239 +68 +76 +255 +87 +98 +241 +75 +85 +217 +60 +67 +219 +64 +68 +225 +66 +70 +225 +62 +65 +222 +57 +61 +220 +56 +57 +218 +55 +56 +212 +57 +55 +201 +56 +51 +195 +56 +49 +190 +57 +50 +193 +64 +58 +206 +77 +72 +215 +85 +83 +210 +77 +78 +196 +66 +64 +178 +55 +50 +182 +57 +53 +207 +75 +73 +217 +77 +76 +227 +81 +82 +239 +89 +90 +234 +82 +81 +241 +89 +86 +201 +53 +49 +206 +62 +54 +210 +66 +57 +208 +64 +55 +211 +63 +53 +217 +66 +57 +224 +67 +60 +226 +64 +59 +233 +63 +64 +231 +56 +61 +236 +57 +61 +242 +63 +67 +239 +58 +63 +232 +53 +56 +236 +62 +61 +246 +77 +74 +222 +57 +51 +219 +54 +48 +218 +51 +43 +222 +51 +44 +229 +52 +46 +236 +51 +48 +242 +50 +49 +244 +48 +49 +244 +48 +50 +246 +47 +50 +246 +48 +49 +245 +47 +48 +245 +47 +46 +240 +48 +45 +233 +52 +45 +224 +56 +45 +217 +63 +51 +194 +54 +39 +183 +53 +40 +179 +57 +46 +203 +86 +79 +239 +124 +121 +255 +147 +146 +254 +135 +139 +255 +128 +137 +255 +121 +135 +252 +110 +126 +250 +99 +118 +250 +88 +111 +252 +80 +106 +251 +72 +102 +250 +67 +98 +242 +61 +92 +239 +66 +94 +229 +77 +100 +215 +90 +104 +136 +50 +53 +107 +57 +48 +92 +77 +56 +91 +101 +67 +99 +123 +75 +106 +137 +80 +115 +146 +89 +116 +149 +92 +117 +152 +94 +119 +157 +98 +121 +161 +101 +122 +162 +102 +119 +160 +100 +118 +160 +97 +119 +159 +97 +118 +158 +96 +120 +159 +96 +120 +159 +96 +123 +159 +97 +122 +160 +99 +122 +162 +102 +122 +163 +103 +122 +167 +102 +122 +167 +98 +122 +168 +96 +122 +168 +93 +124 +171 +93 +126 +173 +95 +134 +178 +103 +139 +180 +110 +140 +179 +116 +138 +173 +115 +134 +166 +117 +128 +157 +113 +116 +142 +105 +105 +128 +100 +80 +98 +84 +67 +82 +75 +56 +71 +64 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +57 +93 +75 +53 +95 +77 +53 +96 +80 +57 +95 +80 +59 +92 +79 +62 +90 +78 +64 +88 +79 +70 +88 +81 +75 +89 +80 +81 +96 +87 +92 +103 +96 +104 +110 +102 +115 +115 +104 +121 +115 +103 +123 +115 +103 +125 +113 +103 +127 +111 +108 +129 +112 +112 +138 +114 +118 +153 +118 +124 +172 +122 +130 +193 +127 +135 +208 +132 +139 +220 +138 +140 +225 +147 +142 +224 +157 +141 +214 +160 +132 +190 +158 +117 +159 +160 +108 +130 +172 +110 +115 +188 +117 +111 +210 +118 +107 +240 +115 +109 +253 +109 +108 +254 +104 +105 +251 +95 +96 +249 +83 +87 +244 +71 +77 +237 +60 +66 +234 +55 +61 +232 +53 +59 +227 +54 +56 +221 +57 +56 +215 +60 +55 +208 +64 +55 +199 +65 +53 +192 +65 +48 +185 +64 +47 +173 +55 +41 +180 +64 +51 +175 +58 +48 +176 +59 +49 +200 +82 +72 +213 +92 +81 +201 +77 +67 +187 +59 +48 +190 +57 +48 +193 +55 +45 +204 +57 +47 +214 +62 +51 +219 +61 +49 +218 +54 +42 +220 +52 +39 +226 +54 +42 +224 +51 +44 +226 +55 +48 +228 +61 +53 +229 +69 +57 +226 +70 +57 +222 +66 +51 +222 +65 +50 +226 +62 +50 +219 +48 +38 +234 +55 +50 +236 +48 +47 +238 +45 +48 +239 +44 +50 +246 +51 +59 +255 +76 +84 +255 +87 +94 +255 +90 +95 +255 +79 +83 +225 +46 +49 +227 +48 +51 +224 +44 +45 +247 +69 +69 +232 +54 +54 +220 +44 +44 +218 +44 +45 +234 +61 +63 +219 +49 +52 +216 +50 +54 +255 +98 +104 +224 +61 +66 +202 +41 +49 +202 +45 +52 +193 +38 +42 +213 +59 +61 +224 +65 +69 +218 +55 +58 +217 +51 +55 +223 +57 +61 +220 +55 +59 +205 +47 +48 +204 +52 +51 +205 +59 +59 +211 +71 +70 +221 +83 +83 +235 +96 +99 +245 +105 +108 +244 +101 +107 +234 +94 +97 +196 +64 +62 +198 +69 +64 +229 +94 +91 +248 +104 +103 +255 +111 +112 +255 +106 +106 +229 +75 +75 +215 +61 +59 +201 +52 +48 +209 +62 +55 +215 +68 +60 +214 +67 +59 +213 +62 +53 +213 +60 +52 +216 +58 +49 +220 +52 +49 +238 +53 +59 +241 +45 +55 +240 +44 +54 +242 +46 +56 +239 +44 +52 +235 +44 +51 +243 +57 +60 +254 +74 +75 +223 +51 +47 +220 +51 +46 +218 +51 +43 +220 +51 +44 +227 +53 +46 +234 +52 +48 +239 +52 +47 +242 +50 +49 +244 +48 +50 +246 +47 +50 +247 +47 +49 +246 +46 +48 +245 +47 +46 +240 +48 +45 +234 +51 +45 +226 +55 +45 +217 +63 +51 +198 +56 +42 +180 +50 +37 +178 +56 +45 +195 +78 +71 +239 +124 +121 +255 +146 +145 +255 +135 +140 +255 +126 +137 +255 +117 +132 +249 +108 +124 +246 +97 +116 +245 +85 +109 +247 +74 +102 +249 +64 +96 +249 +59 +93 +243 +58 +92 +237 +68 +97 +219 +80 +101 +193 +87 +97 +114 +46 +43 +98 +62 +48 +96 +84 +62 +99 +106 +73 +102 +124 +77 +107 +137 +83 +116 +146 +92 +117 +150 +95 +118 +153 +95 +120 +158 +99 +121 +161 +99 +120 +160 +98 +117 +159 +96 +117 +159 +96 +117 +157 +95 +118 +158 +95 +119 +158 +95 +120 +159 +96 +123 +159 +97 +122 +161 +98 +122 +162 +100 +123 +165 +101 +124 +166 +100 +124 +167 +96 +121 +167 +94 +121 +168 +90 +123 +170 +92 +125 +172 +94 +128 +172 +97 +133 +175 +103 +135 +174 +109 +135 +170 +112 +133 +165 +115 +131 +160 +114 +123 +149 +110 +114 +138 +106 +100 +119 +100 +91 +107 +94 +81 +97 +84 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +58 +94 +76 +52 +95 +78 +52 +96 +78 +56 +94 +79 +58 +91 +78 +62 +89 +79 +69 +90 +83 +77 +90 +84 +84 +95 +90 +97 +104 +98 +112 +114 +109 +129 +122 +117 +140 +123 +117 +145 +123 +113 +147 +122 +112 +147 +118 +112 +148 +113 +116 +149 +114 +119 +157 +116 +124 +170 +119 +128 +183 +122 +131 +196 +126 +134 +207 +132 +138 +216 +139 +141 +218 +150 +144 +218 +153 +139 +201 +155 +133 +180 +162 +131 +162 +170 +132 +145 +171 +126 +123 +159 +107 +93 +153 +82 +64 +186 +78 +66 +210 +82 +73 +225 +88 +82 +233 +88 +85 +239 +84 +82 +241 +75 +77 +236 +63 +67 +229 +52 +58 +235 +56 +60 +231 +57 +59 +226 +58 +57 +218 +61 +56 +211 +64 +56 +203 +65 +54 +195 +63 +48 +188 +62 +47 +179 +57 +44 +186 +65 +54 +171 +53 +43 +163 +46 +36 +190 +73 +63 +217 +103 +92 +217 +100 +90 +203 +85 +73 +184 +60 +50 +184 +54 +41 +192 +51 +41 +206 +58 +48 +217 +59 +48 +218 +54 +44 +222 +51 +41 +228 +54 +45 +223 +49 +42 +228 +55 +49 +227 +59 +50 +221 +57 +47 +222 +62 +48 +227 +70 +53 +228 +66 +51 +223 +57 +43 +222 +48 +39 +233 +52 +45 +240 +51 +49 +239 +45 +46 +236 +41 +45 +242 +47 +53 +255 +66 +71 +255 +82 +87 +255 +93 +98 +255 +92 +97 +226 +57 +60 +227 +57 +60 +213 +43 +44 +244 +74 +75 +226 +56 +57 +215 +47 +47 +217 +51 +53 +203 +39 +40 +202 +37 +41 +247 +87 +89 +220 +61 +65 +213 +57 +61 +209 +54 +58 +186 +31 +35 +196 +40 +43 +219 +61 +62 +229 +66 +69 +219 +53 +57 +215 +44 +50 +220 +49 +55 +217 +48 +53 +204 +41 +46 +208 +52 +55 +226 +76 +78 +244 +98 +101 +250 +105 +110 +247 +100 +108 +246 +96 +105 +248 +96 +108 +248 +98 +107 +214 +76 +76 +213 +78 +74 +234 +92 +90 +234 +86 +84 +231 +77 +77 +227 +72 +70 +207 +52 +50 +206 +51 +47 +217 +65 +60 +224 +75 +68 +228 +79 +72 +223 +74 +67 +217 +64 +56 +215 +58 +51 +215 +54 +46 +220 +46 +45 +245 +50 +58 +251 +45 +58 +248 +42 +55 +245 +39 +52 +245 +41 +52 +248 +48 +58 +255 +62 +67 +255 +74 +74 +224 +49 +46 +222 +51 +44 +220 +51 +44 +221 +53 +44 +225 +52 +45 +231 +52 +47 +237 +52 +47 +240 +51 +47 +244 +48 +50 +247 +47 +50 +249 +46 +49 +248 +45 +48 +246 +46 +46 +241 +47 +45 +235 +50 +45 +226 +55 +45 +217 +61 +49 +201 +59 +45 +179 +49 +36 +177 +55 +44 +186 +67 +61 +236 +121 +118 +255 +141 +141 +255 +136 +141 +255 +123 +135 +255 +113 +129 +246 +104 +120 +243 +96 +114 +243 +83 +107 +244 +69 +98 +249 +58 +92 +249 +55 +90 +243 +58 +92 +235 +72 +99 +205 +80 +96 +160 +74 +77 +102 +52 +43 +89 +66 +48 +95 +87 +64 +99 +106 +73 +102 +124 +78 +107 +136 +82 +116 +145 +91 +119 +149 +95 +120 +153 +96 +123 +158 +100 +122 +160 +99 +118 +158 +96 +115 +155 +93 +114 +156 +92 +115 +155 +92 +116 +156 +93 +118 +157 +94 +119 +158 +95 +123 +159 +97 +122 +161 +98 +121 +161 +98 +122 +164 +98 +124 +167 +98 +123 +166 +95 +120 +166 +91 +120 +167 +89 +122 +169 +89 +123 +170 +90 +126 +170 +95 +131 +173 +101 +133 +172 +107 +135 +169 +109 +137 +167 +115 +137 +165 +117 +132 +157 +115 +124 +148 +114 +117 +137 +112 +111 +128 +109 +103 +120 +102 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +95 +78 +58 +97 +80 +54 +97 +80 +54 +97 +79 +57 +94 +79 +60 +91 +79 +65 +91 +82 +75 +92 +86 +86 +95 +90 +97 +107 +103 +118 +115 +111 +134 +125 +122 +151 +130 +126 +161 +129 +124 +165 +125 +119 +163 +123 +117 +165 +120 +118 +167 +115 +121 +171 +115 +125 +178 +120 +129 +184 +123 +132 +191 +126 +134 +196 +132 +138 +200 +141 +142 +206 +148 +147 +205 +154 +147 +198 +160 +150 +187 +171 +156 +179 +188 +167 +176 +201 +173 +169 +197 +166 +148 +170 +136 +109 +154 +103 +76 +155 +70 +50 +173 +65 +52 +181 +65 +52 +194 +66 +57 +214 +72 +68 +232 +78 +78 +238 +74 +75 +236 +63 +67 +235 +61 +63 +233 +59 +61 +229 +59 +59 +224 +60 +58 +217 +64 +56 +210 +63 +53 +202 +62 +49 +194 +60 +48 +189 +58 +48 +190 +63 +54 +175 +52 +44 +167 +49 +39 +187 +73 +63 +209 +99 +86 +214 +104 +91 +213 +101 +87 +195 +79 +66 +186 +62 +50 +186 +52 +41 +199 +55 +44 +214 +57 +48 +217 +53 +44 +223 +50 +43 +231 +54 +48 +226 +48 +44 +227 +52 +47 +226 +55 +47 +222 +55 +46 +224 +62 +49 +229 +67 +52 +228 +62 +48 +222 +52 +37 +229 +51 +41 +232 +47 +42 +240 +51 +47 +240 +46 +46 +239 +45 +46 +241 +48 +51 +242 +54 +55 +244 +64 +67 +246 +77 +82 +252 +89 +94 +233 +70 +75 +246 +81 +87 +216 +51 +55 +235 +70 +74 +221 +56 +60 +230 +65 +69 +216 +53 +56 +204 +44 +46 +207 +46 +51 +226 +70 +73 +210 +55 +59 +208 +55 +58 +185 +35 +37 +213 +59 +61 +217 +57 +59 +226 +60 +62 +232 +62 +65 +230 +55 +60 +223 +46 +54 +219 +42 +50 +224 +50 +59 +228 +61 +68 +238 +77 +83 +250 +95 +101 +255 +109 +115 +255 +106 +115 +248 +97 +106 +245 +91 +103 +246 +90 +104 +246 +92 +102 +244 +100 +100 +232 +90 +86 +232 +87 +84 +216 +64 +61 +207 +49 +48 +212 +52 +52 +211 +51 +51 +225 +67 +64 +227 +74 +69 +233 +82 +75 +234 +83 +76 +225 +74 +65 +217 +63 +55 +216 +57 +51 +219 +56 +49 +227 +51 +51 +243 +46 +55 +255 +48 +62 +255 +48 +61 +250 +42 +55 +252 +46 +58 +255 +59 +69 +255 +67 +72 +251 +65 +66 +227 +49 +47 +223 +52 +45 +221 +52 +45 +221 +53 +44 +226 +52 +45 +230 +51 +44 +237 +52 +47 +241 +52 +48 +244 +48 +50 +247 +47 +50 +249 +46 +49 +248 +45 +48 +246 +46 +46 +241 +47 +45 +235 +50 +45 +227 +55 +45 +216 +58 +47 +205 +62 +48 +181 +49 +37 +177 +55 +44 +178 +59 +53 +233 +115 +113 +255 +138 +138 +255 +135 +141 +255 +116 +132 +253 +104 +124 +243 +97 +116 +241 +92 +112 +244 +82 +106 +245 +68 +97 +251 +55 +93 +252 +56 +94 +245 +61 +95 +232 +78 +102 +188 +81 +91 +125 +57 +54 +94 +60 +48 +81 +68 +49 +91 +86 +64 +93 +100 +69 +101 +119 +77 +106 +133 +82 +114 +142 +91 +118 +148 +94 +121 +154 +97 +123 +158 +100 +120 +158 +97 +115 +155 +93 +112 +152 +89 +112 +153 +87 +113 +154 +88 +113 +154 +88 +116 +155 +92 +117 +156 +93 +121 +157 +95 +120 +159 +96 +120 +161 +95 +121 +162 +94 +122 +165 +94 +121 +164 +92 +120 +164 +89 +120 +164 +87 +121 +165 +86 +123 +167 +88 +127 +169 +95 +130 +172 +100 +132 +171 +104 +134 +168 +108 +135 +165 +111 +134 +162 +113 +128 +154 +109 +120 +145 +106 +112 +132 +104 +108 +128 +101 +101 +121 +96 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +95 +78 +58 +99 +81 +57 +99 +81 +57 +97 +80 +60 +93 +80 +64 +90 +80 +71 +92 +84 +82 +95 +90 +97 +97 +95 +109 +116 +114 +138 +121 +120 +152 +129 +128 +168 +131 +129 +176 +126 +126 +176 +121 +121 +175 +121 +117 +176 +119 +119 +181 +119 +124 +190 +120 +127 +195 +125 +133 +196 +130 +136 +196 +133 +138 +193 +141 +143 +191 +151 +150 +190 +160 +157 +188 +172 +167 +187 +182 +172 +180 +190 +179 +175 +200 +184 +169 +208 +190 +166 +214 +193 +162 +209 +187 +150 +208 +172 +136 +175 +111 +84 +174 +92 +71 +164 +71 +53 +168 +62 +48 +194 +71 +63 +224 +87 +81 +239 +87 +86 +241 +78 +79 +233 +64 +67 +234 +61 +63 +230 +60 +61 +226 +61 +59 +223 +61 +58 +215 +61 +53 +207 +59 +49 +201 +57 +48 +193 +56 +48 +193 +60 +53 +185 +58 +51 +184 +61 +53 +193 +79 +69 +199 +88 +77 +199 +93 +79 +209 +101 +88 +211 +99 +85 +194 +76 +62 +188 +58 +45 +197 +56 +46 +210 +57 +49 +215 +52 +45 +223 +50 +44 +231 +54 +48 +230 +52 +48 +225 +50 +45 +224 +53 +46 +227 +60 +51 +231 +67 +55 +230 +67 +52 +226 +58 +45 +223 +51 +37 +233 +52 +43 +229 +45 +37 +240 +48 +45 +240 +48 +45 +241 +52 +50 +242 +54 +53 +232 +46 +47 +226 +50 +52 +231 +66 +70 +247 +88 +93 +246 +87 +92 +255 +111 +117 +229 +68 +74 +235 +72 +77 +224 +60 +67 +254 +91 +96 +255 +109 +115 +220 +59 +64 +255 +123 +128 +255 +108 +112 +234 +81 +84 +211 +61 +63 +198 +48 +50 +215 +59 +62 +241 +72 +75 +235 +59 +62 +237 +56 +63 +246 +62 +70 +240 +56 +66 +230 +46 +56 +241 +64 +74 +255 +95 +103 +255 +110 +119 +255 +107 +114 +254 +100 +110 +245 +94 +103 +247 +95 +107 +253 +99 +111 +253 +95 +110 +246 +90 +101 +241 +93 +93 +227 +80 +73 +226 +74 +71 +213 +55 +52 +210 +47 +48 +217 +53 +52 +210 +48 +46 +216 +57 +53 +223 +68 +63 +227 +74 +68 +226 +73 +65 +217 +64 +56 +211 +54 +47 +214 +52 +47 +220 +55 +49 +232 +54 +54 +234 +39 +47 +252 +48 +60 +254 +50 +61 +247 +43 +54 +249 +48 +58 +255 +62 +69 +253 +63 +65 +236 +52 +52 +226 +51 +46 +224 +53 +46 +222 +54 +45 +223 +52 +44 +225 +51 +42 +232 +51 +44 +239 +52 +47 +244 +52 +49 +246 +48 +49 +247 +47 +50 +249 +46 +49 +248 +45 +48 +248 +46 +46 +242 +47 +45 +235 +50 +45 +227 +55 +45 +215 +57 +46 +209 +63 +50 +182 +48 +37 +178 +54 +44 +176 +54 +49 +232 +112 +111 +255 +135 +136 +255 +134 +142 +255 +110 +128 +252 +99 +120 +241 +94 +113 +242 +90 +111 +245 +81 +106 +246 +67 +97 +253 +57 +95 +253 +59 +96 +242 +67 +98 +225 +84 +103 +174 +82 +87 +98 +48 +39 +89 +68 +51 +74 +69 +47 +85 +83 +60 +88 +93 +63 +99 +115 +76 +105 +129 +81 +113 +139 +91 +118 +146 +95 +122 +152 +98 +124 +157 +100 +120 +156 +95 +114 +153 +90 +110 +151 +85 +110 +151 +85 +110 +151 +85 +111 +152 +86 +114 +153 +90 +116 +155 +92 +119 +155 +93 +119 +158 +93 +119 +158 +91 +120 +161 +91 +121 +163 +91 +119 +163 +88 +118 +162 +87 +118 +162 +85 +119 +163 +84 +121 +165 +88 +122 +164 +90 +126 +166 +95 +129 +166 +99 +127 +161 +100 +126 +156 +102 +123 +151 +102 +114 +140 +93 +105 +130 +88 +95 +117 +81 +92 +113 +82 +86 +107 +76 +92 +76 +60 +94 +78 +62 +96 +80 +64 +96 +80 +64 +95 +79 +63 +95 +79 +63 +95 +79 +63 +97 +81 +65 +98 +82 +66 +95 +79 +63 +93 +77 +61 +93 +77 +61 +97 +81 +65 +99 +83 +67 +98 +82 +66 +96 +81 +62 +100 +83 +63 +97 +80 +62 +93 +80 +64 +94 +81 +73 +91 +81 +80 +90 +83 +90 +101 +97 +112 +115 +113 +137 +121 +120 +154 +122 +124 +165 +126 +128 +177 +128 +129 +185 +125 +127 +186 +120 +122 +183 +114 +115 +180 +108 +111 +182 +116 +119 +198 +118 +124 +202 +128 +131 +202 +139 +141 +198 +150 +151 +195 +164 +164 +190 +178 +176 +187 +188 +185 +180 +203 +197 +181 +211 +204 +176 +217 +207 +172 +219 +207 +165 +220 +207 +163 +221 +209 +161 +217 +203 +156 +217 +194 +152 +209 +168 +136 +184 +128 +103 +161 +93 +70 +203 +122 +103 +216 +116 +101 +189 +72 +63 +216 +81 +78 +247 +99 +99 +233 +75 +76 +229 +63 +65 +225 +57 +57 +227 +59 +58 +226 +58 +57 +219 +55 +53 +216 +54 +49 +214 +59 +54 +203 +56 +49 +192 +53 +46 +199 +66 +59 +187 +60 +51 +191 +73 +63 +198 +88 +75 +185 +79 +65 +206 +100 +86 +209 +99 +84 +204 +88 +73 +197 +71 +57 +196 +58 +47 +205 +54 +45 +216 +55 +47 +225 +54 +47 +227 +52 +47 +223 +48 +45 +223 +50 +44 +224 +55 +48 +228 +61 +52 +224 +60 +48 +221 +55 +41 +223 +53 +40 +229 +55 +44 +228 +47 +36 +234 +47 +38 +236 +47 +41 +238 +49 +45 +238 +50 +48 +235 +52 +48 +232 +53 +49 +226 +54 +52 +215 +55 +57 +230 +74 +78 +245 +89 +93 +237 +78 +83 +215 +56 +61 +215 +54 +60 +249 +88 +96 +255 +126 +132 +255 +120 +128 +255 +107 +113 +255 +99 +107 +255 +102 +109 +255 +101 +107 +245 +92 +97 +242 +89 +92 +252 +91 +96 +255 +87 +90 +255 +70 +75 +249 +58 +66 +248 +57 +65 +243 +51 +62 +235 +45 +57 +234 +50 +62 +238 +62 +72 +252 +85 +95 +255 +97 +105 +255 +104 +114 +254 +103 +112 +251 +100 +109 +254 +100 +110 +255 +97 +111 +251 +94 +103 +237 +83 +83 +223 +70 +64 +214 +56 +53 +214 +52 +49 +215 +49 +49 +215 +47 +46 +216 +51 +49 +219 +57 +52 +225 +68 +61 +220 +66 +58 +217 +63 +55 +214 +60 +52 +215 +57 +48 +219 +56 +49 +224 +57 +51 +230 +54 +54 +240 +55 +60 +243 +52 +59 +243 +52 +59 +246 +52 +60 +245 +54 +59 +242 +53 +57 +235 +51 +51 +227 +49 +47 +222 +51 +44 +222 +53 +46 +223 +55 +46 +224 +53 +43 +228 +51 +43 +233 +50 +44 +239 +50 +44 +245 +50 +48 +247 +49 +50 +248 +48 +51 +250 +47 +50 +249 +46 +49 +249 +47 +47 +243 +48 +46 +236 +51 +46 +229 +55 +46 +224 +63 +53 +204 +56 +44 +191 +54 +44 +175 +47 +38 +184 +59 +55 +210 +88 +87 +255 +152 +154 +254 +123 +131 +255 +109 +128 +255 +102 +124 +246 +93 +114 +239 +81 +104 +241 +72 +101 +249 +68 +101 +253 +61 +100 +245 +59 +96 +242 +79 +108 +209 +84 +100 +137 +61 +63 +80 +44 +32 +69 +58 +38 +68 +70 +46 +77 +77 +53 +90 +94 +67 +91 +105 +69 +99 +120 +77 +113 +136 +90 +120 +146 +98 +120 +150 +96 +116 +149 +92 +114 +150 +89 +113 +152 +89 +108 +149 +83 +109 +150 +82 +110 +151 +83 +111 +152 +84 +114 +153 +88 +116 +155 +90 +117 +156 +93 +117 +156 +91 +116 +155 +88 +116 +157 +87 +118 +160 +88 +119 +161 +87 +118 +162 +87 +118 +162 +85 +117 +161 +84 +116 +160 +83 +123 +165 +91 +123 +163 +93 +122 +158 +94 +117 +151 +91 +109 +139 +85 +98 +126 +77 +88 +114 +67 +83 +106 +62 +63 +85 +46 +63 +85 +47 +62 +84 +46 +91 +75 +59 +94 +78 +62 +96 +80 +64 +96 +80 +64 +96 +80 +64 +95 +79 +63 +96 +80 +64 +97 +81 +65 +98 +82 +66 +96 +80 +64 +95 +79 +63 +96 +80 +64 +98 +82 +66 +99 +83 +67 +98 +82 +66 +96 +80 +64 +102 +86 +71 +95 +81 +70 +92 +79 +71 +94 +84 +83 +97 +90 +97 +100 +96 +111 +109 +107 +131 +118 +119 +150 +119 +121 +162 +123 +125 +174 +125 +127 +184 +120 +124 +185 +113 +117 +181 +107 +112 +180 +108 +111 +182 +110 +113 +190 +117 +119 +206 +124 +126 +211 +137 +137 +209 +152 +152 +206 +168 +167 +199 +184 +182 +193 +201 +197 +186 +211 +206 +177 +219 +214 +172 +226 +219 +167 +231 +222 +167 +230 +221 +164 +228 +219 +164 +226 +216 +163 +219 +209 +158 +212 +199 +154 +212 +188 +154 +189 +155 +128 +170 +124 +100 +199 +138 +119 +202 +125 +109 +182 +86 +74 +211 +96 +91 +246 +114 +112 +236 +90 +91 +231 +75 +76 +226 +63 +64 +228 +62 +62 +233 +63 +64 +229 +59 +59 +224 +54 +54 +219 +54 +52 +214 +61 +56 +201 +56 +51 +202 +63 +56 +185 +54 +46 +184 +62 +51 +189 +75 +64 +182 +72 +59 +200 +93 +77 +221 +111 +96 +212 +96 +81 +198 +72 +58 +189 +53 +41 +196 +48 +38 +212 +54 +45 +220 +53 +45 +219 +48 +41 +226 +53 +49 +229 +57 +53 +228 +61 +55 +224 +60 +51 +220 +56 +46 +219 +53 +41 +223 +52 +42 +227 +53 +42 +236 +55 +46 +237 +53 +43 +237 +50 +43 +235 +48 +43 +231 +48 +44 +227 +50 +44 +225 +52 +46 +221 +53 +50 +214 +56 +55 +216 +62 +64 +228 +74 +76 +243 +87 +91 +250 +94 +98 +252 +92 +100 +254 +93 +101 +255 +97 +105 +240 +79 +87 +235 +74 +82 +238 +78 +86 +252 +92 +100 +255 +104 +111 +255 +101 +107 +244 +89 +95 +242 +79 +84 +236 +53 +58 +239 +45 +53 +241 +44 +54 +244 +47 +57 +238 +40 +53 +228 +34 +45 +227 +41 +54 +234 +57 +67 +251 +81 +90 +253 +92 +100 +255 +100 +108 +255 +101 +109 +255 +102 +110 +255 +101 +109 +252 +92 +104 +242 +82 +90 +229 +69 +69 +222 +60 +55 +219 +54 +52 +222 +54 +51 +223 +53 +53 +220 +51 +48 +218 +50 +47 +219 +54 +50 +224 +62 +57 +219 +62 +55 +216 +59 +52 +215 +58 +51 +219 +56 +49 +223 +56 +50 +229 +57 +53 +231 +58 +54 +233 +57 +59 +234 +55 +58 +235 +55 +58 +238 +55 +57 +238 +55 +57 +236 +54 +53 +229 +51 +49 +223 +50 +44 +220 +51 +44 +221 +54 +45 +223 +55 +44 +226 +54 +44 +229 +50 +43 +234 +49 +44 +242 +49 +44 +245 +50 +48 +247 +49 +50 +247 +48 +51 +250 +47 +50 +249 +46 +49 +247 +47 +47 +243 +48 +46 +236 +51 +46 +229 +55 +46 +223 +60 +51 +212 +61 +50 +194 +56 +46 +182 +49 +42 +183 +55 +52 +216 +90 +91 +255 +144 +147 +251 +115 +125 +254 +103 +122 +254 +94 +118 +247 +87 +111 +244 +80 +105 +246 +71 +102 +246 +65 +98 +250 +61 +99 +241 +66 +99 +227 +81 +104 +183 +76 +86 +119 +60 +56 +76 +50 +35 +62 +57 +35 +61 +65 +40 +71 +71 +47 +80 +83 +56 +88 +99 +65 +96 +114 +74 +110 +131 +88 +117 +143 +95 +118 +147 +93 +116 +147 +88 +113 +147 +86 +112 +148 +84 +107 +146 +79 +107 +148 +80 +108 +149 +81 +109 +150 +82 +112 +151 +86 +114 +153 +88 +115 +154 +91 +115 +154 +89 +116 +155 +88 +117 +157 +87 +117 +159 +87 +117 +159 +87 +116 +158 +84 +114 +158 +81 +113 +157 +82 +112 +156 +81 +110 +152 +80 +108 +148 +78 +104 +140 +76 +98 +129 +70 +88 +117 +63 +78 +105 +54 +70 +93 +47 +64 +87 +43 +64 +87 +45 +64 +87 +45 +64 +87 +45 +89 +76 +60 +91 +78 +62 +94 +81 +65 +94 +81 +65 +94 +81 +65 +94 +81 +65 +95 +82 +66 +96 +83 +67 +97 +84 +68 +96 +83 +67 +95 +82 +66 +96 +83 +67 +97 +84 +68 +97 +84 +68 +96 +83 +67 +94 +80 +67 +98 +85 +77 +92 +81 +77 +91 +81 +82 +99 +89 +98 +107 +100 +116 +113 +109 +132 +118 +117 +149 +121 +123 +164 +121 +123 +172 +121 +126 +182 +120 +124 +187 +110 +115 +181 +101 +105 +176 +96 +103 +175 +106 +110 +184 +114 +117 +196 +125 +125 +213 +135 +133 +217 +151 +148 +217 +169 +167 +216 +187 +185 +209 +203 +201 +202 +220 +215 +193 +229 +224 +184 +233 +228 +173 +237 +231 +169 +240 +232 +167 +237 +229 +166 +231 +225 +167 +226 +219 +165 +215 +207 +160 +203 +196 +154 +185 +174 +144 +170 +154 +129 +156 +130 +107 +171 +130 +112 +168 +110 +96 +158 +81 +71 +187 +93 +85 +222 +109 +105 +247 +117 +117 +238 +96 +95 +227 +74 +76 +226 +66 +68 +234 +65 +68 +235 +62 +64 +231 +57 +58 +224 +54 +54 +223 +61 +58 +212 +59 +54 +212 +65 +58 +194 +55 +48 +183 +55 +44 +183 +62 +51 +174 +61 +47 +182 +70 +56 +219 +106 +92 +223 +105 +91 +217 +91 +77 +202 +66 +54 +197 +50 +40 +209 +52 +43 +217 +54 +45 +217 +50 +44 +222 +53 +50 +233 +65 +62 +236 +71 +67 +224 +61 +54 +213 +50 +41 +213 +49 +39 +218 +50 +39 +222 +48 +37 +230 +52 +42 +232 +49 +41 +231 +46 +41 +230 +47 +41 +227 +50 +44 +226 +55 +47 +225 +61 +52 +224 +66 +57 +198 +45 +40 +202 +52 +51 +220 +68 +67 +240 +86 +88 +250 +94 +98 +247 +90 +97 +243 +83 +91 +241 +81 +91 +231 +69 +80 +232 +70 +81 +237 +77 +87 +251 +91 +101 +255 +107 +116 +255 +109 +115 +242 +87 +93 +225 +60 +66 +232 +47 +53 +242 +45 +52 +250 +50 +60 +251 +51 +62 +244 +44 +57 +236 +40 +52 +243 +55 +69 +255 +76 +87 +245 +74 +83 +244 +80 +87 +247 +87 +95 +252 +95 +102 +255 +100 +107 +255 +97 +105 +246 +82 +89 +232 +67 +73 +222 +57 +55 +222 +55 +49 +227 +55 +53 +233 +60 +56 +235 +59 +59 +230 +57 +53 +225 +53 +49 +221 +54 +48 +221 +58 +51 +217 +59 +50 +215 +57 +48 +215 +57 +48 +220 +55 +49 +225 +56 +51 +231 +58 +54 +233 +60 +56 +227 +57 +57 +227 +57 +57 +229 +57 +55 +231 +57 +56 +232 +56 +56 +230 +55 +52 +225 +52 +48 +219 +50 +43 +218 +54 +45 +219 +55 +45 +222 +56 +44 +226 +54 +44 +231 +50 +41 +235 +48 +41 +243 +48 +44 +247 +49 +48 +245 +49 +50 +245 +49 +51 +248 +48 +50 +247 +47 +49 +247 +47 +47 +242 +48 +46 +238 +51 +46 +231 +54 +46 +221 +57 +48 +220 +68 +57 +199 +56 +48 +187 +52 +46 +181 +47 +46 +228 +95 +98 +255 +131 +136 +248 +108 +119 +252 +99 +120 +251 +88 +115 +248 +81 +109 +251 +78 +108 +250 +69 +102 +243 +59 +93 +239 +61 +95 +233 +74 +102 +210 +85 +103 +155 +68 +74 +107 +60 +52 +79 +62 +44 +62 +60 +39 +59 +63 +40 +70 +68 +47 +72 +72 +48 +81 +92 +60 +89 +107 +69 +103 +124 +81 +114 +137 +91 +116 +143 +90 +113 +144 +85 +109 +143 +82 +107 +143 +79 +105 +144 +77 +105 +145 +75 +105 +146 +76 +107 +148 +80 +109 +150 +84 +110 +151 +85 +112 +151 +88 +113 +152 +87 +117 +156 +89 +117 +157 +87 +116 +156 +85 +114 +156 +84 +112 +154 +82 +109 +151 +77 +107 +149 +77 +106 +148 +76 +101 +141 +71 +97 +136 +69 +91 +127 +65 +85 +116 +59 +76 +105 +51 +69 +96 +45 +65 +88 +42 +62 +85 +39 +67 +93 +48 +68 +94 +49 +69 +95 +50 +87 +74 +58 +90 +77 +61 +92 +79 +63 +94 +81 +65 +93 +80 +64 +94 +81 +65 +95 +82 +66 +97 +84 +68 +96 +83 +67 +96 +83 +67 +96 +83 +67 +97 +84 +68 +97 +84 +68 +96 +83 +67 +95 +82 +66 +92 +80 +68 +90 +79 +77 +90 +81 +86 +98 +88 +99 +106 +99 +115 +113 +109 +134 +118 +117 +149 +120 +122 +163 +122 +124 +173 +119 +124 +180 +115 +121 +183 +109 +114 +180 +98 +105 +175 +93 +100 +172 +97 +103 +177 +108 +114 +190 +120 +123 +202 +137 +138 +221 +149 +146 +225 +164 +162 +225 +182 +181 +225 +199 +196 +217 +213 +209 +208 +225 +220 +198 +231 +227 +189 +235 +229 +179 +238 +233 +175 +238 +232 +174 +233 +226 +171 +227 +219 +170 +218 +211 +167 +203 +195 +158 +188 +182 +150 +166 +164 +139 +157 +152 +132 +150 +134 +118 +155 +127 +113 +155 +113 +99 +156 +98 +87 +181 +104 +96 +208 +113 +109 +251 +139 +137 +243 +118 +116 +232 +92 +93 +229 +76 +78 +229 +69 +71 +234 +65 +68 +234 +61 +63 +232 +60 +60 +223 +58 +56 +219 +60 +56 +222 +69 +63 +211 +67 +59 +195 +58 +48 +186 +58 +47 +176 +54 +41 +167 +49 +35 +191 +73 +59 +219 +97 +82 +234 +107 +92 +219 +83 +69 +201 +58 +44 +204 +52 +39 +212 +54 +43 +215 +52 +45 +217 +52 +50 +241 +77 +75 +254 +90 +88 +237 +75 +70 +217 +56 +48 +214 +51 +42 +219 +52 +43 +222 +50 +40 +223 +46 +38 +225 +44 +37 +225 +44 +37 +222 +45 +37 +220 +49 +41 +218 +54 +44 +217 +59 +48 +215 +63 +52 +194 +47 +39 +196 +52 +44 +206 +58 +54 +217 +67 +66 +223 +70 +72 +224 +69 +73 +228 +71 +78 +234 +77 +86 +241 +81 +93 +246 +86 +98 +247 +87 +97 +248 +91 +100 +255 +102 +111 +255 +107 +115 +241 +86 +94 +219 +56 +61 +233 +50 +55 +240 +47 +52 +241 +46 +54 +240 +43 +52 +235 +37 +50 +235 +41 +52 +249 +62 +73 +255 +83 +95 +237 +63 +73 +232 +65 +73 +234 +71 +76 +242 +81 +86 +255 +90 +96 +255 +88 +93 +244 +71 +77 +227 +54 +56 +225 +53 +51 +228 +55 +51 +234 +59 +56 +242 +64 +62 +244 +64 +63 +239 +61 +59 +230 +57 +53 +224 +55 +50 +221 +56 +50 +218 +57 +49 +217 +56 +48 +217 +56 +48 +220 +55 +49 +227 +55 +51 +232 +57 +54 +233 +58 +55 +226 +58 +55 +224 +59 +57 +227 +58 +55 +230 +58 +56 +231 +58 +54 +229 +56 +52 +224 +53 +46 +218 +51 +43 +218 +54 +44 +219 +55 +45 +222 +56 +44 +226 +54 +44 +231 +50 +41 +235 +48 +41 +242 +47 +43 +246 +48 +47 +244 +50 +50 +244 +50 +51 +247 +49 +50 +246 +48 +49 +246 +48 +47 +242 +48 +46 +238 +51 +46 +231 +54 +46 +220 +56 +47 +224 +70 +60 +201 +57 +49 +190 +51 +46 +182 +44 +44 +238 +102 +106 +255 +121 +128 +248 +103 +116 +253 +100 +121 +250 +86 +113 +251 +76 +107 +255 +72 +106 +252 +64 +99 +239 +55 +89 +232 +63 +94 +224 +82 +104 +195 +89 +101 +135 +67 +66 +101 +67 +55 +90 +79 +59 +72 +70 +49 +65 +67 +45 +76 +71 +51 +70 +68 +45 +76 +85 +54 +83 +99 +62 +98 +116 +76 +108 +131 +85 +112 +139 +88 +110 +141 +82 +107 +141 +80 +105 +142 +75 +103 +143 +73 +104 +144 +74 +104 +145 +75 +106 +147 +77 +107 +148 +80 +109 +150 +84 +111 +150 +87 +112 +151 +86 +116 +155 +88 +115 +155 +85 +113 +153 +83 +111 +151 +80 +106 +147 +77 +103 +144 +74 +101 +142 +72 +100 +141 +71 +96 +135 +68 +93 +129 +65 +87 +121 +61 +82 +113 +56 +77 +105 +54 +76 +102 +54 +78 +101 +55 +79 +102 +56 +77 +103 +56 +78 +104 +56 +79 +105 +58 +85 +72 +56 +87 +74 +58 +91 +78 +62 +92 +79 +63 +93 +80 +64 +93 +80 +64 +95 +82 +66 +97 +84 +68 +95 +82 +66 +96 +83 +67 +97 +84 +68 +97 +84 +68 +96 +83 +67 +95 +82 +66 +95 +82 +66 +94 +81 +73 +86 +77 +82 +95 +88 +104 +110 +102 +123 +116 +112 +137 +120 +116 +151 +120 +119 +161 +120 +122 +171 +121 +123 +180 +115 +121 +183 +106 +114 +179 +96 +103 +173 +91 +99 +171 +95 +103 +176 +106 +114 +187 +118 +124 +198 +128 +132 +206 +147 +149 +223 +158 +159 +224 +173 +174 +228 +187 +189 +228 +203 +201 +225 +212 +211 +217 +221 +218 +209 +225 +223 +202 +229 +224 +194 +230 +226 +191 +228 +222 +188 +224 +215 +182 +218 +208 +181 +206 +198 +175 +190 +182 +163 +174 +167 +151 +155 +153 +140 +143 +141 +128 +140 +132 +121 +141 +123 +113 +147 +117 +107 +157 +114 +105 +169 +109 +101 +188 +111 +105 +230 +137 +132 +237 +129 +126 +240 +116 +114 +240 +102 +100 +238 +88 +89 +237 +79 +78 +235 +69 +69 +233 +65 +64 +227 +58 +55 +224 +59 +55 +228 +66 +61 +222 +69 +63 +204 +60 +51 +198 +61 +51 +196 +66 +53 +175 +49 +35 +174 +48 +34 +199 +73 +59 +220 +88 +75 +214 +78 +64 +204 +61 +47 +206 +56 +42 +208 +54 +42 +209 +51 +42 +214 +52 +50 +245 +85 +85 +255 +107 +104 +250 +93 +88 +227 +68 +62 +220 +59 +51 +223 +59 +50 +227 +56 +48 +226 +52 +45 +227 +50 +44 +226 +49 +43 +221 +48 +41 +212 +48 +39 +205 +47 +36 +198 +47 +36 +194 +48 +35 +197 +57 +44 +192 +52 +39 +193 +51 +41 +203 +58 +53 +215 +67 +65 +219 +69 +71 +219 +66 +71 +218 +64 +72 +225 +69 +80 +236 +80 +91 +242 +86 +97 +242 +86 +97 +249 +93 +104 +255 +101 +109 +241 +87 +95 +222 +63 +68 +233 +59 +60 +237 +53 +55 +237 +51 +56 +239 +50 +56 +242 +50 +61 +247 +57 +67 +255 +72 +83 +255 +86 +95 +229 +53 +63 +222 +51 +59 +223 +54 +59 +234 +65 +68 +249 +74 +79 +253 +72 +77 +244 +59 +65 +233 +49 +51 +232 +53 +49 +235 +57 +53 +239 +60 +56 +242 +60 +57 +243 +59 +57 +240 +58 +55 +233 +55 +51 +226 +55 +48 +223 +59 +50 +220 +59 +49 +219 +58 +48 +220 +57 +48 +223 +56 +50 +228 +55 +51 +232 +54 +52 +233 +55 +53 +230 +58 +56 +228 +59 +56 +230 +58 +56 +232 +58 +57 +232 +59 +55 +230 +57 +53 +225 +54 +47 +220 +51 +44 +219 +55 +45 +220 +56 +46 +223 +57 +45 +225 +55 +42 +229 +51 +41 +233 +49 +41 +241 +48 +41 +244 +49 +45 +243 +51 +50 +241 +51 +51 +244 +50 +50 +244 +48 +49 +244 +49 +47 +242 +48 +46 +238 +51 +46 +231 +54 +46 +222 +55 +47 +224 +67 +58 +202 +55 +48 +192 +49 +45 +192 +49 +51 +247 +106 +112 +255 +113 +122 +249 +103 +116 +248 +95 +116 +246 +82 +109 +252 +68 +102 +255 +63 +100 +255 +59 +99 +242 +58 +94 +228 +71 +100 +216 +91 +109 +171 +86 +91 +119 +69 +62 +100 +74 +61 +97 +89 +70 +84 +79 +59 +75 +73 +52 +80 +73 +54 +71 +69 +46 +71 +80 +51 +76 +92 +56 +90 +108 +70 +102 +124 +78 +109 +133 +83 +109 +138 +82 +108 +140 +77 +104 +141 +74 +102 +142 +72 +103 +143 +72 +103 +145 +73 +105 +146 +76 +106 +147 +79 +108 +149 +83 +110 +149 +86 +111 +150 +85 +116 +153 +86 +115 +152 +85 +110 +149 +82 +106 +146 +76 +102 +143 +75 +99 +140 +72 +97 +138 +70 +95 +136 +70 +90 +129 +66 +88 +124 +63 +83 +116 +59 +80 +110 +56 +79 +107 +58 +82 +108 +61 +87 +110 +64 +90 +113 +67 +85 +111 +63 +85 +112 +61 +85 +111 +63 +82 +69 +53 +85 +72 +56 +88 +75 +59 +90 +77 +61 +91 +78 +62 +92 +79 +63 +94 +81 +65 +96 +83 +67 +96 +83 +67 +97 +84 +68 +97 +84 +68 +97 +84 +68 +96 +83 +67 +96 +83 +67 +98 +85 +69 +97 +86 +80 +94 +86 +99 +106 +101 +124 +121 +117 +144 +125 +121 +154 +122 +121 +161 +120 +121 +169 +118 +121 +176 +115 +119 +180 +106 +114 +179 +99 +106 +176 +91 +99 +171 +93 +101 +174 +104 +112 +185 +118 +126 +199 +129 +135 +209 +136 +141 +209 +153 +157 +220 +163 +166 +221 +175 +179 +226 +187 +191 +228 +198 +199 +227 +207 +206 +224 +212 +211 +219 +215 +213 +214 +217 +214 +209 +217 +213 +204 +215 +208 +198 +210 +201 +192 +204 +195 +190 +197 +186 +184 +180 +168 +168 +163 +155 +153 +141 +137 +134 +124 +121 +116 +124 +116 +113 +120 +107 +101 +130 +107 +101 +143 +110 +103 +144 +97 +91 +157 +96 +91 +192 +115 +109 +215 +122 +117 +237 +128 +123 +249 +126 +121 +253 +115 +112 +250 +100 +99 +243 +85 +84 +237 +73 +71 +237 +68 +63 +234 +62 +58 +225 +60 +54 +224 +65 +59 +209 +58 +49 +211 +67 +58 +221 +84 +74 +194 +62 +50 +184 +54 +41 +189 +57 +44 +194 +61 +46 +200 +63 +47 +207 +66 +49 +215 +67 +53 +214 +64 +49 +209 +55 +45 +208 +50 +47 +234 +76 +77 +250 +95 +93 +242 +87 +83 +223 +68 +63 +217 +58 +52 +219 +56 +49 +224 +55 +48 +230 +57 +51 +231 +57 +50 +231 +57 +50 +226 +58 +49 +218 +57 +47 +209 +57 +44 +202 +56 +43 +196 +56 +41 +176 +40 +24 +184 +51 +34 +200 +64 +50 +211 +73 +62 +210 +68 +64 +203 +59 +58 +204 +55 +59 +207 +58 +64 +211 +57 +67 +227 +73 +83 +237 +86 +95 +240 +89 +98 +244 +93 +102 +246 +95 +104 +232 +83 +89 +218 +63 +67 +229 +64 +62 +236 +63 +59 +243 +64 +67 +253 +70 +74 +255 +76 +84 +255 +81 +89 +255 +84 +93 +255 +85 +94 +226 +51 +58 +221 +46 +53 +221 +46 +51 +231 +55 +58 +245 +60 +65 +249 +58 +63 +248 +52 +56 +244 +48 +50 +237 +52 +50 +239 +57 +53 +240 +56 +54 +237 +52 +50 +235 +50 +48 +234 +50 +48 +231 +52 +48 +225 +52 +46 +227 +60 +52 +224 +61 +52 +223 +60 +51 +222 +59 +50 +225 +56 +51 +228 +55 +51 +232 +52 +51 +232 +52 +51 +232 +56 +56 +231 +57 +56 +232 +56 +56 +235 +57 +57 +235 +57 +55 +233 +55 +53 +226 +53 +47 +222 +51 +44 +219 +55 +45 +220 +56 +44 +221 +58 +43 +223 +55 +42 +227 +50 +40 +231 +48 +40 +239 +48 +40 +242 +49 +44 +241 +52 +50 +240 +52 +51 +243 +51 +50 +243 +49 +49 +243 +49 +47 +241 +49 +46 +236 +51 +46 +231 +54 +46 +224 +57 +49 +217 +60 +51 +204 +55 +49 +193 +48 +45 +209 +64 +67 +255 +110 +117 +253 +107 +117 +247 +99 +113 +237 +84 +105 +241 +74 +102 +250 +62 +97 +255 +55 +94 +255 +55 +98 +248 +64 +100 +227 +79 +105 +200 +92 +105 +139 +71 +70 +106 +70 +58 +93 +76 +60 +93 +86 +67 +88 +81 +62 +81 +74 +55 +79 +71 +52 +73 +68 +46 +68 +74 +46 +71 +85 +50 +83 +99 +62 +94 +115 +72 +103 +127 +77 +106 +135 +79 +106 +138 +75 +103 +140 +71 +103 +140 +70 +102 +142 +71 +102 +144 +72 +103 +144 +74 +105 +146 +78 +107 +148 +82 +109 +148 +85 +109 +148 +85 +113 +149 +85 +111 +148 +81 +106 +145 +78 +103 +142 +75 +99 +140 +72 +96 +137 +69 +95 +136 +70 +94 +134 +71 +92 +130 +69 +91 +126 +68 +87 +120 +65 +86 +114 +63 +85 +111 +64 +89 +112 +66 +93 +114 +71 +94 +117 +71 +90 +114 +66 +88 +115 +64 +88 +115 +64 +78 +66 +50 +81 +69 +53 +85 +73 +57 +87 +75 +59 +88 +76 +60 +90 +78 +62 +92 +80 +64 +94 +82 +66 +97 +85 +69 +98 +86 +70 +98 +86 +70 +97 +85 +69 +95 +83 +67 +97 +85 +69 +102 +90 +74 +104 +93 +89 +110 +103 +119 +117 +112 +142 +124 +120 +153 +123 +121 +160 +119 +120 +166 +118 +119 +173 +112 +117 +175 +106 +111 +175 +97 +104 +172 +94 +102 +174 +95 +103 +176 +101 +109 +182 +112 +120 +192 +125 +133 +205 +137 +144 +216 +143 +151 +214 +153 +161 +210 +161 +168 +210 +170 +178 +217 +180 +186 +222 +186 +191 +223 +192 +193 +224 +195 +195 +223 +199 +197 +221 +198 +194 +217 +197 +192 +212 +193 +186 +204 +188 +179 +196 +187 +176 +193 +181 +168 +186 +166 +153 +170 +150 +139 +153 +139 +132 +139 +117 +111 +113 +119 +110 +111 +115 +101 +101 +122 +102 +101 +137 +109 +106 +133 +94 +89 +150 +99 +95 +155 +90 +84 +183 +103 +96 +214 +117 +110 +237 +124 +118 +252 +125 +119 +255 +120 +115 +254 +106 +102 +249 +92 +87 +252 +83 +78 +245 +72 +66 +230 +61 +54 +231 +68 +61 +216 +59 +52 +219 +71 +61 +234 +92 +82 +197 +59 +48 +196 +60 +48 +189 +55 +43 +190 +54 +40 +199 +62 +46 +209 +68 +51 +212 +66 +51 +212 +65 +49 +215 +65 +51 +210 +56 +54 +216 +62 +62 +221 +67 +67 +220 +66 +64 +214 +61 +55 +213 +56 +49 +216 +55 +47 +222 +55 +47 +229 +58 +51 +230 +57 +51 +229 +58 +51 +226 +59 +51 +219 +62 +53 +213 +65 +53 +209 +69 +56 +204 +71 +54 +174 +45 +24 +188 +59 +37 +205 +74 +56 +209 +76 +61 +198 +61 +53 +187 +48 +43 +192 +48 +48 +202 +57 +62 +215 +65 +74 +226 +76 +85 +236 +86 +97 +240 +90 +101 +239 +92 +100 +236 +89 +97 +223 +76 +82 +212 +62 +64 +209 +52 +47 +218 +53 +47 +227 +57 +57 +237 +63 +64 +245 +66 +72 +247 +68 +74 +244 +64 +73 +239 +62 +70 +228 +51 +59 +225 +48 +54 +230 +49 +54 +240 +55 +60 +247 +54 +57 +249 +49 +52 +254 +45 +50 +253 +49 +52 +239 +50 +48 +240 +57 +53 +240 +55 +52 +236 +48 +46 +232 +44 +42 +231 +48 +44 +230 +51 +46 +224 +51 +44 +228 +61 +53 +224 +61 +52 +224 +61 +52 +224 +60 +51 +227 +58 +53 +230 +57 +53 +234 +54 +53 +236 +54 +53 +236 +53 +55 +236 +53 +55 +237 +53 +55 +238 +54 +56 +238 +54 +54 +235 +53 +52 +228 +50 +46 +222 +49 +43 +222 +55 +46 +221 +57 +45 +221 +58 +43 +223 +55 +42 +225 +52 +38 +230 +49 +38 +237 +49 +40 +241 +49 +44 +240 +52 +50 +238 +53 +51 +241 +52 +50 +242 +50 +49 +243 +49 +47 +241 +49 +46 +236 +51 +46 +231 +54 +46 +226 +59 +51 +210 +52 +43 +210 +58 +53 +198 +50 +48 +231 +85 +88 +255 +112 +120 +249 +99 +110 +241 +90 +105 +227 +75 +96 +239 +72 +102 +253 +58 +98 +255 +49 +93 +255 +54 +98 +253 +67 +104 +219 +77 +101 +177 +80 +89 +106 +53 +47 +94 +71 +55 +88 +75 +58 +85 +78 +59 +89 +81 +62 +85 +74 +56 +76 +64 +48 +73 +68 +48 +64 +70 +44 +65 +79 +46 +75 +91 +54 +88 +106 +64 +98 +120 +71 +102 +129 +74 +104 +136 +73 +102 +139 +70 +101 +138 +68 +99 +139 +66 +99 +141 +69 +101 +142 +72 +103 +144 +76 +104 +145 +79 +105 +145 +82 +107 +146 +83 +110 +146 +82 +108 +144 +80 +104 +143 +78 +100 +139 +74 +97 +138 +72 +95 +136 +70 +95 +135 +72 +95 +135 +72 +95 +133 +72 +95 +130 +72 +93 +126 +71 +93 +121 +70 +93 +119 +72 +96 +119 +75 +99 +120 +79 +99 +122 +78 +92 +116 +66 +90 +117 +64 +90 +117 +64 +74 +67 +51 +77 +70 +54 +81 +72 +57 +84 +75 +60 +87 +75 +61 +89 +77 +63 +92 +79 +63 +94 +81 +65 +100 +87 +70 +101 +88 +71 +100 +88 +72 +98 +86 +70 +95 +85 +73 +97 +87 +77 +103 +94 +85 +108 +99 +102 +119 +114 +137 +121 +117 +154 +120 +118 +158 +116 +115 +159 +114 +114 +164 +116 +117 +173 +108 +112 +175 +98 +103 +169 +90 +97 +169 +95 +101 +175 +102 +108 +184 +109 +115 +191 +118 +124 +200 +129 +135 +211 +143 +147 +221 +151 +156 +222 +155 +161 +211 +160 +167 +209 +169 +174 +216 +174 +179 +221 +177 +180 +223 +178 +179 +223 +180 +179 +223 +182 +179 +222 +181 +176 +217 +179 +172 +213 +174 +166 +203 +171 +161 +196 +170 +159 +193 +164 +153 +185 +153 +140 +170 +136 +126 +150 +126 +120 +132 +102 +97 +103 +108 +99 +102 +100 +88 +90 +108 +90 +88 +124 +99 +95 +123 +86 +80 +147 +98 +93 +140 +77 +70 +162 +85 +77 +187 +97 +88 +212 +108 +99 +238 +121 +114 +255 +129 +122 +255 +124 +119 +255 +112 +106 +254 +97 +92 +247 +84 +79 +233 +71 +66 +238 +79 +73 +221 +66 +61 +222 +71 +64 +234 +87 +79 +186 +44 +34 +190 +49 +39 +190 +52 +39 +199 +62 +46 +209 +69 +54 +203 +62 +45 +193 +50 +34 +202 +55 +39 +219 +69 +55 +222 +69 +63 +211 +57 +55 +204 +51 +46 +205 +53 +48 +212 +59 +53 +215 +61 +53 +221 +60 +52 +225 +61 +52 +228 +59 +52 +228 +57 +50 +222 +53 +46 +215 +52 +43 +207 +53 +41 +202 +56 +43 +197 +60 +44 +194 +63 +45 +212 +83 +62 +200 +71 +50 +189 +60 +41 +190 +58 +45 +195 +61 +50 +196 +59 +53 +194 +55 +52 +194 +52 +51 +220 +75 +78 +221 +76 +81 +225 +80 +85 +229 +84 +89 +232 +89 +93 +229 +86 +88 +220 +77 +79 +212 +67 +64 +203 +52 +43 +212 +54 +43 +218 +53 +47 +224 +52 +50 +228 +49 +52 +232 +49 +54 +233 +48 +56 +231 +46 +54 +238 +51 +62 +237 +50 +59 +244 +52 +63 +253 +56 +66 +255 +51 +62 +253 +41 +53 +255 +40 +51 +255 +46 +57 +248 +45 +51 +249 +53 +55 +249 +53 +57 +240 +46 +47 +235 +42 +43 +233 +48 +46 +232 +53 +49 +226 +53 +47 +227 +60 +52 +224 +61 +52 +224 +61 +52 +225 +61 +52 +228 +59 +54 +231 +58 +54 +235 +55 +54 +238 +54 +54 +236 +52 +54 +235 +51 +53 +236 +50 +53 +237 +51 +52 +237 +53 +53 +234 +52 +49 +227 +49 +45 +219 +48 +40 +222 +56 +44 +221 +58 +43 +221 +58 +43 +222 +56 +40 +224 +52 +38 +227 +51 +36 +233 +51 +38 +236 +52 +42 +238 +53 +48 +238 +53 +50 +240 +52 +50 +240 +51 +47 +242 +50 +47 +239 +50 +44 +235 +52 +44 +231 +54 +46 +228 +61 +52 +205 +47 +38 +215 +62 +57 +202 +52 +53 +249 +98 +103 +255 +112 +121 +246 +91 +105 +237 +80 +99 +228 +70 +93 +243 +72 +104 +255 +61 +101 +255 +50 +93 +255 +55 +97 +245 +71 +104 +201 +74 +93 +148 +66 +70 +83 +43 +35 +88 +72 +56 +84 +75 +58 +79 +72 +54 +89 +80 +63 +83 +74 +57 +69 +64 +45 +71 +70 +49 +61 +67 +39 +64 +74 +40 +73 +85 +49 +83 +100 +58 +95 +114 +69 +101 +125 +73 +103 +132 +74 +101 +136 +72 +99 +136 +67 +97 +137 +66 +98 +138 +67 +99 +141 +69 +101 +142 +72 +102 +143 +77 +104 +143 +80 +105 +144 +81 +108 +144 +80 +107 +144 +77 +102 +141 +74 +99 +138 +73 +97 +136 +71 +96 +135 +70 +96 +135 +72 +96 +134 +73 +94 +129 +71 +94 +127 +70 +95 +125 +71 +96 +124 +73 +97 +123 +75 +100 +123 +77 +102 +124 +78 +102 +126 +78 +93 +120 +67 +92 +121 +63 +93 +122 +66 +68 +66 +54 +70 +68 +56 +74 +70 +59 +80 +71 +62 +82 +72 +62 +87 +73 +62 +93 +77 +62 +95 +79 +63 +96 +81 +62 +97 +82 +63 +96 +83 +66 +95 +86 +71 +98 +89 +82 +103 +98 +95 +111 +106 +110 +115 +111 +126 +119 +113 +147 +122 +116 +160 +124 +121 +168 +121 +119 +169 +112 +112 +166 +103 +103 +163 +96 +97 +162 +92 +95 +164 +96 +98 +173 +102 +104 +181 +111 +112 +192 +121 +122 +204 +132 +130 +214 +141 +139 +223 +150 +146 +231 +156 +153 +232 +160 +158 +223 +161 +160 +218 +163 +162 +219 +164 +163 +220 +166 +163 +220 +165 +162 +219 +165 +160 +216 +164 +159 +213 +165 +158 +210 +163 +156 +207 +162 +154 +201 +162 +153 +198 +159 +150 +193 +153 +142 +184 +142 +131 +171 +131 +124 +155 +113 +111 +124 +104 +103 +108 +99 +95 +96 +102 +90 +90 +108 +89 +85 +115 +86 +80 +128 +85 +78 +143 +86 +79 +150 +82 +73 +169 +89 +80 +181 +88 +80 +192 +91 +83 +216 +107 +100 +235 +122 +114 +246 +131 +124 +255 +139 +134 +249 +117 +113 +255 +117 +115 +237 +95 +93 +223 +80 +76 +217 +69 +65 +239 +90 +84 +204 +55 +49 +197 +50 +42 +196 +54 +42 +195 +55 +40 +192 +55 +39 +195 +55 +38 +198 +57 +40 +202 +59 +43 +208 +60 +46 +213 +63 +49 +210 +56 +46 +214 +60 +50 +215 +63 +52 +211 +59 +48 +205 +53 +40 +205 +51 +39 +216 +58 +47 +226 +64 +53 +224 +57 +48 +225 +57 +48 +222 +55 +46 +215 +55 +43 +207 +55 +41 +201 +58 +42 +198 +63 +44 +196 +65 +47 +194 +61 +46 +198 +64 +52 +203 +69 +58 +205 +71 +60 +204 +67 +59 +197 +60 +52 +187 +50 +44 +182 +43 +38 +199 +60 +55 +208 +69 +66 +217 +79 +76 +224 +86 +83 +227 +89 +86 +225 +88 +82 +216 +79 +73 +208 +67 +58 +205 +58 +42 +213 +58 +40 +220 +56 +44 +227 +53 +46 +232 +46 +47 +237 +42 +50 +240 +40 +51 +244 +39 +54 +251 +44 +62 +250 +43 +63 +251 +42 +63 +253 +41 +63 +255 +39 +63 +255 +38 +63 +255 +36 +60 +255 +35 +60 +255 +35 +55 +255 +38 +56 +255 +42 +59 +254 +44 +57 +244 +44 +54 +237 +46 +53 +233 +53 +54 +232 +60 +58 +221 +56 +52 +221 +58 +51 +222 +59 +52 +224 +59 +53 +227 +58 +53 +230 +57 +53 +233 +55 +51 +235 +53 +52 +235 +51 +53 +236 +52 +54 +235 +53 +52 +233 +53 +52 +231 +53 +51 +226 +53 +47 +221 +53 +44 +219 +53 +41 +220 +56 +44 +219 +57 +42 +220 +57 +40 +222 +57 +38 +223 +56 +38 +226 +55 +37 +227 +54 +37 +230 +52 +38 +236 +53 +45 +237 +52 +47 +240 +53 +48 +241 +52 +46 +241 +53 +44 +237 +53 +43 +232 +54 +42 +228 +56 +44 +222 +58 +48 +212 +55 +46 +211 +58 +53 +215 +62 +64 +255 +109 +117 +255 +98 +113 +248 +85 +106 +241 +75 +99 +247 +79 +105 +236 +58 +90 +249 +57 +94 +255 +63 +103 +245 +64 +99 +230 +80 +107 +178 +73 +87 +97 +36 +35 +71 +43 +32 +65 +56 +39 +75 +68 +52 +82 +76 +60 +79 +73 +57 +66 +67 +49 +59 +68 +47 +60 +73 +47 +65 +72 +38 +69 +75 +37 +75 +83 +46 +83 +93 +56 +91 +107 +68 +97 +118 +75 +100 +126 +78 +100 +131 +74 +98 +134 +70 +96 +136 +66 +97 +137 +64 +99 +139 +66 +101 +141 +70 +104 +144 +74 +108 +144 +80 +109 +145 +81 +108 +145 +76 +105 +142 +72 +103 +140 +71 +102 +139 +72 +102 +138 +74 +101 +137 +73 +99 +133 +72 +97 +131 +71 +100 +131 +74 +100 +129 +73 +98 +127 +71 +99 +126 +71 +100 +127 +74 +100 +127 +72 +101 +126 +71 +97 +125 +67 +91 +123 +60 +92 +127 +61 +95 +130 +66 +61 +63 +52 +63 +65 +54 +70 +67 +60 +74 +69 +63 +80 +69 +63 +84 +71 +62 +91 +75 +62 +93 +77 +61 +96 +79 +59 +96 +81 +60 +94 +83 +65 +94 +86 +73 +99 +91 +88 +104 +99 +105 +110 +108 +121 +115 +111 +134 +116 +112 +149 +118 +112 +158 +116 +112 +162 +112 +109 +162 +103 +102 +159 +97 +97 +159 +93 +94 +161 +92 +92 +164 +101 +100 +176 +107 +106 +186 +116 +114 +197 +125 +123 +207 +134 +130 +217 +141 +137 +224 +148 +142 +230 +152 +147 +229 +155 +149 +221 +156 +151 +217 +157 +152 +218 +158 +153 +219 +158 +151 +218 +157 +150 +217 +156 +150 +214 +155 +149 +211 +158 +150 +210 +156 +148 +205 +156 +147 +200 +155 +147 +198 +154 +145 +192 +147 +138 +183 +136 +127 +170 +128 +121 +154 +115 +109 +123 +107 +101 +105 +100 +94 +94 +101 +91 +89 +107 +90 +83 +113 +86 +77 +124 +84 +74 +141 +84 +75 +157 +84 +75 +178 +91 +82 +187 +88 +82 +195 +88 +82 +211 +102 +97 +221 +114 +106 +224 +120 +111 +235 +126 +119 +251 +136 +133 +255 +135 +133 +247 +117 +115 +238 +103 +100 +227 +85 +83 +235 +90 +85 +199 +50 +44 +194 +47 +37 +197 +55 +41 +195 +55 +38 +192 +55 +37 +193 +56 +38 +196 +56 +39 +200 +59 +42 +207 +59 +45 +211 +61 +47 +213 +57 +44 +213 +57 +44 +211 +58 +44 +210 +58 +44 +209 +57 +43 +209 +57 +43 +212 +56 +43 +216 +56 +44 +223 +59 +49 +224 +57 +48 +220 +56 +46 +214 +56 +44 +207 +57 +42 +200 +57 +40 +193 +58 +38 +190 +57 +38 +190 +54 +42 +193 +56 +48 +198 +61 +53 +201 +64 +56 +202 +65 +57 +200 +63 +55 +197 +60 +52 +194 +57 +49 +191 +52 +45 +199 +62 +54 +209 +72 +64 +216 +79 +71 +218 +81 +73 +215 +78 +70 +204 +67 +59 +195 +55 +42 +202 +55 +37 +211 +56 +36 +221 +55 +41 +229 +52 +44 +237 +47 +47 +244 +43 +51 +249 +41 +55 +253 +40 +58 +255 +43 +64 +255 +42 +65 +255 +41 +65 +255 +38 +65 +255 +35 +64 +255 +33 +60 +255 +30 +61 +255 +29 +58 +255 +30 +57 +255 +31 +56 +255 +36 +58 +255 +41 +59 +247 +45 +57 +241 +50 +58 +234 +55 +58 +230 +60 +60 +220 +57 +52 +220 +58 +53 +222 +59 +52 +224 +59 +53 +227 +58 +53 +230 +57 +53 +233 +55 +51 +235 +53 +50 +235 +51 +53 +236 +52 +54 +235 +53 +52 +232 +54 +52 +228 +55 +49 +223 +54 +47 +220 +53 +44 +217 +53 +41 +219 +57 +42 +219 +57 +42 +220 +57 +40 +220 +57 +38 +222 +57 +38 +223 +56 +37 +225 +56 +37 +227 +54 +37 +231 +53 +43 +234 +51 +43 +235 +52 +44 +235 +53 +42 +235 +53 +42 +232 +54 +40 +228 +55 +41 +223 +55 +42 +221 +61 +49 +209 +52 +43 +207 +53 +51 +239 +84 +88 +255 +102 +114 +255 +91 +111 +241 +73 +98 +249 +76 +104 +248 +69 +99 +247 +64 +95 +244 +56 +91 +243 +62 +97 +239 +78 +109 +205 +76 +98 +139 +56 +64 +89 +41 +37 +69 +51 +39 +60 +54 +40 +62 +59 +44 +67 +64 +49 +67 +66 +48 +61 +64 +45 +56 +68 +46 +58 +73 +44 +60 +68 +29 +75 +80 +39 +92 +98 +60 +101 +111 +74 +104 +118 +82 +101 +122 +81 +100 +126 +79 +100 +130 +76 +97 +131 +70 +97 +134 +65 +97 +137 +64 +99 +140 +64 +103 +141 +68 +105 +142 +72 +107 +144 +77 +108 +145 +78 +108 +145 +75 +106 +144 +71 +104 +141 +72 +102 +139 +70 +103 +138 +74 +102 +137 +73 +102 +133 +74 +100 +131 +72 +102 +131 +75 +100 +129 +73 +100 +127 +72 +100 +128 +70 +101 +129 +71 +101 +129 +71 +102 +127 +69 +98 +126 +65 +93 +128 +62 +95 +132 +63 +98 +135 +66 +54 +57 +46 +58 +60 +49 +63 +63 +55 +68 +65 +58 +75 +66 +59 +79 +69 +60 +86 +72 +61 +89 +76 +60 +94 +79 +60 +92 +79 +60 +92 +83 +66 +94 +87 +77 +99 +93 +93 +104 +101 +108 +111 +109 +123 +115 +113 +137 +115 +111 +148 +113 +107 +153 +106 +102 +152 +99 +96 +149 +92 +91 +148 +90 +90 +152 +92 +93 +160 +92 +95 +166 +104 +106 +181 +110 +111 +191 +119 +120 +202 +127 +128 +210 +134 +132 +216 +138 +136 +220 +143 +139 +224 +145 +142 +221 +147 +144 +215 +147 +144 +211 +147 +144 +211 +147 +144 +211 +148 +142 +212 +147 +141 +211 +147 +140 +208 +146 +139 +206 +149 +140 +205 +147 +139 +199 +148 +139 +194 +148 +140 +191 +147 +139 +186 +140 +133 +175 +131 +123 +162 +126 +115 +145 +121 +103 +119 +115 +96 +102 +103 +91 +91 +100 +91 +86 +100 +91 +82 +104 +88 +75 +117 +85 +72 +135 +83 +72 +166 +89 +81 +190 +95 +89 +203 +91 +89 +208 +88 +87 +218 +100 +98 +222 +109 +105 +220 +113 +107 +226 +119 +113 +251 +138 +132 +255 +138 +134 +255 +133 +129 +255 +125 +121 +247 +110 +104 +238 +97 +88 +196 +52 +43 +192 +50 +38 +196 +56 +41 +193 +58 +39 +192 +57 +38 +192 +57 +37 +194 +57 +38 +198 +59 +40 +204 +58 +43 +208 +58 +44 +214 +58 +45 +211 +53 +41 +206 +53 +39 +208 +56 +42 +212 +62 +47 +212 +62 +47 +206 +54 +40 +203 +47 +34 +218 +58 +46 +218 +56 +45 +217 +55 +44 +214 +56 +44 +208 +58 +43 +201 +58 +41 +194 +57 +38 +190 +55 +36 +189 +53 +41 +192 +54 +44 +194 +56 +46 +196 +58 +48 +199 +61 +51 +202 +64 +54 +203 +65 +55 +204 +66 +56 +199 +58 +49 +202 +64 +54 +207 +69 +59 +208 +70 +60 +210 +72 +62 +209 +71 +61 +202 +64 +54 +197 +55 +43 +204 +54 +37 +214 +54 +38 +223 +55 +44 +231 +52 +47 +241 +48 +51 +246 +45 +53 +251 +43 +57 +255 +42 +60 +252 +39 +59 +252 +39 +61 +251 +37 +61 +249 +35 +59 +251 +33 +58 +250 +30 +55 +252 +28 +55 +254 +27 +54 +255 +29 +55 +255 +30 +53 +254 +35 +55 +253 +42 +59 +247 +50 +60 +242 +55 +62 +236 +57 +60 +229 +59 +59 +220 +57 +52 +220 +58 +53 +222 +59 +52 +224 +59 +53 +229 +57 +53 +231 +56 +53 +233 +55 +51 +235 +53 +50 +237 +51 +54 +238 +52 +55 +237 +53 +53 +234 +54 +53 +229 +54 +49 +225 +54 +47 +220 +53 +44 +216 +52 +40 +218 +56 +41 +217 +57 +41 +218 +57 +39 +219 +56 +37 +221 +56 +37 +222 +55 +36 +224 +55 +36 +225 +54 +37 +225 +53 +39 +226 +52 +41 +227 +53 +42 +227 +54 +40 +227 +54 +40 +225 +55 +40 +221 +55 +41 +218 +56 +43 +219 +61 +50 +204 +50 +42 +211 +56 +54 +255 +108 +112 +255 +93 +108 +249 +81 +104 +237 +62 +91 +255 +75 +108 +247 +59 +92 +255 +66 +100 +240 +56 +90 +233 +65 +98 +227 +87 +113 +171 +64 +82 +101 +34 +41 +81 +46 +42 +65 +52 +43 +52 +53 +39 +53 +54 +38 +58 +59 +41 +63 +62 +42 +62 +61 +40 +60 +64 +41 +62 +69 +38 +62 +70 +29 +88 +97 +52 +115 +126 +84 +128 +140 +100 +119 +135 +96 +104 +127 +83 +97 +125 +76 +97 +128 +71 +96 +131 +67 +96 +133 +63 +97 +137 +64 +99 +140 +64 +104 +142 +69 +106 +143 +74 +107 +144 +77 +108 +145 +78 +110 +147 +77 +107 +145 +72 +104 +141 +72 +103 +140 +71 +104 +139 +75 +104 +139 +75 +102 +136 +76 +100 +134 +74 +101 +132 +75 +100 +131 +74 +99 +128 +70 +100 +129 +71 +102 +130 +72 +102 +130 +71 +101 +129 +70 +98 +128 +66 +99 +134 +68 +101 +138 +69 +104 +141 +72 +50 +53 +42 +53 +56 +45 +59 +60 +52 +65 +62 +55 +71 +64 +58 +75 +66 +59 +82 +69 +60 +86 +74 +60 +88 +76 +60 +89 +77 +61 +89 +81 +68 +94 +87 +79 +99 +94 +98 +105 +103 +114 +111 +110 +128 +114 +111 +140 +114 +109 +149 +106 +103 +148 +96 +94 +143 +87 +87 +139 +84 +85 +142 +87 +88 +152 +92 +95 +162 +97 +99 +173 +108 +110 +187 +114 +115 +195 +123 +124 +206 +130 +131 +213 +136 +134 +217 +138 +136 +219 +140 +136 +220 +141 +138 +217 +143 +142 +212 +143 +140 +209 +143 +140 +209 +142 +139 +210 +143 +137 +211 +142 +136 +210 +142 +134 +209 +141 +133 +206 +143 +133 +202 +142 +133 +196 +143 +134 +191 +144 +136 +187 +143 +136 +180 +137 +131 +169 +128 +121 +154 +126 +112 +137 +127 +96 +112 +121 +90 +96 +107 +89 +89 +99 +92 +84 +96 +94 +81 +98 +91 +73 +109 +86 +70 +128 +82 +69 +161 +84 +76 +193 +91 +89 +209 +89 +91 +217 +88 +92 +228 +99 +103 +228 +108 +107 +224 +112 +108 +228 +121 +115 +236 +125 +118 +237 +122 +115 +254 +131 +126 +255 +134 +129 +255 +129 +123 +245 +107 +97 +201 +60 +50 +196 +56 +41 +194 +59 +40 +191 +58 +39 +191 +59 +38 +190 +58 +37 +193 +58 +38 +197 +58 +39 +200 +57 +41 +206 +56 +42 +216 +58 +46 +212 +54 +42 +206 +53 +39 +206 +56 +41 +209 +62 +46 +209 +62 +46 +203 +56 +40 +199 +47 +33 +210 +54 +41 +211 +53 +41 +210 +52 +40 +210 +54 +41 +209 +57 +43 +205 +60 +43 +200 +61 +42 +196 +59 +41 +196 +58 +45 +196 +58 +47 +198 +57 +48 +198 +57 +47 +199 +58 +49 +200 +59 +49 +201 +60 +51 +203 +61 +51 +211 +68 +60 +211 +69 +59 +208 +65 +57 +203 +61 +51 +203 +60 +52 +207 +65 +55 +207 +64 +56 +206 +59 +49 +206 +53 +39 +217 +53 +41 +226 +53 +46 +235 +51 +49 +242 +47 +53 +247 +43 +54 +249 +41 +55 +252 +41 +58 +249 +38 +57 +247 +38 +59 +247 +38 +59 +248 +39 +60 +251 +38 +60 +253 +37 +58 +255 +36 +58 +255 +35 +58 +255 +33 +54 +253 +34 +54 +250 +37 +55 +249 +44 +59 +247 +53 +62 +242 +57 +63 +233 +57 +59 +225 +57 +56 +220 +57 +52 +220 +58 +53 +222 +59 +52 +224 +59 +53 +229 +57 +53 +231 +56 +53 +233 +55 +51 +235 +53 +52 +238 +52 +55 +238 +52 +55 +238 +54 +54 +234 +54 +53 +230 +55 +50 +225 +54 +47 +220 +53 +44 +215 +53 +42 +216 +56 +42 +216 +56 +40 +216 +56 +40 +217 +56 +38 +218 +55 +38 +220 +55 +36 +221 +54 +36 +221 +54 +36 +219 +53 +37 +220 +54 +40 +221 +55 +39 +220 +57 +40 +220 +57 +40 +218 +59 +40 +215 +58 +41 +214 +58 +43 +213 +59 +49 +206 +51 +46 +231 +73 +74 +255 +111 +119 +254 +85 +104 +243 +69 +94 +243 +62 +95 +255 +67 +102 +251 +55 +91 +252 +60 +97 +240 +66 +99 +228 +79 +108 +196 +80 +101 +129 +47 +61 +78 +29 +33 +72 +48 +46 +54 +47 +39 +50 +52 +39 +56 +58 +44 +62 +65 +46 +65 +64 +43 +63 +61 +36 +65 +64 +36 +69 +70 +36 +84 +93 +48 +112 +126 +77 +143 +159 +114 +151 +168 +124 +131 +152 +109 +106 +132 +87 +95 +123 +74 +93 +126 +69 +95 +131 +67 +97 +134 +64 +98 +138 +65 +102 +143 +67 +107 +144 +74 +108 +145 +76 +109 +146 +79 +109 +146 +79 +111 +148 +78 +108 +146 +73 +105 +142 +73 +104 +141 +72 +105 +140 +76 +105 +140 +76 +104 +138 +78 +103 +137 +77 +102 +133 +76 +100 +131 +74 +100 +129 +71 +101 +130 +72 +103 +131 +72 +104 +132 +73 +102 +130 +71 +100 +130 +68 +103 +138 +72 +105 +142 +73 +108 +145 +76 +45 +51 +39 +51 +54 +43 +56 +57 +49 +60 +59 +54 +66 +61 +57 +71 +64 +58 +77 +68 +61 +81 +71 +61 +83 +73 +61 +83 +75 +62 +85 +78 +68 +90 +85 +81 +97 +94 +101 +105 +103 +117 +109 +107 +129 +108 +107 +138 +106 +104 +144 +98 +96 +143 +88 +86 +136 +80 +80 +134 +81 +81 +141 +88 +89 +154 +96 +99 +170 +102 +106 +180 +111 +114 +193 +117 +120 +201 +124 +127 +208 +130 +133 +214 +134 +135 +217 +135 +136 +216 +138 +137 +217 +139 +138 +214 +139 +139 +209 +139 +138 +206 +138 +136 +209 +137 +135 +210 +137 +133 +210 +136 +131 +211 +138 +131 +211 +137 +130 +207 +140 +132 +205 +139 +132 +199 +141 +133 +192 +141 +134 +185 +141 +134 +175 +135 +130 +162 +126 +120 +146 +127 +110 +129 +131 +90 +104 +125 +84 +90 +108 +87 +84 +99 +92 +82 +92 +96 +79 +91 +95 +72 +102 +90 +68 +122 +83 +66 +149 +74 +68 +187 +83 +82 +209 +83 +87 +219 +82 +89 +230 +93 +100 +231 +102 +106 +224 +108 +108 +227 +118 +113 +228 +117 +110 +226 +111 +104 +247 +126 +118 +255 +130 +123 +255 +135 +126 +244 +108 +96 +201 +63 +50 +193 +56 +40 +192 +59 +40 +191 +61 +39 +191 +61 +39 +192 +60 +39 +194 +59 +39 +197 +58 +39 +199 +56 +40 +205 +55 +41 +216 +58 +47 +217 +56 +46 +210 +56 +44 +207 +57 +43 +204 +58 +43 +201 +58 +42 +200 +57 +41 +201 +55 +40 +207 +57 +43 +209 +55 +43 +210 +56 +44 +209 +55 +43 +207 +55 +42 +204 +56 +42 +203 +60 +44 +203 +62 +45 +202 +60 +48 +201 +61 +48 +202 +60 +50 +201 +59 +47 +200 +58 +48 +198 +56 +44 +197 +55 +45 +197 +53 +42 +208 +64 +55 +208 +64 +53 +205 +61 +52 +201 +57 +46 +203 +56 +48 +206 +59 +49 +205 +58 +50 +204 +53 +44 +208 +47 +37 +217 +48 +41 +228 +50 +48 +236 +50 +53 +244 +47 +56 +249 +45 +57 +251 +43 +59 +252 +44 +60 +252 +45 +63 +251 +46 +63 +252 +47 +64 +252 +47 +64 +254 +47 +65 +255 +47 +63 +255 +45 +63 +255 +46 +64 +255 +40 +56 +251 +40 +55 +247 +43 +55 +245 +48 +58 +241 +54 +61 +237 +56 +61 +228 +56 +56 +221 +53 +52 +220 +57 +52 +220 +58 +53 +222 +59 +54 +226 +58 +55 +229 +57 +53 +231 +56 +53 +234 +54 +53 +236 +52 +52 +241 +52 +56 +241 +52 +56 +239 +53 +54 +237 +55 +54 +230 +55 +50 +225 +54 +47 +218 +54 +44 +215 +53 +42 +216 +56 +42 +214 +57 +40 +214 +57 +40 +216 +57 +38 +216 +57 +38 +217 +56 +38 +218 +55 +38 +217 +56 +38 +213 +56 +37 +213 +58 +38 +214 +59 +39 +213 +61 +40 +212 +61 +40 +211 +62 +42 +211 +61 +44 +211 +61 +46 +208 +55 +47 +215 +60 +56 +255 +93 +100 +255 +96 +111 +255 +80 +103 +240 +60 +89 +255 +66 +104 +250 +55 +95 +255 +55 +95 +242 +52 +88 +237 +78 +108 +215 +92 +113 +148 +64 +79 +91 +38 +46 +71 +40 +45 +63 +49 +48 +49 +46 +41 +52 +54 +43 +58 +62 +47 +60 +65 +43 +58 +61 +34 +62 +61 +30 +80 +74 +40 +94 +92 +53 +121 +133 +83 +144 +163 +108 +170 +190 +139 +168 +190 +141 +142 +165 +119 +111 +139 +91 +97 +127 +75 +94 +127 +70 +96 +132 +68 +99 +136 +66 +101 +141 +68 +106 +147 +71 +111 +148 +78 +112 +149 +80 +111 +147 +83 +111 +147 +83 +111 +148 +78 +108 +146 +73 +105 +142 +73 +103 +140 +71 +105 +140 +76 +105 +140 +76 +105 +139 +79 +104 +138 +78 +102 +133 +74 +101 +132 +73 +100 +131 +72 +101 +132 +73 +103 +133 +73 +104 +134 +72 +103 +133 +71 +101 +133 +68 +105 +142 +73 +105 +145 +75 +108 +148 +78 +43 +49 +37 +46 +52 +42 +52 +55 +48 +56 +57 +51 +62 +58 +55 +66 +61 +58 +72 +65 +59 +75 +68 +60 +78 +72 +60 +78 +71 +61 +79 +74 +68 +87 +83 +82 +95 +94 +102 +102 +101 +117 +103 +103 +127 +103 +102 +134 +98 +97 +137 +91 +89 +138 +81 +81 +133 +78 +79 +135 +82 +83 +147 +91 +94 +163 +101 +105 +179 +108 +111 +190 +117 +119 +202 +122 +124 +209 +127 +129 +214 +131 +133 +216 +134 +135 +217 +134 +135 +215 +136 +135 +213 +137 +136 +212 +135 +135 +205 +134 +134 +204 +134 +132 +205 +133 +130 +207 +133 +128 +210 +133 +128 +210 +135 +127 +212 +135 +128 +208 +141 +133 +210 +140 +133 +201 +141 +133 +192 +140 +134 +182 +139 +133 +169 +132 +128 +155 +123 +118 +138 +124 +106 +120 +129 +87 +97 +126 +81 +86 +109 +85 +81 +100 +94 +80 +92 +100 +77 +89 +97 +73 +99 +93 +69 +118 +87 +67 +146 +78 +69 +183 +85 +82 +209 +84 +90 +219 +82 +90 +231 +92 +99 +231 +98 +103 +228 +104 +106 +231 +113 +111 +236 +121 +114 +230 +113 +104 +247 +124 +116 +243 +115 +106 +254 +120 +109 +230 +92 +81 +196 +59 +43 +190 +53 +35 +194 +59 +39 +193 +61 +40 +193 +61 +40 +195 +60 +40 +196 +59 +40 +200 +59 +41 +203 +57 +42 +207 +55 +42 +214 +53 +43 +216 +55 +45 +212 +58 +46 +206 +58 +44 +199 +58 +41 +196 +56 +39 +198 +58 +41 +202 +61 +44 +207 +61 +46 +214 +64 +50 +217 +65 +52 +214 +62 +49 +206 +56 +42 +200 +52 +38 +202 +56 +41 +203 +60 +44 +201 +58 +44 +200 +58 +44 +201 +59 +47 +201 +59 +45 +202 +58 +47 +200 +57 +43 +200 +53 +43 +199 +53 +40 +202 +54 +44 +207 +59 +47 +210 +62 +52 +211 +63 +51 +214 +63 +54 +213 +62 +51 +206 +55 +46 +201 +44 +35 +210 +43 +37 +220 +45 +42 +231 +48 +50 +240 +51 +57 +246 +49 +59 +250 +48 +60 +253 +48 +63 +253 +48 +63 +249 +48 +64 +247 +49 +64 +247 +49 +64 +246 +48 +61 +247 +47 +60 +247 +45 +57 +250 +44 +57 +250 +42 +55 +252 +46 +59 +248 +46 +58 +245 +48 +58 +240 +51 +58 +237 +54 +59 +231 +55 +58 +224 +54 +54 +218 +53 +51 +220 +57 +52 +221 +58 +53 +223 +58 +54 +226 +58 +55 +229 +57 +53 +231 +56 +53 +234 +54 +53 +236 +52 +52 +242 +53 +57 +242 +53 +57 +240 +54 +55 +237 +55 +54 +230 +55 +52 +223 +54 +47 +218 +54 +45 +214 +54 +42 +213 +55 +43 +212 +56 +41 +212 +56 +41 +212 +57 +39 +213 +56 +39 +213 +56 +37 +215 +55 +39 +212 +57 +37 +208 +57 +36 +206 +60 +37 +207 +61 +38 +207 +63 +39 +206 +64 +40 +206 +64 +42 +206 +63 +46 +208 +60 +48 +208 +55 +49 +232 +72 +72 +255 +103 +113 +254 +78 +98 +255 +72 +100 +246 +56 +90 +255 +66 +108 +246 +49 +92 +255 +57 +96 +234 +55 +87 +221 +83 +106 +185 +87 +102 +107 +50 +57 +71 +41 +43 +71 +55 +58 +59 +50 +51 +56 +51 +48 +58 +55 +48 +57 +59 +45 +53 +58 +35 +51 +56 +24 +66 +68 +29 +102 +99 +58 +129 +131 +84 +159 +174 +119 +169 +193 +135 +181 +206 +151 +175 +199 +147 +146 +174 +125 +118 +148 +98 +101 +134 +81 +96 +130 +70 +96 +133 +66 +99 +136 +66 +103 +143 +70 +109 +150 +74 +114 +152 +79 +114 +151 +82 +113 +149 +85 +112 +148 +84 +111 +148 +78 +108 +145 +75 +104 +141 +72 +102 +139 +70 +104 +139 +75 +105 +140 +76 +105 +139 +78 +105 +139 +79 +103 +134 +75 +102 +133 +74 +101 +132 +73 +102 +133 +73 +104 +136 +73 +105 +137 +72 +105 +135 +71 +102 +134 +67 +106 +143 +74 +107 +147 +77 +110 +150 +80 +40 +48 +35 +43 +49 +39 +47 +52 +45 +51 +53 +48 +55 +54 +52 +60 +56 +53 +64 +61 +56 +67 +62 +56 +73 +69 +60 +72 +69 +60 +75 +72 +67 +82 +80 +81 +91 +91 +101 +97 +98 +116 +98 +98 +124 +96 +96 +130 +95 +94 +136 +90 +88 +138 +84 +84 +138 +84 +84 +144 +92 +93 +160 +103 +105 +179 +112 +115 +196 +118 +120 +205 +123 +127 +216 +126 +130 +219 +131 +132 +222 +132 +134 +221 +132 +133 +216 +131 +132 +214 +133 +132 +212 +134 +133 +209 +131 +134 +203 +130 +133 +202 +131 +131 +205 +130 +129 +207 +131 +127 +211 +133 +128 +212 +136 +128 +214 +136 +128 +211 +141 +133 +210 +139 +132 +200 +139 +131 +188 +139 +132 +176 +137 +130 +163 +129 +124 +146 +119 +113 +127 +117 +102 +109 +125 +86 +91 +121 +81 +81 +107 +87 +78 +101 +95 +79 +93 +101 +77 +91 +100 +73 +100 +96 +71 +116 +91 +69 +140 +82 +70 +176 +91 +84 +202 +89 +91 +214 +85 +90 +226 +91 +97 +230 +93 +100 +231 +98 +101 +237 +109 +108 +245 +122 +115 +237 +114 +106 +247 +120 +111 +222 +89 +80 +229 +91 +80 +210 +68 +56 +195 +53 +39 +199 +58 +41 +197 +58 +39 +196 +60 +38 +197 +61 +39 +200 +61 +40 +202 +59 +42 +205 +58 +42 +208 +56 +42 +212 +54 +42 +211 +48 +39 +212 +51 +41 +210 +56 +44 +205 +59 +44 +199 +59 +42 +194 +59 +40 +192 +59 +40 +195 +60 +41 +200 +59 +42 +213 +67 +52 +225 +75 +61 +222 +72 +58 +211 +61 +47 +202 +52 +38 +201 +53 +39 +205 +59 +44 +200 +57 +41 +200 +57 +41 +200 +57 +43 +200 +57 +41 +202 +56 +43 +202 +56 +41 +203 +55 +43 +203 +55 +41 +205 +54 +43 +210 +60 +46 +215 +63 +52 +216 +64 +51 +218 +64 +54 +219 +65 +53 +215 +58 +49 +210 +49 +41 +220 +48 +46 +229 +49 +52 +238 +52 +57 +245 +54 +62 +249 +52 +62 +249 +49 +62 +250 +48 +64 +248 +47 +63 +242 +46 +60 +239 +47 +60 +237 +47 +57 +237 +48 +55 +239 +45 +53 +239 +44 +50 +242 +43 +50 +241 +42 +49 +244 +49 +57 +244 +50 +58 +242 +53 +59 +236 +53 +57 +229 +53 +55 +225 +53 +53 +223 +55 +54 +221 +56 +54 +220 +56 +54 +221 +57 +55 +223 +58 +54 +227 +58 +55 +230 +56 +55 +233 +55 +55 +234 +54 +55 +236 +52 +54 +244 +53 +58 +244 +53 +58 +241 +55 +58 +238 +56 +55 +230 +55 +52 +224 +55 +48 +218 +54 +45 +212 +54 +42 +211 +55 +42 +209 +56 +42 +208 +56 +42 +208 +57 +40 +208 +57 +40 +208 +57 +38 +209 +56 +40 +208 +57 +38 +203 +57 +34 +200 +58 +34 +200 +62 +36 +199 +63 +37 +200 +64 +40 +200 +64 +42 +203 +62 +45 +206 +59 +49 +213 +58 +54 +250 +85 +91 +255 +94 +111 +255 +71 +97 +253 +62 +95 +254 +58 +96 +255 +56 +102 +250 +53 +98 +244 +58 +95 +230 +71 +99 +192 +80 +96 +135 +64 +72 +84 +50 +51 +67 +53 +52 +68 +57 +61 +62 +51 +55 +66 +51 +54 +64 +53 +49 +58 +56 +43 +54 +60 +34 +57 +67 +30 +80 +92 +46 +125 +132 +80 +159 +168 +113 +176 +197 +138 +175 +203 +142 +176 +204 +146 +166 +195 +141 +146 +174 +125 +123 +153 +101 +103 +136 +81 +95 +129 +69 +94 +131 +64 +99 +137 +64 +105 +143 +68 +111 +149 +74 +115 +153 +80 +115 +152 +83 +113 +149 +85 +111 +147 +83 +110 +147 +78 +107 +144 +74 +103 +140 +71 +101 +138 +69 +103 +138 +74 +104 +139 +75 +105 +139 +78 +105 +139 +78 +102 +136 +75 +100 +134 +73 +100 +134 +73 +101 +136 +72 +103 +138 +74 +104 +139 +73 +105 +137 +72 +102 +137 +69 +106 +146 +76 +108 +150 +78 +111 +153 +81 +38 +46 +33 +40 +48 +37 +45 +50 +43 +49 +51 +46 +51 +51 +49 +55 +54 +52 +58 +57 +53 +60 +59 +54 +71 +68 +61 +68 +68 +60 +71 +70 +66 +79 +79 +81 +90 +90 +100 +95 +97 +112 +94 +96 +121 +92 +92 +126 +96 +95 +137 +92 +90 +140 +89 +88 +145 +92 +92 +154 +103 +103 +173 +113 +115 +192 +122 +124 +209 +127 +128 +220 +129 +132 +225 +130 +133 +228 +133 +134 +227 +132 +133 +225 +131 +131 +219 +129 +130 +213 +131 +130 +210 +131 +130 +206 +132 +135 +204 +131 +134 +201 +132 +132 +204 +131 +130 +206 +133 +130 +211 +135 +130 +214 +138 +130 +215 +140 +131 +212 +141 +133 +208 +140 +131 +196 +139 +130 +183 +138 +130 +171 +133 +127 +155 +127 +120 +136 +115 +110 +117 +111 +99 +99 +117 +87 +85 +114 +84 +76 +105 +87 +75 +102 +95 +77 +99 +101 +77 +97 +100 +73 +102 +96 +70 +115 +93 +70 +125 +79 +63 +159 +89 +77 +184 +89 +83 +197 +83 +82 +215 +86 +90 +226 +87 +92 +233 +90 +96 +240 +100 +101 +247 +114 +109 +241 +110 +102 +247 +113 +104 +209 +68 +59 +212 +65 +55 +197 +49 +37 +200 +52 +38 +212 +67 +50 +199 +57 +37 +199 +58 +38 +201 +59 +39 +205 +60 +41 +208 +58 +43 +211 +58 +44 +216 +56 +44 +217 +55 +44 +207 +44 +35 +206 +48 +37 +206 +54 +41 +203 +60 +44 +199 +64 +45 +193 +62 +42 +190 +59 +39 +188 +55 +36 +192 +52 +35 +209 +66 +50 +227 +79 +65 +228 +78 +64 +216 +66 +52 +203 +55 +41 +203 +55 +41 +208 +62 +47 +202 +59 +43 +201 +58 +42 +199 +56 +40 +198 +55 +39 +200 +54 +39 +202 +54 +40 +206 +56 +42 +208 +56 +43 +211 +59 +46 +213 +59 +47 +213 +57 +45 +210 +54 +42 +213 +55 +44 +218 +60 +49 +221 +60 +50 +220 +55 +49 +232 +56 +56 +241 +56 +61 +247 +58 +65 +251 +57 +66 +250 +52 +65 +245 +47 +60 +242 +44 +59 +239 +44 +58 +237 +47 +59 +234 +49 +57 +234 +51 +56 +235 +52 +56 +237 +53 +55 +241 +53 +54 +244 +51 +54 +243 +53 +55 +239 +50 +54 +238 +53 +58 +236 +56 +59 +233 +54 +57 +226 +52 +53 +222 +52 +52 +223 +55 +54 +225 +60 +58 +221 +56 +54 +222 +57 +55 +225 +57 +54 +227 +58 +55 +230 +56 +55 +233 +55 +55 +234 +54 +55 +236 +52 +54 +244 +53 +58 +244 +53 +58 +241 +55 +58 +236 +56 +57 +230 +57 +53 +223 +56 +50 +216 +55 +47 +211 +55 +43 +208 +56 +43 +205 +58 +42 +205 +57 +43 +204 +59 +42 +205 +58 +42 +205 +58 +40 +205 +58 +42 +204 +59 +40 +197 +57 +34 +194 +58 +34 +195 +61 +36 +194 +62 +37 +195 +63 +40 +198 +63 +43 +201 +61 +46 +205 +56 +49 +220 +60 +62 +255 +93 +102 +255 +81 +103 +255 +72 +100 +250 +56 +91 +255 +63 +103 +246 +46 +92 +251 +62 +104 +228 +61 +91 +224 +93 +111 +162 +76 +85 +91 +45 +45 +71 +56 +51 +70 +66 +63 +64 +55 +58 +67 +52 +57 +71 +48 +54 +70 +50 +49 +64 +57 +41 +63 +68 +38 +69 +86 +42 +96 +116 +63 +139 +157 +97 +170 +190 +127 +177 +203 +140 +171 +201 +139 +166 +195 +139 +157 +186 +132 +142 +172 +122 +123 +153 +101 +102 +135 +80 +90 +124 +64 +94 +129 +63 +97 +135 +62 +104 +142 +67 +111 +149 +74 +114 +152 +79 +114 +151 +82 +112 +148 +84 +110 +146 +82 +110 +147 +78 +106 +143 +73 +102 +139 +70 +100 +137 +68 +102 +137 +73 +104 +139 +75 +105 +139 +78 +105 +139 +78 +102 +136 +75 +101 +135 +74 +100 +135 +71 +101 +136 +70 +103 +138 +72 +104 +139 +71 +104 +139 +71 +101 +138 +68 +107 +147 +76 +109 +151 +79 +112 +154 +82 +40 +48 +33 +39 +47 +34 +40 +45 +38 +41 +46 +40 +46 +48 +45 +51 +51 +49 +55 +56 +51 +57 +58 +52 +61 +61 +53 +63 +64 +56 +68 +69 +64 +74 +76 +75 +79 +82 +89 +86 +88 +101 +90 +92 +115 +93 +94 +125 +89 +88 +130 +91 +89 +139 +94 +93 +150 +101 +101 +163 +110 +110 +182 +119 +120 +200 +127 +129 +216 +132 +133 +226 +140 +140 +238 +140 +140 +240 +138 +138 +236 +134 +135 +228 +130 +130 +220 +128 +128 +214 +130 +128 +211 +131 +130 +206 +128 +131 +198 +129 +133 +197 +131 +131 +201 +132 +132 +206 +134 +131 +208 +136 +131 +211 +139 +132 +210 +140 +132 +207 +138 +128 +197 +138 +128 +188 +137 +128 +175 +135 +125 +160 +128 +120 +143 +119 +111 +122 +107 +101 +103 +102 +93 +88 +106 +92 +81 +108 +92 +77 +104 +92 +76 +102 +94 +75 +101 +95 +73 +102 +96 +72 +106 +96 +71 +114 +94 +70 +114 +79 +59 +135 +84 +65 +166 +92 +79 +193 +96 +89 +209 +89 +88 +220 +81 +84 +237 +83 +91 +247 +92 +96 +249 +104 +101 +230 +89 +80 +212 +68 +60 +206 +55 +48 +209 +55 +47 +215 +58 +49 +214 +61 +47 +212 +59 +43 +207 +57 +40 +205 +58 +38 +207 +57 +40 +209 +58 +41 +212 +56 +41 +216 +56 +42 +220 +53 +44 +220 +53 +44 +208 +47 +37 +205 +51 +41 +204 +56 +44 +202 +62 +47 +197 +64 +47 +193 +64 +45 +190 +61 +42 +188 +57 +39 +194 +57 +41 +190 +48 +34 +233 +87 +74 +223 +75 +63 +195 +47 +35 +209 +61 +49 +206 +60 +47 +199 +56 +40 +202 +59 +43 +201 +58 +41 +200 +57 +40 +199 +56 +39 +200 +55 +38 +201 +54 +38 +203 +53 +38 +204 +52 +38 +208 +55 +41 +215 +59 +46 +220 +62 +50 +220 +60 +48 +217 +55 +44 +218 +56 +45 +226 +62 +52 +236 +67 +60 +245 +66 +69 +242 +57 +63 +240 +50 +60 +246 +52 +63 +246 +50 +64 +241 +45 +59 +237 +45 +58 +237 +50 +61 +236 +55 +62 +230 +53 +59 +228 +54 +56 +229 +55 +56 +235 +57 +57 +240 +58 +57 +241 +55 +56 +239 +55 +55 +242 +59 +61 +238 +60 +60 +234 +58 +58 +230 +56 +55 +225 +56 +53 +223 +55 +52 +220 +55 +53 +220 +55 +53 +222 +57 +55 +225 +57 +56 +227 +57 +57 +230 +58 +58 +233 +57 +59 +236 +57 +60 +237 +57 +60 +239 +56 +60 +244 +55 +59 +243 +54 +58 +240 +56 +58 +237 +57 +58 +231 +59 +57 +224 +59 +53 +215 +57 +48 +207 +55 +44 +202 +56 +43 +200 +57 +41 +199 +57 +43 +198 +58 +41 +199 +58 +41 +199 +58 +40 +200 +59 +42 +199 +60 +41 +193 +57 +35 +196 +61 +39 +190 +58 +35 +182 +52 +30 +188 +57 +37 +201 +68 +51 +206 +64 +54 +201 +49 +44 +255 +95 +101 +255 +87 +103 +255 +75 +98 +252 +61 +92 +245 +51 +88 +242 +50 +89 +247 +56 +99 +240 +69 +105 +228 +91 +111 +171 +71 +81 +110 +52 +51 +78 +51 +44 +67 +63 +54 +65 +66 +60 +66 +54 +56 +66 +43 +49 +77 +46 +51 +77 +49 +46 +67 +56 +38 +68 +74 +40 +88 +110 +61 +125 +155 +95 +155 +186 +119 +167 +198 +130 +171 +203 +140 +159 +190 +130 +152 +182 +128 +148 +178 +126 +130 +160 +110 +102 +132 +82 +88 +118 +66 +89 +123 +63 +93 +128 +62 +99 +135 +65 +105 +143 +68 +110 +148 +73 +109 +149 +76 +108 +148 +78 +107 +146 +79 +108 +145 +78 +105 +142 +73 +102 +138 +68 +99 +134 +66 +99 +134 +66 +102 +137 +73 +104 +139 +75 +102 +138 +76 +100 +136 +74 +103 +139 +77 +104 +140 +78 +103 +139 +75 +102 +139 +72 +101 +138 +69 +102 +139 +69 +106 +143 +73 +107 +147 +74 +113 +155 +81 +113 +157 +82 +114 +158 +83 +42 +48 +34 +41 +47 +35 +41 +46 +39 +41 +46 +40 +45 +47 +44 +49 +51 +48 +53 +54 +49 +55 +56 +50 +59 +60 +52 +62 +63 +55 +65 +68 +61 +72 +74 +71 +79 +80 +84 +83 +85 +97 +88 +89 +107 +90 +92 +117 +92 +90 +127 +94 +93 +137 +100 +98 +148 +107 +106 +164 +117 +116 +186 +127 +126 +206 +135 +135 +223 +139 +140 +233 +141 +141 +239 +140 +140 +240 +137 +137 +235 +133 +132 +226 +128 +128 +216 +128 +126 +210 +128 +127 +207 +130 +130 +204 +133 +134 +199 +134 +135 +199 +135 +136 +201 +137 +136 +204 +139 +136 +207 +140 +134 +206 +141 +134 +204 +142 +133 +200 +138 +128 +188 +137 +127 +177 +134 +124 +161 +130 +120 +147 +123 +115 +130 +116 +107 +112 +108 +98 +96 +100 +93 +83 +99 +96 +79 +98 +96 +75 +101 +94 +75 +102 +94 +75 +105 +92 +73 +108 +93 +72 +110 +94 +71 +113 +93 +69 +121 +93 +71 +130 +89 +67 +149 +88 +70 +173 +90 +76 +199 +86 +80 +221 +83 +83 +243 +82 +88 +254 +89 +95 +240 +85 +83 +227 +76 +69 +217 +62 +57 +213 +54 +48 +217 +54 +47 +220 +57 +48 +219 +57 +44 +214 +57 +40 +211 +56 +38 +209 +56 +38 +209 +56 +40 +212 +56 +41 +215 +55 +41 +220 +54 +42 +223 +52 +44 +221 +53 +44 +206 +48 +39 +201 +53 +41 +200 +57 +43 +198 +61 +45 +196 +65 +47 +193 +64 +45 +191 +60 +42 +190 +57 +40 +196 +56 +41 +203 +60 +46 +228 +82 +69 +220 +72 +60 +200 +52 +40 +204 +58 +45 +200 +58 +44 +194 +52 +38 +202 +61 +44 +203 +60 +43 +202 +59 +42 +202 +59 +42 +203 +58 +41 +204 +57 +41 +206 +56 +41 +207 +54 +40 +211 +55 +42 +214 +56 +44 +217 +55 +44 +215 +51 +41 +213 +49 +39 +216 +49 +40 +222 +55 +46 +231 +60 +53 +248 +68 +71 +241 +56 +62 +237 +47 +57 +239 +47 +58 +240 +48 +61 +238 +46 +59 +235 +49 +60 +235 +54 +63 +228 +53 +58 +220 +51 +54 +216 +50 +50 +223 +58 +56 +238 +69 +66 +248 +73 +70 +248 +68 +67 +243 +63 +62 +233 +58 +55 +231 +57 +56 +229 +57 +55 +226 +57 +54 +225 +56 +53 +224 +56 +53 +225 +57 +56 +225 +57 +56 +224 +56 +55 +226 +56 +56 +229 +57 +57 +231 +57 +58 +233 +57 +59 +236 +57 +60 +237 +57 +60 +238 +55 +59 +243 +54 +58 +242 +53 +57 +238 +54 +56 +234 +56 +56 +228 +59 +56 +220 +58 +53 +211 +57 +47 +203 +55 +43 +198 +56 +42 +195 +58 +42 +194 +58 +42 +192 +59 +42 +192 +59 +42 +193 +60 +41 +193 +60 +43 +193 +60 +41 +189 +57 +36 +193 +63 +41 +187 +58 +37 +179 +53 +31 +185 +58 +39 +192 +60 +47 +201 +58 +50 +215 +61 +61 +255 +95 +103 +255 +81 +100 +253 +67 +91 +246 +57 +87 +242 +57 +91 +242 +61 +96 +240 +64 +100 +224 +74 +101 +170 +64 +76 +131 +63 +62 +95 +58 +50 +72 +58 +47 +59 +61 +48 +59 +61 +50 +73 +59 +58 +85 +61 +61 +81 +47 +46 +84 +55 +47 +87 +75 +53 +100 +104 +69 +119 +143 +91 +140 +176 +112 +154 +195 +125 +159 +199 +129 +152 +186 +125 +154 +185 +128 +154 +182 +131 +141 +169 +120 +114 +142 +94 +89 +117 +69 +84 +112 +61 +92 +123 +66 +95 +127 +64 +98 +134 +64 +105 +141 +67 +109 +147 +72 +108 +148 +75 +107 +147 +76 +105 +144 +77 +105 +144 +77 +103 +140 +71 +101 +137 +67 +99 +134 +66 +99 +134 +68 +103 +138 +74 +105 +140 +76 +104 +140 +78 +103 +139 +77 +105 +141 +79 +105 +141 +77 +105 +142 +75 +103 +140 +71 +103 +140 +70 +102 +142 +69 +108 +146 +73 +109 +149 +76 +112 +156 +81 +111 +157 +82 +114 +158 +83 +45 +49 +34 +45 +49 +35 +44 +47 +38 +44 +46 +41 +47 +47 +45 +49 +49 +47 +51 +52 +47 +52 +53 +45 +57 +59 +48 +60 +62 +49 +64 +66 +55 +69 +72 +65 +75 +77 +76 +81 +82 +87 +85 +85 +97 +86 +87 +105 +92 +89 +116 +94 +93 +127 +102 +100 +140 +112 +110 +160 +122 +120 +183 +133 +131 +206 +141 +139 +223 +144 +144 +234 +144 +142 +239 +142 +140 +237 +138 +137 +231 +135 +132 +223 +129 +127 +211 +127 +124 +203 +127 +125 +200 +128 +127 +195 +134 +134 +196 +136 +136 +196 +138 +138 +198 +140 +139 +199 +140 +138 +201 +140 +136 +197 +140 +132 +191 +139 +130 +183 +137 +128 +175 +134 +124 +161 +128 +118 +145 +123 +112 +129 +117 +106 +114 +110 +100 +99 +105 +94 +88 +99 +93 +81 +93 +98 +76 +93 +98 +75 +97 +95 +74 +103 +92 +74 +109 +90 +73 +112 +91 +72 +114 +92 +71 +114 +92 +69 +122 +96 +73 +123 +87 +63 +137 +82 +61 +164 +85 +68 +199 +88 +79 +224 +86 +83 +245 +80 +84 +252 +79 +83 +226 +62 +60 +222 +60 +55 +221 +56 +52 +222 +55 +49 +225 +54 +47 +225 +54 +46 +221 +55 +43 +218 +55 +40 +212 +55 +38 +211 +56 +36 +211 +56 +38 +213 +56 +39 +216 +54 +41 +221 +53 +42 +224 +51 +44 +221 +53 +44 +203 +51 +40 +196 +54 +40 +194 +57 +41 +193 +60 +43 +194 +63 +45 +194 +63 +45 +193 +60 +43 +192 +56 +40 +195 +53 +39 +220 +74 +61 +218 +70 +58 +213 +65 +53 +206 +60 +47 +196 +54 +40 +196 +59 +43 +190 +54 +38 +198 +58 +41 +199 +58 +41 +199 +58 +41 +201 +58 +42 +202 +56 +41 +203 +55 +41 +204 +54 +40 +205 +51 +39 +213 +57 +45 +213 +55 +44 +214 +51 +42 +215 +51 +42 +218 +51 +43 +223 +54 +47 +229 +58 +51 +233 +60 +56 +240 +60 +61 +237 +52 +57 +235 +48 +55 +236 +49 +56 +238 +51 +60 +237 +52 +60 +235 +55 +64 +234 +61 +67 +221 +55 +59 +225 +65 +65 +236 +78 +75 +248 +89 +85 +253 +90 +85 +250 +81 +76 +239 +66 +62 +229 +56 +52 +226 +54 +50 +224 +55 +50 +224 +55 +50 +224 +55 +50 +225 +56 +53 +226 +57 +54 +228 +59 +56 +228 +59 +56 +225 +55 +55 +228 +56 +56 +230 +56 +58 +232 +56 +59 +235 +56 +60 +235 +56 +60 +235 +56 +60 +236 +56 +59 +239 +53 +56 +238 +52 +55 +236 +53 +55 +231 +55 +55 +226 +58 +55 +217 +58 +52 +207 +56 +47 +199 +55 +44 +194 +56 +43 +191 +58 +43 +189 +59 +43 +187 +60 +43 +187 +60 +43 +187 +60 +41 +187 +60 +43 +187 +60 +41 +184 +57 +38 +189 +64 +42 +179 +57 +36 +177 +54 +36 +182 +59 +43 +180 +49 +39 +194 +52 +48 +235 +80 +84 +255 +92 +105 +254 +75 +96 +243 +59 +85 +237 +57 +86 +238 +65 +93 +236 +73 +102 +227 +75 +100 +202 +79 +97 +130 +56 +57 +102 +62 +54 +85 +63 +50 +71 +64 +48 +59 +60 +44 +56 +54 +41 +65 +52 +43 +78 +55 +47 +72 +43 +35 +83 +60 +44 +103 +93 +66 +129 +136 +95 +146 +171 +116 +149 +188 +123 +148 +194 +122 +149 +192 +123 +146 +180 +120 +156 +184 +133 +154 +180 +133 +128 +154 +109 +92 +117 +75 +72 +98 +53 +78 +104 +56 +91 +120 +66 +95 +125 +63 +99 +131 +64 +104 +140 +68 +108 +146 +71 +106 +146 +73 +104 +146 +74 +103 +144 +76 +102 +143 +75 +100 +137 +68 +100 +135 +67 +99 +134 +68 +101 +136 +70 +104 +139 +75 +107 +142 +78 +107 +143 +79 +106 +142 +78 +105 +144 +79 +105 +144 +79 +105 +144 +77 +104 +144 +74 +103 +143 +72 +104 +146 +72 +108 +148 +75 +111 +153 +77 +115 +161 +86 +115 +163 +87 +117 +163 +88 +50 +52 +38 +48 +52 +38 +48 +49 +41 +48 +49 +43 +49 +50 +45 +50 +51 +46 +51 +52 +46 +52 +54 +43 +57 +59 +45 +59 +62 +45 +63 +65 +51 +68 +70 +57 +73 +74 +68 +77 +79 +78 +82 +81 +87 +83 +83 +93 +88 +86 +100 +92 +90 +111 +100 +97 +126 +110 +108 +148 +122 +119 +172 +132 +130 +195 +140 +137 +214 +145 +143 +227 +148 +145 +234 +147 +144 +235 +142 +139 +226 +137 +133 +217 +130 +127 +204 +127 +124 +195 +127 +124 +191 +128 +126 +189 +132 +131 +189 +134 +133 +190 +137 +136 +193 +141 +138 +193 +139 +136 +189 +137 +133 +183 +135 +127 +174 +133 +125 +166 +133 +123 +157 +128 +118 +143 +121 +110 +127 +114 +102 +112 +109 +97 +99 +107 +93 +90 +105 +90 +83 +99 +91 +78 +92 +97 +75 +90 +98 +74 +97 +95 +74 +103 +92 +74 +111 +89 +75 +115 +89 +74 +117 +90 +73 +119 +91 +70 +118 +86 +65 +123 +81 +59 +139 +81 +61 +171 +88 +70 +205 +91 +80 +226 +84 +80 +237 +71 +73 +239 +63 +65 +219 +50 +47 +220 +53 +47 +225 +53 +49 +227 +54 +48 +227 +53 +46 +225 +53 +43 +224 +54 +41 +219 +56 +41 +214 +55 +36 +211 +56 +36 +209 +56 +38 +212 +57 +39 +216 +54 +41 +220 +54 +42 +224 +51 +44 +218 +54 +45 +200 +54 +41 +189 +56 +39 +188 +55 +38 +189 +58 +40 +191 +62 +43 +194 +63 +45 +195 +59 +43 +196 +56 +41 +198 +52 +39 +233 +85 +73 +211 +60 +49 +204 +56 +44 +209 +66 +52 +190 +53 +37 +192 +61 +43 +192 +61 +43 +192 +56 +40 +196 +56 +39 +197 +57 +40 +199 +58 +41 +200 +57 +41 +203 +55 +41 +204 +54 +40 +205 +51 +39 +210 +54 +42 +212 +51 +41 +213 +50 +41 +219 +52 +44 +227 +58 +51 +233 +62 +55 +236 +63 +57 +236 +61 +58 +232 +52 +53 +236 +53 +57 +239 +54 +59 +238 +53 +59 +234 +50 +58 +230 +51 +57 +228 +55 +61 +226 +60 +64 +243 +85 +86 +252 +98 +98 +255 +109 +106 +255 +105 +100 +243 +86 +81 +228 +65 +60 +223 +54 +51 +221 +52 +47 +223 +54 +49 +222 +55 +49 +222 +55 +49 +223 +56 +50 +225 +56 +53 +226 +57 +54 +229 +57 +55 +230 +58 +56 +229 +55 +56 +230 +56 +57 +232 +56 +59 +233 +57 +60 +235 +56 +60 +235 +56 +60 +235 +56 +60 +236 +55 +60 +238 +53 +58 +238 +54 +56 +234 +54 +55 +229 +57 +55 +223 +60 +55 +214 +60 +52 +204 +57 +47 +197 +57 +44 +190 +57 +42 +186 +59 +42 +182 +59 +41 +181 +60 +41 +181 +60 +43 +180 +61 +41 +179 +59 +42 +179 +60 +40 +179 +58 +39 +183 +64 +44 +173 +56 +38 +173 +56 +39 +179 +59 +45 +171 +43 +34 +193 +53 +52 +252 +97 +103 +253 +85 +100 +249 +72 +92 +238 +62 +85 +232 +62 +88 +229 +73 +95 +220 +81 +100 +206 +81 +95 +177 +85 +90 +119 +70 +65 +92 +70 +57 +79 +66 +50 +74 +67 +49 +70 +67 +48 +64 +61 +42 +61 +54 +35 +61 +50 +30 +65 +50 +29 +81 +70 +42 +110 +107 +72 +138 +147 +102 +149 +172 +116 +145 +180 +116 +141 +184 +115 +144 +186 +120 +157 +187 +133 +161 +184 +138 +144 +167 +125 +108 +130 +91 +75 +95 +58 +65 +87 +48 +76 +99 +55 +87 +114 +63 +95 +123 +64 +100 +131 +64 +105 +138 +67 +107 +145 +70 +105 +145 +72 +103 +145 +71 +100 +143 +72 +101 +142 +74 +98 +135 +66 +99 +134 +66 +100 +135 +69 +103 +138 +72 +106 +141 +77 +108 +143 +79 +109 +145 +81 +110 +146 +82 +106 +145 +80 +106 +145 +78 +106 +146 +76 +104 +146 +74 +103 +145 +71 +105 +147 +71 +109 +151 +75 +112 +156 +79 +119 +166 +88 +118 +166 +90 +118 +166 +90 +55 +56 +40 +54 +56 +42 +54 +54 +44 +53 +54 +46 +53 +54 +48 +53 +54 +48 +54 +55 +47 +54 +56 +43 +59 +62 +45 +61 +64 +45 +64 +67 +46 +68 +71 +52 +73 +75 +62 +77 +78 +70 +81 +80 +78 +82 +82 +82 +86 +85 +83 +89 +88 +93 +97 +95 +108 +107 +105 +129 +117 +115 +155 +128 +125 +178 +136 +134 +199 +140 +138 +211 +149 +146 +225 +148 +145 +226 +144 +141 +220 +139 +135 +211 +132 +129 +196 +129 +125 +186 +127 +124 +181 +127 +124 +179 +129 +126 +181 +132 +129 +182 +135 +133 +183 +137 +134 +181 +138 +132 +176 +134 +128 +166 +129 +122 +155 +128 +119 +146 +127 +115 +135 +122 +110 +124 +114 +101 +108 +109 +95 +95 +106 +91 +88 +105 +90 +83 +106 +89 +79 +102 +90 +76 +97 +96 +76 +95 +97 +76 +100 +95 +76 +105 +92 +75 +110 +91 +76 +116 +90 +75 +122 +90 +75 +125 +90 +71 +127 +84 +65 +136 +81 +61 +157 +81 +65 +182 +86 +70 +205 +83 +72 +216 +72 +64 +223 +58 +56 +226 +52 +51 +221 +49 +45 +223 +51 +47 +226 +53 +47 +227 +53 +46 +225 +51 +44 +223 +51 +41 +221 +53 +40 +220 +57 +40 +211 +56 +36 +208 +57 +36 +207 +58 +38 +209 +58 +39 +212 +56 +41 +217 +55 +42 +221 +53 +44 +216 +55 +45 +196 +59 +43 +185 +58 +41 +181 +54 +37 +183 +56 +39 +189 +59 +43 +194 +61 +46 +199 +59 +46 +199 +55 +44 +208 +57 +48 +245 +92 +84 +214 +61 +53 +201 +53 +43 +207 +65 +53 +184 +51 +36 +183 +58 +40 +188 +63 +43 +191 +58 +41 +195 +58 +42 +198 +58 +43 +200 +58 +44 +202 +59 +45 +204 +58 +45 +207 +56 +45 +209 +55 +45 +208 +51 +42 +210 +49 +41 +214 +49 +43 +222 +55 +49 +229 +60 +55 +234 +62 +58 +232 +59 +55 +230 +55 +52 +233 +55 +53 +239 +59 +60 +240 +60 +63 +234 +54 +57 +228 +49 +53 +228 +53 +58 +232 +66 +70 +237 +77 +79 +255 +120 +119 +255 +113 +110 +241 +96 +91 +221 +74 +67 +209 +56 +51 +209 +50 +46 +220 +55 +51 +231 +64 +58 +224 +57 +51 +224 +57 +49 +224 +55 +50 +224 +55 +50 +226 +54 +50 +227 +55 +51 +229 +55 +54 +229 +55 +54 +230 +54 +56 +231 +55 +57 +234 +55 +59 +235 +56 +60 +235 +56 +62 +235 +56 +62 +232 +55 +61 +234 +55 +59 +238 +55 +59 +238 +55 +57 +234 +55 +58 +228 +58 +58 +223 +61 +58 +214 +61 +55 +203 +59 +50 +195 +59 +47 +186 +56 +42 +181 +58 +42 +179 +59 +42 +175 +60 +41 +175 +60 +42 +172 +60 +40 +172 +59 +41 +172 +59 +41 +170 +59 +40 +172 +61 +42 +166 +56 +39 +167 +57 +42 +170 +56 +45 +171 +48 +41 +203 +64 +67 +255 +105 +114 +243 +78 +94 +241 +72 +91 +235 +69 +89 +226 +73 +91 +215 +80 +94 +199 +85 +93 +178 +86 +87 +153 +90 +85 +103 +75 +63 +83 +74 +57 +80 +68 +52 +78 +67 +49 +73 +67 +45 +66 +64 +39 +63 +66 +35 +65 +71 +35 +77 +85 +46 +94 +103 +60 +120 +129 +84 +139 +153 +102 +145 +164 +109 +141 +169 +110 +143 +178 +114 +151 +185 +125 +157 +183 +136 +146 +167 +128 +117 +134 +100 +82 +99 +67 +63 +80 +48 +66 +83 +49 +79 +97 +57 +86 +108 +61 +98 +123 +66 +101 +130 +66 +105 +138 +67 +106 +144 +69 +105 +146 +70 +101 +145 +70 +98 +144 +72 +99 +142 +71 +98 +135 +66 +102 +134 +67 +103 +138 +72 +105 +140 +74 +107 +142 +78 +109 +144 +80 +110 +146 +82 +111 +147 +83 +106 +145 +78 +107 +146 +79 +106 +147 +77 +105 +147 +75 +105 +147 +73 +106 +150 +73 +110 +154 +75 +114 +158 +79 +120 +167 +89 +118 +167 +88 +118 +167 +88 +63 +61 +46 +61 +62 +46 +61 +61 +49 +61 +61 +51 +61 +61 +53 +59 +60 +52 +59 +61 +50 +59 +61 +47 +63 +66 +47 +64 +68 +45 +67 +71 +46 +70 +74 +51 +75 +76 +58 +78 +79 +65 +81 +81 +73 +82 +82 +72 +89 +87 +74 +90 +90 +78 +95 +94 +92 +103 +101 +114 +113 +110 +137 +123 +121 +161 +131 +128 +183 +135 +133 +196 +143 +140 +209 +143 +140 +211 +141 +138 +207 +138 +133 +199 +131 +127 +186 +126 +121 +175 +122 +119 +166 +121 +118 +165 +123 +119 +169 +124 +122 +171 +128 +125 +170 +131 +126 +166 +131 +125 +161 +127 +121 +149 +124 +116 +137 +122 +114 +129 +118 +107 +115 +114 +102 +104 +109 +95 +94 +106 +91 +86 +107 +90 +82 +108 +90 +80 +108 +90 +78 +107 +91 +78 +103 +94 +77 +102 +95 +77 +103 +94 +77 +106 +93 +77 +110 +93 +77 +118 +92 +77 +124 +92 +77 +131 +89 +73 +150 +94 +79 +157 +85 +71 +169 +77 +64 +185 +73 +61 +197 +64 +55 +204 +56 +46 +213 +50 +43 +221 +50 +43 +225 +53 +49 +225 +54 +47 +226 +53 +46 +226 +52 +45 +224 +50 +41 +222 +52 +39 +220 +54 +38 +218 +59 +40 +209 +57 +36 +205 +59 +36 +204 +59 +38 +206 +59 +39 +209 +58 +41 +213 +57 +42 +217 +55 +44 +211 +57 +45 +193 +62 +44 +180 +59 +40 +176 +53 +35 +178 +53 +35 +187 +57 +41 +196 +60 +46 +201 +59 +47 +203 +55 +45 +217 +63 +55 +248 +91 +84 +227 +73 +65 +206 +58 +48 +204 +64 +51 +184 +54 +38 +172 +51 +32 +181 +60 +41 +188 +57 +39 +191 +55 +39 +192 +55 +39 +195 +55 +40 +197 +55 +41 +201 +55 +42 +206 +55 +44 +209 +55 +45 +217 +60 +51 +219 +58 +50 +222 +57 +51 +229 +60 +55 +234 +62 +58 +234 +61 +57 +231 +56 +53 +227 +52 +49 +232 +57 +54 +235 +60 +57 +236 +58 +58 +232 +56 +58 +236 +62 +64 +248 +80 +80 +255 +98 +99 +255 +112 +112 +249 +104 +101 +226 +84 +80 +202 +61 +54 +192 +49 +43 +201 +52 +48 +214 +59 +55 +223 +61 +58 +224 +59 +55 +226 +59 +53 +225 +58 +50 +226 +57 +52 +225 +56 +51 +227 +55 +51 +228 +55 +51 +229 +53 +53 +230 +54 +54 +233 +54 +57 +233 +54 +57 +234 +55 +59 +235 +56 +60 +235 +56 +62 +234 +55 +61 +232 +55 +61 +233 +54 +58 +239 +56 +60 +236 +56 +57 +232 +56 +58 +227 +59 +58 +221 +62 +58 +211 +62 +55 +201 +60 +50 +192 +60 +47 +182 +56 +41 +178 +58 +41 +174 +59 +41 +170 +59 +40 +169 +60 +40 +168 +59 +39 +165 +58 +38 +165 +58 +40 +165 +60 +41 +160 +57 +40 +160 +59 +41 +160 +57 +42 +162 +54 +42 +181 +62 +56 +219 +84 +88 +249 +102 +112 +237 +76 +92 +237 +74 +93 +231 +76 +92 +216 +78 +91 +198 +83 +90 +177 +87 +86 +156 +92 +82 +136 +97 +82 +84 +71 +55 +77 +74 +57 +83 +70 +53 +77 +62 +43 +63 +51 +27 +57 +54 +23 +65 +77 +37 +78 +102 +54 +108 +138 +84 +119 +148 +92 +132 +155 +101 +137 +154 +100 +141 +155 +102 +144 +163 +107 +148 +173 +116 +152 +176 +124 +131 +149 +109 +110 +125 +92 +81 +96 +67 +60 +74 +48 +57 +70 +44 +65 +80 +49 +79 +95 +59 +87 +106 +61 +99 +122 +68 +101 +130 +66 +106 +139 +68 +107 +145 +70 +105 +146 +70 +101 +145 +70 +97 +143 +70 +99 +142 +71 +99 +136 +67 +105 +137 +70 +106 +141 +75 +108 +143 +77 +108 +143 +79 +108 +143 +79 +109 +145 +81 +110 +146 +82 +109 +148 +81 +109 +149 +79 +109 +150 +80 +108 +150 +76 +107 +151 +74 +109 +153 +74 +114 +159 +78 +115 +162 +81 +124 +173 +94 +123 +172 +93 +122 +171 +92 +68 +65 +48 +68 +66 +51 +68 +66 +54 +67 +67 +57 +67 +67 +59 +67 +67 +59 +66 +66 +54 +66 +67 +51 +68 +70 +48 +69 +72 +45 +71 +74 +45 +74 +77 +50 +79 +78 +57 +82 +81 +63 +84 +82 +69 +85 +83 +68 +92 +90 +67 +92 +92 +68 +92 +93 +79 +97 +97 +97 +105 +104 +120 +114 +113 +144 +123 +122 +166 +129 +126 +181 +134 +130 +191 +136 +131 +195 +136 +132 +193 +132 +129 +186 +127 +123 +174 +121 +115 +161 +116 +111 +151 +111 +109 +148 +112 +109 +154 +114 +111 +158 +118 +113 +154 +119 +115 +150 +119 +115 +142 +116 +111 +131 +115 +107 +120 +114 +105 +110 +109 +97 +97 +108 +95 +89 +106 +92 +83 +107 +90 +80 +109 +91 +79 +111 +91 +80 +111 +92 +78 +111 +92 +78 +110 +92 +78 +109 +93 +78 +107 +94 +78 +108 +95 +79 +111 +95 +79 +117 +96 +79 +125 +93 +78 +137 +89 +77 +161 +95 +83 +167 +79 +69 +174 +66 +56 +186 +59 +50 +197 +55 +45 +204 +50 +40 +212 +51 +41 +220 +53 +44 +224 +55 +48 +225 +54 +47 +225 +52 +45 +224 +51 +44 +224 +52 +42 +221 +53 +40 +216 +55 +37 +212 +57 +37 +207 +58 +34 +202 +61 +34 +201 +61 +36 +202 +62 +39 +205 +60 +41 +210 +59 +42 +213 +57 +44 +207 +59 +45 +191 +64 +45 +177 +60 +40 +172 +53 +33 +174 +51 +33 +186 +56 +40 +196 +60 +46 +202 +58 +47 +206 +53 +45 +216 +57 +51 +240 +78 +73 +241 +84 +77 +217 +66 +57 +204 +66 +53 +190 +63 +46 +166 +49 +29 +179 +60 +40 +190 +60 +44 +193 +57 +43 +193 +55 +42 +194 +54 +41 +197 +55 +43 +201 +57 +46 +207 +59 +49 +212 +59 +51 +225 +68 +61 +227 +65 +60 +228 +63 +59 +231 +62 +59 +233 +61 +59 +233 +59 +58 +232 +56 +56 +231 +56 +53 +231 +56 +53 +230 +57 +53 +230 +55 +52 +233 +59 +58 +244 +74 +74 +255 +92 +91 +255 +100 +99 +248 +99 +95 +204 +61 +57 +193 +56 +50 +189 +52 +46 +195 +56 +49 +213 +65 +61 +222 +69 +64 +223 +61 +59 +217 +52 +50 +226 +59 +53 +226 +59 +51 +226 +57 +52 +226 +57 +52 +228 +56 +52 +229 +56 +52 +231 +55 +55 +233 +55 +55 +234 +54 +57 +235 +55 +58 +235 +54 +59 +235 +56 +60 +235 +56 +62 +232 +55 +61 +232 +55 +61 +233 +54 +58 +235 +55 +58 +233 +54 +57 +230 +56 +57 +224 +59 +57 +219 +62 +57 +209 +62 +54 +198 +60 +49 +190 +60 +46 +179 +56 +41 +174 +59 +41 +170 +59 +40 +166 +59 +39 +164 +59 +40 +163 +58 +39 +163 +58 +39 +160 +57 +38 +161 +62 +43 +150 +55 +37 +156 +61 +43 +154 +57 +41 +154 +50 +39 +195 +80 +75 +237 +107 +109 +237 +93 +102 +235 +80 +94 +232 +75 +92 +220 +74 +87 +202 +77 +83 +182 +84 +83 +161 +93 +82 +142 +101 +81 +127 +106 +85 +78 +75 +56 +75 +72 +55 +80 +63 +47 +76 +55 +36 +69 +53 +27 +71 +71 +35 +87 +111 +61 +105 +146 +86 +127 +178 +111 +130 +179 +113 +131 +165 +104 +125 +146 +89 +131 +141 +89 +142 +150 +99 +137 +151 +100 +124 +140 +95 +88 +102 +67 +71 +84 +56 +57 +69 +45 +54 +66 +42 +58 +68 +44 +61 +74 +48 +74 +88 +55 +87 +104 +62 +101 +124 +70 +104 +130 +67 +108 +139 +69 +108 +144 +70 +105 +147 +71 +99 +145 +70 +97 +145 +71 +97 +143 +71 +102 +139 +70 +108 +140 +73 +109 +144 +78 +110 +145 +79 +108 +143 +79 +107 +142 +78 +107 +143 +79 +109 +145 +81 +112 +151 +84 +113 +153 +83 +112 +153 +83 +112 +154 +80 +111 +155 +78 +113 +157 +78 +116 +163 +82 +119 +166 +85 +126 +175 +96 +123 +174 +95 +121 +172 +93 +73 +67 +51 +74 +68 +54 +73 +69 +57 +73 +69 +58 +73 +71 +59 +73 +71 +59 +72 +70 +57 +72 +71 +53 +73 +72 +51 +74 +74 +50 +76 +76 +50 +78 +78 +52 +82 +80 +59 +84 +81 +62 +88 +82 +68 +89 +84 +65 +93 +89 +62 +91 +90 +62 +92 +89 +72 +94 +91 +84 +100 +97 +104 +110 +107 +126 +120 +115 +147 +125 +120 +160 +129 +123 +167 +131 +125 +171 +133 +127 +173 +131 +124 +166 +125 +119 +157 +117 +110 +143 +111 +105 +133 +107 +103 +130 +105 +102 +133 +106 +103 +134 +109 +104 +134 +109 +105 +128 +109 +105 +120 +108 +103 +110 +107 +98 +101 +106 +96 +94 +103 +93 +84 +104 +92 +80 +104 +90 +77 +107 +91 +76 +110 +93 +77 +113 +94 +79 +113 +94 +79 +112 +93 +78 +112 +93 +79 +111 +93 +79 +112 +93 +78 +115 +93 +79 +119 +93 +78 +126 +93 +78 +137 +91 +76 +147 +87 +76 +162 +84 +72 +166 +69 +60 +171 +57 +47 +186 +55 +45 +200 +56 +47 +211 +54 +45 +217 +54 +45 +221 +54 +45 +223 +54 +47 +223 +52 +45 +223 +52 +44 +223 +52 +44 +223 +55 +44 +221 +55 +41 +216 +54 +39 +209 +54 +36 +207 +58 +36 +204 +60 +36 +202 +60 +38 +203 +61 +39 +206 +59 +41 +209 +59 +42 +211 +58 +44 +206 +60 +45 +190 +65 +47 +175 +60 +39 +168 +51 +33 +172 +51 +32 +182 +57 +39 +193 +61 +46 +201 +59 +47 +204 +56 +46 +204 +50 +42 +224 +65 +59 +248 +91 +84 +224 +73 +64 +208 +68 +55 +202 +70 +55 +171 +50 +31 +184 +63 +44 +202 +70 +55 +204 +66 +53 +202 +64 +51 +203 +63 +50 +205 +63 +51 +210 +66 +55 +220 +69 +60 +225 +71 +63 +226 +64 +59 +226 +61 +57 +227 +58 +55 +226 +54 +52 +226 +54 +52 +227 +55 +53 +229 +57 +55 +229 +60 +57 +228 +63 +57 +224 +61 +54 +221 +58 +53 +225 +63 +58 +234 +77 +72 +234 +81 +76 +211 +64 +57 +184 +41 +35 +184 +45 +38 +190 +53 +45 +201 +62 +55 +208 +65 +59 +214 +62 +57 +217 +59 +56 +225 +59 +59 +231 +61 +61 +226 +57 +54 +226 +57 +54 +226 +57 +54 +228 +56 +54 +229 +57 +53 +231 +58 +54 +233 +57 +57 +234 +58 +58 +234 +56 +56 +234 +56 +56 +235 +56 +59 +235 +56 +59 +233 +57 +60 +232 +56 +59 +231 +55 +58 +231 +55 +58 +233 +54 +58 +230 +54 +56 +226 +56 +56 +222 +58 +56 +214 +61 +56 +204 +61 +53 +194 +60 +49 +185 +59 +45 +174 +57 +40 +170 +59 +42 +166 +59 +41 +162 +59 +40 +160 +59 +39 +158 +59 +38 +159 +58 +40 +155 +58 +39 +152 +63 +45 +140 +53 +34 +153 +61 +46 +152 +56 +42 +151 +47 +38 +205 +92 +88 +246 +122 +124 +222 +88 +95 +229 +89 +100 +217 +81 +91 +200 +77 +82 +183 +77 +79 +167 +87 +80 +155 +97 +85 +141 +104 +85 +128 +110 +86 +84 +84 +56 +67 +72 +42 +66 +57 +28 +72 +59 +27 +88 +80 +43 +110 +116 +68 +132 +162 +102 +148 +193 +126 +135 +188 +118 +134 +184 +115 +124 +158 +97 +110 +130 +77 +117 +126 +81 +130 +135 +94 +117 +125 +86 +91 +98 +64 +59 +68 +41 +52 +60 +37 +53 +61 +40 +61 +68 +50 +60 +69 +50 +57 +67 +43 +67 +80 +50 +85 +101 +62 +103 +123 +72 +105 +131 +70 +108 +139 +71 +109 +145 +71 +106 +147 +71 +102 +146 +71 +98 +144 +71 +99 +142 +71 +104 +141 +74 +108 +143 +77 +111 +146 +80 +110 +147 +80 +108 +143 +77 +105 +142 +75 +106 +143 +74 +106 +146 +76 +115 +155 +84 +115 +157 +85 +115 +157 +83 +114 +158 +81 +114 +158 +79 +115 +162 +82 +119 +166 +85 +122 +171 +90 +119 +167 +91 +117 +165 +91 +116 +164 +90 +82 +75 +59 +82 +75 +59 +82 +74 +61 +82 +74 +61 +82 +74 +61 +82 +74 +61 +82 +74 +61 +82 +75 +59 +85 +78 +60 +86 +79 +61 +87 +80 +62 +88 +81 +63 +89 +82 +64 +91 +84 +68 +92 +85 +69 +92 +85 +69 +98 +91 +72 +97 +90 +72 +97 +89 +76 +98 +89 +82 +101 +93 +91 +107 +97 +105 +113 +102 +116 +117 +106 +123 +122 +110 +132 +124 +112 +136 +127 +115 +139 +127 +115 +137 +124 +112 +132 +117 +106 +123 +109 +98 +114 +101 +93 +106 +99 +96 +105 +96 +95 +101 +95 +93 +98 +95 +90 +94 +94 +90 +89 +94 +89 +85 +97 +90 +82 +98 +90 +79 +101 +91 +79 +103 +91 +75 +105 +92 +75 +107 +92 +73 +107 +92 +71 +109 +92 +72 +109 +93 +70 +106 +94 +72 +106 +98 +79 +114 +101 +84 +113 +90 +74 +117 +79 +66 +139 +87 +74 +156 +92 +80 +162 +90 +76 +170 +91 +76 +164 +78 +61 +165 +70 +52 +166 +60 +44 +176 +56 +40 +194 +56 +45 +210 +56 +48 +221 +52 +49 +222 +49 +45 +223 +54 +47 +222 +55 +46 +222 +55 +46 +222 +55 +46 +222 +55 +46 +219 +55 +43 +216 +54 +41 +215 +55 +41 +213 +56 +41 +212 +56 +41 +210 +57 +41 +210 +57 +41 +210 +57 +43 +210 +57 +43 +212 +56 +43 +205 +59 +44 +189 +59 +43 +182 +62 +45 +174 +57 +40 +169 +49 +32 +171 +50 +33 +183 +57 +42 +192 +60 +47 +195 +57 +46 +200 +53 +43 +206 +53 +45 +212 +58 +48 +219 +67 +56 +221 +75 +62 +212 +72 +57 +194 +61 +44 +183 +50 +35 +221 +80 +70 +216 +74 +64 +212 +70 +60 +211 +69 +59 +215 +73 +63 +219 +72 +64 +221 +68 +62 +223 +61 +58 +223 +55 +52 +230 +56 +55 +234 +58 +58 +234 +58 +58 +229 +57 +55 +224 +55 +52 +222 +57 +51 +220 +61 +55 +220 +69 +62 +209 +65 +57 +199 +57 +47 +191 +50 +40 +185 +48 +38 +186 +52 +41 +191 +59 +47 +195 +63 +51 +195 +58 +48 +199 +61 +51 +208 +64 +55 +217 +64 +58 +224 +62 +59 +229 +60 +57 +233 +57 +57 +236 +58 +58 +230 +56 +58 +229 +56 +58 +229 +56 +58 +229 +57 +57 +229 +57 +55 +229 +57 +55 +229 +57 +53 +229 +57 +53 +224 +52 +48 +225 +53 +49 +228 +54 +53 +229 +55 +54 +230 +56 +57 +231 +57 +58 +231 +57 +58 +231 +57 +59 +235 +59 +62 +230 +57 +59 +223 +57 +57 +220 +61 +58 +214 +65 +61 +205 +66 +59 +193 +65 +54 +183 +63 +49 +169 +58 +41 +163 +60 +43 +160 +61 +42 +155 +60 +40 +153 +58 +38 +150 +58 +37 +151 +56 +38 +145 +56 +38 +144 +65 +48 +139 +60 +45 +135 +47 +35 +145 +47 +38 +188 +76 +74 +228 +109 +111 +229 +109 +111 +205 +86 +90 +189 +76 +78 +181 +78 +79 +170 +81 +77 +162 +85 +79 +155 +88 +79 +150 +93 +82 +149 +97 +84 +138 +106 +83 +88 +89 +47 +61 +75 +22 +56 +69 +15 +86 +97 +41 +127 +141 +80 +155 +176 +111 +161 +188 +121 +156 +189 +120 +146 +181 +115 +126 +157 +97 +104 +128 +76 +92 +109 +67 +89 +100 +66 +84 +93 +66 +72 +80 +57 +63 +68 +48 +58 +61 +44 +64 +67 +50 +60 +64 +49 +58 +62 +48 +60 +67 +51 +58 +67 +48 +65 +78 +50 +82 +100 +62 +93 +115 +66 +103 +131 +72 +112 +143 +75 +111 +147 +75 +108 +146 +71 +106 +146 +73 +105 +147 +75 +103 +144 +74 +108 +144 +80 +109 +145 +83 +111 +147 +83 +108 +147 +80 +109 +146 +77 +107 +147 +74 +109 +150 +74 +109 +152 +73 +113 +156 +76 +113 +158 +77 +114 +159 +78 +114 +161 +80 +116 +163 +82 +118 +167 +85 +121 +170 +89 +122 +170 +94 +123 +168 +101 +111 +155 +92 +101 +145 +82 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +88 +79 +64 +89 +80 +65 +89 +80 +65 +91 +82 +67 +92 +83 +68 +93 +84 +69 +94 +85 +70 +95 +86 +71 +100 +91 +74 +99 +90 +73 +99 +89 +77 +99 +89 +79 +102 +91 +85 +106 +95 +93 +110 +98 +100 +112 +100 +104 +114 +101 +108 +116 +103 +112 +118 +105 +114 +118 +105 +114 +115 +102 +109 +109 +96 +103 +103 +91 +95 +98 +88 +89 +94 +91 +86 +90 +90 +82 +89 +86 +79 +87 +84 +75 +88 +84 +73 +88 +84 +72 +92 +86 +72 +94 +87 +71 +99 +90 +75 +99 +90 +73 +102 +91 +73 +103 +92 +72 +105 +93 +71 +106 +94 +70 +107 +95 +71 +106 +95 +73 +102 +97 +77 +111 +103 +84 +119 +91 +77 +129 +83 +70 +153 +86 +77 +168 +88 +79 +175 +82 +74 +180 +82 +69 +173 +73 +57 +170 +67 +48 +171 +61 +44 +177 +57 +41 +190 +56 +44 +204 +55 +48 +216 +52 +50 +220 +51 +48 +221 +54 +46 +220 +56 +46 +220 +56 +46 +220 +56 +46 +219 +55 +45 +218 +56 +45 +217 +55 +44 +215 +55 +43 +215 +55 +43 +213 +55 +43 +213 +55 +43 +213 +55 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +206 +58 +44 +190 +60 +46 +182 +62 +46 +174 +57 +40 +166 +49 +32 +167 +50 +32 +178 +58 +41 +185 +62 +46 +190 +60 +46 +198 +58 +45 +199 +52 +42 +203 +52 +41 +210 +59 +48 +220 +69 +58 +225 +79 +66 +223 +81 +67 +221 +79 +67 +219 +70 +63 +214 +65 +59 +209 +60 +53 +208 +59 +52 +211 +62 +55 +215 +62 +56 +217 +58 +54 +218 +53 +51 +230 +56 +55 +234 +56 +56 +236 +56 +57 +234 +56 +56 +230 +56 +55 +226 +58 +55 +225 +62 +57 +219 +66 +58 +205 +64 +55 +194 +61 +52 +187 +57 +44 +180 +52 +39 +178 +52 +38 +181 +55 +41 +186 +60 +45 +191 +64 +49 +198 +64 +52 +205 +64 +54 +213 +65 +55 +220 +63 +56 +226 +58 +55 +230 +56 +55 +235 +55 +54 +239 +56 +58 +233 +54 +58 +231 +54 +60 +231 +55 +58 +230 +56 +57 +230 +56 +55 +229 +57 +53 +229 +57 +53 +227 +58 +53 +226 +57 +50 +227 +58 +51 +227 +58 +53 +228 +59 +54 +228 +59 +56 +228 +59 +56 +229 +57 +57 +229 +57 +57 +228 +58 +59 +227 +59 +59 +223 +60 +61 +217 +63 +61 +208 +65 +59 +196 +63 +54 +183 +61 +50 +172 +59 +45 +165 +59 +43 +160 +61 +42 +156 +61 +43 +151 +60 +41 +150 +59 +40 +146 +58 +38 +147 +56 +37 +140 +58 +37 +128 +57 +39 +128 +56 +41 +137 +53 +42 +157 +60 +53 +191 +81 +80 +215 +101 +101 +209 +94 +97 +183 +77 +77 +172 +78 +76 +164 +84 +77 +157 +89 +80 +152 +92 +81 +151 +94 +83 +151 +94 +83 +152 +95 +86 +140 +102 +81 +96 +95 +47 +83 +103 +42 +94 +114 +51 +122 +144 +79 +153 +175 +110 +165 +190 +124 +153 +178 +112 +136 +160 +98 +106 +130 +72 +97 +117 +66 +84 +101 +59 +74 +88 +55 +70 +80 +55 +63 +72 +53 +57 +63 +49 +53 +56 +45 +58 +60 +47 +65 +66 +52 +61 +63 +52 +58 +61 +50 +61 +65 +51 +58 +67 +48 +64 +77 +51 +82 +100 +62 +94 +116 +69 +103 +131 +72 +113 +144 +77 +112 +148 +76 +110 +146 +72 +107 +148 +72 +107 +147 +76 +104 +145 +75 +109 +145 +81 +110 +146 +84 +109 +148 +83 +109 +148 +81 +107 +147 +76 +107 +148 +72 +108 +151 +72 +109 +152 +72 +112 +157 +74 +112 +157 +74 +112 +160 +76 +115 +162 +81 +117 +166 +84 +120 +169 +88 +120 +169 +88 +120 +168 +94 +110 +152 +89 +100 +141 +83 +90 +131 +73 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +91 +82 +67 +92 +83 +68 +93 +84 +69 +94 +85 +70 +95 +86 +71 +96 +87 +72 +97 +88 +73 +97 +88 +71 +101 +93 +74 +101 +93 +72 +100 +91 +74 +100 +91 +76 +101 +91 +81 +102 +91 +85 +104 +93 +89 +104 +93 +91 +105 +93 +93 +106 +94 +94 +107 +95 +95 +107 +95 +95 +105 +94 +92 +102 +91 +89 +98 +87 +83 +95 +86 +81 +90 +86 +77 +87 +84 +75 +85 +81 +72 +82 +78 +67 +81 +77 +66 +83 +79 +67 +87 +81 +67 +88 +82 +66 +94 +87 +71 +94 +87 +69 +97 +89 +70 +99 +91 +70 +103 +92 +72 +105 +94 +72 +107 +96 +74 +105 +97 +76 +101 +96 +77 +113 +101 +85 +123 +94 +80 +136 +88 +78 +162 +91 +85 +175 +88 +81 +177 +74 +69 +182 +71 +64 +182 +65 +55 +183 +63 +49 +182 +60 +47 +184 +56 +43 +189 +55 +43 +197 +57 +44 +204 +57 +47 +211 +57 +47 +217 +56 +46 +219 +55 +45 +219 +55 +45 +219 +57 +46 +218 +56 +45 +217 +55 +44 +217 +55 +44 +215 +55 +43 +215 +55 +43 +213 +55 +43 +213 +55 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +210 +57 +43 +205 +59 +44 +192 +62 +48 +182 +62 +46 +173 +58 +40 +163 +50 +32 +163 +51 +31 +170 +58 +38 +179 +62 +44 +185 +62 +46 +196 +63 +48 +196 +56 +43 +197 +50 +40 +200 +52 +42 +208 +60 +48 +216 +70 +57 +220 +77 +63 +225 +78 +68 +216 +59 +54 +215 +53 +51 +210 +51 +48 +211 +53 +50 +216 +58 +55 +222 +63 +60 +227 +62 +60 +232 +60 +60 +236 +57 +60 +237 +54 +58 +234 +51 +55 +231 +51 +54 +230 +54 +56 +227 +57 +57 +224 +60 +58 +217 +64 +58 +193 +55 +45 +184 +56 +43 +179 +53 +39 +175 +52 +37 +175 +52 +37 +178 +55 +40 +182 +59 +43 +187 +61 +46 +200 +68 +53 +205 +67 +54 +213 +66 +56 +217 +63 +55 +223 +58 +52 +229 +56 +52 +234 +54 +53 +238 +55 +57 +234 +54 +57 +233 +54 +57 +233 +54 +57 +231 +55 +55 +231 +55 +55 +230 +57 +53 +229 +57 +53 +229 +58 +51 +227 +58 +51 +228 +59 +52 +228 +59 +54 +227 +60 +54 +227 +59 +56 +226 +58 +57 +225 +57 +57 +222 +56 +56 +221 +57 +58 +220 +60 +60 +218 +64 +62 +211 +66 +61 +200 +63 +57 +185 +58 +49 +173 +55 +43 +165 +55 +40 +161 +59 +44 +157 +60 +43 +153 +60 +43 +148 +59 +41 +147 +58 +40 +144 +57 +38 +144 +55 +37 +138 +57 +38 +122 +54 +35 +121 +54 +37 +136 +57 +44 +160 +70 +61 +185 +83 +79 +192 +87 +84 +184 +80 +79 +171 +73 +70 +162 +77 +72 +156 +83 +76 +153 +89 +80 +151 +94 +83 +151 +97 +87 +151 +97 +87 +152 +95 +86 +139 +101 +80 +115 +114 +70 +122 +141 +86 +147 +166 +110 +164 +185 +128 +171 +192 +135 +158 +179 +123 +124 +144 +91 +91 +111 +60 +63 +82 +36 +65 +83 +43 +65 +80 +47 +63 +76 +50 +58 +67 +48 +54 +60 +46 +54 +57 +48 +53 +56 +47 +57 +59 +46 +64 +65 +51 +61 +63 +52 +57 +60 +49 +61 +65 +51 +57 +66 +47 +64 +77 +51 +81 +99 +61 +96 +118 +71 +105 +133 +74 +115 +146 +79 +114 +150 +78 +112 +148 +74 +109 +150 +74 +109 +149 +78 +107 +148 +78 +112 +148 +84 +113 +149 +85 +111 +150 +83 +110 +150 +80 +108 +148 +75 +108 +149 +73 +108 +151 +72 +110 +153 +73 +112 +157 +76 +112 +157 +76 +112 +159 +78 +117 +164 +83 +120 +169 +88 +121 +170 +91 +117 +166 +87 +113 +160 +88 +95 +137 +74 +86 +127 +69 +79 +120 +62 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +95 +86 +71 +96 +87 +72 +96 +87 +72 +97 +88 +73 +98 +89 +74 +99 +90 +75 +100 +91 +76 +100 +91 +74 +101 +93 +72 +102 +94 +71 +102 +94 +73 +103 +95 +76 +103 +94 +79 +102 +92 +80 +102 +92 +82 +102 +92 +83 +104 +93 +87 +104 +93 +87 +104 +93 +87 +104 +94 +85 +103 +93 +84 +101 +91 +81 +100 +90 +80 +99 +91 +78 +93 +89 +77 +90 +86 +74 +86 +82 +70 +82 +78 +66 +80 +76 +64 +80 +77 +62 +84 +78 +64 +85 +79 +63 +87 +81 +65 +89 +84 +65 +91 +86 +67 +93 +88 +68 +97 +90 +71 +100 +93 +74 +102 +95 +76 +102 +97 +77 +103 +97 +81 +111 +99 +85 +119 +91 +79 +138 +91 +81 +169 +98 +92 +182 +91 +88 +180 +71 +68 +183 +61 +58 +193 +61 +56 +195 +60 +54 +195 +58 +48 +193 +57 +45 +189 +56 +41 +189 +57 +42 +193 +61 +46 +202 +62 +47 +213 +57 +45 +217 +55 +44 +218 +56 +45 +217 +57 +45 +218 +56 +45 +216 +56 +44 +216 +56 +44 +213 +55 +43 +213 +55 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +210 +57 +43 +205 +59 +44 +193 +63 +49 +182 +62 +46 +172 +57 +39 +162 +51 +32 +157 +51 +29 +162 +56 +34 +172 +61 +41 +181 +64 +46 +188 +63 +45 +191 +58 +43 +195 +55 +42 +197 +53 +42 +203 +55 +43 +206 +58 +46 +206 +60 +47 +211 +58 +50 +220 +55 +53 +223 +50 +52 +218 +50 +50 +218 +52 +52 +222 +56 +56 +226 +60 +60 +232 +62 +63 +235 +61 +62 +235 +56 +60 +235 +52 +56 +232 +49 +54 +229 +50 +53 +228 +54 +56 +224 +56 +55 +217 +55 +53 +204 +55 +49 +185 +51 +40 +177 +54 +39 +175 +53 +38 +174 +54 +38 +174 +54 +38 +176 +56 +40 +179 +58 +41 +181 +58 +42 +195 +65 +49 +202 +66 +52 +210 +66 +55 +217 +64 +56 +223 +60 +53 +227 +58 +53 +234 +56 +54 +236 +56 +55 +237 +54 +56 +235 +55 +56 +235 +55 +56 +234 +56 +54 +234 +56 +54 +232 +57 +52 +231 +58 +52 +230 +59 +52 +226 +57 +50 +225 +58 +50 +223 +58 +52 +224 +59 +55 +222 +58 +56 +220 +58 +56 +219 +57 +55 +217 +57 +57 +214 +60 +58 +213 +64 +60 +210 +67 +61 +202 +65 +59 +187 +59 +50 +175 +54 +43 +164 +54 +39 +158 +55 +40 +156 +59 +42 +152 +59 +41 +148 +59 +41 +146 +59 +40 +143 +58 +38 +141 +56 +36 +140 +55 +35 +135 +57 +37 +128 +61 +42 +118 +53 +35 +129 +53 +39 +153 +69 +58 +170 +80 +72 +172 +77 +71 +169 +76 +71 +166 +81 +76 +157 +80 +74 +152 +85 +76 +148 +90 +79 +148 +94 +82 +149 +97 +86 +149 +97 +86 +151 +97 +87 +141 +103 +84 +137 +133 +95 +153 +169 +120 +173 +189 +142 +166 +184 +136 +144 +161 +116 +115 +134 +89 +78 +96 +56 +47 +65 +27 +45 +62 +28 +51 +66 +37 +58 +70 +46 +61 +70 +51 +59 +65 +51 +58 +61 +50 +58 +61 +52 +60 +61 +53 +57 +57 +45 +63 +64 +50 +60 +62 +51 +57 +60 +49 +60 +64 +50 +57 +66 +47 +63 +76 +50 +80 +98 +60 +97 +119 +72 +106 +134 +75 +116 +147 +80 +115 +151 +79 +114 +150 +76 +111 +152 +76 +111 +151 +80 +109 +151 +79 +112 +151 +84 +115 +152 +85 +112 +152 +82 +111 +151 +80 +109 +150 +74 +109 +150 +72 +110 +153 +74 +112 +155 +75 +113 +158 +77 +114 +159 +78 +116 +163 +83 +121 +168 +88 +123 +172 +93 +119 +167 +91 +109 +157 +83 +101 +146 +77 +90 +132 +69 +82 +123 +65 +77 +118 +60 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +100 +91 +76 +100 +91 +76 +101 +92 +77 +102 +93 +78 +102 +93 +78 +102 +93 +76 +102 +94 +71 +103 +95 +72 +104 +96 +73 +105 +97 +76 +105 +97 +78 +105 +96 +79 +104 +95 +80 +103 +94 +79 +106 +96 +84 +105 +96 +81 +105 +96 +81 +104 +95 +78 +104 +95 +78 +104 +96 +77 +104 +96 +77 +104 +97 +78 +100 +94 +78 +96 +90 +76 +91 +85 +71 +86 +80 +66 +80 +77 +62 +78 +75 +58 +78 +75 +58 +78 +75 +58 +80 +77 +60 +82 +79 +62 +84 +81 +64 +86 +83 +64 +88 +87 +67 +91 +90 +70 +93 +92 +72 +95 +92 +75 +99 +96 +81 +105 +93 +81 +112 +85 +74 +134 +91 +82 +172 +105 +99 +189 +100 +96 +191 +79 +77 +197 +67 +67 +205 +61 +61 +210 +58 +57 +209 +57 +52 +203 +56 +48 +194 +56 +43 +187 +60 +41 +184 +65 +43 +190 +65 +43 +208 +58 +43 +215 +55 +41 +216 +56 +42 +215 +58 +43 +217 +57 +43 +214 +57 +42 +214 +57 +42 +212 +56 +41 +212 +56 +41 +212 +56 +41 +212 +56 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +205 +59 +44 +193 +63 +49 +182 +62 +48 +171 +58 +40 +161 +54 +34 +154 +52 +30 +155 +55 +32 +163 +61 +38 +175 +66 +45 +179 +59 +42 +186 +59 +44 +194 +58 +44 +199 +57 +45 +203 +56 +46 +206 +58 +48 +208 +60 +48 +216 +59 +52 +232 +58 +60 +234 +53 +60 +228 +51 +57 +226 +51 +56 +223 +53 +56 +223 +53 +56 +225 +52 +56 +225 +51 +53 +233 +54 +60 +232 +53 +57 +231 +52 +58 +230 +56 +58 +226 +57 +60 +218 +56 +54 +206 +51 +49 +191 +48 +40 +181 +53 +40 +174 +57 +40 +174 +57 +40 +173 +58 +40 +173 +58 +40 +173 +58 +40 +173 +56 +38 +175 +55 +38 +184 +58 +43 +193 +59 +47 +205 +63 +51 +215 +64 +55 +221 +62 +56 +225 +60 +56 +231 +58 +54 +235 +57 +55 +237 +55 +54 +238 +54 +54 +238 +54 +54 +237 +55 +52 +234 +56 +52 +232 +58 +51 +231 +58 +51 +228 +60 +51 +225 +58 +50 +223 +59 +50 +223 +60 +53 +220 +61 +55 +219 +61 +58 +217 +62 +60 +215 +61 +59 +212 +62 +61 +207 +64 +60 +203 +66 +60 +197 +66 +58 +185 +61 +53 +173 +55 +45 +163 +53 +40 +158 +55 +40 +154 +58 +42 +150 +59 +41 +147 +60 +41 +145 +59 +42 +141 +58 +40 +138 +57 +38 +137 +56 +37 +136 +55 +36 +131 +56 +37 +131 +64 +45 +117 +52 +34 +123 +51 +37 +147 +71 +58 +164 +81 +73 +161 +78 +70 +158 +78 +71 +161 +87 +78 +152 +85 +76 +146 +88 +76 +144 +90 +78 +141 +92 +78 +143 +93 +82 +148 +96 +85 +151 +97 +87 +143 +104 +87 +141 +137 +102 +152 +165 +122 +157 +169 +129 +128 +142 +106 +93 +107 +72 +68 +83 +52 +50 +64 +38 +36 +50 +25 +45 +58 +38 +48 +59 +42 +53 +61 +46 +57 +63 +51 +60 +63 +52 +61 +63 +52 +58 +59 +51 +58 +58 +48 +57 +57 +45 +62 +63 +49 +59 +61 +50 +56 +59 +48 +59 +63 +49 +56 +65 +46 +62 +75 +49 +80 +98 +60 +98 +120 +73 +107 +135 +76 +117 +148 +81 +116 +152 +80 +115 +151 +77 +113 +154 +78 +113 +153 +82 +111 +153 +81 +114 +154 +83 +114 +154 +83 +114 +154 +81 +112 +153 +77 +109 +151 +75 +109 +152 +73 +112 +155 +76 +115 +158 +79 +116 +160 +81 +118 +162 +83 +120 +167 +89 +123 +169 +94 +122 +168 +95 +113 +159 +86 +100 +146 +74 +89 +134 +67 +92 +133 +73 +85 +124 +69 +81 +120 +65 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +102 +93 +78 +102 +93 +78 +102 +93 +78 +103 +94 +79 +103 +94 +79 +104 +95 +80 +104 +95 +78 +103 +95 +74 +104 +96 +73 +105 +97 +76 +106 +98 +77 +106 +98 +79 +106 +98 +79 +106 +97 +80 +106 +97 +80 +106 +97 +80 +105 +97 +78 +104 +96 +77 +104 +96 +75 +104 +96 +75 +104 +96 +73 +105 +97 +74 +106 +98 +75 +102 +95 +77 +98 +93 +74 +94 +88 +72 +88 +82 +66 +83 +77 +61 +77 +74 +57 +75 +72 +55 +73 +72 +54 +75 +74 +56 +76 +75 +57 +76 +77 +59 +78 +79 +61 +80 +81 +63 +81 +84 +65 +83 +86 +69 +84 +85 +69 +92 +88 +76 +95 +85 +73 +100 +80 +69 +124 +87 +78 +161 +104 +97 +181 +102 +97 +193 +88 +85 +211 +83 +82 +214 +65 +67 +220 +60 +62 +219 +57 +55 +210 +56 +48 +200 +58 +46 +189 +62 +43 +178 +66 +42 +183 +64 +40 +204 +59 +42 +212 +55 +40 +213 +56 +41 +213 +57 +42 +214 +57 +42 +213 +57 +42 +213 +57 +42 +212 +56 +41 +212 +56 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +205 +59 +44 +193 +63 +49 +181 +61 +47 +171 +60 +41 +162 +57 +36 +153 +54 +31 +149 +53 +29 +155 +59 +34 +167 +65 +42 +178 +66 +46 +185 +64 +47 +191 +59 +44 +195 +55 +42 +197 +50 +40 +203 +52 +43 +210 +59 +48 +223 +61 +56 +233 +54 +58 +237 +52 +60 +234 +55 +61 +232 +57 +62 +229 +59 +62 +228 +59 +62 +225 +59 +61 +224 +58 +60 +223 +53 +56 +224 +55 +58 +226 +57 +62 +224 +61 +62 +217 +61 +62 +207 +58 +54 +194 +51 +47 +181 +48 +39 +177 +57 +43 +172 +61 +42 +172 +61 +42 +171 +62 +42 +170 +61 +41 +169 +60 +40 +169 +58 +39 +171 +56 +37 +175 +54 +37 +183 +56 +41 +197 +59 +48 +206 +62 +51 +214 +61 +53 +222 +60 +55 +227 +59 +56 +232 +59 +55 +236 +56 +55 +239 +55 +53 +239 +55 +53 +238 +56 +53 +235 +58 +52 +233 +59 +52 +231 +60 +52 +228 +61 +52 +226 +62 +53 +224 +63 +55 +222 +65 +58 +218 +65 +59 +217 +65 +62 +213 +65 +63 +209 +64 +61 +205 +66 +63 +195 +63 +58 +187 +64 +56 +179 +61 +51 +170 +56 +45 +161 +53 +40 +155 +53 +39 +152 +56 +40 +149 +60 +42 +145 +60 +40 +141 +60 +41 +138 +60 +40 +136 +58 +38 +134 +57 +39 +132 +55 +37 +131 +54 +36 +127 +54 +37 +125 +58 +41 +116 +51 +33 +126 +57 +42 +151 +79 +65 +163 +89 +78 +156 +82 +71 +149 +79 +69 +152 +86 +74 +149 +89 +78 +144 +91 +77 +142 +90 +77 +140 +91 +77 +142 +92 +81 +147 +95 +84 +153 +96 +87 +145 +103 +87 +126 +120 +88 +121 +131 +94 +114 +124 +90 +85 +96 +66 +59 +69 +44 +47 +59 +37 +48 +59 +42 +48 +60 +46 +51 +61 +50 +52 +60 +49 +54 +60 +50 +60 +63 +54 +64 +65 +57 +63 +65 +54 +60 +60 +48 +55 +55 +43 +56 +57 +43 +62 +63 +49 +58 +60 +49 +55 +58 +47 +58 +62 +48 +55 +64 +45 +61 +74 +48 +79 +97 +59 +98 +120 +73 +107 +135 +76 +117 +148 +81 +117 +153 +81 +116 +152 +78 +113 +154 +78 +114 +154 +83 +112 +154 +82 +114 +154 +81 +115 +156 +80 +114 +155 +79 +112 +153 +75 +110 +153 +74 +112 +155 +76 +115 +158 +79 +118 +161 +82 +121 +165 +88 +123 +167 +90 +122 +168 +93 +120 +166 +93 +113 +159 +87 +103 +148 +79 +93 +138 +69 +88 +130 +66 +95 +134 +77 +87 +126 +71 +82 +121 +66 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +105 +96 +79 +106 +97 +80 +106 +98 +79 +106 +98 +79 +106 +98 +79 +105 +96 +79 +105 +96 +79 +105 +97 +78 +105 +97 +78 +105 +97 +78 +104 +96 +75 +104 +96 +75 +104 +96 +73 +104 +96 +73 +104 +97 +71 +104 +97 +71 +104 +97 +71 +102 +95 +76 +101 +94 +75 +98 +91 +73 +92 +87 +68 +87 +82 +63 +80 +77 +58 +76 +73 +56 +73 +72 +54 +73 +72 +54 +71 +72 +54 +71 +74 +57 +71 +75 +58 +72 +76 +59 +73 +77 +60 +72 +79 +63 +74 +78 +63 +82 +80 +67 +89 +81 +70 +92 +78 +67 +105 +82 +68 +129 +89 +77 +149 +87 +76 +174 +84 +76 +209 +91 +89 +217 +75 +74 +223 +65 +66 +223 +57 +57 +217 +55 +50 +207 +59 +49 +195 +62 +45 +183 +64 +42 +180 +60 +36 +201 +58 +41 +211 +55 +40 +212 +56 +41 +211 +58 +42 +213 +57 +42 +211 +58 +42 +211 +58 +42 +211 +58 +42 +210 +57 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +205 +59 +44 +193 +61 +48 +181 +61 +47 +172 +61 +44 +163 +60 +41 +152 +56 +32 +144 +52 +27 +149 +57 +32 +161 +65 +41 +173 +67 +45 +182 +65 +47 +191 +61 +47 +192 +54 +43 +194 +47 +37 +199 +48 +39 +208 +54 +46 +222 +58 +56 +232 +53 +57 +238 +54 +62 +236 +59 +65 +233 +64 +67 +229 +66 +69 +224 +66 +67 +220 +64 +65 +217 +63 +63 +204 +50 +50 +207 +55 +54 +211 +58 +60 +207 +62 +59 +199 +60 +57 +189 +56 +49 +180 +53 +46 +171 +53 +41 +170 +60 +45 +167 +62 +43 +167 +62 +43 +166 +63 +44 +165 +62 +43 +166 +61 +40 +166 +59 +39 +169 +58 +39 +170 +55 +37 +177 +56 +39 +188 +56 +43 +195 +57 +46 +203 +56 +48 +211 +58 +52 +220 +61 +57 +228 +63 +59 +233 +58 +55 +236 +57 +53 +236 +57 +53 +235 +58 +52 +233 +59 +52 +232 +59 +52 +229 +61 +52 +226 +62 +52 +224 +66 +55 +221 +67 +57 +218 +67 +60 +213 +66 +59 +207 +65 +61 +202 +63 +60 +199 +61 +59 +191 +62 +57 +177 +60 +51 +169 +58 +47 +162 +56 +43 +156 +54 +40 +152 +55 +39 +148 +56 +41 +145 +58 +41 +141 +58 +40 +139 +61 +41 +137 +60 +42 +135 +60 +41 +131 +58 +39 +130 +57 +40 +128 +55 +38 +127 +54 +37 +125 +54 +36 +120 +51 +35 +120 +53 +37 +133 +66 +50 +152 +85 +69 +157 +87 +75 +148 +80 +67 +144 +80 +68 +149 +90 +76 +147 +89 +77 +144 +90 +78 +144 +92 +81 +144 +92 +81 +146 +91 +84 +149 +92 +85 +152 +91 +86 +142 +98 +85 +107 +98 +69 +86 +96 +61 +74 +83 +52 +61 +71 +44 +54 +63 +42 +50 +61 +44 +52 +62 +51 +53 +63 +54 +54 +61 +54 +56 +63 +56 +61 +66 +59 +67 +70 +61 +69 +71 +60 +67 +68 +54 +64 +62 +47 +59 +57 +42 +55 +56 +42 +61 +62 +48 +58 +60 +49 +55 +58 +47 +58 +62 +48 +54 +63 +44 +61 +74 +48 +78 +96 +58 +97 +119 +72 +107 +135 +76 +117 +148 +81 +117 +153 +81 +116 +152 +78 +114 +155 +79 +114 +154 +83 +112 +154 +80 +113 +155 +79 +114 +157 +78 +113 +156 +77 +112 +155 +76 +111 +154 +75 +114 +157 +78 +117 +161 +84 +121 +165 +88 +127 +171 +96 +126 +169 +97 +122 +165 +93 +113 +156 +85 +102 +145 +76 +95 +137 +71 +93 +135 +69 +94 +136 +73 +97 +136 +79 +89 +128 +73 +82 +121 +66 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +103 +94 +79 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +105 +96 +81 +105 +96 +81 +109 +100 +85 +108 +99 +84 +106 +97 +82 +105 +96 +81 +104 +95 +80 +103 +94 +79 +103 +94 +77 +104 +96 +77 +105 +97 +78 +105 +97 +76 +105 +97 +76 +105 +97 +76 +104 +96 +73 +104 +96 +73 +104 +97 +71 +104 +96 +73 +103 +97 +75 +102 +95 +76 +101 +94 +75 +98 +91 +72 +92 +87 +68 +85 +82 +63 +80 +77 +60 +77 +76 +58 +69 +70 +52 +68 +71 +52 +68 +72 +55 +68 +72 +55 +66 +73 +57 +66 +75 +58 +66 +75 +58 +67 +74 +58 +74 +74 +62 +84 +80 +68 +85 +79 +65 +89 +76 +60 +101 +75 +58 +115 +69 +53 +146 +74 +62 +192 +91 +83 +215 +83 +79 +222 +70 +69 +223 +59 +58 +220 +55 +53 +213 +59 +51 +204 +61 +47 +189 +60 +41 +184 +55 +34 +203 +58 +41 +207 +56 +39 +208 +57 +40 +210 +59 +42 +210 +59 +42 +210 +59 +42 +210 +59 +42 +210 +59 +42 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +205 +59 +44 +193 +59 +48 +182 +58 +46 +173 +60 +44 +167 +62 +43 +153 +57 +35 +143 +51 +26 +147 +55 +30 +159 +63 +39 +163 +57 +35 +176 +59 +41 +192 +62 +48 +198 +60 +49 +204 +56 +46 +208 +55 +47 +217 +60 +53 +227 +63 +61 +236 +61 +66 +238 +63 +68 +233 +67 +69 +226 +68 +67 +214 +64 +63 +202 +59 +55 +192 +53 +48 +187 +49 +46 +183 +48 +44 +187 +54 +49 +190 +58 +54 +187 +60 +54 +179 +58 +50 +169 +57 +46 +164 +56 +44 +160 +58 +43 +161 +61 +45 +159 +62 +43 +160 +63 +44 +161 +64 +45 +161 +64 +45 +163 +64 +43 +163 +62 +42 +164 +61 +42 +169 +59 +42 +173 +58 +40 +178 +55 +40 +184 +54 +41 +191 +53 +43 +201 +57 +48 +212 +63 +57 +224 +67 +62 +229 +60 +55 +232 +59 +53 +232 +59 +53 +231 +60 +52 +229 +60 +53 +228 +61 +52 +225 +62 +53 +222 +64 +53 +220 +68 +57 +216 +68 +58 +210 +67 +59 +202 +65 +57 +196 +63 +58 +188 +59 +54 +184 +56 +53 +176 +57 +51 +162 +55 +45 +153 +56 +40 +149 +53 +39 +147 +54 +39 +145 +58 +41 +143 +60 +42 +139 +58 +41 +133 +56 +38 +136 +61 +42 +133 +60 +43 +131 +60 +42 +128 +60 +41 +126 +58 +39 +124 +56 +37 +123 +54 +38 +123 +54 +38 +121 +49 +35 +128 +56 +42 +140 +71 +56 +150 +83 +67 +146 +80 +66 +139 +76 +61 +144 +82 +69 +153 +95 +83 +145 +87 +76 +146 +89 +78 +148 +91 +82 +150 +93 +84 +150 +93 +86 +151 +92 +86 +150 +89 +84 +140 +94 +81 +97 +88 +59 +69 +77 +40 +54 +64 +30 +56 +65 +38 +62 +71 +50 +60 +69 +52 +51 +61 +50 +45 +55 +46 +49 +56 +49 +55 +62 +54 +66 +69 +60 +71 +74 +63 +72 +73 +59 +66 +67 +49 +63 +62 +42 +59 +58 +38 +55 +56 +40 +61 +62 +48 +57 +59 +48 +54 +57 +46 +58 +62 +48 +54 +63 +44 +60 +73 +47 +78 +96 +58 +97 +119 +72 +106 +134 +75 +117 +148 +81 +116 +152 +80 +116 +152 +78 +114 +155 +79 +114 +154 +83 +112 +154 +80 +113 +156 +77 +113 +156 +76 +113 +156 +76 +112 +155 +75 +112 +155 +76 +115 +158 +79 +119 +163 +86 +123 +167 +92 +130 +173 +101 +128 +171 +100 +120 +163 +92 +106 +149 +80 +93 +135 +69 +89 +131 +65 +94 +136 +72 +101 +143 +80 +99 +138 +81 +90 +129 +74 +83 +122 +67 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +95 +83 +106 +96 +87 +106 +96 +87 +106 +96 +87 +106 +96 +87 +106 +96 +86 +106 +96 +86 +106 +96 +84 +106 +97 +82 +106 +97 +82 +106 +97 +80 +106 +97 +80 +106 +98 +79 +106 +98 +79 +106 +98 +79 +106 +98 +77 +106 +98 +77 +103 +95 +74 +103 +95 +74 +102 +94 +73 +101 +95 +73 +98 +93 +73 +90 +88 +67 +83 +80 +61 +77 +76 +58 +72 +73 +55 +69 +72 +55 +65 +69 +54 +64 +68 +53 +63 +69 +55 +63 +71 +56 +63 +71 +56 +63 +69 +55 +72 +74 +61 +74 +75 +61 +67 +68 +52 +75 +74 +54 +92 +81 +59 +96 +70 +47 +128 +75 +57 +189 +107 +93 +217 +104 +96 +224 +86 +83 +226 +71 +69 +229 +65 +64 +226 +64 +61 +215 +61 +53 +203 +59 +48 +201 +59 +45 +199 +51 +37 +203 +53 +38 +204 +54 +39 +205 +55 +40 +205 +55 +40 +206 +56 +41 +209 +59 +44 +211 +61 +46 +210 +60 +45 +210 +60 +45 +210 +60 +45 +210 +60 +45 +209 +59 +44 +209 +59 +44 +209 +59 +44 +206 +60 +45 +187 +50 +40 +182 +55 +46 +177 +59 +47 +168 +58 +41 +154 +55 +34 +148 +53 +31 +149 +55 +30 +156 +57 +34 +174 +65 +45 +179 +59 +43 +186 +54 +41 +193 +52 +42 +205 +54 +47 +215 +60 +55 +226 +67 +63 +234 +72 +69 +232 +68 +69 +232 +69 +72 +221 +67 +67 +201 +58 +54 +187 +54 +49 +180 +56 +48 +176 +55 +46 +169 +52 +43 +171 +57 +47 +169 +57 +46 +164 +56 +46 +160 +56 +45 +155 +57 +44 +150 +58 +43 +147 +60 +43 +146 +60 +43 +150 +61 +43 +152 +61 +42 +153 +62 +43 +154 +63 +44 +155 +64 +45 +156 +65 +44 +158 +66 +45 +161 +64 +45 +162 +59 +42 +165 +58 +40 +171 +55 +40 +176 +54 +41 +182 +54 +43 +190 +56 +45 +197 +58 +51 +204 +60 +52 +218 +61 +54 +224 +61 +54 +226 +63 +56 +226 +65 +55 +226 +65 +57 +222 +66 +54 +218 +64 +54 +215 +64 +53 +216 +72 +61 +210 +69 +59 +199 +65 +56 +187 +59 +50 +178 +53 +47 +170 +51 +45 +166 +49 +42 +159 +50 +43 +153 +57 +45 +146 +59 +42 +145 +57 +43 +141 +58 +42 +139 +58 +41 +136 +59 +41 +135 +59 +43 +133 +60 +43 +128 +57 +39 +125 +56 +40 +124 +57 +40 +124 +57 +40 +124 +57 +40 +123 +56 +39 +121 +54 +38 +120 +51 +36 +119 +45 +32 +139 +65 +52 +151 +79 +67 +147 +77 +65 +142 +76 +64 +145 +81 +69 +147 +85 +74 +142 +82 +71 +152 +92 +82 +152 +92 +82 +145 +85 +77 +144 +84 +76 +151 +90 +85 +149 +88 +83 +148 +87 +84 +147 +103 +90 +93 +84 +53 +73 +81 +42 +65 +75 +40 +66 +75 +44 +62 +72 +47 +55 +64 +43 +50 +61 +45 +52 +63 +49 +52 +60 +49 +72 +80 +67 +90 +94 +80 +87 +91 +74 +77 +79 +58 +68 +70 +46 +65 +65 +39 +61 +61 +37 +58 +59 +41 +62 +63 +49 +59 +61 +50 +58 +61 +50 +59 +63 +49 +52 +61 +42 +59 +72 +46 +80 +98 +60 +99 +121 +74 +108 +136 +77 +117 +148 +81 +115 +151 +79 +114 +150 +76 +112 +153 +77 +114 +154 +83 +113 +155 +81 +112 +157 +76 +113 +158 +75 +114 +159 +78 +114 +159 +78 +115 +159 +80 +118 +162 +85 +123 +167 +92 +127 +170 +98 +130 +173 +102 +120 +163 +94 +106 +147 +79 +96 +137 +71 +94 +135 +69 +97 +137 +74 +102 +142 +80 +104 +144 +84 +100 +137 +83 +91 +128 +76 +84 +121 +69 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +95 +83 +106 +95 +89 +106 +95 +91 +106 +95 +91 +106 +95 +89 +106 +95 +89 +106 +96 +87 +106 +96 +86 +106 +96 +84 +106 +96 +84 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +80 +106 +97 +80 +104 +96 +77 +104 +96 +75 +103 +95 +74 +103 +95 +74 +100 +93 +74 +94 +89 +69 +85 +82 +63 +79 +78 +58 +73 +74 +58 +69 +72 +55 +66 +68 +54 +64 +68 +53 +63 +69 +55 +62 +70 +55 +62 +70 +55 +61 +69 +54 +66 +70 +56 +65 +67 +53 +64 +69 +49 +72 +76 +53 +77 +73 +48 +82 +65 +39 +124 +82 +58 +185 +117 +98 +201 +100 +88 +221 +96 +90 +234 +86 +84 +230 +72 +71 +226 +64 +62 +226 +64 +61 +219 +62 +57 +209 +56 +48 +205 +57 +43 +206 +61 +44 +207 +61 +46 +207 +62 +45 +207 +59 +45 +206 +59 +43 +205 +57 +43 +205 +58 +42 +206 +58 +44 +208 +58 +43 +208 +58 +44 +208 +58 +43 +208 +58 +44 +208 +58 +43 +208 +58 +44 +205 +59 +46 +201 +63 +53 +197 +66 +58 +188 +66 +55 +174 +61 +47 +159 +54 +35 +150 +49 +29 +150 +49 +29 +155 +50 +29 +168 +53 +35 +180 +54 +40 +195 +59 +47 +209 +65 +56 +222 +69 +63 +230 +73 +68 +233 +74 +70 +234 +75 +72 +224 +66 +65 +219 +69 +68 +208 +66 +62 +190 +59 +51 +175 +57 +47 +171 +61 +48 +165 +63 +49 +159 +61 +48 +159 +63 +49 +156 +62 +50 +151 +62 +48 +149 +61 +47 +143 +61 +47 +139 +62 +46 +135 +64 +46 +136 +63 +44 +142 +61 +42 +143 +60 +42 +146 +60 +43 +145 +62 +44 +148 +63 +43 +148 +63 +43 +150 +63 +44 +153 +62 +44 +159 +64 +46 +161 +61 +45 +164 +58 +44 +168 +56 +44 +173 +55 +43 +178 +56 +45 +184 +57 +48 +189 +56 +47 +202 +60 +50 +208 +60 +50 +211 +63 +53 +213 +65 +55 +215 +67 +57 +214 +67 +57 +212 +68 +57 +209 +69 +56 +202 +66 +54 +195 +65 +52 +185 +61 +51 +176 +58 +48 +169 +54 +47 +164 +53 +46 +159 +52 +44 +153 +55 +44 +146 +58 +46 +140 +61 +44 +138 +59 +44 +136 +59 +43 +134 +58 +42 +132 +59 +42 +131 +60 +42 +129 +60 +44 +126 +59 +42 +124 +59 +41 +123 +57 +41 +121 +58 +41 +120 +57 +40 +119 +56 +39 +117 +54 +39 +119 +52 +36 +128 +52 +39 +144 +68 +55 +152 +78 +67 +145 +75 +63 +140 +74 +62 +143 +81 +68 +146 +84 +73 +144 +82 +71 +147 +83 +74 +152 +88 +79 +152 +85 +79 +151 +86 +80 +156 +93 +88 +148 +87 +82 +142 +83 +79 +138 +99 +84 +93 +87 +53 +88 +99 +57 +95 +106 +66 +90 +102 +66 +73 +84 +54 +54 +67 +41 +52 +64 +42 +60 +72 +52 +79 +88 +71 +89 +98 +81 +95 +102 +84 +87 +92 +70 +74 +78 +55 +66 +69 +42 +63 +63 +35 +60 +60 +34 +57 +58 +40 +61 +62 +48 +58 +60 +49 +57 +60 +49 +60 +64 +50 +53 +62 +43 +59 +72 +46 +80 +98 +60 +100 +122 +75 +108 +136 +77 +117 +148 +81 +116 +152 +80 +114 +150 +76 +113 +154 +78 +114 +154 +83 +113 +155 +81 +115 +160 +79 +114 +159 +76 +112 +157 +76 +113 +158 +77 +116 +160 +81 +120 +164 +87 +124 +167 +95 +127 +170 +99 +123 +166 +97 +111 +154 +85 +99 +140 +74 +93 +134 +68 +97 +137 +74 +101 +141 +78 +101 +141 +78 +99 +139 +79 +100 +137 +83 +91 +128 +76 +84 +121 +69 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +95 +85 +106 +95 +91 +106 +94 +94 +106 +94 +94 +106 +95 +93 +106 +95 +89 +106 +96 +87 +106 +96 +86 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +86 +106 +96 +84 +108 +97 +79 +107 +96 +76 +105 +97 +78 +105 +97 +78 +102 +95 +76 +97 +92 +72 +89 +86 +67 +83 +82 +62 +77 +75 +60 +72 +73 +57 +68 +70 +56 +65 +69 +54 +65 +69 +54 +63 +70 +54 +62 +68 +54 +61 +67 +53 +62 +69 +53 +58 +62 +45 +66 +71 +49 +73 +75 +51 +69 +63 +37 +84 +64 +39 +132 +92 +67 +181 +116 +96 +179 +87 +74 +214 +100 +90 +239 +101 +98 +236 +84 +83 +230 +70 +72 +235 +71 +72 +232 +66 +68 +219 +57 +54 +203 +55 +43 +201 +58 +42 +201 +58 +44 +201 +58 +42 +203 +57 +44 +202 +56 +41 +200 +54 +41 +200 +54 +39 +202 +56 +43 +203 +55 +41 +203 +55 +43 +203 +55 +41 +203 +55 +43 +204 +56 +42 +204 +56 +44 +203 +56 +46 +194 +51 +45 +190 +53 +47 +182 +54 +45 +173 +51 +40 +161 +48 +34 +158 +47 +30 +160 +49 +32 +167 +51 +36 +188 +65 +50 +199 +67 +55 +214 +71 +63 +225 +76 +70 +231 +76 +71 +233 +74 +70 +229 +70 +66 +223 +68 +64 +216 +66 +65 +209 +67 +65 +195 +63 +58 +177 +59 +49 +166 +60 +47 +161 +65 +49 +156 +69 +52 +152 +69 +51 +149 +68 +51 +146 +67 +52 +143 +66 +50 +138 +65 +48 +133 +64 +48 +130 +65 +47 +126 +65 +46 +129 +64 +46 +132 +59 +42 +136 +59 +43 +137 +58 +41 +137 +60 +42 +139 +60 +43 +139 +60 +43 +142 +61 +42 +143 +60 +42 +150 +63 +46 +152 +60 +45 +155 +59 +43 +158 +56 +42 +162 +56 +43 +167 +56 +45 +170 +58 +46 +175 +57 +47 +185 +57 +46 +190 +57 +48 +193 +59 +48 +196 +62 +51 +197 +63 +51 +197 +65 +52 +195 +65 +51 +193 +65 +52 +182 +59 +44 +178 +58 +44 +170 +56 +45 +163 +55 +43 +158 +54 +43 +155 +54 +44 +152 +55 +46 +148 +58 +47 +141 +59 +47 +136 +60 +44 +135 +59 +45 +132 +59 +44 +130 +58 +43 +128 +59 +43 +128 +59 +43 +127 +60 +44 +125 +59 +43 +122 +59 +42 +122 +59 +44 +119 +57 +42 +118 +56 +41 +117 +55 +40 +116 +54 +41 +118 +52 +38 +136 +59 +49 +148 +70 +60 +150 +78 +66 +142 +74 +61 +136 +72 +60 +141 +79 +66 +145 +83 +72 +146 +82 +73 +146 +79 +73 +153 +84 +79 +153 +83 +81 +154 +86 +83 +154 +93 +90 +147 +89 +85 +141 +91 +84 +141 +108 +91 +129 +125 +88 +126 +137 +94 +128 +139 +97 +108 +120 +82 +76 +88 +52 +54 +68 +35 +61 +74 +46 +76 +90 +64 +101 +113 +89 +101 +111 +87 +93 +101 +77 +80 +85 +62 +69 +73 +48 +63 +67 +40 +61 +64 +35 +58 +60 +36 +56 +57 +39 +59 +60 +46 +56 +58 +47 +57 +60 +49 +61 +65 +51 +54 +63 +44 +60 +73 +47 +80 +98 +60 +100 +122 +75 +109 +137 +78 +118 +149 +82 +116 +152 +80 +115 +151 +77 +113 +154 +78 +114 +154 +83 +112 +154 +80 +117 +162 +81 +112 +160 +76 +110 +157 +76 +112 +159 +79 +117 +164 +86 +121 +167 +92 +125 +168 +96 +124 +167 +96 +112 +153 +85 +102 +143 +77 +92 +132 +69 +92 +132 +69 +101 +140 +77 +105 +144 +81 +102 +141 +78 +95 +133 +72 +99 +136 +82 +90 +127 +76 +83 +120 +69 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +96 +86 +107 +96 +92 +107 +95 +95 +107 +96 +94 +107 +96 +92 +107 +96 +90 +107 +97 +88 +107 +97 +87 +107 +97 +85 +107 +97 +85 +107 +97 +85 +107 +97 +85 +107 +97 +85 +107 +97 +87 +107 +97 +87 +107 +97 +88 +107 +97 +87 +110 +98 +82 +109 +98 +80 +106 +98 +79 +106 +98 +79 +104 +97 +78 +101 +94 +75 +95 +90 +71 +89 +86 +69 +82 +79 +62 +77 +75 +60 +71 +72 +58 +68 +70 +56 +67 +69 +55 +66 +68 +54 +64 +68 +53 +62 +66 +51 +63 +70 +52 +60 +65 +45 +71 +73 +51 +76 +70 +48 +77 +59 +37 +110 +78 +57 +152 +100 +79 +167 +96 +78 +158 +66 +53 +197 +84 +76 +229 +100 +95 +239 +95 +94 +237 +83 +85 +237 +74 +79 +234 +68 +72 +227 +64 +65 +205 +56 +49 +199 +57 +45 +197 +55 +43 +197 +55 +43 +200 +56 +45 +202 +58 +47 +203 +59 +48 +205 +58 +48 +209 +62 +52 +209 +62 +52 +210 +62 +52 +210 +62 +52 +211 +63 +53 +211 +63 +53 +211 +63 +53 +211 +62 +55 +211 +63 +59 +209 +66 +62 +203 +68 +62 +198 +70 +61 +194 +70 +60 +195 +73 +62 +199 +77 +64 +206 +80 +68 +217 +83 +72 +221 +80 +71 +226 +77 +71 +228 +73 +69 +228 +71 +66 +226 +67 +63 +224 +65 +61 +220 +65 +61 +214 +69 +66 +202 +67 +63 +189 +62 +55 +173 +59 +48 +161 +61 +46 +155 +66 +48 +151 +70 +51 +148 +73 +54 +142 +69 +52 +140 +69 +51 +138 +66 +51 +133 +66 +49 +130 +64 +48 +125 +64 +46 +123 +64 +46 +124 +63 +45 +128 +59 +44 +131 +57 +44 +131 +58 +43 +132 +59 +44 +132 +59 +44 +133 +60 +45 +135 +59 +43 +136 +59 +43 +137 +58 +43 +140 +57 +41 +143 +55 +41 +147 +55 +42 +150 +56 +44 +156 +58 +47 +160 +59 +47 +163 +59 +48 +170 +58 +47 +173 +56 +46 +175 +57 +47 +176 +58 +46 +176 +58 +46 +176 +58 +44 +175 +57 +43 +174 +56 +42 +168 +55 +41 +165 +55 +40 +158 +54 +41 +155 +54 +42 +149 +55 +43 +146 +56 +45 +145 +57 +47 +142 +60 +48 +136 +60 +46 +133 +60 +45 +131 +59 +44 +129 +57 +42 +127 +58 +42 +126 +57 +42 +125 +58 +42 +125 +59 +43 +124 +58 +44 +122 +59 +44 +121 +59 +44 +119 +57 +42 +115 +56 +42 +113 +54 +40 +114 +55 +41 +117 +53 +41 +140 +68 +56 +146 +72 +61 +145 +75 +63 +138 +72 +58 +135 +73 +60 +139 +79 +68 +147 +84 +75 +151 +84 +76 +150 +81 +76 +155 +84 +80 +152 +81 +79 +148 +83 +79 +150 +92 +88 +144 +95 +88 +144 +104 +94 +151 +126 +106 +148 +148 +112 +133 +146 +102 +117 +130 +87 +89 +104 +63 +67 +82 +43 +63 +79 +42 +80 +96 +60 +99 +114 +81 +101 +116 +85 +92 +105 +75 +78 +88 +61 +67 +76 +49 +63 +69 +43 +62 +66 +41 +61 +65 +40 +59 +61 +39 +55 +56 +40 +58 +59 +45 +55 +57 +46 +57 +60 +49 +61 +65 +51 +55 +64 +45 +60 +73 +47 +79 +97 +59 +98 +120 +73 +108 +136 +77 +118 +149 +82 +117 +153 +81 +116 +152 +78 +114 +155 +79 +114 +154 +83 +111 +155 +80 +113 +160 +79 +111 +158 +77 +111 +158 +77 +115 +162 +82 +122 +168 +93 +124 +170 +97 +122 +165 +94 +117 +160 +91 +99 +140 +74 +94 +135 +69 +91 +131 +68 +95 +135 +72 +103 +142 +79 +106 +145 +80 +102 +141 +76 +96 +135 +72 +98 +135 +81 +89 +126 +75 +82 +119 +68 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +96 +84 +107 +96 +90 +107 +96 +92 +107 +96 +90 +107 +97 +88 +107 +97 +87 +107 +97 +85 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +97 +85 +107 +97 +87 +107 +97 +87 +107 +97 +88 +107 +97 +87 +111 +99 +85 +110 +98 +82 +107 +98 +81 +107 +98 +81 +107 +98 +81 +104 +97 +79 +100 +93 +77 +96 +90 +74 +88 +82 +66 +82 +79 +62 +78 +75 +60 +73 +71 +56 +71 +69 +54 +68 +69 +53 +66 +67 +51 +63 +66 +49 +64 +72 +49 +65 +70 +47 +77 +71 +49 +83 +62 +43 +101 +62 +45 +148 +90 +76 +170 +96 +83 +153 +63 +52 +155 +52 +43 +179 +64 +57 +214 +89 +85 +241 +106 +103 +245 +101 +101 +235 +82 +85 +232 +73 +78 +233 +77 +80 +217 +73 +65 +211 +70 +60 +205 +64 +54 +203 +62 +52 +206 +64 +54 +210 +68 +58 +213 +71 +61 +215 +71 +62 +218 +74 +65 +218 +74 +65 +221 +74 +66 +221 +74 +66 +222 +75 +67 +222 +75 +67 +224 +75 +68 +224 +75 +69 +235 +83 +82 +232 +84 +84 +227 +83 +82 +220 +82 +79 +216 +83 +76 +216 +83 +76 +219 +85 +76 +224 +85 +78 +224 +76 +72 +225 +73 +70 +227 +69 +66 +226 +67 +64 +228 +66 +64 +226 +67 +64 +228 +69 +66 +224 +70 +68 +218 +73 +70 +203 +68 +64 +188 +61 +55 +174 +60 +50 +163 +62 +50 +153 +66 +49 +147 +68 +51 +146 +71 +52 +141 +68 +51 +138 +66 +51 +137 +65 +51 +132 +63 +48 +130 +62 +49 +128 +62 +48 +125 +62 +47 +125 +62 +47 +127 +59 +46 +128 +58 +46 +128 +58 +46 +128 +58 +46 +128 +61 +45 +129 +60 +45 +129 +60 +45 +131 +59 +45 +130 +57 +42 +132 +56 +42 +134 +56 +43 +138 +56 +42 +140 +57 +43 +144 +58 +45 +146 +58 +46 +148 +58 +47 +155 +59 +47 +158 +57 +45 +159 +57 +45 +160 +58 +44 +161 +57 +44 +162 +56 +43 +162 +56 +42 +162 +56 +42 +159 +56 +41 +156 +56 +41 +152 +56 +40 +148 +56 +41 +143 +57 +42 +140 +58 +44 +137 +58 +45 +135 +59 +45 +132 +58 +45 +130 +58 +44 +129 +57 +43 +128 +56 +42 +125 +56 +41 +125 +55 +43 +124 +56 +43 +123 +57 +43 +122 +56 +44 +121 +57 +45 +120 +58 +45 +118 +56 +43 +113 +53 +42 +111 +53 +41 +113 +55 +43 +116 +57 +43 +140 +72 +59 +141 +73 +60 +137 +73 +61 +132 +73 +59 +133 +75 +63 +140 +82 +70 +147 +87 +77 +152 +88 +79 +152 +81 +77 +156 +85 +81 +152 +82 +80 +147 +86 +81 +146 +96 +89 +136 +98 +87 +131 +103 +91 +134 +122 +100 +110 +114 +81 +90 +105 +64 +74 +89 +48 +65 +82 +40 +73 +90 +48 +87 +105 +63 +100 +118 +78 +106 +124 +86 +88 +105 +69 +76 +91 +58 +63 +76 +46 +58 +68 +41 +60 +68 +44 +62 +67 +45 +60 +65 +45 +58 +61 +44 +56 +57 +43 +58 +59 +45 +54 +56 +45 +56 +59 +48 +62 +66 +52 +55 +64 +45 +59 +72 +46 +76 +94 +56 +95 +117 +70 +105 +133 +74 +116 +147 +80 +116 +152 +80 +116 +152 +78 +114 +155 +79 +115 +155 +84 +112 +156 +81 +110 +157 +77 +109 +158 +76 +112 +161 +80 +119 +168 +89 +124 +170 +97 +122 +168 +96 +114 +157 +88 +105 +147 +81 +90 +131 +65 +92 +132 +69 +97 +136 +73 +101 +140 +77 +103 +142 +77 +103 +142 +75 +104 +141 +74 +102 +138 +76 +99 +134 +80 +89 +123 +73 +82 +116 +66 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +97 +85 +108 +98 +89 +108 +98 +89 +108 +98 +89 +108 +98 +86 +108 +98 +86 +108 +99 +82 +108 +99 +82 +108 +100 +81 +108 +100 +81 +108 +100 +81 +108 +99 +82 +108 +99 +84 +108 +98 +86 +108 +98 +88 +108 +98 +88 +108 +98 +88 +111 +99 +85 +110 +98 +82 +107 +98 +81 +108 +99 +82 +108 +99 +82 +107 +98 +81 +103 +96 +80 +100 +93 +77 +94 +87 +71 +89 +83 +67 +83 +77 +63 +77 +74 +59 +75 +72 +57 +71 +69 +54 +69 +66 +51 +64 +65 +47 +61 +71 +46 +66 +70 +45 +81 +66 +45 +98 +61 +45 +129 +69 +58 +169 +89 +82 +178 +79 +74 +155 +46 +43 +175 +60 +57 +184 +62 +59 +208 +84 +82 +242 +112 +110 +254 +118 +118 +243 +100 +104 +237 +88 +94 +242 +93 +95 +227 +85 +81 +218 +80 +70 +212 +71 +64 +208 +67 +58 +209 +68 +61 +212 +71 +62 +214 +71 +65 +214 +71 +63 +217 +72 +67 +218 +74 +66 +220 +72 +68 +221 +74 +67 +222 +74 +70 +222 +75 +68 +224 +75 +71 +224 +75 +71 +226 +72 +72 +225 +71 +73 +220 +72 +72 +217 +71 +71 +214 +72 +68 +215 +72 +68 +216 +71 +66 +219 +70 +66 +224 +66 +65 +228 +65 +66 +230 +66 +65 +232 +66 +66 +231 +67 +66 +228 +66 +64 +223 +65 +62 +219 +65 +63 +221 +73 +71 +205 +66 +63 +188 +59 +54 +175 +61 +51 +165 +63 +51 +153 +64 +48 +146 +65 +48 +144 +67 +51 +140 +64 +50 +137 +64 +49 +136 +62 +49 +134 +60 +49 +132 +60 +48 +129 +59 +49 +129 +59 +49 +128 +60 +49 +128 +60 +49 +127 +61 +49 +127 +60 +51 +127 +61 +49 +127 +61 +49 +127 +61 +47 +127 +61 +49 +127 +61 +47 +128 +60 +47 +129 +60 +45 +131 +59 +45 +131 +57 +44 +133 +57 +44 +132 +56 +42 +133 +55 +43 +133 +54 +41 +141 +57 +46 +143 +56 +46 +145 +57 +45 +148 +58 +47 +151 +59 +46 +154 +61 +46 +158 +60 +47 +159 +62 +46 +153 +57 +41 +150 +57 +40 +147 +58 +42 +144 +58 +43 +138 +59 +44 +135 +59 +43 +132 +59 +44 +130 +58 +43 +130 +58 +44 +129 +57 +43 +127 +55 +41 +126 +54 +40 +123 +53 +41 +123 +53 +41 +123 +53 +41 +122 +54 +41 +120 +54 +42 +120 +56 +44 +119 +57 +44 +115 +56 +42 +112 +52 +41 +111 +53 +41 +114 +58 +45 +118 +60 +48 +139 +77 +64 +137 +75 +60 +132 +74 +60 +130 +77 +61 +133 +81 +67 +139 +86 +72 +146 +88 +77 +151 +87 +78 +147 +78 +73 +153 +84 +79 +151 +86 +82 +149 +92 +85 +144 +101 +92 +123 +94 +80 +102 +86 +70 +96 +94 +71 +69 +79 +45 +62 +78 +41 +63 +79 +40 +74 +92 +50 +95 +114 +69 +107 +126 +81 +101 +120 +75 +88 +106 +64 +77 +95 +55 +64 +81 +45 +54 +69 +38 +55 +68 +42 +61 +70 +49 +61 +68 +52 +58 +62 +48 +55 +59 +45 +56 +58 +44 +58 +59 +45 +54 +56 +45 +56 +59 +48 +62 +66 +52 +55 +64 +45 +57 +70 +44 +73 +91 +53 +91 +113 +66 +101 +129 +70 +114 +145 +78 +115 +151 +79 +115 +151 +77 +114 +155 +79 +115 +155 +84 +112 +156 +81 +109 +156 +76 +111 +160 +79 +115 +164 +85 +120 +168 +92 +122 +168 +96 +115 +160 +91 +105 +147 +81 +96 +138 +72 +89 +129 +66 +94 +134 +71 +101 +140 +77 +103 +142 +77 +102 +141 +74 +101 +141 +71 +103 +140 +71 +104 +140 +76 +97 +132 +78 +88 +122 +72 +81 +115 +65 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +98 +88 +108 +98 +86 +108 +98 +86 +108 +99 +82 +108 +99 +82 +108 +100 +79 +108 +100 +79 +108 +100 +77 +108 +100 +77 +108 +100 +77 +108 +100 +79 +108 +100 +81 +108 +99 +82 +108 +99 +84 +108 +98 +86 +108 +98 +86 +111 +99 +85 +109 +97 +83 +107 +98 +83 +108 +99 +84 +109 +100 +85 +108 +99 +84 +105 +96 +81 +102 +95 +79 +98 +91 +75 +94 +87 +71 +88 +81 +65 +82 +76 +60 +79 +73 +57 +74 +71 +54 +73 +67 +51 +65 +67 +46 +60 +70 +43 +66 +69 +42 +86 +64 +43 +122 +70 +57 +163 +80 +76 +178 +72 +72 +180 +57 +60 +183 +52 +57 +197 +67 +69 +193 +65 +64 +200 +75 +73 +222 +98 +96 +241 +113 +112 +242 +109 +112 +233 +97 +101 +228 +89 +92 +219 +81 +78 +213 +76 +68 +207 +68 +63 +205 +66 +59 +207 +68 +63 +208 +69 +62 +208 +66 +62 +205 +64 +57 +210 +67 +63 +210 +67 +61 +212 +67 +64 +213 +68 +63 +215 +67 +65 +216 +68 +64 +217 +69 +67 +218 +68 +67 +221 +65 +68 +221 +65 +68 +222 +68 +70 +221 +71 +72 +223 +73 +72 +224 +74 +73 +227 +73 +73 +229 +71 +72 +231 +65 +67 +234 +65 +68 +236 +66 +69 +236 +66 +69 +231 +65 +65 +226 +64 +62 +219 +61 +58 +214 +60 +58 +219 +69 +70 +204 +60 +60 +188 +54 +51 +177 +58 +50 +169 +62 +52 +155 +61 +49 +147 +61 +48 +145 +63 +49 +139 +60 +47 +139 +59 +48 +138 +58 +49 +137 +57 +48 +136 +56 +49 +135 +56 +51 +136 +57 +52 +133 +58 +52 +128 +60 +51 +125 +61 +51 +125 +61 +52 +125 +61 +51 +125 +61 +51 +125 +61 +49 +125 +61 +51 +124 +60 +48 +124 +60 +48 +124 +61 +46 +126 +60 +46 +126 +58 +45 +125 +57 +44 +125 +56 +41 +126 +54 +42 +126 +54 +42 +131 +57 +46 +131 +57 +46 +135 +57 +45 +137 +57 +46 +141 +57 +46 +145 +59 +46 +149 +60 +46 +150 +61 +45 +146 +57 +41 +145 +58 +41 +141 +58 +42 +138 +59 +42 +135 +59 +43 +131 +60 +42 +128 +59 +43 +126 +59 +42 +128 +56 +42 +128 +56 +44 +126 +54 +42 +125 +53 +41 +124 +52 +40 +122 +52 +40 +122 +52 +42 +121 +53 +42 +117 +50 +41 +118 +54 +44 +118 +56 +45 +114 +54 +43 +111 +51 +41 +111 +53 +42 +115 +58 +47 +120 +64 +51 +138 +80 +66 +134 +78 +63 +129 +78 +61 +130 +81 +64 +133 +86 +70 +137 +88 +73 +142 +85 +74 +145 +82 +73 +146 +79 +73 +151 +84 +78 +147 +84 +79 +145 +92 +86 +138 +102 +90 +110 +91 +74 +80 +75 +55 +69 +75 +49 +65 +78 +48 +75 +90 +57 +87 +103 +67 +96 +114 +74 +103 +121 +79 +100 +122 +76 +86 +108 +62 +71 +93 +47 +65 +86 +45 +55 +72 +36 +49 +64 +33 +54 +66 +42 +61 +70 +53 +60 +68 +57 +56 +61 +54 +55 +58 +51 +57 +59 +46 +59 +60 +46 +54 +56 +45 +57 +60 +49 +63 +67 +53 +55 +64 +45 +55 +68 +42 +70 +88 +50 +86 +108 +61 +97 +125 +66 +111 +142 +75 +113 +149 +77 +115 +151 +77 +114 +155 +79 +116 +156 +85 +113 +157 +82 +111 +158 +80 +113 +162 +81 +117 +166 +87 +118 +166 +90 +115 +161 +89 +106 +151 +82 +98 +140 +74 +91 +133 +69 +94 +134 +72 +96 +136 +73 +99 +138 +75 +101 +140 +75 +102 +141 +74 +102 +142 +72 +102 +139 +70 +101 +137 +73 +96 +131 +77 +87 +121 +71 +80 +114 +64 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +98 +86 +108 +99 +84 +108 +99 +84 +108 +99 +82 +108 +100 +81 +108 +100 +79 +108 +100 +79 +108 +100 +77 +108 +100 +77 +108 +100 +79 +108 +100 +79 +108 +100 +81 +108 +99 +82 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +109 +97 +83 +109 +97 +83 +109 +97 +83 +109 +100 +85 +108 +99 +84 +106 +97 +82 +103 +96 +80 +100 +93 +77 +96 +89 +73 +90 +83 +67 +85 +78 +62 +80 +75 +56 +77 +72 +53 +73 +68 +49 +69 +67 +46 +65 +69 +42 +71 +67 +40 +92 +65 +44 +137 +83 +71 +175 +92 +88 +169 +63 +65 +169 +49 +51 +203 +74 +78 +195 +64 +69 +189 +61 +62 +185 +59 +60 +195 +71 +71 +216 +90 +91 +229 +101 +102 +221 +88 +91 +205 +71 +72 +209 +74 +71 +207 +69 +66 +205 +66 +63 +206 +67 +62 +210 +71 +66 +210 +71 +66 +206 +67 +62 +201 +62 +55 +207 +68 +61 +209 +68 +61 +210 +68 +64 +212 +69 +65 +214 +69 +66 +217 +69 +67 +220 +67 +69 +222 +68 +70 +222 +63 +67 +223 +64 +68 +222 +66 +69 +223 +69 +69 +225 +71 +71 +224 +70 +70 +224 +66 +67 +225 +62 +63 +232 +66 +68 +234 +64 +67 +232 +62 +65 +231 +61 +62 +228 +62 +62 +228 +64 +63 +226 +67 +64 +223 +69 +67 +215 +65 +66 +200 +56 +56 +184 +52 +48 +177 +58 +52 +169 +62 +54 +155 +61 +51 +146 +60 +47 +142 +63 +50 +137 +59 +47 +136 +58 +48 +136 +58 +48 +136 +56 +49 +136 +55 +51 +138 +55 +51 +137 +56 +52 +136 +59 +53 +128 +58 +50 +126 +59 +50 +126 +59 +50 +124 +60 +50 +124 +60 +48 +124 +60 +48 +124 +60 +48 +124 +60 +48 +120 +56 +44 +121 +57 +45 +124 +58 +46 +124 +58 +46 +125 +59 +45 +125 +59 +45 +125 +57 +44 +125 +57 +44 +126 +58 +47 +127 +57 +47 +128 +55 +46 +129 +55 +44 +132 +54 +42 +133 +53 +42 +134 +55 +42 +134 +55 +40 +138 +56 +42 +136 +57 +42 +136 +59 +43 +133 +60 +45 +132 +60 +45 +128 +61 +44 +126 +60 +44 +125 +59 +43 +125 +57 +44 +125 +55 +45 +124 +54 +44 +121 +53 +42 +122 +52 +42 +120 +52 +41 +120 +52 +41 +120 +53 +44 +114 +50 +40 +117 +53 +43 +118 +56 +45 +114 +54 +43 +110 +52 +41 +110 +53 +42 +116 +59 +48 +120 +66 +54 +138 +85 +71 +132 +80 +66 +128 +79 +64 +132 +83 +68 +136 +87 +73 +140 +86 +74 +140 +82 +71 +141 +78 +71 +149 +84 +78 +148 +85 +78 +139 +82 +75 +132 +88 +77 +127 +100 +83 +101 +90 +68 +71 +75 +50 +61 +74 +44 +73 +88 +57 +90 +107 +73 +103 +120 +84 +99 +120 +81 +89 +110 +69 +83 +104 +61 +78 +99 +56 +74 +95 +52 +58 +76 +38 +48 +63 +30 +44 +57 +29 +53 +62 +41 +61 +67 +53 +60 +66 +56 +58 +60 +55 +57 +60 +53 +59 +61 +50 +59 +61 +48 +55 +57 +46 +57 +60 +49 +63 +67 +53 +56 +63 +45 +56 +66 +41 +69 +85 +49 +85 +104 +59 +97 +122 +67 +110 +138 +77 +114 +147 +78 +114 +150 +78 +114 +154 +81 +115 +157 +83 +113 +157 +82 +114 +160 +85 +117 +163 +88 +118 +164 +91 +116 +162 +90 +111 +154 +85 +102 +144 +78 +94 +136 +72 +91 +131 +68 +100 +140 +78 +97 +137 +75 +96 +135 +72 +99 +138 +73 +102 +141 +74 +103 +142 +75 +101 +138 +69 +97 +133 +69 +96 +131 +77 +87 +121 +71 +80 +114 +64 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +81 +107 +98 +81 +107 +98 +81 +107 +98 +81 +108 +99 +82 +108 +99 +82 +108 +99 +82 +108 +99 +82 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +107 +93 +80 +112 +96 +81 +116 +100 +87 +114 +100 +87 +110 +98 +86 +106 +96 +84 +104 +96 +83 +104 +98 +84 +103 +97 +83 +103 +97 +81 +99 +93 +77 +91 +86 +67 +86 +81 +61 +83 +78 +56 +78 +72 +50 +71 +65 +41 +76 +70 +44 +74 +62 +36 +98 +73 +51 +145 +103 +87 +182 +120 +109 +187 +108 +101 +183 +89 +87 +185 +79 +79 +182 +66 +69 +189 +66 +69 +194 +68 +71 +200 +70 +72 +205 +72 +75 +208 +74 +75 +211 +75 +77 +211 +75 +77 +205 +69 +69 +205 +69 +69 +208 +70 +68 +211 +72 +69 +212 +70 +66 +207 +68 +61 +206 +67 +60 +207 +70 +60 +200 +68 +56 +201 +69 +57 +203 +69 +60 +207 +68 +63 +212 +67 +64 +216 +66 +67 +222 +63 +68 +222 +61 +67 +225 +66 +70 +223 +67 +68 +223 +67 +68 +224 +68 +69 +224 +68 +69 +225 +70 +68 +225 +70 +68 +227 +69 +68 +227 +67 +67 +228 +66 +64 +228 +64 +63 +227 +63 +62 +227 +63 +62 +227 +63 +61 +227 +63 +61 +224 +66 +63 +211 +66 +63 +197 +62 +58 +184 +57 +51 +170 +55 +48 +160 +57 +48 +151 +61 +50 +142 +62 +51 +134 +62 +50 +131 +63 +50 +129 +63 +51 +129 +61 +50 +129 +59 +51 +132 +57 +51 +135 +56 +51 +136 +56 +49 +136 +57 +50 +133 +59 +48 +132 +60 +46 +132 +60 +46 +129 +60 +45 +129 +59 +47 +128 +58 +46 +128 +58 +46 +128 +58 +46 +126 +58 +45 +126 +58 +45 +126 +58 +45 +126 +58 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +125 +57 +48 +126 +56 +48 +126 +56 +46 +128 +55 +46 +128 +55 +46 +128 +55 +46 +126 +56 +44 +128 +56 +44 +126 +56 +44 +125 +57 +44 +124 +56 +45 +123 +57 +45 +122 +56 +44 +120 +56 +44 +120 +56 +44 +120 +56 +46 +120 +56 +46 +119 +55 +45 +118 +56 +45 +118 +54 +44 +116 +54 +43 +115 +53 +42 +113 +53 +43 +109 +49 +39 +114 +54 +44 +110 +52 +41 +109 +51 +40 +111 +54 +43 +109 +52 +41 +113 +56 +45 +127 +73 +61 +133 +83 +72 +133 +83 +74 +134 +82 +71 +136 +82 +72 +139 +80 +72 +144 +81 +74 +148 +81 +75 +149 +82 +76 +147 +84 +77 +141 +84 +75 +137 +91 +78 +130 +99 +81 +111 +95 +72 +89 +85 +58 +77 +86 +55 +79 +95 +59 +106 +126 +89 +98 +120 +81 +89 +111 +72 +85 +106 +67 +82 +103 +64 +77 +98 +59 +73 +89 +53 +67 +82 +49 +55 +68 +38 +52 +62 +35 +50 +58 +35 +54 +59 +39 +60 +62 +48 +64 +66 +53 +64 +64 +54 +60 +62 +51 +53 +56 +45 +51 +57 +45 +52 +58 +46 +55 +58 +47 +57 +61 +47 +59 +63 +46 +61 +66 +44 +60 +69 +40 +83 +95 +59 +97 +114 +70 +110 +134 +82 +115 +145 +85 +114 +149 +81 +114 +154 +83 +115 +157 +83 +114 +157 +85 +117 +158 +90 +126 +167 +101 +126 +167 +101 +112 +152 +89 +98 +138 +75 +94 +134 +71 +94 +134 +72 +94 +132 +71 +96 +134 +73 +98 +136 +75 +100 +138 +77 +102 +141 +78 +101 +140 +77 +99 +138 +75 +96 +135 +72 +94 +132 +71 +95 +130 +76 +84 +118 +68 +75 +109 +59 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +114 +98 +83 +113 +97 +82 +114 +98 +85 +113 +99 +86 +114 +102 +90 +111 +103 +90 +109 +101 +88 +106 +100 +86 +103 +99 +87 +107 +104 +89 +111 +105 +89 +108 +103 +84 +104 +99 +79 +99 +94 +72 +91 +85 +61 +82 +76 +52 +80 +74 +48 +72 +62 +37 +81 +63 +41 +107 +80 +61 +127 +88 +71 +132 +78 +66 +136 +69 +61 +147 +68 +63 +177 +87 +86 +184 +84 +84 +187 +81 +81 +192 +80 +79 +192 +78 +77 +193 +77 +77 +194 +76 +74 +194 +76 +74 +205 +85 +84 +197 +73 +71 +192 +62 +62 +195 +61 +58 +205 +67 +64 +209 +70 +65 +205 +66 +59 +199 +62 +52 +202 +68 +57 +202 +68 +57 +204 +70 +61 +208 +69 +62 +214 +69 +66 +219 +66 +68 +223 +64 +69 +224 +63 +69 +223 +67 +70 +223 +67 +68 +223 +67 +68 +223 +69 +69 +224 +69 +67 +224 +70 +68 +225 +70 +68 +225 +70 +68 +224 +69 +65 +225 +67 +64 +224 +66 +63 +224 +65 +62 +226 +64 +61 +226 +64 +61 +226 +64 +61 +224 +66 +63 +213 +68 +63 +200 +67 +60 +186 +62 +54 +172 +58 +48 +160 +57 +48 +148 +58 +47 +138 +60 +48 +130 +60 +48 +128 +65 +50 +126 +64 +51 +126 +62 +52 +127 +60 +51 +131 +58 +51 +134 +57 +49 +136 +56 +49 +137 +57 +48 +135 +59 +46 +133 +60 +45 +132 +59 +44 +132 +59 +44 +131 +59 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +127 +57 +45 +127 +57 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +124 +57 +48 +124 +57 +48 +124 +57 +48 +122 +58 +48 +122 +58 +48 +121 +57 +47 +121 +57 +47 +121 +57 +47 +119 +57 +46 +119 +57 +46 +119 +56 +47 +119 +56 +47 +116 +56 +46 +115 +55 +45 +114 +54 +44 +114 +54 +44 +112 +54 +43 +112 +54 +43 +107 +49 +38 +113 +55 +44 +109 +52 +41 +108 +51 +40 +111 +54 +43 +108 +51 +40 +112 +55 +44 +126 +72 +62 +132 +82 +73 +133 +83 +76 +136 +81 +74 +139 +80 +74 +144 +81 +76 +148 +80 +77 +149 +81 +78 +148 +83 +79 +138 +79 +71 +133 +83 +72 +128 +91 +75 +123 +101 +80 +115 +105 +80 +104 +107 +76 +102 +113 +81 +103 +120 +84 +94 +116 +77 +88 +110 +71 +80 +102 +63 +76 +97 +58 +75 +95 +58 +75 +92 +58 +71 +86 +55 +67 +80 +52 +60 +70 +45 +56 +64 +41 +54 +59 +39 +55 +58 +41 +60 +61 +47 +63 +64 +50 +62 +62 +50 +59 +61 +48 +52 +58 +48 +51 +59 +48 +53 +59 +49 +54 +60 +48 +58 +60 +47 +60 +63 +46 +62 +65 +44 +62 +68 +42 +81 +91 +57 +94 +109 +68 +107 +129 +82 +112 +140 +82 +112 +147 +83 +113 +153 +82 +115 +157 +83 +115 +158 +86 +120 +159 +94 +124 +162 +101 +120 +158 +97 +107 +145 +84 +96 +134 +73 +93 +131 +70 +93 +131 +70 +92 +130 +69 +96 +134 +73 +97 +135 +74 +99 +137 +76 +101 +139 +78 +100 +138 +77 +98 +136 +75 +96 +134 +73 +94 +132 +73 +93 +127 +76 +82 +116 +66 +73 +107 +57 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +113 +100 +84 +111 +95 +80 +109 +93 +80 +109 +95 +82 +113 +101 +89 +111 +103 +92 +108 +100 +89 +104 +98 +86 +102 +98 +87 +112 +108 +96 +123 +120 +105 +126 +123 +106 +127 +121 +105 +122 +117 +98 +112 +105 +86 +101 +96 +74 +84 +84 +60 +70 +70 +46 +67 +62 +40 +77 +66 +46 +83 +64 +47 +85 +56 +40 +93 +55 +42 +108 +61 +51 +110 +55 +48 +117 +57 +49 +126 +59 +53 +135 +64 +58 +146 +73 +66 +155 +80 +74 +165 +88 +80 +171 +91 +82 +185 +94 +89 +183 +84 +78 +181 +72 +69 +186 +67 +63 +198 +68 +66 +206 +71 +67 +210 +68 +64 +207 +64 +58 +208 +65 +59 +209 +66 +60 +211 +68 +62 +213 +70 +64 +215 +70 +67 +219 +69 +70 +222 +68 +70 +222 +68 +70 +222 +68 +68 +222 +68 +68 +222 +68 +68 +221 +69 +68 +223 +69 +69 +222 +70 +69 +223 +69 +67 +223 +69 +67 +222 +68 +66 +222 +68 +66 +221 +68 +63 +220 +67 +62 +221 +66 +61 +221 +66 +61 +221 +66 +61 +220 +67 +62 +214 +69 +64 +206 +69 +63 +195 +66 +60 +179 +62 +53 +162 +58 +49 +148 +56 +45 +136 +57 +44 +131 +59 +45 +130 +64 +50 +127 +64 +49 +126 +62 +50 +127 +61 +49 +131 +58 +49 +134 +57 +49 +135 +56 +49 +136 +58 +48 +135 +59 +46 +132 +59 +44 +132 +59 +44 +132 +59 +44 +130 +58 +44 +130 +58 +44 +128 +58 +46 +128 +58 +46 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +123 +59 +49 +123 +59 +49 +122 +58 +48 +121 +59 +48 +120 +58 +47 +120 +58 +47 +120 +58 +47 +120 +58 +47 +116 +56 +46 +116 +56 +46 +115 +55 +45 +115 +55 +45 +114 +54 +44 +113 +53 +43 +111 +53 +42 +111 +53 +42 +106 +49 +38 +111 +54 +43 +109 +52 +41 +107 +50 +39 +108 +54 +42 +105 +51 +39 +109 +55 +43 +125 +71 +61 +135 +80 +73 +135 +80 +73 +139 +80 +74 +142 +81 +76 +145 +82 +77 +146 +83 +78 +148 +85 +80 +145 +86 +80 +140 +87 +79 +135 +91 +80 +126 +94 +79 +116 +98 +78 +111 +105 +81 +111 +114 +85 +108 +119 +89 +102 +119 +85 +81 +101 +66 +75 +95 +58 +69 +89 +54 +68 +85 +51 +69 +86 +54 +71 +86 +57 +71 +84 +56 +69 +82 +56 +63 +73 +48 +60 +68 +45 +57 +62 +42 +55 +59 +42 +58 +60 +46 +60 +62 +48 +59 +61 +47 +57 +59 +46 +54 +60 +50 +53 +61 +50 +54 +60 +50 +54 +60 +48 +58 +60 +47 +60 +62 +48 +61 +64 +45 +61 +67 +41 +77 +87 +53 +90 +105 +64 +102 +124 +77 +108 +136 +78 +110 +145 +81 +113 +153 +82 +117 +159 +85 +116 +159 +87 +122 +161 +96 +119 +157 +96 +110 +148 +87 +99 +137 +76 +92 +130 +69 +92 +130 +69 +92 +130 +69 +90 +128 +67 +95 +133 +72 +97 +135 +74 +98 +136 +75 +100 +138 +77 +99 +137 +76 +97 +135 +74 +95 +133 +72 +93 +131 +72 +91 +125 +74 +80 +113 +66 +70 +103 +56 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +114 +100 +87 +111 +97 +84 +109 +95 +82 +107 +95 +83 +107 +97 +87 +108 +99 +90 +108 +101 +91 +106 +102 +93 +106 +102 +93 +120 +116 +105 +136 +132 +120 +145 +141 +129 +149 +143 +129 +146 +140 +126 +137 +130 +114 +125 +122 +103 +96 +99 +78 +79 +84 +62 +68 +71 +50 +70 +69 +49 +72 +67 +48 +70 +61 +44 +76 +60 +44 +86 +67 +52 +80 +57 +43 +82 +54 +42 +86 +52 +42 +89 +53 +41 +92 +54 +43 +97 +57 +47 +101 +61 +49 +109 +61 +49 +136 +76 +66 +157 +83 +74 +173 +86 +79 +181 +79 +75 +188 +70 +68 +196 +66 +66 +208 +68 +67 +216 +70 +70 +212 +64 +62 +213 +65 +63 +214 +66 +62 +216 +68 +64 +217 +69 +67 +219 +69 +68 +219 +69 +68 +221 +69 +68 +222 +68 +68 +221 +69 +68 +221 +69 +68 +221 +69 +68 +221 +69 +68 +221 +69 +68 +221 +69 +66 +220 +71 +67 +219 +70 +66 +218 +69 +65 +217 +68 +62 +217 +68 +62 +218 +67 +60 +218 +67 +60 +219 +68 +61 +217 +68 +62 +214 +67 +60 +211 +70 +63 +201 +70 +62 +186 +65 +56 +167 +59 +49 +152 +56 +44 +140 +57 +43 +133 +60 +45 +131 +64 +48 +127 +64 +49 +126 +63 +48 +127 +61 +47 +131 +58 +49 +132 +58 +47 +135 +57 +47 +136 +58 +46 +132 +58 +45 +132 +59 +44 +132 +59 +44 +131 +58 +43 +130 +58 +44 +130 +58 +44 +127 +57 +45 +127 +57 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +124 +57 +48 +125 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +123 +56 +47 +120 +56 +46 +123 +59 +49 +121 +59 +48 +121 +59 +48 +121 +59 +48 +120 +58 +47 +120 +58 +47 +120 +58 +47 +118 +58 +47 +115 +55 +45 +115 +55 +45 +115 +55 +45 +114 +54 +44 +113 +53 +43 +111 +53 +42 +111 +53 +42 +109 +52 +41 +106 +49 +38 +111 +54 +43 +108 +51 +40 +104 +50 +38 +107 +53 +41 +104 +50 +38 +108 +54 +42 +124 +70 +60 +138 +79 +71 +140 +79 +74 +141 +80 +75 +143 +82 +77 +144 +83 +78 +145 +86 +80 +144 +87 +80 +140 +90 +81 +137 +93 +82 +133 +97 +85 +121 +95 +80 +105 +90 +71 +100 +95 +73 +100 +104 +79 +92 +102 +75 +78 +93 +64 +69 +85 +56 +65 +81 +52 +61 +77 +48 +60 +75 +46 +63 +77 +51 +67 +81 +55 +70 +82 +58 +71 +83 +59 +66 +76 +52 +62 +71 +50 +58 +65 +47 +57 +61 +44 +57 +61 +46 +57 +61 +46 +56 +60 +45 +55 +59 +45 +55 +61 +51 +54 +61 +53 +54 +59 +52 +54 +60 +50 +58 +60 +49 +59 +61 +47 +60 +63 +44 +60 +65 +42 +74 +83 +52 +86 +101 +62 +98 +120 +73 +106 +134 +76 +110 +145 +81 +115 +155 +84 +119 +161 +87 +120 +162 +90 +123 +162 +97 +114 +152 +91 +101 +139 +78 +92 +130 +69 +90 +128 +67 +92 +130 +69 +92 +130 +69 +90 +128 +67 +95 +133 +72 +96 +134 +73 +97 +135 +74 +98 +136 +75 +97 +135 +74 +96 +134 +73 +94 +132 +71 +93 +131 +74 +90 +124 +74 +78 +111 +64 +69 +102 +55 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +114 +102 +88 +116 +104 +92 +115 +103 +91 +109 +99 +89 +106 +97 +88 +108 +101 +93 +115 +110 +104 +122 +119 +112 +129 +126 +119 +144 +141 +134 +160 +157 +148 +168 +165 +156 +171 +167 +156 +168 +164 +153 +163 +157 +145 +153 +150 +135 +122 +123 +107 +99 +102 +83 +79 +82 +63 +71 +74 +55 +69 +72 +53 +66 +69 +50 +66 +69 +50 +69 +72 +53 +75 +76 +60 +74 +72 +57 +71 +68 +53 +68 +62 +48 +65 +57 +44 +65 +55 +43 +64 +54 +42 +70 +52 +40 +85 +53 +42 +113 +66 +56 +142 +79 +72 +160 +79 +75 +175 +73 +71 +191 +71 +73 +204 +69 +73 +211 +66 +69 +213 +64 +66 +215 +65 +66 +216 +66 +65 +217 +67 +66 +218 +69 +65 +218 +69 +65 +218 +69 +65 +218 +69 +65 +221 +69 +68 +221 +68 +70 +221 +68 +70 +219 +69 +70 +219 +69 +68 +219 +69 +68 +219 +69 +68 +217 +69 +67 +218 +70 +66 +217 +69 +65 +214 +70 +62 +213 +69 +61 +213 +69 +61 +213 +69 +61 +213 +69 +61 +214 +70 +62 +212 +65 +58 +211 +67 +59 +206 +69 +61 +193 +66 +57 +174 +62 +51 +158 +57 +45 +145 +59 +46 +138 +60 +47 +132 +63 +48 +129 +63 +47 +128 +62 +46 +128 +61 +45 +129 +59 +47 +132 +58 +45 +134 +58 +45 +135 +59 +46 +132 +58 +45 +131 +59 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +129 +57 +43 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +124 +57 +49 +122 +58 +49 +124 +57 +49 +121 +57 +48 +121 +57 +48 +120 +56 +47 +120 +56 +47 +118 +55 +46 +121 +58 +49 +121 +58 +49 +120 +57 +48 +118 +58 +48 +118 +58 +48 +117 +57 +47 +117 +57 +47 +116 +58 +47 +114 +55 +47 +113 +54 +46 +113 +54 +46 +112 +53 +45 +111 +52 +44 +110 +51 +43 +110 +51 +43 +109 +52 +43 +106 +49 +40 +109 +55 +45 +106 +52 +42 +104 +50 +40 +106 +52 +42 +102 +50 +39 +106 +54 +43 +125 +68 +59 +141 +78 +71 +143 +78 +72 +144 +81 +74 +144 +84 +76 +144 +85 +79 +142 +87 +80 +138 +89 +82 +131 +91 +81 +123 +89 +77 +118 +92 +79 +107 +90 +74 +93 +85 +66 +89 +88 +68 +89 +94 +72 +79 +89 +65 +63 +75 +51 +58 +72 +47 +55 +69 +46 +52 +66 +43 +53 +65 +43 +56 +68 +46 +61 +73 +51 +67 +76 +55 +69 +78 +57 +66 +75 +54 +63 +72 +53 +60 +69 +50 +58 +65 +47 +56 +63 +47 +55 +62 +46 +53 +60 +44 +52 +58 +44 +53 +60 +52 +53 +60 +53 +54 +59 +53 +54 +59 +52 +57 +59 +48 +58 +60 +47 +59 +62 +45 +59 +64 +41 +71 +80 +49 +82 +97 +58 +96 +118 +71 +105 +133 +75 +111 +146 +82 +117 +157 +86 +121 +163 +89 +121 +163 +91 +120 +159 +96 +110 +145 +87 +96 +131 +73 +90 +125 +67 +91 +126 +68 +94 +129 +71 +94 +129 +71 +93 +128 +70 +96 +131 +73 +97 +132 +74 +98 +133 +75 +98 +133 +75 +97 +132 +74 +96 +131 +73 +95 +130 +72 +94 +129 +73 +87 +124 +73 +76 +112 +66 +66 +102 +56 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +107 +97 +85 +110 +100 +90 +112 +102 +92 +108 +99 +90 +107 +100 +92 +114 +109 +103 +132 +129 +124 +145 +144 +140 +167 +163 +160 +181 +177 +174 +196 +193 +188 +201 +198 +193 +201 +196 +190 +197 +192 +186 +192 +185 +177 +185 +178 +168 +164 +156 +143 +136 +130 +114 +102 +99 +84 +80 +81 +63 +70 +73 +56 +62 +69 +51 +59 +68 +49 +58 +70 +50 +56 +69 +51 +56 +69 +51 +56 +67 +50 +58 +66 +51 +60 +66 +52 +64 +67 +56 +67 +69 +58 +71 +69 +57 +64 +52 +40 +83 +56 +47 +104 +61 +54 +129 +68 +65 +163 +79 +79 +192 +87 +91 +204 +81 +86 +202 +67 +73 +211 +71 +74 +214 +70 +70 +216 +70 +70 +218 +70 +68 +219 +70 +66 +219 +70 +66 +220 +68 +63 +220 +68 +65 +221 +69 +68 +221 +68 +70 +219 +69 +70 +219 +69 +70 +218 +68 +67 +218 +68 +67 +218 +68 +67 +217 +69 +67 +217 +69 +65 +215 +70 +65 +214 +69 +64 +212 +69 +61 +211 +68 +60 +210 +69 +60 +211 +70 +61 +212 +69 +61 +212 +63 +56 +213 +64 +57 +208 +67 +58 +198 +67 +57 +182 +65 +55 +165 +61 +48 +150 +61 +47 +140 +61 +46 +134 +62 +47 +130 +63 +47 +129 +62 +46 +128 +61 +45 +129 +60 +45 +131 +59 +45 +132 +58 +45 +133 +59 +46 +130 +58 +44 +130 +58 +44 +130 +58 +44 +130 +58 +44 +129 +57 +43 +127 +58 +43 +127 +57 +45 +126 +56 +44 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +122 +58 +49 +122 +58 +49 +121 +57 +48 +121 +57 +48 +120 +56 +47 +118 +55 +46 +118 +55 +46 +116 +56 +46 +119 +56 +47 +117 +57 +47 +117 +57 +47 +115 +57 +46 +116 +56 +46 +115 +57 +46 +114 +56 +45 +114 +56 +45 +113 +54 +46 +113 +54 +46 +112 +53 +45 +111 +52 +44 +110 +51 +43 +109 +52 +43 +108 +51 +42 +106 +52 +42 +104 +50 +40 +108 +54 +44 +105 +51 +41 +102 +50 +39 +104 +52 +41 +101 +49 +38 +105 +53 +42 +123 +66 +57 +142 +77 +71 +146 +77 +72 +145 +80 +74 +143 +84 +76 +141 +86 +79 +135 +88 +78 +129 +89 +79 +124 +92 +81 +115 +92 +78 +107 +91 +76 +96 +87 +70 +86 +83 +66 +80 +83 +66 +74 +81 +63 +64 +73 +54 +52 +64 +44 +51 +60 +43 +50 +59 +42 +48 +57 +40 +48 +57 +40 +50 +59 +42 +53 +62 +45 +57 +66 +49 +60 +69 +52 +63 +72 +55 +63 +72 +53 +62 +71 +52 +58 +70 +50 +58 +67 +50 +53 +64 +47 +51 +62 +45 +49 +60 +44 +51 +58 +51 +51 +57 +53 +52 +57 +53 +52 +57 +50 +56 +57 +49 +57 +59 +46 +59 +62 +45 +59 +64 +42 +67 +76 +47 +79 +94 +55 +93 +115 +68 +105 +132 +77 +112 +147 +83 +119 +159 +89 +121 +163 +89 +119 +161 +89 +113 +152 +89 +102 +137 +79 +90 +125 +67 +88 +123 +65 +92 +127 +69 +93 +128 +70 +93 +128 +70 +94 +129 +71 +96 +131 +73 +96 +131 +73 +96 +131 +73 +96 +131 +73 +96 +131 +73 +95 +130 +72 +94 +129 +71 +93 +128 +74 +85 +121 +73 +74 +110 +64 +65 +101 +57 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +98 +86 +106 +96 +86 +106 +97 +88 +107 +100 +90 +107 +103 +94 +117 +112 +106 +136 +133 +128 +159 +158 +154 +176 +176 +174 +195 +194 +192 +211 +210 +208 +226 +225 +223 +231 +230 +228 +231 +227 +224 +227 +222 +218 +222 +214 +211 +217 +206 +200 +206 +188 +178 +184 +165 +151 +151 +135 +122 +121 +109 +93 +95 +89 +73 +75 +76 +58 +64 +69 +49 +59 +68 +47 +62 +74 +54 +61 +72 +55 +61 +70 +53 +59 +67 +52 +59 +62 +53 +58 +59 +51 +57 +56 +51 +58 +55 +48 +63 +60 +51 +69 +59 +50 +81 +53 +49 +99 +55 +52 +137 +71 +72 +177 +92 +95 +199 +96 +100 +202 +87 +90 +205 +81 +83 +209 +79 +79 +213 +78 +75 +216 +77 +74 +219 +74 +71 +221 +72 +68 +224 +69 +65 +223 +68 +66 +222 +68 +68 +221 +68 +70 +221 +68 +70 +220 +67 +69 +220 +67 +69 +219 +66 +68 +219 +67 +66 +217 +67 +66 +218 +68 +67 +216 +68 +64 +213 +68 +63 +212 +69 +63 +211 +68 +60 +210 +69 +60 +211 +70 +61 +212 +69 +61 +217 +64 +58 +217 +64 +58 +209 +66 +58 +200 +67 +58 +188 +67 +58 +172 +64 +52 +153 +59 +47 +140 +57 +43 +137 +61 +47 +131 +62 +46 +129 +62 +45 +128 +61 +44 +129 +60 +44 +131 +59 +44 +131 +59 +44 +132 +60 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +129 +57 +43 +127 +57 +45 +127 +57 +45 +126 +56 +46 +125 +57 +46 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +122 +58 +49 +121 +58 +49 +120 +57 +48 +120 +57 +48 +119 +56 +47 +116 +56 +46 +115 +55 +45 +114 +56 +45 +116 +56 +46 +115 +57 +46 +114 +56 +45 +113 +56 +45 +114 +56 +45 +112 +55 +44 +112 +55 +44 +112 +55 +44 +111 +54 +45 +111 +54 +45 +110 +53 +44 +110 +53 +44 +109 +52 +43 +108 +51 +42 +107 +50 +41 +105 +51 +41 +103 +49 +39 +107 +55 +44 +104 +52 +41 +101 +49 +38 +104 +52 +41 +98 +48 +37 +102 +52 +41 +122 +65 +56 +144 +77 +71 +146 +77 +72 +145 +80 +74 +142 +85 +76 +136 +88 +78 +129 +89 +79 +120 +90 +79 +114 +92 +78 +107 +94 +78 +94 +87 +71 +82 +80 +65 +75 +78 +61 +67 +74 +58 +57 +66 +49 +50 +58 +43 +48 +56 +41 +49 +55 +43 +49 +55 +45 +48 +54 +44 +47 +53 +43 +47 +53 +41 +48 +56 +43 +50 +58 +43 +52 +60 +45 +57 +68 +52 +59 +70 +53 +61 +72 +55 +60 +73 +55 +59 +70 +53 +54 +67 +49 +51 +64 +44 +49 +62 +45 +46 +56 +48 +48 +54 +50 +49 +54 +50 +50 +55 +49 +55 +56 +50 +57 +59 +48 +58 +60 +46 +58 +63 +41 +63 +72 +43 +75 +89 +53 +91 +113 +67 +104 +131 +76 +113 +147 +86 +119 +158 +91 +119 +161 +89 +115 +156 +86 +103 +141 +80 +94 +129 +73 +85 +120 +64 +87 +122 +66 +91 +126 +70 +91 +126 +70 +91 +126 +70 +93 +128 +72 +95 +130 +74 +95 +130 +74 +95 +130 +74 +95 +130 +74 +94 +129 +73 +94 +129 +73 +93 +128 +72 +93 +128 +74 +85 +118 +73 +74 +107 +64 +64 +96 +55 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +98 +86 +112 +103 +94 +110 +103 +95 +108 +103 +97 +116 +113 +106 +135 +132 +127 +161 +160 +156 +188 +188 +186 +206 +208 +207 +207 +207 +207 +224 +224 +224 +242 +242 +242 +250 +248 +249 +251 +247 +246 +247 +243 +240 +241 +236 +233 +240 +226 +223 +232 +208 +198 +221 +193 +181 +193 +171 +157 +162 +145 +129 +125 +117 +98 +94 +92 +71 +75 +77 +55 +67 +72 +50 +65 +73 +50 +65 +73 +52 +64 +71 +53 +66 +68 +55 +65 +65 +55 +66 +61 +57 +67 +57 +55 +65 +57 +54 +59 +58 +53 +66 +61 +55 +71 +53 +49 +76 +45 +43 +102 +54 +54 +145 +81 +82 +181 +102 +105 +199 +109 +109 +192 +92 +92 +199 +90 +87 +206 +87 +83 +211 +84 +78 +216 +78 +75 +222 +74 +72 +225 +70 +68 +226 +68 +67 +221 +68 +70 +219 +69 +70 +219 +69 +70 +220 +67 +69 +220 +67 +69 +219 +66 +68 +219 +67 +66 +219 +67 +66 +220 +68 +67 +217 +67 +66 +215 +67 +63 +212 +67 +62 +212 +67 +62 +211 +68 +60 +210 +69 +60 +213 +69 +61 +221 +66 +61 +219 +65 +57 +210 +66 +58 +202 +68 +59 +191 +69 +58 +176 +65 +54 +156 +58 +45 +139 +53 +38 +138 +60 +47 +133 +61 +46 +130 +61 +45 +128 +61 +44 +129 +60 +44 +129 +60 +44 +131 +60 +42 +132 +60 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +127 +58 +43 +127 +57 +45 +126 +56 +44 +125 +57 +46 +125 +57 +46 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +123 +59 +49 +121 +58 +49 +119 +59 +49 +120 +57 +48 +117 +57 +47 +116 +56 +46 +115 +57 +46 +114 +56 +45 +113 +55 +44 +114 +56 +45 +113 +56 +45 +112 +55 +44 +110 +56 +44 +112 +55 +44 +109 +55 +43 +111 +54 +43 +111 +54 +43 +111 +54 +45 +111 +54 +45 +110 +53 +44 +109 +52 +43 +108 +51 +42 +106 +52 +42 +105 +51 +41 +104 +52 +41 +102 +50 +39 +107 +55 +44 +104 +52 +41 +99 +49 +38 +101 +51 +40 +98 +48 +37 +101 +51 +40 +120 +66 +56 +142 +77 +71 +146 +79 +73 +142 +82 +74 +138 +85 +77 +131 +88 +79 +122 +90 +79 +113 +91 +77 +104 +92 +76 +90 +84 +68 +73 +74 +58 +63 +67 +52 +62 +68 +54 +57 +65 +50 +48 +56 +43 +47 +55 +42 +54 +60 +50 +52 +55 +48 +53 +56 +49 +53 +55 +50 +52 +55 +48 +50 +53 +46 +48 +54 +44 +48 +56 +45 +49 +57 +44 +54 +65 +51 +58 +69 +53 +61 +74 +57 +62 +75 +57 +60 +73 +55 +55 +70 +51 +50 +65 +44 +49 +62 +45 +44 +54 +46 +46 +52 +48 +48 +53 +49 +49 +54 +48 +54 +55 +49 +56 +58 +47 +58 +60 +46 +58 +63 +43 +60 +69 +42 +73 +87 +52 +89 +111 +65 +103 +130 +77 +112 +146 +86 +118 +157 +92 +117 +158 +88 +112 +153 +85 +96 +134 +73 +88 +123 +67 +83 +118 +62 +87 +122 +66 +91 +126 +70 +89 +124 +68 +89 +124 +68 +92 +127 +71 +95 +130 +74 +95 +130 +74 +94 +129 +73 +94 +129 +73 +94 +129 +73 +93 +128 +72 +93 +128 +72 +93 +127 +76 +83 +116 +73 +72 +104 +65 +63 +93 +55 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +108 +100 +87 +105 +98 +90 +103 +100 +93 +118 +115 +110 +147 +146 +142 +175 +175 +173 +196 +198 +197 +218 +220 +219 +234 +238 +239 +243 +244 +246 +246 +247 +249 +252 +252 +254 +255 +255 +255 +255 +255 +253 +255 +251 +250 +252 +247 +244 +253 +242 +236 +247 +225 +212 +242 +216 +199 +224 +202 +181 +198 +182 +159 +170 +160 +135 +136 +132 +105 +98 +98 +70 +69 +72 +45 +68 +72 +47 +67 +71 +48 +70 +69 +49 +71 +68 +53 +70 +60 +51 +67 +54 +48 +70 +52 +50 +73 +57 +57 +65 +60 +57 +66 +61 +58 +70 +56 +55 +75 +54 +53 +101 +69 +70 +147 +105 +106 +198 +147 +146 +233 +172 +169 +211 +140 +136 +199 +119 +112 +191 +96 +90 +195 +86 +81 +210 +82 +79 +219 +77 +76 +225 +71 +73 +225 +69 +72 +220 +70 +71 +220 +74 +75 +217 +68 +70 +210 +60 +62 +215 +62 +64 +225 +72 +74 +225 +71 +73 +216 +62 +64 +218 +64 +64 +218 +64 +64 +217 +65 +64 +215 +66 +62 +215 +66 +62 +212 +64 +60 +209 +64 +59 +211 +64 +57 +222 +67 +62 +219 +65 +57 +211 +64 +57 +202 +65 +57 +190 +66 +56 +176 +64 +53 +159 +58 +46 +144 +56 +42 +140 +61 +48 +135 +62 +47 +131 +62 +46 +129 +62 +45 +128 +61 +44 +127 +60 +43 +129 +61 +42 +129 +60 +44 +127 +58 +43 +127 +57 +45 +127 +57 +45 +126 +56 +44 +126 +56 +46 +124 +56 +45 +124 +56 +45 +124 +56 +45 +124 +57 +48 +124 +57 +48 +124 +57 +48 +124 +57 +48 +122 +58 +49 +122 +58 +49 +122 +58 +49 +122 +58 +49 +121 +61 +53 +119 +60 +52 +119 +59 +51 +117 +58 +50 +116 +57 +49 +113 +56 +47 +112 +55 +46 +112 +55 +46 +111 +54 +45 +109 +55 +45 +109 +55 +45 +108 +56 +45 +109 +55 +45 +108 +56 +45 +109 +55 +45 +109 +55 +45 +105 +50 +43 +109 +54 +47 +112 +57 +50 +111 +56 +49 +107 +52 +45 +103 +50 +42 +103 +50 +42 +104 +51 +43 +101 +48 +40 +105 +55 +46 +100 +50 +41 +93 +45 +35 +96 +48 +38 +95 +47 +37 +98 +50 +40 +115 +62 +54 +140 +79 +74 +143 +80 +75 +136 +81 +74 +129 +82 +74 +125 +89 +77 +118 +95 +81 +102 +89 +73 +84 +78 +62 +68 +69 +53 +62 +69 +53 +58 +67 +50 +53 +64 +48 +52 +60 +47 +51 +59 +48 +52 +58 +48 +52 +58 +48 +54 +56 +51 +55 +56 +51 +54 +54 +52 +52 +54 +49 +51 +53 +48 +49 +54 +47 +47 +54 +46 +46 +54 +43 +46 +57 +43 +50 +61 +45 +54 +67 +50 +58 +71 +54 +58 +73 +54 +56 +71 +52 +52 +67 +46 +49 +63 +46 +42 +52 +43 +44 +50 +46 +45 +50 +46 +46 +51 +45 +52 +53 +47 +55 +57 +46 +58 +60 +47 +58 +63 +43 +54 +62 +38 +68 +82 +49 +87 +108 +67 +104 +130 +82 +115 +148 +93 +119 +158 +95 +114 +155 +87 +107 +148 +82 +91 +126 +68 +88 +121 +68 +84 +117 +64 +84 +117 +64 +87 +120 +67 +90 +123 +70 +91 +124 +71 +90 +123 +70 +94 +127 +74 +98 +131 +78 +98 +131 +78 +94 +127 +74 +92 +125 +72 +95 +128 +75 +96 +129 +76 +94 +126 +77 +83 +113 +75 +70 +100 +66 +61 +88 +55 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +108 +100 +89 +103 +100 +93 +111 +110 +106 +134 +133 +131 +164 +164 +162 +193 +195 +194 +214 +218 +219 +234 +238 +239 +247 +251 +252 +247 +251 +254 +248 +252 +255 +252 +253 +255 +254 +254 +254 +255 +255 +253 +255 +254 +250 +255 +252 +249 +255 +250 +243 +255 +240 +224 +251 +235 +212 +237 +223 +197 +215 +205 +178 +192 +187 +157 +164 +163 +132 +130 +131 +99 +103 +106 +75 +76 +81 +51 +71 +74 +47 +69 +67 +46 +71 +66 +47 +72 +62 +50 +73 +58 +51 +76 +57 +53 +75 +60 +57 +66 +56 +55 +71 +62 +63 +81 +69 +69 +96 +80 +80 +124 +104 +103 +166 +140 +139 +207 +178 +174 +232 +197 +191 +255 +213 +207 +234 +177 +168 +201 +131 +123 +188 +99 +93 +199 +87 +85 +213 +83 +83 +219 +74 +77 +216 +67 +69 +213 +71 +70 +210 +70 +69 +215 +73 +72 +219 +75 +75 +218 +70 +70 +212 +62 +63 +214 +61 +63 +221 +67 +69 +217 +63 +63 +217 +63 +63 +218 +64 +64 +218 +64 +64 +217 +65 +62 +214 +65 +61 +212 +64 +60 +212 +63 +57 +220 +65 +60 +219 +64 +59 +211 +64 +57 +203 +66 +58 +191 +67 +59 +177 +65 +54 +160 +59 +49 +146 +56 +45 +140 +61 +48 +135 +62 +47 +131 +62 +46 +129 +62 +45 +128 +61 +44 +127 +60 +43 +129 +60 +44 +129 +60 +44 +127 +58 +43 +127 +57 +45 +127 +57 +45 +126 +56 +44 +125 +57 +46 +124 +56 +45 +124 +56 +45 +124 +56 +45 +124 +57 +48 +124 +57 +48 +124 +57 +48 +124 +57 +48 +122 +58 +49 +123 +59 +50 +123 +59 +50 +122 +59 +50 +119 +60 +52 +117 +60 +51 +117 +58 +50 +115 +58 +49 +114 +57 +48 +110 +56 +46 +111 +54 +45 +109 +55 +45 +109 +55 +45 +108 +56 +45 +108 +56 +45 +108 +56 +45 +108 +56 +45 +106 +56 +45 +108 +56 +45 +108 +56 +45 +107 +54 +46 +110 +55 +48 +111 +56 +49 +110 +57 +49 +108 +55 +47 +105 +52 +44 +103 +50 +42 +101 +51 +42 +99 +49 +40 +100 +52 +42 +95 +47 +37 +94 +46 +36 +98 +50 +40 +94 +46 +36 +96 +48 +38 +112 +62 +53 +129 +74 +69 +135 +82 +76 +135 +88 +82 +126 +88 +79 +114 +86 +75 +100 +82 +68 +81 +74 +58 +62 +63 +47 +58 +65 +49 +54 +65 +48 +53 +64 +48 +51 +62 +48 +52 +60 +49 +52 +60 +49 +53 +59 +49 +55 +58 +51 +55 +57 +52 +55 +55 +53 +55 +55 +53 +53 +55 +50 +52 +54 +49 +49 +54 +47 +47 +54 +46 +47 +55 +44 +46 +57 +43 +49 +60 +46 +52 +65 +48 +56 +69 +52 +57 +72 +53 +56 +71 +52 +52 +69 +50 +52 +66 +49 +46 +56 +47 +46 +53 +46 +46 +51 +45 +45 +50 +43 +50 +51 +43 +52 +54 +43 +56 +58 +45 +57 +61 +44 +55 +63 +40 +68 +81 +51 +87 +108 +69 +104 +130 +85 +116 +149 +96 +119 +157 +98 +112 +152 +89 +103 +143 +80 +89 +124 +68 +87 +120 +67 +84 +117 +64 +84 +117 +64 +86 +119 +66 +89 +122 +69 +89 +122 +69 +89 +122 +69 +91 +124 +71 +95 +128 +75 +95 +128 +75 +92 +125 +72 +91 +124 +71 +94 +127 +74 +94 +127 +74 +94 +123 +77 +82 +109 +74 +70 +95 +66 +59 +84 +55 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +108 +102 +90 +101 +100 +95 +121 +123 +120 +151 +153 +152 +178 +182 +183 +205 +209 +210 +228 +233 +236 +244 +249 +252 +250 +255 +255 +251 +255 +255 +252 +255 +255 +253 +254 +255 +254 +254 +254 +255 +254 +252 +255 +255 +251 +255 +255 +250 +255 +255 +244 +254 +252 +231 +250 +249 +221 +239 +240 +209 +225 +229 +196 +210 +216 +180 +188 +196 +159 +160 +168 +131 +135 +145 +108 +96 +103 +69 +81 +88 +55 +68 +71 +44 +68 +67 +46 +74 +68 +52 +76 +68 +55 +75 +65 +56 +73 +62 +58 +68 +58 +57 +84 +74 +75 +107 +95 +95 +130 +118 +118 +157 +146 +144 +192 +178 +175 +219 +206 +200 +234 +220 +211 +248 +228 +217 +255 +240 +229 +255 +224 +214 +234 +167 +159 +190 +101 +97 +177 +67 +68 +198 +72 +75 +219 +86 +89 +216 +88 +85 +207 +79 +76 +202 +70 +66 +204 +69 +66 +210 +70 +69 +214 +70 +70 +216 +68 +68 +217 +67 +68 +214 +61 +63 +216 +62 +64 +217 +63 +63 +217 +63 +63 +217 +65 +64 +214 +64 +63 +213 +65 +61 +213 +64 +58 +217 +64 +58 +217 +64 +58 +210 +66 +58 +203 +69 +60 +192 +68 +60 +178 +66 +55 +161 +60 +50 +147 +57 +46 +142 +60 +48 +137 +61 +48 +131 +62 +47 +129 +62 +46 +127 +61 +45 +126 +60 +44 +128 +61 +45 +128 +61 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +125 +57 +46 +125 +57 +46 +124 +56 +45 +123 +56 +47 +123 +56 +47 +125 +58 +49 +125 +58 +49 +123 +59 +50 +123 +59 +50 +123 +59 +50 +123 +59 +50 +122 +59 +52 +120 +60 +52 +116 +59 +50 +113 +59 +49 +114 +57 +48 +111 +57 +47 +110 +56 +46 +108 +56 +45 +108 +54 +44 +107 +55 +44 +108 +56 +45 +106 +56 +45 +106 +56 +45 +106 +56 +45 +106 +56 +45 +105 +57 +45 +106 +56 +45 +106 +56 +45 +110 +57 +49 +109 +56 +48 +109 +56 +48 +109 +56 +48 +109 +56 +48 +105 +55 +46 +102 +52 +43 +99 +49 +40 +100 +50 +41 +97 +49 +39 +93 +45 +35 +95 +48 +38 +99 +52 +42 +92 +45 +35 +95 +48 +38 +115 +68 +60 +125 +80 +74 +129 +86 +80 +126 +89 +81 +112 +84 +73 +94 +74 +63 +79 +67 +55 +63 +60 +45 +52 +54 +40 +50 +59 +42 +48 +59 +43 +49 +60 +46 +50 +61 +47 +52 +60 +49 +52 +60 +49 +53 +59 +49 +55 +58 +51 +55 +57 +52 +55 +57 +54 +54 +56 +51 +53 +55 +50 +53 +55 +50 +50 +55 +48 +48 +55 +47 +48 +56 +45 +46 +57 +43 +48 +59 +45 +50 +63 +46 +54 +67 +50 +55 +69 +52 +56 +71 +52 +56 +71 +52 +57 +70 +53 +52 +62 +51 +51 +58 +50 +47 +52 +45 +44 +50 +40 +47 +48 +40 +49 +51 +40 +53 +55 +42 +54 +58 +41 +54 +62 +39 +68 +81 +53 +89 +109 +74 +107 +132 +90 +119 +151 +102 +119 +156 +102 +108 +147 +90 +95 +135 +75 +87 +120 +67 +87 +117 +67 +84 +114 +64 +84 +114 +64 +86 +116 +66 +88 +118 +68 +89 +119 +69 +89 +119 +69 +90 +120 +70 +93 +123 +73 +95 +125 +75 +93 +123 +73 +93 +123 +73 +95 +125 +75 +94 +124 +74 +90 +119 +75 +78 +101 +72 +65 +87 +64 +54 +76 +53 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +110 +101 +86 +110 +101 +86 +109 +103 +91 +106 +107 +102 +131 +135 +136 +163 +167 +168 +185 +190 +193 +208 +213 +216 +229 +237 +239 +243 +251 +253 +245 +253 +255 +251 +255 +255 +251 +255 +255 +252 +255 +255 +252 +254 +251 +253 +254 +249 +254 +253 +248 +255 +254 +247 +255 +255 +243 +248 +253 +230 +244 +253 +222 +238 +247 +216 +230 +242 +206 +221 +233 +195 +206 +218 +180 +182 +193 +153 +161 +171 +134 +128 +135 +101 +102 +109 +76 +77 +81 +54 +70 +72 +48 +72 +74 +53 +75 +73 +58 +72 +68 +57 +68 +64 +55 +80 +70 +68 +106 +96 +95 +139 +129 +128 +164 +154 +153 +183 +175 +172 +203 +198 +194 +223 +218 +212 +234 +230 +221 +247 +238 +229 +255 +249 +239 +255 +246 +235 +255 +215 +207 +245 +178 +172 +227 +141 +140 +200 +100 +100 +176 +68 +66 +194 +83 +76 +200 +85 +78 +199 +82 +73 +195 +72 +65 +199 +72 +66 +211 +77 +74 +213 +74 +71 +207 +63 +62 +210 +62 +62 +212 +62 +63 +213 +63 +62 +216 +64 +63 +214 +64 +63 +214 +64 +63 +213 +65 +61 +213 +65 +61 +214 +62 +57 +213 +64 +58 +210 +67 +61 +204 +69 +63 +192 +69 +62 +178 +65 +57 +162 +61 +53 +149 +59 +50 +142 +60 +49 +137 +61 +48 +131 +62 +47 +129 +62 +46 +127 +61 +47 +126 +60 +44 +128 +61 +45 +128 +61 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +125 +57 +46 +125 +57 +46 +124 +56 +45 +123 +56 +47 +123 +56 +47 +126 +59 +50 +126 +59 +50 +124 +60 +51 +123 +59 +50 +123 +59 +50 +123 +59 +50 +122 +59 +52 +120 +60 +52 +114 +57 +48 +111 +57 +47 +111 +57 +47 +109 +57 +46 +108 +56 +45 +107 +55 +44 +106 +54 +43 +104 +54 +43 +105 +55 +44 +105 +55 +44 +105 +55 +44 +104 +56 +44 +104 +56 +44 +104 +56 +44 +104 +56 +44 +104 +56 +44 +109 +59 +50 +108 +55 +47 +106 +53 +45 +105 +55 +46 +106 +56 +47 +106 +56 +47 +102 +52 +43 +97 +49 +39 +101 +53 +43 +97 +50 +40 +93 +46 +36 +97 +50 +40 +98 +51 +41 +89 +42 +32 +97 +50 +40 +121 +78 +69 +129 +92 +86 +118 +87 +82 +105 +78 +71 +87 +67 +58 +73 +60 +51 +64 +58 +46 +58 +59 +45 +56 +60 +46 +48 +56 +41 +47 +58 +42 +51 +59 +46 +52 +60 +47 +53 +61 +50 +53 +59 +49 +54 +57 +48 +54 +57 +48 +55 +57 +52 +54 +56 +51 +54 +56 +51 +52 +57 +50 +51 +56 +49 +51 +57 +47 +49 +57 +46 +49 +57 +46 +46 +57 +43 +47 +58 +44 +48 +61 +44 +50 +63 +46 +53 +66 +49 +55 +69 +52 +59 +72 +54 +60 +73 +56 +57 +67 +56 +55 +63 +52 +50 +56 +46 +45 +51 +39 +46 +48 +37 +47 +49 +36 +50 +52 +38 +52 +56 +39 +52 +60 +39 +69 +82 +56 +93 +112 +80 +114 +139 +100 +123 +154 +110 +119 +156 +105 +102 +141 +88 +85 +124 +69 +83 +115 +65 +84 +114 +64 +83 +113 +63 +83 +113 +63 +84 +114 +64 +85 +115 +65 +86 +116 +66 +86 +116 +66 +87 +117 +67 +91 +121 +71 +93 +123 +73 +92 +122 +72 +94 +124 +74 +95 +125 +75 +92 +122 +72 +87 +114 +73 +73 +93 +68 +61 +78 +60 +49 +66 +48 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +111 +102 +87 +111 +102 +87 +110 +103 +93 +113 +113 +111 +135 +140 +143 +164 +169 +172 +183 +191 +194 +205 +213 +216 +227 +237 +239 +242 +252 +254 +244 +254 +255 +248 +255 +255 +250 +255 +255 +251 +255 +252 +253 +255 +250 +252 +253 +245 +250 +252 +241 +249 +249 +237 +246 +248 +234 +246 +255 +232 +243 +255 +228 +240 +253 +225 +238 +249 +217 +233 +244 +210 +222 +232 +197 +202 +210 +173 +182 +190 +153 +157 +163 +129 +125 +130 +98 +89 +93 +66 +71 +76 +53 +70 +75 +55 +70 +74 +57 +67 +71 +57 +65 +67 +56 +98 +95 +88 +133 +125 +122 +170 +162 +159 +192 +184 +181 +203 +195 +193 +213 +208 +205 +230 +225 +221 +241 +238 +233 +249 +246 +239 +250 +243 +233 +251 +237 +226 +255 +236 +227 +255 +242 +234 +255 +224 +219 +233 +165 +162 +182 +105 +99 +164 +76 +64 +178 +82 +68 +192 +90 +78 +199 +92 +82 +197 +83 +73 +190 +69 +61 +193 +64 +59 +202 +67 +64 +203 +64 +61 +206 +64 +62 +209 +63 +63 +210 +64 +64 +211 +66 +63 +211 +66 +63 +211 +66 +63 +211 +66 +61 +211 +63 +59 +210 +65 +60 +208 +69 +64 +201 +69 +64 +189 +67 +62 +175 +64 +57 +160 +62 +53 +149 +61 +51 +142 +60 +49 +137 +60 +50 +131 +61 +49 +129 +61 +48 +127 +61 +49 +126 +60 +46 +127 +61 +47 +127 +61 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +46 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +124 +60 +51 +124 +60 +51 +124 +60 +51 +123 +59 +50 +122 +59 +52 +121 +58 +51 +121 +58 +51 +119 +59 +51 +110 +55 +48 +109 +56 +48 +108 +55 +47 +108 +55 +47 +107 +54 +46 +104 +54 +45 +104 +54 +45 +104 +54 +45 +105 +55 +46 +104 +56 +46 +104 +56 +46 +103 +56 +46 +103 +56 +46 +103 +56 +46 +103 +56 +46 +104 +56 +46 +107 +57 +50 +104 +54 +47 +102 +52 +45 +103 +53 +46 +105 +55 +48 +104 +55 +48 +101 +52 +45 +98 +49 +42 +99 +50 +43 +98 +51 +43 +95 +48 +40 +93 +49 +40 +93 +49 +40 +86 +42 +33 +98 +54 +45 +123 +85 +76 +116 +89 +82 +97 +78 +72 +78 +63 +56 +65 +55 +46 +61 +54 +44 +59 +57 +45 +57 +59 +46 +57 +60 +49 +51 +57 +45 +51 +59 +46 +53 +59 +47 +54 +60 +48 +54 +60 +48 +55 +58 +47 +53 +56 +45 +52 +55 +46 +54 +57 +48 +52 +57 +50 +51 +56 +49 +51 +57 +47 +51 +57 +47 +50 +58 +47 +49 +57 +46 +49 +57 +44 +46 +57 +43 +46 +57 +43 +47 +58 +44 +48 +59 +45 +51 +62 +46 +54 +67 +50 +58 +69 +53 +60 +71 +55 +61 +69 +56 +58 +66 +53 +53 +59 +47 +48 +54 +40 +48 +50 +37 +47 +49 +36 +49 +51 +37 +49 +53 +36 +50 +58 +37 +71 +83 +59 +98 +117 +87 +119 +143 +107 +124 +155 +114 +113 +149 +103 +92 +130 +81 +74 +112 +61 +79 +111 +62 +81 +110 +62 +81 +110 +62 +81 +110 +62 +81 +110 +62 +81 +110 +62 +83 +112 +64 +83 +112 +64 +87 +116 +68 +91 +120 +72 +93 +122 +74 +93 +122 +74 +95 +124 +76 +95 +124 +76 +90 +119 +71 +82 +108 +69 +65 +82 +63 +54 +67 +57 +43 +56 +46 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +111 +102 +87 +112 +103 +88 +112 +103 +88 +110 +103 +93 +108 +110 +109 +122 +130 +133 +147 +154 +160 +171 +181 +183 +196 +206 +208 +220 +230 +232 +237 +247 +249 +244 +254 +255 +245 +254 +253 +246 +255 +252 +250 +255 +250 +251 +255 +249 +251 +254 +243 +248 +250 +237 +245 +246 +232 +241 +244 +227 +244 +253 +234 +244 +253 +232 +244 +252 +229 +243 +249 +223 +242 +246 +219 +233 +236 +205 +216 +215 +185 +197 +196 +165 +177 +176 +146 +143 +142 +114 +101 +103 +79 +77 +80 +59 +71 +75 +58 +70 +77 +61 +71 +79 +66 +74 +82 +71 +122 +123 +115 +158 +155 +148 +195 +190 +184 +215 +207 +204 +222 +212 +211 +230 +220 +219 +243 +235 +233 +252 +247 +244 +243 +240 +235 +254 +251 +244 +255 +255 +246 +255 +251 +241 +255 +243 +234 +255 +237 +229 +255 +226 +218 +255 +210 +199 +212 +143 +127 +181 +100 +81 +162 +75 +58 +178 +85 +70 +190 +88 +74 +182 +71 +60 +182 +63 +55 +199 +74 +68 +199 +67 +62 +202 +67 +63 +205 +66 +63 +208 +66 +64 +208 +66 +62 +208 +66 +62 +208 +66 +62 +208 +65 +61 +210 +65 +60 +210 +67 +63 +206 +68 +65 +197 +68 +63 +184 +65 +61 +170 +61 +56 +158 +59 +53 +149 +60 +52 +142 +59 +51 +137 +60 +50 +131 +61 +51 +129 +61 +50 +127 +61 +49 +126 +60 +48 +127 +61 +49 +127 +61 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +46 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +124 +60 +51 +123 +59 +50 +123 +59 +50 +122 +58 +49 +121 +58 +51 +120 +57 +50 +119 +56 +49 +117 +57 +49 +110 +55 +48 +108 +55 +47 +108 +55 +47 +106 +56 +47 +105 +55 +46 +105 +55 +46 +104 +54 +45 +103 +55 +45 +103 +55 +45 +103 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +104 +55 +48 +104 +54 +47 +103 +53 +46 +103 +53 +46 +103 +54 +47 +104 +55 +48 +103 +54 +47 +102 +53 +46 +97 +50 +42 +101 +54 +46 +94 +50 +41 +92 +48 +39 +96 +52 +43 +97 +53 +44 +105 +61 +52 +117 +83 +74 +88 +71 +64 +69 +62 +54 +60 +53 +47 +57 +53 +44 +59 +56 +47 +56 +58 +47 +53 +55 +44 +51 +54 +43 +54 +57 +46 +53 +59 +47 +55 +58 +47 +54 +57 +46 +54 +57 +46 +53 +56 +45 +53 +55 +44 +51 +54 +43 +50 +56 +44 +49 +57 +44 +50 +56 +46 +49 +57 +44 +49 +57 +46 +49 +57 +44 +49 +57 +44 +49 +57 +44 +46 +57 +43 +46 +57 +43 +46 +57 +43 +47 +58 +44 +48 +59 +43 +51 +62 +46 +54 +65 +49 +55 +66 +50 +60 +68 +53 +58 +67 +50 +56 +63 +47 +53 +59 +45 +52 +54 +41 +50 +52 +39 +49 +51 +37 +48 +52 +37 +48 +55 +37 +72 +84 +62 +101 +120 +92 +117 +141 +109 +116 +146 +108 +102 +137 +95 +82 +119 +75 +66 +104 +57 +75 +107 +60 +78 +107 +59 +80 +109 +61 +80 +109 +61 +78 +107 +59 +78 +107 +59 +79 +108 +60 +81 +110 +62 +86 +115 +67 +90 +119 +71 +93 +122 +74 +94 +123 +75 +95 +124 +76 +95 +124 +76 +86 +115 +67 +78 +102 +66 +59 +73 +56 +48 +59 +51 +38 +47 +42 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +111 +102 +87 +112 +103 +88 +113 +104 +89 +111 +104 +94 +104 +105 +107 +109 +116 +122 +133 +140 +148 +163 +172 +177 +191 +200 +205 +211 +222 +226 +229 +240 +242 +240 +252 +252 +242 +252 +251 +245 +254 +249 +248 +255 +247 +250 +255 +246 +252 +255 +242 +250 +253 +236 +248 +249 +231 +246 +247 +231 +246 +246 +234 +247 +247 +235 +250 +247 +232 +252 +246 +230 +253 +245 +226 +247 +236 +214 +231 +216 +195 +213 +198 +175 +192 +177 +154 +158 +147 +125 +117 +110 +91 +90 +87 +70 +80 +81 +67 +83 +86 +75 +91 +98 +90 +99 +109 +100 +146 +154 +141 +176 +179 +168 +210 +207 +198 +230 +223 +217 +242 +228 +227 +249 +235 +235 +255 +241 +244 +255 +248 +249 +255 +253 +251 +255 +251 +248 +249 +248 +243 +247 +247 +237 +251 +249 +237 +255 +252 +240 +255 +253 +241 +255 +249 +234 +255 +224 +203 +234 +168 +144 +183 +111 +89 +168 +87 +68 +174 +85 +69 +183 +82 +70 +185 +77 +65 +191 +74 +65 +195 +71 +63 +198 +69 +63 +202 +69 +64 +203 +68 +64 +205 +68 +62 +204 +67 +61 +203 +66 +60 +204 +65 +60 +209 +67 +63 +208 +69 +64 +204 +69 +65 +194 +67 +61 +179 +61 +57 +166 +59 +53 +156 +59 +53 +149 +60 +54 +140 +60 +51 +135 +61 +52 +133 +60 +53 +129 +61 +52 +127 +60 +51 +126 +60 +48 +127 +61 +49 +127 +61 +49 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +46 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +123 +59 +50 +123 +59 +50 +121 +58 +51 +120 +57 +50 +119 +56 +49 +118 +55 +48 +118 +55 +48 +115 +55 +47 +110 +55 +48 +106 +56 +47 +106 +56 +47 +106 +56 +47 +106 +56 +47 +104 +56 +46 +104 +56 +46 +104 +56 +46 +103 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +100 +56 +45 +100 +56 +45 +100 +56 +45 +102 +55 +45 +103 +54 +47 +104 +55 +48 +105 +56 +49 +105 +56 +49 +104 +55 +48 +105 +56 +49 +106 +59 +51 +108 +61 +53 +103 +56 +48 +107 +60 +52 +98 +54 +45 +97 +53 +44 +111 +67 +58 +120 +76 +67 +116 +73 +64 +110 +77 +68 +67 +57 +48 +53 +54 +46 +52 +53 +47 +56 +57 +49 +56 +59 +50 +52 +55 +46 +49 +52 +43 +50 +53 +44 +53 +56 +45 +53 +56 +45 +53 +55 +44 +52 +54 +43 +52 +54 +43 +52 +54 +43 +52 +54 +41 +51 +55 +41 +47 +55 +40 +46 +57 +41 +48 +56 +43 +46 +57 +41 +46 +57 +43 +46 +57 +41 +48 +56 +41 +48 +56 +41 +49 +57 +42 +48 +56 +41 +48 +56 +43 +47 +55 +42 +48 +56 +43 +49 +57 +44 +51 +59 +46 +52 +60 +45 +57 +66 +49 +58 +67 +48 +59 +66 +48 +58 +65 +49 +58 +60 +46 +54 +56 +42 +50 +52 +38 +47 +51 +36 +50 +57 +39 +73 +85 +63 +99 +117 +91 +109 +132 +103 +102 +132 +98 +87 +121 +84 +73 +110 +69 +63 +100 +56 +72 +103 +59 +76 +105 +59 +78 +107 +61 +78 +107 +61 +76 +105 +59 +76 +105 +59 +77 +106 +60 +79 +108 +62 +85 +114 +68 +89 +118 +72 +91 +120 +74 +93 +122 +76 +94 +123 +77 +92 +121 +75 +81 +110 +64 +71 +95 +59 +54 +66 +52 +43 +52 +47 +34 +40 +38 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +106 +99 +83 +106 +98 +85 +108 +98 +86 +108 +98 +86 +109 +99 +87 +109 +100 +85 +109 +100 +85 +109 +100 +85 +108 +101 +85 +109 +102 +86 +110 +103 +87 +111 +103 +90 +110 +104 +92 +111 +104 +94 +109 +106 +101 +107 +111 +114 +109 +116 +122 +131 +138 +144 +165 +174 +179 +195 +204 +209 +213 +223 +225 +230 +238 +241 +244 +252 +254 +244 +253 +250 +247 +253 +249 +249 +254 +247 +250 +255 +244 +252 +255 +242 +252 +255 +241 +252 +255 +238 +253 +254 +240 +251 +248 +239 +254 +250 +241 +255 +249 +239 +255 +250 +237 +255 +249 +233 +255 +242 +223 +239 +224 +203 +221 +206 +183 +193 +178 +155 +162 +151 +129 +124 +117 +98 +98 +95 +78 +88 +90 +76 +93 +99 +87 +109 +119 +110 +124 +134 +125 +165 +173 +162 +187 +193 +181 +215 +215 +207 +235 +230 +226 +250 +238 +238 +255 +244 +244 +255 +245 +247 +254 +244 +245 +253 +247 +247 +250 +249 +247 +250 +252 +247 +251 +255 +249 +250 +253 +244 +244 +247 +238 +247 +249 +238 +255 +252 +239 +255 +242 +225 +255 +242 +224 +250 +201 +184 +188 +129 +113 +157 +85 +71 +171 +85 +72 +183 +85 +74 +177 +69 +59 +192 +74 +64 +198 +71 +64 +201 +70 +62 +202 +69 +62 +202 +67 +61 +201 +66 +60 +199 +66 +59 +200 +65 +59 +207 +70 +62 +205 +71 +62 +199 +71 +62 +188 +67 +59 +173 +62 +53 +159 +58 +50 +149 +59 +51 +145 +62 +54 +138 +61 +53 +132 +62 +52 +130 +62 +53 +129 +61 +52 +127 +60 +51 +126 +60 +48 +128 +60 +49 +128 +60 +49 +126 +58 +47 +126 +58 +47 +126 +58 +49 +125 +57 +48 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +122 +58 +49 +122 +58 +49 +120 +57 +50 +119 +56 +49 +118 +55 +48 +117 +54 +47 +117 +54 +47 +113 +54 +46 +109 +56 +48 +107 +57 +48 +106 +56 +47 +106 +56 +47 +105 +57 +47 +105 +57 +47 +105 +57 +47 +104 +56 +46 +103 +55 +45 +102 +55 +45 +103 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +53 +46 +106 +56 +49 +109 +59 +52 +107 +58 +51 +106 +57 +50 +106 +58 +48 +109 +62 +52 +111 +67 +56 +108 +64 +53 +111 +68 +59 +100 +60 +50 +99 +61 +50 +122 +86 +74 +134 +100 +90 +121 +87 +77 +98 +76 +65 +62 +58 +49 +51 +56 +49 +52 +57 +50 +55 +60 +53 +52 +58 +48 +47 +53 +43 +50 +53 +44 +57 +60 +51 +51 +54 +43 +50 +53 +42 +50 +52 +41 +48 +51 +40 +49 +51 +40 +50 +53 +42 +52 +54 +43 +52 +55 +44 +46 +54 +41 +44 +55 +41 +47 +55 +42 +45 +56 +42 +47 +55 +42 +47 +55 +42 +47 +55 +42 +47 +55 +42 +49 +57 +44 +48 +56 +43 +48 +56 +45 +47 +55 +44 +47 +55 +44 +47 +55 +44 +48 +56 +45 +48 +56 +43 +55 +63 +48 +57 +66 +49 +60 +69 +52 +61 +68 +52 +59 +65 +51 +56 +60 +46 +50 +54 +39 +45 +52 +36 +50 +59 +42 +74 +86 +66 +99 +114 +91 +104 +124 +97 +93 +118 +88 +79 +109 +75 +70 +102 +65 +65 +97 +58 +72 +100 +59 +75 +104 +60 +78 +107 +63 +78 +107 +63 +75 +104 +60 +74 +103 +57 +76 +105 +61 +78 +107 +61 +84 +113 +69 +87 +116 +72 +90 +119 +75 +91 +120 +76 +93 +122 +78 +90 +118 +77 +78 +106 +65 +67 +91 +59 +50 +62 +52 +41 +47 +47 +31 +37 +37 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +100 +86 +106 +100 +86 +106 +100 +88 +108 +100 +89 +108 +99 +90 +109 +101 +90 +109 +101 +88 +109 +102 +86 +103 +96 +78 +106 +101 +82 +110 +107 +88 +111 +108 +93 +104 +101 +92 +102 +101 +97 +115 +113 +114 +129 +130 +134 +137 +142 +146 +149 +157 +160 +170 +178 +181 +194 +199 +202 +215 +220 +223 +233 +237 +238 +245 +246 +248 +248 +250 +249 +252 +254 +253 +254 +254 +252 +255 +255 +250 +253 +254 +246 +250 +253 +242 +249 +252 +241 +250 +253 +242 +251 +254 +243 +249 +250 +242 +250 +250 +242 +249 +249 +237 +252 +250 +235 +254 +252 +231 +249 +247 +222 +233 +229 +202 +213 +212 +182 +186 +185 +155 +152 +152 +124 +113 +116 +89 +95 +100 +77 +98 +107 +88 +114 +125 +108 +132 +144 +130 +145 +155 +144 +180 +185 +178 +202 +204 +199 +226 +227 +222 +240 +239 +235 +247 +243 +242 +251 +247 +246 +253 +249 +248 +252 +248 +247 +255 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +250 +254 +255 +250 +254 +255 +250 +254 +255 +250 +254 +255 +250 +251 +253 +248 +255 +253 +248 +255 +251 +246 +255 +229 +223 +215 +166 +159 +163 +96 +88 +155 +68 +61 +178 +75 +66 +193 +79 +69 +195 +71 +61 +198 +67 +57 +201 +68 +59 +205 +72 +63 +206 +73 +64 +203 +72 +64 +202 +71 +61 +198 +71 +56 +195 +72 +56 +190 +73 +56 +181 +71 +56 +166 +69 +53 +154 +66 +52 +144 +66 +53 +139 +67 +53 +133 +67 +53 +129 +67 +54 +127 +65 +52 +127 +63 +51 +128 +62 +50 +128 +60 +49 +129 +59 +49 +129 +59 +49 +127 +57 +49 +126 +58 +49 +124 +57 +49 +123 +56 +48 +122 +55 +47 +122 +55 +47 +119 +55 +46 +118 +54 +45 +119 +55 +46 +119 +55 +46 +119 +56 +47 +119 +56 +47 +118 +55 +46 +117 +54 +45 +113 +53 +43 +110 +51 +43 +108 +55 +47 +105 +56 +49 +105 +56 +49 +104 +55 +48 +104 +55 +48 +103 +54 +47 +103 +54 +47 +103 +54 +47 +102 +53 +46 +103 +54 +47 +105 +55 +48 +105 +56 +49 +104 +55 +48 +103 +54 +47 +101 +52 +45 +101 +51 +44 +104 +51 +45 +106 +53 +47 +109 +56 +48 +107 +57 +48 +106 +58 +48 +105 +59 +46 +105 +61 +48 +107 +65 +51 +103 +66 +50 +106 +73 +58 +100 +72 +58 +118 +95 +79 +126 +107 +92 +138 +120 +106 +140 +127 +111 +82 +74 +61 +55 +57 +46 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +51 +54 +45 +48 +54 +44 +50 +53 +44 +47 +53 +43 +49 +52 +43 +47 +53 +43 +47 +52 +45 +46 +53 +45 +47 +52 +45 +46 +53 +45 +47 +52 +45 +47 +52 +45 +47 +52 +45 +47 +52 +45 +48 +53 +46 +47 +52 +45 +47 +52 +45 +46 +51 +44 +46 +51 +44 +47 +52 +45 +47 +52 +45 +47 +54 +46 +49 +59 +50 +51 +61 +50 +54 +64 +53 +56 +66 +55 +57 +68 +54 +55 +66 +52 +53 +64 +48 +51 +62 +45 +52 +63 +46 +68 +81 +61 +87 +101 +78 +91 +107 +81 +80 +98 +72 +69 +88 +60 +64 +84 +56 +66 +87 +54 +73 +99 +62 +75 +101 +62 +75 +102 +61 +75 +102 +61 +74 +101 +60 +74 +101 +58 +76 +103 +62 +79 +106 +63 +85 +112 +71 +89 +116 +75 +92 +118 +79 +93 +119 +80 +93 +119 +82 +87 +113 +78 +72 +98 +63 +59 +79 +54 +37 +48 +42 +38 +43 +46 +36 +41 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +105 +100 +81 +106 +104 +83 +109 +106 +87 +106 +107 +91 +103 +103 +95 +108 +108 +108 +126 +127 +132 +144 +147 +154 +167 +174 +180 +183 +193 +195 +208 +213 +216 +225 +230 +233 +241 +242 +244 +250 +251 +253 +255 +254 +255 +255 +254 +255 +254 +253 +251 +255 +254 +250 +255 +255 +250 +254 +255 +249 +251 +252 +244 +248 +251 +242 +246 +252 +242 +247 +253 +243 +247 +250 +241 +248 +250 +239 +248 +250 +237 +247 +250 +233 +249 +251 +229 +242 +245 +218 +223 +226 +195 +204 +208 +175 +180 +184 +151 +145 +150 +118 +107 +113 +85 +89 +97 +73 +95 +107 +85 +116 +129 +111 +140 +152 +138 +157 +167 +156 +191 +193 +188 +211 +211 +209 +231 +231 +229 +243 +243 +241 +247 +247 +245 +251 +251 +249 +252 +252 +250 +251 +251 +249 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +251 +255 +254 +241 +255 +255 +237 +251 +252 +247 +249 +248 +255 +248 +247 +255 +233 +230 +239 +190 +185 +196 +128 +119 +164 +80 +70 +176 +78 +65 +186 +76 +63 +193 +75 +63 +196 +74 +61 +194 +68 +56 +188 +61 +52 +190 +63 +54 +196 +70 +58 +196 +70 +55 +195 +74 +55 +191 +76 +58 +180 +73 +55 +166 +70 +54 +153 +67 +50 +144 +68 +54 +138 +71 +55 +130 +68 +55 +127 +67 +56 +126 +66 +55 +124 +64 +53 +126 +62 +52 +127 +60 +51 +128 +60 +49 +128 +60 +51 +125 +58 +50 +125 +58 +50 +122 +58 +49 +122 +58 +49 +121 +57 +48 +120 +56 +47 +118 +55 +46 +118 +55 +46 +117 +54 +45 +118 +55 +46 +116 +56 +46 +116 +56 +46 +116 +56 +46 +114 +54 +44 +111 +53 +42 +109 +52 +43 +108 +55 +47 +105 +56 +49 +106 +56 +49 +104 +55 +48 +105 +55 +48 +104 +55 +48 +103 +54 +47 +103 +54 +47 +101 +51 +44 +101 +51 +44 +103 +53 +46 +104 +54 +47 +106 +56 +49 +106 +56 +49 +106 +56 +49 +107 +57 +50 +107 +54 +48 +108 +55 +49 +107 +57 +48 +107 +59 +49 +107 +59 +47 +106 +62 +49 +106 +64 +48 +105 +68 +50 +103 +72 +54 +107 +80 +61 +103 +82 +65 +117 +102 +83 +129 +117 +101 +140 +133 +115 +134 +131 +114 +75 +76 +60 +54 +57 +46 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +48 +53 +47 +47 +52 +46 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +47 +52 +46 +47 +54 +47 +46 +56 +48 +47 +58 +50 +49 +61 +51 +52 +64 +54 +54 +66 +54 +54 +66 +54 +54 +66 +52 +53 +66 +49 +54 +67 +49 +67 +80 +62 +80 +93 +73 +82 +96 +73 +73 +87 +64 +65 +79 +54 +66 +80 +55 +69 +85 +58 +74 +98 +64 +74 +100 +63 +75 +101 +64 +75 +101 +62 +73 +99 +60 +72 +99 +58 +73 +100 +59 +74 +101 +60 +83 +110 +69 +88 +114 +75 +92 +118 +81 +93 +119 +84 +91 +116 +84 +84 +109 +79 +67 +92 +62 +54 +73 +53 +38 +49 +45 +39 +44 +48 +37 +42 +46 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +109 +104 +85 +107 +105 +84 +109 +106 +87 +106 +107 +91 +107 +107 +99 +119 +119 +119 +145 +146 +151 +167 +172 +178 +190 +197 +203 +209 +219 +221 +235 +240 +243 +246 +251 +254 +253 +254 +255 +254 +255 +255 +255 +254 +255 +255 +253 +254 +254 +253 +251 +255 +254 +250 +255 +255 +250 +253 +254 +248 +250 +251 +243 +245 +248 +239 +241 +247 +235 +241 +247 +235 +244 +247 +236 +245 +249 +235 +246 +248 +234 +245 +248 +229 +245 +247 +225 +238 +238 +212 +219 +219 +191 +201 +202 +171 +176 +177 +146 +147 +150 +121 +117 +121 +96 +107 +112 +90 +116 +123 +105 +136 +144 +129 +159 +167 +156 +174 +181 +173 +205 +207 +202 +222 +222 +220 +239 +239 +237 +248 +248 +246 +251 +251 +249 +254 +254 +252 +254 +254 +252 +253 +253 +251 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +254 +245 +250 +253 +251 +255 +255 +254 +254 +254 +255 +248 +246 +255 +250 +244 +255 +245 +235 +248 +204 +193 +215 +157 +143 +147 +75 +60 +164 +81 +65 +168 +75 +58 +167 +64 +49 +183 +71 +59 +207 +89 +77 +206 +84 +73 +189 +63 +51 +196 +68 +55 +198 +72 +58 +195 +75 +61 +185 +73 +59 +170 +66 +55 +157 +63 +51 +149 +65 +55 +144 +70 +59 +134 +66 +57 +129 +66 +57 +126 +66 +56 +123 +65 +54 +122 +64 +53 +122 +62 +52 +122 +62 +52 +122 +62 +52 +120 +60 +52 +120 +60 +52 +119 +59 +51 +119 +59 +51 +117 +58 +50 +116 +57 +49 +116 +57 +49 +116 +57 +49 +114 +57 +48 +114 +57 +48 +114 +57 +48 +114 +57 +48 +111 +57 +47 +110 +56 +46 +108 +54 +44 +107 +53 +43 +108 +55 +47 +106 +56 +49 +108 +55 +49 +106 +56 +49 +107 +54 +48 +105 +55 +48 +105 +55 +48 +104 +54 +47 +103 +53 +46 +103 +53 +46 +102 +53 +46 +103 +54 +47 +104 +55 +48 +105 +56 +49 +107 +58 +51 +107 +58 +51 +108 +59 +52 +106 +59 +51 +105 +58 +48 +104 +60 +49 +107 +63 +50 +106 +67 +52 +105 +68 +50 +102 +69 +50 +102 +73 +55 +108 +86 +65 +106 +89 +71 +117 +106 +86 +134 +127 +109 +145 +142 +123 +128 +127 +109 +69 +70 +54 +53 +56 +45 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +46 +51 +45 +45 +50 +44 +45 +50 +44 +46 +51 +45 +47 +52 +46 +46 +53 +46 +43 +53 +45 +43 +54 +46 +45 +57 +47 +47 +59 +49 +50 +62 +50 +52 +64 +52 +54 +66 +52 +55 +68 +51 +56 +69 +51 +63 +76 +58 +69 +82 +62 +67 +81 +58 +59 +73 +50 +56 +70 +45 +62 +76 +51 +68 +84 +57 +74 +95 +64 +74 +98 +64 +76 +100 +66 +75 +99 +63 +73 +97 +61 +71 +96 +57 +70 +95 +56 +71 +96 +57 +82 +107 +68 +88 +112 +76 +93 +117 +83 +94 +118 +86 +90 +113 +84 +80 +103 +75 +61 +84 +56 +46 +65 +46 +38 +49 +45 +39 +44 +48 +37 +42 +46 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +110 +105 +86 +108 +106 +85 +108 +107 +87 +108 +109 +93 +112 +113 +105 +128 +130 +129 +158 +161 +166 +185 +190 +196 +195 +202 +208 +218 +228 +230 +244 +249 +252 +250 +255 +255 +251 +252 +254 +251 +252 +254 +253 +251 +252 +251 +250 +248 +255 +254 +252 +255 +255 +251 +255 +254 +249 +251 +252 +244 +245 +246 +238 +238 +241 +230 +233 +239 +227 +231 +237 +223 +237 +241 +226 +240 +244 +229 +241 +244 +227 +241 +244 +223 +242 +241 +220 +234 +234 +208 +216 +216 +188 +199 +199 +171 +178 +177 +149 +161 +161 +137 +145 +147 +125 +144 +147 +128 +156 +158 +145 +170 +173 +162 +182 +187 +180 +192 +197 +191 +220 +220 +218 +233 +233 +231 +246 +246 +244 +251 +251 +249 +253 +253 +251 +255 +255 +253 +255 +255 +253 +253 +253 +251 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +254 +251 +251 +253 +255 +254 +255 +255 +254 +255 +245 +240 +237 +246 +237 +230 +255 +249 +240 +255 +250 +236 +255 +238 +222 +232 +191 +173 +183 +127 +110 +148 +79 +63 +163 +80 +64 +185 +89 +75 +184 +78 +64 +180 +68 +56 +190 +69 +58 +193 +65 +54 +198 +70 +59 +197 +73 +63 +188 +71 +61 +173 +64 +57 +161 +60 +52 +152 +62 +54 +149 +66 +60 +139 +64 +59 +133 +66 +60 +128 +65 +58 +124 +65 +59 +121 +64 +57 +119 +64 +57 +117 +64 +56 +118 +63 +56 +118 +61 +52 +118 +61 +52 +118 +61 +52 +117 +60 +51 +115 +61 +51 +114 +60 +50 +114 +60 +50 +113 +59 +49 +111 +59 +48 +111 +59 +48 +111 +59 +48 +110 +58 +47 +107 +57 +46 +106 +56 +45 +106 +56 +45 +105 +55 +46 +109 +56 +50 +110 +55 +50 +109 +54 +49 +108 +55 +49 +108 +55 +49 +107 +54 +48 +105 +55 +48 +105 +55 +48 +108 +58 +51 +106 +57 +50 +104 +55 +48 +102 +55 +47 +102 +55 +47 +102 +55 +47 +104 +57 +49 +102 +58 +49 +106 +63 +54 +102 +62 +52 +101 +61 +49 +102 +62 +50 +104 +67 +51 +105 +69 +53 +102 +71 +51 +99 +71 +50 +99 +74 +54 +104 +86 +64 +105 +92 +73 +115 +107 +86 +133 +130 +111 +143 +142 +122 +112 +113 +95 +57 +61 +44 +52 +55 +44 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +46 +51 +45 +45 +52 +45 +42 +52 +44 +41 +52 +44 +42 +54 +44 +43 +55 +45 +46 +58 +46 +49 +61 +49 +52 +64 +50 +53 +65 +51 +54 +67 +50 +58 +71 +53 +60 +73 +55 +56 +69 +49 +50 +63 +43 +50 +64 +41 +56 +70 +47 +62 +78 +52 +68 +88 +60 +69 +93 +61 +75 +96 +65 +74 +98 +64 +75 +96 +63 +71 +95 +59 +72 +94 +58 +70 +94 +58 +83 +105 +69 +88 +112 +78 +96 +117 +86 +94 +117 +88 +90 +110 +83 +76 +99 +73 +57 +77 +52 +41 +58 +40 +38 +47 +44 +37 +42 +46 +35 +40 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +108 +103 +84 +107 +105 +84 +110 +109 +89 +111 +112 +96 +116 +117 +109 +133 +135 +134 +164 +167 +172 +191 +196 +202 +205 +212 +218 +229 +239 +241 +251 +255 +255 +251 +255 +255 +250 +251 +253 +252 +253 +255 +255 +253 +254 +253 +252 +250 +255 +255 +253 +255 +255 +251 +254 +253 +248 +247 +248 +240 +239 +240 +232 +231 +234 +223 +224 +230 +218 +222 +229 +213 +231 +235 +218 +234 +239 +219 +237 +240 +219 +236 +240 +217 +238 +238 +214 +232 +232 +208 +218 +216 +191 +204 +202 +177 +194 +189 +167 +183 +181 +160 +177 +174 +157 +182 +180 +167 +193 +190 +181 +201 +200 +195 +210 +211 +206 +217 +217 +215 +232 +232 +230 +242 +242 +240 +250 +250 +248 +252 +252 +250 +253 +253 +251 +255 +255 +253 +255 +255 +253 +252 +252 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +254 +252 +255 +251 +254 +255 +247 +250 +250 +246 +245 +248 +247 +243 +252 +255 +248 +254 +255 +248 +254 +255 +244 +253 +252 +234 +255 +254 +236 +245 +220 +200 +196 +155 +137 +157 +98 +80 +151 +75 +59 +165 +76 +60 +180 +80 +64 +186 +74 +60 +189 +65 +55 +196 +68 +59 +195 +71 +63 +188 +69 +61 +176 +63 +59 +166 +58 +55 +157 +59 +56 +152 +63 +59 +143 +62 +59 +137 +63 +60 +130 +65 +61 +124 +65 +61 +119 +66 +60 +115 +66 +59 +114 +67 +59 +115 +66 +59 +113 +63 +54 +115 +62 +54 +115 +62 +54 +114 +61 +53 +114 +61 +53 +114 +61 +53 +112 +62 +53 +111 +61 +52 +110 +62 +52 +109 +61 +51 +108 +60 +50 +107 +59 +49 +106 +59 +49 +105 +58 +48 +105 +58 +48 +106 +58 +48 +110 +55 +50 +112 +54 +50 +112 +54 +50 +109 +54 +49 +109 +54 +49 +108 +55 +49 +105 +55 +48 +105 +55 +48 +108 +59 +52 +107 +58 +51 +104 +57 +49 +101 +57 +48 +101 +57 +48 +101 +57 +48 +101 +58 +49 +100 +60 +50 +102 +66 +54 +99 +65 +53 +99 +67 +52 +100 +68 +53 +100 +71 +53 +100 +73 +54 +98 +73 +51 +95 +73 +50 +94 +76 +54 +101 +86 +63 +106 +98 +77 +114 +109 +87 +132 +131 +111 +132 +135 +114 +91 +96 +76 +51 +58 +40 +50 +56 +44 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +50 +44 +45 +50 +44 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +45 +50 +44 +44 +51 +44 +44 +54 +46 +43 +53 +45 +42 +52 +43 +42 +52 +43 +43 +53 +44 +46 +56 +45 +48 +59 +45 +50 +61 +47 +50 +61 +45 +53 +64 +47 +54 +65 +48 +53 +65 +45 +49 +61 +41 +49 +61 +41 +53 +65 +45 +56 +70 +47 +61 +79 +53 +64 +84 +56 +70 +89 +61 +72 +92 +64 +74 +93 +63 +73 +94 +61 +75 +94 +62 +75 +96 +63 +84 +103 +71 +91 +112 +81 +99 +118 +90 +97 +117 +90 +89 +107 +83 +74 +93 +71 +54 +71 +52 +38 +52 +37 +36 +45 +42 +36 +41 +44 +34 +39 +42 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +108 +102 +86 +106 +103 +84 +107 +106 +85 +108 +110 +89 +111 +114 +97 +115 +118 +109 +129 +133 +132 +159 +164 +168 +184 +191 +199 +213 +222 +227 +236 +246 +248 +251 +255 +255 +251 +255 +255 +250 +251 +255 +253 +254 +255 +255 +254 +255 +253 +252 +250 +255 +255 +251 +255 +255 +250 +252 +252 +244 +243 +245 +234 +235 +237 +226 +227 +231 +217 +221 +227 +213 +220 +227 +209 +228 +233 +211 +231 +236 +213 +233 +237 +214 +234 +236 +212 +235 +235 +211 +232 +230 +207 +223 +218 +196 +211 +206 +184 +211 +206 +186 +204 +198 +182 +203 +195 +184 +208 +201 +193 +215 +210 +206 +224 +219 +216 +234 +230 +229 +240 +239 +237 +243 +242 +240 +249 +249 +247 +253 +253 +251 +253 +253 +251 +253 +253 +251 +255 +255 +253 +254 +254 +252 +252 +252 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +253 +252 +255 +252 +253 +255 +246 +247 +253 +249 +248 +254 +255 +253 +249 +255 +253 +246 +255 +250 +237 +255 +243 +240 +254 +239 +235 +242 +226 +255 +255 +237 +255 +236 +217 +204 +166 +147 +163 +106 +87 +161 +90 +70 +170 +87 +69 +173 +76 +59 +182 +70 +58 +188 +70 +60 +189 +70 +62 +185 +70 +63 +178 +66 +62 +169 +61 +58 +161 +59 +57 +153 +59 +57 +149 +61 +60 +142 +62 +61 +133 +63 +61 +125 +64 +59 +120 +65 +60 +115 +66 +59 +112 +68 +59 +112 +68 +59 +112 +63 +56 +113 +63 +54 +113 +63 +54 +113 +63 +54 +113 +63 +54 +112 +62 +53 +111 +63 +53 +111 +63 +53 +111 +64 +54 +110 +63 +53 +109 +62 +52 +107 +60 +50 +104 +60 +49 +104 +60 +49 +104 +60 +49 +108 +60 +50 +111 +56 +51 +113 +54 +50 +112 +54 +50 +112 +54 +50 +109 +54 +49 +108 +55 +49 +106 +56 +49 +105 +56 +49 +104 +55 +48 +103 +56 +48 +101 +57 +48 +101 +58 +49 +100 +60 +50 +101 +63 +52 +102 +64 +53 +100 +66 +54 +94 +66 +52 +97 +71 +56 +99 +76 +58 +100 +77 +59 +99 +77 +56 +96 +75 +54 +93 +75 +51 +93 +77 +52 +93 +81 +57 +98 +88 +63 +109 +104 +82 +115 +115 +91 +128 +131 +110 +118 +123 +101 +70 +79 +58 +52 +61 +42 +51 +57 +45 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +44 +49 +43 +43 +48 +42 +43 +48 +42 +43 +48 +42 +43 +48 +42 +44 +49 +43 +44 +51 +44 +46 +53 +46 +44 +54 +46 +42 +52 +43 +42 +52 +43 +42 +52 +43 +43 +53 +44 +45 +55 +44 +46 +57 +43 +45 +56 +42 +48 +59 +43 +52 +63 +47 +53 +64 +47 +52 +63 +46 +51 +63 +43 +51 +62 +45 +51 +64 +44 +55 +70 +47 +57 +75 +51 +64 +79 +56 +66 +84 +58 +71 +87 +60 +72 +91 +63 +77 +93 +66 +77 +96 +68 +85 +101 +74 +92 +111 +83 +100 +116 +90 +96 +114 +90 +88 +103 +82 +71 +88 +69 +52 +66 +49 +36 +50 +37 +36 +45 +42 +36 +41 +44 +34 +39 +42 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +100 +86 +106 +100 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +108 +102 +90 +108 +102 +86 +108 +105 +86 +108 +107 +86 +107 +109 +88 +107 +110 +93 +108 +114 +104 +121 +127 +125 +149 +157 +160 +174 +183 +190 +209 +218 +223 +233 +242 +247 +251 +255 +255 +248 +253 +255 +248 +249 +253 +254 +255 +255 +255 +254 +255 +249 +248 +246 +255 +255 +251 +254 +253 +248 +249 +249 +241 +241 +243 +232 +233 +235 +222 +227 +231 +216 +223 +230 +214 +224 +232 +211 +228 +233 +210 +231 +237 +211 +232 +236 +211 +231 +233 +209 +232 +232 +208 +231 +229 +206 +224 +219 +199 +215 +208 +190 +218 +211 +195 +217 +209 +198 +222 +212 +203 +230 +221 +216 +238 +228 +227 +243 +233 +234 +250 +241 +244 +255 +249 +251 +250 +249 +247 +254 +254 +252 +255 +255 +253 +253 +253 +251 +253 +253 +251 +255 +255 +253 +255 +255 +253 +252 +252 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +253 +252 +255 +250 +249 +255 +251 +250 +255 +254 +253 +252 +255 +253 +245 +255 +252 +234 +251 +245 +234 +255 +248 +242 +255 +253 +245 +255 +250 +239 +245 +231 +255 +250 +234 +255 +250 +232 +242 +204 +185 +171 +119 +98 +143 +81 +58 +170 +93 +73 +175 +80 +62 +179 +76 +61 +179 +75 +62 +179 +75 +64 +177 +73 +64 +172 +69 +62 +162 +63 +58 +154 +59 +55 +150 +61 +57 +143 +62 +58 +136 +63 +57 +129 +64 +58 +122 +65 +58 +117 +67 +58 +113 +69 +58 +113 +69 +60 +112 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +112 +63 +56 +112 +63 +56 +113 +66 +58 +112 +65 +57 +110 +63 +55 +108 +61 +53 +105 +61 +52 +106 +62 +53 +106 +62 +53 +110 +61 +54 +111 +56 +51 +114 +55 +51 +112 +54 +50 +112 +54 +50 +110 +55 +50 +108 +55 +49 +106 +56 +49 +105 +56 +49 +100 +56 +47 +100 +57 +48 +99 +59 +49 +100 +62 +51 +100 +64 +52 +99 +65 +53 +99 +65 +53 +95 +67 +53 +90 +69 +52 +95 +78 +60 +103 +86 +66 +104 +87 +67 +99 +83 +60 +94 +79 +56 +91 +79 +53 +92 +82 +55 +93 +86 +60 +93 +89 +62 +110 +108 +85 +116 +118 +94 +124 +129 +107 +99 +109 +85 +50 +62 +40 +54 +66 +46 +51 +59 +46 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +44 +49 +43 +44 +49 +43 +43 +48 +42 +42 +47 +41 +42 +47 +41 +43 +48 +42 +44 +49 +43 +43 +50 +43 +45 +52 +45 +43 +53 +45 +42 +52 +44 +42 +52 +44 +43 +53 +44 +43 +53 +44 +44 +54 +43 +45 +55 +44 +44 +54 +43 +47 +58 +44 +50 +61 +47 +54 +65 +49 +55 +66 +50 +55 +66 +49 +53 +64 +48 +52 +63 +46 +50 +63 +45 +52 +67 +46 +58 +71 +51 +61 +76 +53 +65 +79 +56 +68 +84 +58 +74 +88 +63 +76 +92 +66 +84 +98 +73 +92 +107 +84 +99 +113 +90 +94 +109 +88 +85 +98 +80 +68 +82 +65 +50 +62 +48 +35 +47 +37 +38 +47 +44 +38 +44 +44 +36 +42 +42 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +100 +86 +106 +100 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +108 +102 +90 +108 +102 +86 +111 +108 +89 +109 +108 +87 +106 +108 +87 +103 +107 +90 +102 +108 +98 +114 +123 +120 +142 +152 +154 +168 +177 +184 +201 +210 +215 +226 +235 +240 +247 +252 +255 +246 +251 +254 +249 +250 +254 +254 +255 +255 +255 +254 +255 +249 +248 +244 +255 +255 +250 +253 +253 +245 +248 +248 +238 +240 +242 +229 +233 +235 +221 +229 +233 +216 +227 +234 +216 +229 +237 +214 +230 +236 +210 +233 +237 +210 +234 +237 +210 +232 +232 +206 +232 +230 +207 +232 +227 +207 +225 +218 +200 +216 +208 +195 +216 +206 +196 +221 +210 +204 +234 +223 +219 +248 +237 +235 +255 +244 +246 +255 +245 +249 +255 +245 +251 +255 +249 +252 +254 +252 +253 +255 +255 +253 +255 +255 +253 +254 +254 +252 +254 +254 +252 +255 +255 +253 +255 +255 +253 +253 +253 +251 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +254 +250 +255 +249 +247 +255 +249 +247 +251 +250 +248 +247 +251 +250 +245 +255 +254 +243 +255 +255 +240 +255 +255 +237 +253 +250 +240 +252 +248 +251 +255 +250 +255 +253 +241 +255 +242 +226 +255 +239 +219 +255 +225 +203 +216 +174 +150 +170 +114 +91 +164 +89 +68 +169 +84 +64 +168 +81 +62 +169 +82 +65 +173 +81 +66 +169 +77 +64 +161 +68 +60 +151 +61 +53 +149 +62 +55 +143 +63 +54 +137 +62 +56 +131 +64 +55 +125 +65 +55 +119 +67 +54 +116 +68 +56 +115 +69 +56 +113 +63 +56 +113 +63 +56 +115 +62 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +112 +63 +56 +115 +66 +59 +113 +66 +58 +111 +64 +56 +109 +62 +54 +108 +61 +53 +106 +62 +53 +109 +62 +54 +111 +62 +55 +111 +56 +51 +113 +55 +51 +111 +56 +51 +109 +56 +50 +109 +56 +50 +105 +56 +49 +104 +57 +49 +102 +58 +49 +102 +59 +50 +100 +62 +51 +100 +64 +52 +98 +66 +53 +96 +67 +53 +93 +65 +51 +92 +64 +50 +87 +66 +49 +84 +71 +52 +91 +83 +62 +102 +94 +71 +105 +94 +72 +98 +88 +63 +90 +83 +57 +90 +83 +55 +92 +87 +58 +90 +86 +59 +88 +87 +59 +107 +109 +85 +115 +119 +94 +117 +125 +102 +85 +97 +73 +38 +50 +28 +56 +68 +48 +51 +59 +46 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +44 +49 +43 +43 +48 +42 +43 +48 +42 +42 +47 +41 +42 +47 +41 +43 +48 +42 +43 +48 +42 +44 +49 +43 +43 +50 +43 +41 +51 +43 +42 +52 +44 +43 +53 +45 +43 +53 +44 +44 +54 +45 +45 +55 +46 +45 +55 +44 +44 +54 +43 +46 +56 +45 +50 +60 +49 +54 +65 +51 +57 +68 +54 +57 +68 +52 +55 +66 +52 +54 +65 +49 +48 +59 +43 +50 +63 +45 +53 +66 +48 +57 +70 +50 +60 +73 +53 +64 +78 +55 +70 +84 +61 +74 +88 +63 +82 +96 +73 +91 +104 +84 +97 +110 +90 +92 +105 +87 +81 +94 +77 +66 +78 +64 +47 +59 +47 +34 +44 +35 +42 +48 +44 +40 +46 +44 +38 +44 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +107 +100 +90 +108 +101 +91 +109 +100 +93 +110 +101 +92 +109 +103 +91 +109 +103 +87 +113 +110 +91 +107 +109 +87 +107 +110 +89 +107 +114 +96 +106 +114 +103 +112 +121 +118 +135 +145 +147 +159 +170 +176 +187 +196 +201 +208 +217 +222 +234 +239 +243 +246 +251 +254 +252 +253 +255 +254 +255 +255 +255 +254 +255 +254 +253 +249 +255 +255 +250 +254 +254 +246 +250 +250 +240 +246 +248 +235 +244 +246 +232 +240 +244 +227 +234 +241 +223 +231 +239 +216 +240 +246 +218 +237 +242 +212 +235 +238 +209 +236 +236 +210 +232 +230 +209 +225 +220 +201 +221 +213 +200 +222 +212 +202 +224 +211 +205 +231 +217 +216 +241 +227 +227 +249 +234 +237 +253 +241 +243 +255 +246 +250 +255 +248 +255 +255 +252 +255 +255 +253 +254 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +255 +250 +255 +254 +250 +255 +255 +251 +255 +255 +253 +254 +255 +255 +252 +255 +255 +250 +255 +255 +249 +254 +255 +249 +253 +255 +254 +255 +255 +254 +253 +251 +254 +249 +243 +255 +248 +238 +255 +249 +233 +255 +248 +226 +255 +241 +217 +255 +232 +207 +182 +132 +105 +162 +100 +75 +147 +83 +58 +155 +87 +64 +165 +93 +71 +160 +83 +65 +154 +75 +58 +155 +76 +61 +142 +63 +50 +141 +63 +50 +135 +63 +51 +128 +60 +47 +121 +59 +46 +116 +60 +45 +115 +63 +49 +115 +66 +52 +114 +61 +53 +114 +61 +55 +116 +61 +56 +115 +62 +56 +117 +64 +58 +117 +64 +58 +116 +63 +57 +113 +63 +56 +115 +65 +58 +113 +64 +57 +113 +64 +57 +113 +64 +57 +112 +63 +56 +110 +63 +55 +111 +62 +55 +111 +62 +55 +107 +57 +50 +109 +56 +50 +108 +58 +51 +108 +59 +52 +108 +59 +52 +104 +60 +51 +103 +60 +51 +99 +61 +50 +99 +63 +51 +94 +62 +49 +100 +71 +57 +99 +71 +57 +84 +61 +45 +78 +57 +40 +77 +56 +39 +64 +49 +30 +87 +81 +59 +80 +78 +55 +75 +73 +48 +79 +75 +50 +93 +89 +62 +105 +101 +74 +101 +97 +68 +86 +85 +55 +88 +88 +60 +93 +96 +67 +111 +115 +90 +122 +128 +102 +100 +108 +85 +61 +73 +49 +45 +57 +35 +50 +62 +42 +52 +60 +47 +53 +59 +49 +52 +58 +48 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +49 +54 +48 +49 +54 +48 +48 +53 +47 +48 +53 +47 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +43 +48 +42 +43 +48 +42 +46 +53 +46 +45 +52 +45 +45 +52 +45 +44 +51 +44 +45 +52 +45 +45 +52 +44 +46 +53 +45 +46 +53 +45 +43 +50 +42 +45 +52 +44 +48 +55 +47 +53 +61 +50 +57 +65 +54 +61 +69 +56 +63 +71 +60 +63 +74 +60 +55 +66 +50 +53 +64 +47 +51 +62 +45 +49 +61 +41 +50 +62 +42 +57 +69 +47 +66 +78 +56 +73 +85 +63 +79 +91 +71 +86 +98 +78 +93 +104 +87 +89 +100 +84 +76 +87 +73 +60 +70 +59 +47 +57 +46 +41 +51 +42 +42 +48 +44 +41 +47 +43 +40 +46 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +107 +100 +90 +108 +101 +91 +109 +100 +93 +110 +101 +92 +109 +103 +91 +107 +104 +87 +111 +110 +90 +106 +108 +86 +107 +110 +89 +107 +114 +96 +106 +116 +105 +113 +124 +120 +137 +148 +150 +163 +174 +180 +190 +199 +204 +210 +219 +224 +235 +240 +244 +247 +252 +255 +253 +254 +255 +254 +255 +255 +255 +254 +252 +254 +253 +249 +255 +255 +250 +254 +254 +244 +251 +251 +239 +247 +249 +235 +244 +247 +230 +240 +245 +225 +234 +242 +221 +232 +237 +214 +234 +239 +209 +230 +235 +203 +228 +231 +202 +230 +230 +204 +227 +225 +204 +223 +217 +201 +222 +212 +202 +223 +212 +206 +230 +216 +215 +236 +222 +222 +245 +230 +233 +250 +238 +242 +255 +243 +247 +255 +246 +250 +255 +249 +253 +255 +251 +254 +255 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +252 +250 +255 +249 +250 +255 +249 +253 +255 +252 +253 +254 +255 +253 +252 +255 +253 +250 +255 +255 +250 +255 +255 +248 +255 +255 +252 +255 +255 +250 +253 +255 +248 +246 +255 +249 +242 +255 +252 +239 +255 +252 +234 +254 +248 +226 +255 +241 +215 +255 +234 +206 +217 +178 +149 +163 +117 +91 +142 +92 +67 +146 +92 +66 +152 +92 +68 +152 +87 +67 +150 +83 +64 +138 +70 +51 +137 +68 +52 +135 +68 +51 +131 +68 +51 +126 +67 +51 +122 +66 +49 +118 +65 +49 +115 +63 +49 +117 +64 +56 +115 +62 +56 +117 +62 +57 +117 +64 +58 +116 +63 +57 +111 +61 +54 +112 +62 +55 +115 +65 +58 +113 +63 +56 +112 +63 +56 +112 +63 +56 +110 +63 +55 +111 +62 +55 +109 +62 +54 +110 +61 +54 +109 +62 +54 +107 +60 +52 +108 +61 +53 +109 +62 +54 +107 +63 +54 +106 +63 +54 +103 +65 +54 +101 +65 +53 +98 +66 +53 +100 +71 +57 +91 +65 +50 +94 +71 +55 +94 +73 +56 +78 +61 +43 +70 +55 +36 +71 +56 +37 +62 +54 +33 +76 +76 +52 +71 +75 +50 +68 +71 +44 +68 +68 +42 +77 +77 +49 +92 +91 +63 +98 +97 +67 +96 +97 +66 +89 +89 +61 +100 +103 +74 +115 +119 +94 +115 +121 +95 +88 +96 +73 +58 +68 +44 +47 +59 +37 +55 +67 +47 +54 +62 +49 +54 +60 +50 +54 +60 +50 +54 +60 +50 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +55 +49 +50 +55 +49 +50 +55 +49 +49 +54 +48 +49 +54 +48 +49 +54 +48 +48 +53 +47 +48 +53 +47 +46 +51 +45 +46 +51 +45 +45 +50 +44 +45 +50 +44 +44 +49 +43 +44 +49 +43 +43 +48 +42 +43 +48 +42 +42 +49 +42 +42 +49 +42 +41 +48 +41 +41 +48 +41 +41 +48 +41 +42 +49 +42 +43 +50 +42 +44 +51 +43 +46 +53 +45 +45 +52 +44 +46 +53 +45 +48 +55 +47 +52 +59 +51 +57 +65 +54 +63 +70 +62 +66 +74 +63 +59 +70 +56 +58 +69 +53 +55 +66 +49 +52 +63 +46 +51 +63 +43 +54 +66 +46 +60 +72 +50 +64 +76 +54 +76 +88 +68 +83 +95 +75 +89 +100 +84 +87 +98 +82 +76 +86 +75 +61 +71 +60 +49 +59 +50 +43 +53 +44 +44 +51 +44 +43 +49 +45 +42 +48 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +110 +101 +92 +109 +103 +91 +107 +104 +87 +109 +108 +88 +105 +109 +86 +106 +111 +89 +107 +116 +97 +105 +117 +105 +113 +125 +121 +138 +152 +153 +165 +178 +184 +191 +202 +208 +212 +221 +226 +237 +242 +246 +247 +252 +255 +252 +253 +255 +253 +255 +254 +255 +254 +252 +254 +253 +248 +255 +255 +247 +253 +253 +243 +250 +251 +237 +247 +250 +233 +244 +247 +228 +239 +244 +222 +231 +239 +216 +229 +235 +209 +226 +231 +201 +222 +225 +194 +221 +221 +193 +222 +222 +198 +222 +219 +200 +221 +215 +203 +224 +213 +207 +228 +217 +215 +237 +225 +225 +242 +230 +234 +249 +237 +241 +254 +243 +247 +255 +246 +250 +255 +248 +251 +255 +249 +252 +255 +252 +252 +255 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +252 +246 +255 +250 +246 +255 +250 +250 +254 +253 +253 +253 +253 +255 +250 +254 +255 +248 +255 +255 +246 +255 +255 +244 +254 +255 +249 +255 +255 +247 +252 +255 +247 +247 +255 +250 +245 +255 +255 +246 +255 +255 +242 +250 +253 +236 +250 +248 +227 +254 +240 +214 +255 +246 +219 +255 +235 +208 +223 +191 +166 +168 +131 +105 +132 +90 +66 +131 +83 +60 +145 +93 +71 +148 +93 +72 +139 +82 +62 +127 +70 +50 +118 +63 +42 +117 +62 +42 +118 +66 +45 +121 +70 +51 +120 +71 +54 +113 +63 +52 +110 +60 +51 +113 +60 +52 +116 +66 +57 +115 +65 +56 +111 +63 +53 +113 +65 +55 +120 +72 +62 +110 +62 +52 +109 +62 +52 +109 +62 +52 +107 +63 +52 +108 +61 +51 +106 +62 +51 +108 +61 +51 +106 +62 +51 +103 +63 +53 +103 +65 +54 +103 +65 +54 +103 +67 +55 +101 +67 +55 +99 +67 +54 +96 +67 +53 +94 +68 +53 +98 +75 +59 +85 +66 +49 +90 +73 +55 +96 +83 +64 +82 +71 +51 +67 +59 +38 +69 +61 +40 +70 +65 +43 +65 +69 +44 +66 +72 +46 +65 +69 +42 +60 +64 +37 +63 +66 +37 +78 +78 +50 +95 +96 +65 +105 +106 +75 +97 +97 +69 +110 +113 +84 +118 +122 +97 +103 +109 +83 +74 +79 +57 +52 +60 +37 +52 +61 +40 +61 +70 +51 +56 +62 +50 +56 +62 +52 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +54 +60 +50 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +54 +60 +50 +54 +60 +50 +54 +60 +50 +53 +58 +52 +52 +57 +51 +52 +57 +51 +52 +57 +51 +51 +56 +50 +51 +56 +50 +51 +56 +50 +50 +55 +49 +48 +53 +47 +48 +53 +47 +47 +52 +46 +46 +51 +45 +45 +50 +44 +44 +49 +43 +43 +48 +42 +43 +48 +42 +41 +46 +40 +41 +46 +40 +41 +46 +40 +41 +46 +40 +41 +46 +40 +42 +47 +41 +43 +48 +42 +44 +49 +43 +49 +54 +48 +47 +52 +46 +44 +49 +43 +44 +49 +43 +47 +52 +46 +54 +59 +52 +61 +66 +60 +65 +72 +64 +64 +75 +61 +62 +75 +58 +60 +73 +55 +56 +69 +51 +52 +65 +45 +50 +63 +43 +51 +65 +42 +53 +67 +44 +68 +81 +61 +75 +88 +68 +81 +94 +77 +81 +94 +77 +72 +84 +72 +60 +72 +60 +50 +62 +52 +46 +56 +47 +46 +53 +46 +46 +53 +46 +45 +52 +45 +103 +100 +85 +103 +100 +85 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +107 +109 +88 +105 +109 +86 +106 +111 +89 +106 +115 +96 +104 +116 +104 +109 +124 +119 +136 +152 +152 +166 +179 +185 +191 +202 +208 +211 +220 +227 +235 +240 +246 +246 +251 +255 +252 +253 +255 +253 +255 +254 +255 +255 +253 +255 +254 +249 +254 +254 +246 +253 +253 +241 +250 +251 +237 +247 +250 +231 +244 +247 +226 +238 +243 +220 +229 +237 +213 +226 +232 +206 +219 +224 +192 +215 +218 +187 +214 +214 +188 +217 +215 +194 +221 +215 +199 +222 +215 +205 +229 +219 +217 +236 +224 +224 +247 +235 +239 +250 +239 +245 +255 +244 +250 +255 +248 +253 +255 +249 +252 +255 +250 +250 +255 +250 +250 +255 +252 +251 +255 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +252 +247 +255 +253 +247 +255 +253 +250 +254 +253 +253 +253 +253 +255 +251 +253 +255 +248 +254 +255 +246 +253 +255 +244 +250 +255 +248 +251 +255 +247 +250 +255 +248 +248 +255 +252 +249 +255 +255 +248 +255 +255 +248 +250 +255 +244 +250 +252 +238 +255 +255 +237 +255 +248 +228 +253 +238 +219 +255 +239 +219 +255 +239 +217 +238 +210 +188 +176 +144 +121 +118 +82 +60 +117 +76 +54 +117 +75 +53 +119 +74 +53 +123 +78 +57 +125 +80 +59 +120 +75 +54 +107 +64 +45 +98 +55 +38 +123 +77 +64 +115 +68 +58 +113 +66 +56 +115 +68 +58 +111 +67 +56 +103 +59 +48 +100 +56 +45 +103 +61 +49 +105 +63 +51 +105 +63 +51 +105 +63 +51 +103 +63 +51 +102 +62 +50 +102 +62 +50 +102 +62 +50 +101 +63 +50 +98 +64 +52 +98 +66 +53 +96 +67 +53 +95 +67 +53 +95 +67 +53 +91 +68 +52 +90 +69 +52 +87 +68 +51 +88 +73 +54 +79 +66 +47 +92 +84 +63 +111 +105 +83 +99 +94 +72 +77 +75 +52 +73 +71 +48 +73 +75 +51 +62 +68 +42 +63 +72 +45 +64 +70 +42 +60 +66 +38 +60 +65 +35 +70 +73 +44 +88 +89 +58 +100 +101 +70 +109 +109 +81 +120 +120 +92 +116 +118 +94 +91 +95 +70 +64 +67 +46 +54 +59 +37 +56 +64 +43 +60 +67 +49 +57 +63 +51 +57 +63 +53 +57 +63 +53 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +57 +63 +53 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +55 +60 +54 +55 +60 +54 +55 +60 +54 +54 +59 +53 +54 +59 +53 +54 +59 +53 +53 +58 +52 +53 +58 +52 +51 +56 +50 +51 +56 +50 +49 +54 +48 +48 +53 +47 +47 +52 +46 +45 +50 +44 +44 +49 +43 +44 +49 +43 +43 +48 +42 +43 +48 +42 +42 +47 +41 +42 +47 +41 +43 +48 +42 +44 +49 +43 +45 +50 +44 +45 +50 +44 +48 +53 +47 +46 +51 +45 +43 +48 +42 +43 +48 +42 +45 +50 +46 +50 +55 +49 +56 +61 +57 +59 +66 +58 +64 +75 +61 +64 +77 +59 +64 +77 +59 +61 +74 +54 +56 +69 +49 +51 +64 +44 +49 +63 +40 +48 +62 +39 +60 +73 +53 +66 +79 +59 +72 +85 +67 +73 +86 +69 +68 +80 +66 +59 +71 +59 +50 +62 +52 +46 +58 +48 +45 +55 +47 +47 +54 +47 +46 +53 +46 +103 +100 +85 +103 +100 +85 +103 +100 +85 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +108 +100 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +107 +109 +88 +105 +110 +87 +105 +113 +90 +103 +115 +95 +100 +114 +101 +106 +121 +116 +133 +149 +149 +163 +178 +183 +189 +200 +206 +210 +219 +226 +234 +239 +245 +244 +249 +253 +251 +252 +255 +253 +255 +254 +255 +255 +253 +255 +255 +250 +255 +255 +248 +255 +255 +243 +254 +255 +241 +251 +254 +235 +247 +250 +229 +240 +245 +222 +230 +238 +214 +226 +232 +204 +217 +220 +191 +213 +213 +185 +210 +208 +185 +212 +209 +190 +218 +212 +200 +224 +217 +209 +234 +224 +223 +244 +233 +237 +253 +242 +248 +255 +246 +251 +255 +250 +255 +255 +252 +255 +255 +253 +254 +254 +253 +251 +254 +253 +249 +254 +253 +249 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +254 +250 +255 +255 +250 +255 +255 +252 +255 +255 +255 +255 +255 +255 +253 +254 +255 +251 +251 +255 +249 +250 +255 +249 +248 +255 +248 +246 +255 +249 +247 +255 +250 +247 +255 +254 +249 +255 +255 +251 +255 +255 +251 +253 +255 +250 +252 +253 +248 +244 +241 +234 +255 +251 +243 +255 +253 +244 +255 +251 +241 +255 +248 +235 +255 +244 +228 +246 +227 +210 +228 +207 +188 +208 +183 +163 +183 +156 +135 +146 +118 +97 +118 +87 +67 +104 +73 +53 +104 +73 +53 +109 +76 +57 +112 +79 +60 +108 +71 +55 +105 +66 +51 +103 +66 +50 +106 +69 +53 +110 +73 +57 +110 +74 +58 +111 +75 +59 +111 +75 +59 +101 +65 +49 +99 +66 +49 +99 +66 +49 +99 +66 +49 +99 +66 +49 +99 +66 +49 +98 +67 +49 +96 +67 +51 +93 +70 +54 +92 +71 +54 +92 +71 +54 +90 +71 +54 +90 +71 +54 +87 +72 +53 +84 +71 +52 +82 +71 +51 +80 +72 +51 +78 +72 +50 +102 +100 +77 +126 +126 +102 +114 +114 +90 +86 +88 +64 +74 +76 +52 +71 +77 +51 +60 +69 +42 +60 +70 +43 +63 +72 +43 +65 +71 +43 +65 +70 +40 +68 +71 +42 +77 +78 +47 +84 +85 +54 +120 +119 +91 +123 +122 +94 +110 +110 +86 +85 +85 +61 +67 +66 +46 +63 +65 +44 +62 +65 +46 +58 +62 +45 +59 +62 +51 +57 +63 +53 +57 +63 +53 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +57 +62 +56 +57 +62 +56 +57 +62 +56 +56 +61 +55 +56 +61 +55 +56 +61 +55 +55 +60 +54 +55 +60 +54 +54 +59 +53 +53 +58 +52 +52 +57 +51 +51 +56 +50 +50 +55 +49 +48 +53 +47 +47 +52 +46 +47 +52 +46 +45 +50 +46 +45 +50 +46 +44 +49 +45 +43 +48 +44 +43 +48 +44 +44 +49 +45 +45 +50 +46 +45 +50 +46 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +46 +50 +49 +48 +53 +49 +51 +55 +54 +52 +59 +52 +59 +71 +57 +61 +76 +57 +64 +79 +60 +64 +79 +58 +60 +75 +54 +55 +70 +47 +52 +67 +44 +50 +65 +42 +54 +69 +46 +58 +73 +52 +64 +79 +60 +66 +80 +63 +63 +77 +62 +56 +70 +55 +49 +63 +50 +45 +57 +45 +45 +55 +46 +46 +53 +45 +45 +52 +44 +102 +99 +84 +102 +99 +84 +103 +100 +85 +104 +101 +86 +104 +101 +86 +105 +102 +87 +106 +103 +88 +106 +103 +88 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +108 +100 +87 +108 +100 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +107 +109 +88 +105 +110 +87 +105 +113 +90 +103 +115 +95 +98 +112 +99 +103 +120 +114 +130 +148 +148 +163 +178 +183 +192 +203 +209 +212 +221 +228 +235 +240 +246 +245 +250 +254 +251 +252 +255 +253 +255 +254 +255 +255 +253 +255 +255 +250 +255 +255 +248 +255 +255 +244 +255 +255 +243 +255 +255 +239 +250 +253 +232 +242 +247 +224 +231 +240 +213 +226 +232 +204 +215 +218 +189 +209 +209 +181 +205 +203 +180 +206 +203 +186 +214 +207 +197 +222 +215 +209 +236 +226 +227 +247 +238 +243 +255 +245 +253 +255 +249 +255 +255 +252 +255 +255 +254 +255 +255 +254 +252 +253 +254 +249 +253 +254 +248 +253 +255 +249 +254 +255 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +254 +253 +254 +255 +254 +255 +255 +254 +255 +255 +254 +255 +255 +254 +255 +253 +254 +255 +250 +253 +254 +248 +253 +253 +245 +251 +251 +241 +252 +252 +244 +254 +253 +248 +255 +254 +250 +255 +255 +253 +254 +254 +254 +254 +252 +255 +254 +252 +255 +251 +246 +252 +255 +250 +254 +254 +248 +250 +249 +244 +241 +253 +246 +240 +255 +254 +244 +255 +254 +241 +255 +254 +237 +255 +248 +230 +252 +239 +220 +242 +227 +208 +226 +209 +189 +205 +187 +167 +179 +161 +141 +155 +134 +115 +140 +117 +99 +122 +93 +75 +125 +94 +76 +116 +85 +67 +97 +68 +50 +87 +58 +40 +89 +60 +42 +91 +62 +44 +88 +61 +42 +96 +69 +50 +96 +69 +50 +96 +69 +50 +95 +70 +50 +96 +71 +51 +96 +71 +51 +96 +71 +51 +93 +72 +51 +92 +75 +55 +92 +77 +58 +92 +77 +58 +89 +76 +57 +88 +77 +57 +85 +77 +56 +82 +76 +54 +81 +76 +54 +78 +76 +53 +81 +81 +57 +105 +107 +83 +124 +128 +103 +109 +113 +88 +83 +89 +63 +70 +76 +50 +62 +71 +44 +60 +70 +43 +60 +70 +43 +63 +72 +43 +68 +74 +46 +69 +74 +44 +68 +71 +42 +72 +73 +42 +76 +77 +46 +121 +120 +92 +116 +115 +87 +102 +100 +77 +84 +82 +59 +76 +73 +54 +75 +74 +54 +70 +69 +51 +60 +61 +45 +60 +63 +52 +57 +63 +53 +57 +63 +53 +57 +63 +53 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +57 +63 +53 +57 +63 +53 +58 +63 +57 +58 +63 +57 +58 +63 +57 +58 +63 +57 +57 +62 +56 +57 +62 +56 +57 +62 +56 +56 +61 +55 +56 +61 +55 +56 +61 +55 +55 +60 +54 +54 +59 +53 +53 +58 +52 +52 +57 +51 +51 +56 +50 +51 +56 +50 +47 +52 +48 +46 +51 +47 +45 +50 +46 +44 +49 +45 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +44 +49 +45 +45 +49 +48 +46 +50 +49 +47 +51 +50 +47 +51 +50 +47 +51 +50 +45 +52 +45 +51 +63 +49 +55 +70 +51 +61 +76 +55 +64 +79 +58 +63 +78 +55 +60 +75 +52 +57 +72 +49 +56 +71 +48 +53 +68 +45 +56 +71 +48 +60 +75 +54 +62 +77 +58 +60 +74 +57 +55 +69 +54 +49 +63 +50 +45 +57 +45 +44 +54 +45 +46 +53 +45 +45 +52 +44 +102 +99 +84 +102 +99 +84 +103 +100 +85 +104 +101 +86 +104 +101 +86 +105 +102 +87 +106 +103 +88 +106 +103 +88 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +108 +100 +87 +108 +100 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +106 +108 +87 +104 +109 +86 +104 +114 +90 +102 +115 +95 +99 +113 +100 +104 +121 +115 +133 +151 +151 +165 +183 +187 +199 +210 +216 +218 +227 +234 +240 +245 +251 +248 +253 +255 +252 +253 +255 +253 +255 +254 +255 +255 +253 +255 +254 +249 +255 +255 +245 +255 +255 +242 +255 +255 +240 +252 +255 +236 +248 +251 +230 +239 +244 +221 +226 +235 +208 +221 +227 +199 +213 +213 +185 +206 +204 +179 +201 +196 +176 +202 +196 +180 +208 +201 +191 +218 +210 +207 +233 +224 +227 +246 +237 +242 +255 +246 +254 +255 +249 +255 +255 +252 +255 +255 +254 +255 +254 +254 +252 +252 +254 +249 +251 +255 +247 +252 +255 +248 +253 +255 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +254 +254 +251 +255 +255 +252 +255 +254 +253 +255 +253 +255 +254 +250 +255 +250 +247 +255 +248 +246 +255 +243 +245 +255 +240 +243 +254 +238 +245 +255 +242 +250 +255 +246 +253 +255 +250 +255 +253 +254 +255 +251 +255 +255 +249 +255 +255 +248 +255 +252 +241 +255 +254 +245 +255 +255 +250 +255 +255 +253 +255 +255 +252 +255 +252 +251 +249 +248 +248 +240 +245 +245 +233 +255 +255 +241 +255 +255 +239 +255 +255 +237 +255 +255 +237 +255 +252 +234 +255 +246 +229 +251 +239 +223 +248 +235 +218 +249 +228 +209 +255 +230 +208 +227 +202 +180 +165 +143 +120 +116 +94 +71 +101 +79 +56 +98 +76 +53 +92 +72 +48 +94 +74 +50 +92 +74 +50 +92 +74 +50 +93 +75 +51 +93 +75 +51 +94 +76 +52 +94 +76 +52 +92 +77 +54 +89 +78 +56 +87 +79 +58 +87 +79 +58 +86 +80 +58 +85 +79 +57 +83 +78 +56 +80 +78 +55 +78 +78 +54 +77 +79 +55 +80 +84 +59 +96 +102 +76 +102 +111 +84 +85 +94 +67 +69 +79 +52 +65 +75 +48 +60 +70 +43 +63 +73 +46 +63 +73 +46 +67 +76 +47 +72 +78 +50 +72 +77 +47 +70 +73 +44 +79 +80 +49 +89 +88 +58 +113 +109 +82 +106 +102 +75 +97 +92 +70 +91 +86 +64 +89 +84 +65 +84 +81 +62 +77 +74 +57 +66 +67 +51 +61 +64 +53 +59 +65 +55 +59 +65 +55 +59 +65 +55 +58 +64 +54 +58 +64 +54 +58 +64 +54 +57 +63 +53 +56 +62 +52 +56 +62 +52 +56 +62 +52 +57 +63 +53 +57 +63 +53 +58 +64 +54 +58 +64 +54 +58 +64 +54 +59 +64 +58 +59 +64 +58 +59 +64 +58 +58 +63 +57 +58 +63 +57 +57 +62 +56 +57 +62 +56 +57 +62 +56 +58 +63 +57 +58 +63 +57 +57 +62 +56 +57 +62 +56 +56 +61 +55 +56 +61 +55 +55 +60 +54 +55 +60 +54 +52 +57 +53 +50 +55 +51 +49 +54 +50 +47 +52 +48 +45 +50 +46 +44 +49 +45 +43 +47 +46 +43 +47 +46 +44 +48 +47 +44 +48 +47 +45 +49 +48 +46 +50 +49 +46 +50 +51 +46 +50 +51 +45 +49 +50 +43 +49 +45 +43 +57 +42 +47 +64 +45 +54 +72 +50 +59 +77 +55 +61 +79 +55 +60 +78 +52 +58 +76 +50 +58 +76 +50 +53 +71 +47 +55 +73 +49 +58 +76 +54 +60 +77 +58 +58 +75 +57 +54 +71 +55 +48 +64 +51 +45 +59 +46 +45 +55 +46 +46 +53 +45 +45 +52 +44 +99 +100 +82 +99 +100 +82 +100 +101 +83 +101 +102 +84 +101 +102 +86 +104 +102 +87 +105 +103 +88 +105 +103 +88 +104 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +107 +101 +87 +108 +100 +89 +108 +101 +91 +109 +100 +93 +109 +102 +92 +107 +103 +91 +106 +105 +87 +105 +107 +86 +104 +109 +87 +104 +114 +90 +103 +116 +96 +100 +113 +103 +106 +123 +117 +137 +155 +157 +170 +187 +194 +205 +216 +222 +223 +232 +239 +242 +249 +255 +250 +255 +255 +251 +255 +255 +253 +255 +254 +254 +255 +250 +254 +254 +246 +250 +250 +238 +250 +251 +237 +250 +251 +233 +248 +250 +229 +244 +246 +225 +234 +238 +215 +223 +227 +202 +217 +219 +195 +211 +209 +184 +204 +199 +177 +197 +190 +172 +198 +190 +177 +204 +195 +188 +214 +206 +204 +230 +221 +224 +244 +234 +242 +253 +246 +254 +254 +249 +255 +255 +253 +255 +254 +254 +255 +253 +253 +251 +252 +254 +249 +251 +255 +249 +252 +255 +250 +253 +255 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +253 +254 +255 +250 +255 +255 +251 +255 +254 +252 +255 +252 +254 +253 +249 +255 +251 +246 +255 +247 +244 +255 +244 +243 +255 +241 +242 +254 +240 +245 +255 +242 +250 +255 +246 +254 +255 +250 +255 +252 +251 +255 +249 +252 +255 +247 +255 +255 +246 +255 +255 +248 +255 +255 +247 +255 +255 +249 +255 +255 +252 +255 +253 +252 +255 +251 +253 +252 +250 +255 +251 +252 +255 +250 +244 +250 +240 +244 +250 +238 +247 +249 +236 +247 +248 +234 +248 +246 +231 +251 +248 +231 +255 +250 +234 +255 +253 +234 +253 +241 +219 +255 +251 +228 +236 +220 +197 +158 +142 +119 +96 +80 +55 +82 +66 +41 +88 +72 +47 +88 +72 +47 +91 +77 +51 +91 +77 +51 +90 +78 +52 +90 +78 +52 +91 +79 +53 +91 +79 +53 +92 +80 +54 +91 +81 +56 +85 +79 +55 +84 +79 +57 +84 +79 +57 +81 +79 +56 +80 +78 +55 +78 +78 +54 +75 +77 +53 +73 +77 +52 +74 +78 +53 +76 +82 +56 +83 +92 +65 +80 +89 +60 +64 +73 +44 +59 +70 +40 +65 +76 +46 +63 +74 +42 +67 +78 +46 +68 +79 +47 +72 +81 +50 +76 +83 +50 +73 +78 +48 +74 +77 +46 +89 +90 +59 +107 +106 +78 +102 +101 +73 +98 +94 +69 +94 +89 +67 +95 +90 +70 +96 +91 +71 +90 +85 +66 +83 +78 +59 +76 +73 +56 +65 +66 +52 +64 +66 +53 +64 +66 +53 +62 +65 +54 +62 +65 +54 +62 +65 +54 +61 +64 +55 +61 +64 +55 +57 +63 +53 +57 +63 +53 +57 +63 +53 +58 +64 +54 +58 +64 +54 +58 +66 +55 +58 +66 +55 +58 +66 +55 +59 +64 +57 +59 +64 +57 +59 +64 +58 +58 +63 +56 +58 +63 +57 +57 +62 +55 +57 +62 +56 +57 +62 +55 +59 +64 +58 +59 +64 +57 +59 +64 +58 +59 +64 +57 +58 +63 +57 +58 +63 +56 +58 +63 +57 +58 +63 +57 +56 +63 +56 +55 +61 +57 +52 +59 +52 +51 +56 +50 +49 +54 +48 +47 +52 +46 +46 +51 +47 +46 +51 +47 +46 +50 +49 +46 +50 +49 +44 +50 +46 +44 +50 +46 +43 +50 +43 +43 +50 +42 +44 +52 +41 +41 +54 +37 +36 +54 +30 +41 +61 +33 +50 +70 +43 +56 +76 +49 +59 +79 +54 +59 +77 +53 +59 +77 +53 +59 +77 +53 +56 +74 +50 +57 +75 +51 +59 +77 +53 +60 +78 +54 +60 +78 +56 +55 +72 +53 +49 +66 +48 +46 +60 +45 +46 +56 +45 +47 +54 +46 +46 +53 +45 +92 +102 +78 +93 +103 +79 +95 +103 +80 +96 +104 +81 +98 +106 +85 +101 +106 +86 +103 +106 +87 +104 +107 +88 +102 +103 +85 +104 +103 +85 +104 +101 +86 +104 +101 +86 +106 +100 +86 +107 +101 +87 +107 +101 +89 +108 +102 +88 +107 +101 +87 +106 +103 +88 +109 +103 +91 +108 +104 +93 +109 +102 +94 +106 +102 +91 +104 +100 +88 +102 +100 +85 +102 +103 +85 +103 +108 +86 +102 +111 +90 +98 +111 +93 +99 +112 +103 +114 +130 +127 +150 +168 +172 +185 +199 +208 +209 +219 +228 +224 +233 +240 +240 +247 +253 +247 +252 +255 +247 +253 +251 +250 +255 +251 +252 +255 +248 +252 +254 +243 +248 +249 +235 +250 +251 +235 +249 +248 +230 +243 +240 +221 +239 +236 +217 +236 +233 +214 +224 +222 +201 +214 +209 +189 +216 +208 +189 +203 +191 +175 +188 +179 +164 +188 +178 +169 +195 +184 +180 +205 +195 +196 +219 +210 +215 +233 +223 +231 +250 +243 +251 +253 +248 +255 +254 +251 +255 +255 +254 +255 +254 +254 +255 +252 +254 +253 +251 +253 +250 +252 +254 +251 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +255 +253 +255 +255 +253 +255 +255 +251 +255 +254 +250 +255 +253 +250 +255 +252 +249 +255 +252 +249 +255 +252 +249 +255 +254 +255 +255 +253 +254 +253 +253 +253 +253 +253 +253 +254 +255 +255 +254 +255 +253 +251 +255 +252 +249 +254 +248 +253 +255 +250 +251 +252 +246 +253 +252 +247 +255 +255 +250 +255 +254 +248 +255 +249 +244 +255 +247 +243 +255 +250 +249 +255 +251 +255 +255 +252 +255 +254 +253 +255 +254 +255 +255 +254 +255 +255 +251 +255 +252 +251 +255 +252 +250 +254 +253 +252 +255 +255 +252 +255 +255 +255 +255 +253 +255 +254 +249 +255 +254 +242 +255 +254 +237 +255 +254 +234 +255 +254 +232 +251 +245 +223 +255 +252 +230 +233 +225 +202 +145 +137 +114 +86 +79 +53 +88 +78 +51 +85 +76 +47 +83 +74 +45 +87 +78 +49 +87 +78 +49 +85 +78 +49 +85 +78 +49 +84 +79 +50 +84 +79 +50 +84 +78 +52 +83 +79 +52 +81 +77 +50 +82 +78 +53 +80 +78 +53 +80 +80 +54 +77 +79 +55 +75 +79 +54 +72 +77 +54 +71 +76 +53 +74 +80 +54 +70 +79 +52 +65 +74 +45 +61 +70 +39 +62 +72 +38 +68 +75 +42 +70 +77 +43 +68 +78 +41 +77 +88 +48 +75 +87 +47 +70 +81 +41 +67 +77 +40 +79 +86 +52 +94 +99 +67 +96 +99 +68 +90 +90 +62 +89 +89 +63 +91 +89 +66 +95 +90 +68 +95 +90 +70 +95 +88 +69 +92 +85 +66 +88 +81 +62 +85 +78 +59 +75 +70 +51 +71 +68 +49 +68 +65 +48 +65 +63 +48 +64 +62 +49 +62 +62 +50 +63 +63 +53 +63 +65 +54 +60 +63 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +57 +65 +52 +55 +66 +52 +55 +66 +52 +55 +66 +52 +58 +66 +55 +57 +65 +54 +57 +64 +56 +56 +64 +53 +56 +63 +55 +57 +65 +54 +57 +64 +56 +58 +66 +55 +58 +65 +57 +58 +66 +55 +57 +64 +56 +58 +66 +55 +59 +66 +58 +60 +68 +57 +61 +68 +60 +62 +69 +61 +56 +66 +58 +55 +65 +57 +55 +65 +56 +55 +63 +52 +53 +61 +48 +51 +59 +46 +50 +56 +46 +49 +54 +48 +46 +52 +48 +47 +53 +49 +45 +55 +47 +45 +57 +45 +46 +59 +41 +48 +64 +38 +54 +71 +39 +55 +77 +39 +59 +86 +43 +59 +88 +44 +60 +86 +49 +59 +84 +52 +59 +82 +56 +60 +79 +57 +61 +78 +59 +61 +79 +57 +58 +76 +54 +63 +81 +55 +68 +86 +60 +68 +87 +59 +67 +87 +60 +64 +84 +59 +55 +74 +52 +46 +63 +44 +45 +55 +44 +44 +51 +43 +41 +48 +40 +89 +103 +77 +90 +104 +78 +92 +104 +80 +93 +105 +81 +97 +107 +83 +98 +108 +84 +103 +108 +88 +103 +108 +88 +103 +104 +86 +103 +104 +86 +105 +102 +87 +105 +102 +87 +107 +101 +87 +108 +102 +88 +109 +101 +90 +109 +103 +89 +108 +102 +88 +106 +103 +88 +107 +103 +91 +108 +104 +93 +107 +103 +94 +106 +102 +91 +104 +102 +90 +101 +102 +86 +104 +105 +87 +103 +108 +86 +103 +112 +93 +102 +115 +98 +106 +119 +110 +121 +137 +136 +156 +171 +178 +186 +200 +209 +208 +218 +227 +224 +233 +238 +240 +247 +253 +246 +254 +255 +249 +255 +253 +249 +255 +249 +251 +254 +245 +249 +253 +239 +249 +250 +236 +248 +249 +231 +246 +243 +226 +238 +235 +216 +235 +230 +211 +230 +225 +206 +221 +214 +196 +210 +201 +184 +203 +191 +175 +193 +179 +166 +184 +172 +160 +187 +174 +166 +194 +183 +181 +205 +195 +196 +219 +208 +214 +228 +221 +228 +251 +243 +254 +253 +247 +255 +254 +251 +255 +255 +254 +255 +254 +253 +255 +252 +253 +255 +252 +254 +253 +252 +254 +253 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +255 +253 +255 +255 +253 +255 +253 +250 +255 +253 +250 +255 +253 +250 +255 +252 +249 +255 +252 +248 +255 +253 +248 +255 +254 +253 +255 +254 +252 +253 +253 +253 +253 +253 +253 +255 +255 +255 +255 +255 +255 +254 +254 +254 +253 +253 +253 +255 +255 +253 +255 +255 +251 +255 +252 +249 +254 +247 +241 +245 +236 +229 +238 +228 +219 +244 +231 +222 +250 +241 +234 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +252 +255 +255 +252 +255 +255 +255 +254 +255 +254 +254 +252 +255 +253 +244 +255 +254 +236 +255 +253 +231 +255 +254 +229 +248 +246 +223 +254 +252 +231 +229 +224 +202 +141 +137 +112 +83 +77 +51 +84 +79 +50 +82 +75 +46 +81 +74 +45 +85 +79 +47 +85 +79 +47 +84 +79 +49 +84 +79 +49 +83 +79 +50 +83 +79 +50 +81 +80 +52 +81 +80 +52 +81 +77 +50 +79 +78 +50 +80 +78 +53 +78 +81 +54 +77 +79 +55 +74 +80 +54 +72 +77 +54 +69 +77 +53 +71 +80 +53 +69 +78 +49 +65 +74 +45 +63 +73 +39 +66 +73 +40 +70 +77 +43 +74 +80 +44 +74 +82 +43 +75 +86 +43 +75 +88 +42 +82 +93 +51 +89 +100 +60 +93 +101 +64 +87 +94 +60 +83 +88 +58 +83 +86 +57 +85 +85 +61 +86 +86 +62 +90 +85 +65 +91 +86 +66 +92 +85 +66 +92 +84 +65 +90 +82 +61 +89 +81 +60 +82 +76 +54 +80 +74 +52 +75 +70 +51 +72 +67 +48 +67 +64 +49 +65 +63 +50 +66 +64 +52 +63 +65 +54 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +58 +66 +55 +57 +65 +54 +57 +65 +54 +56 +64 +53 +56 +64 +53 +57 +65 +54 +57 +65 +54 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +59 +67 +56 +60 +68 +57 +61 +69 +58 +60 +70 +59 +61 +71 +63 +60 +72 +62 +60 +70 +59 +60 +71 +55 +60 +68 +53 +58 +66 +51 +57 +63 +51 +56 +61 +54 +55 +62 +55 +52 +62 +54 +51 +61 +52 +48 +62 +45 +51 +67 +41 +57 +77 +42 +66 +89 +47 +71 +97 +49 +79 +112 +59 +76 +110 +59 +76 +105 +61 +70 +97 +62 +66 +89 +63 +60 +82 +61 +59 +76 +58 +58 +75 +56 +61 +79 +57 +68 +86 +60 +74 +93 +65 +76 +95 +65 +75 +95 +67 +72 +92 +64 +60 +83 +57 +51 +70 +48 +43 +53 +42 +43 +50 +42 +40 +47 +39 +89 +103 +77 +90 +104 +78 +92 +104 +80 +94 +106 +82 +97 +107 +83 +99 +109 +85 +103 +108 +88 +104 +109 +89 +105 +106 +88 +105 +106 +88 +107 +104 +89 +107 +104 +89 +108 +102 +88 +109 +103 +89 +110 +102 +91 +110 +104 +90 +108 +102 +88 +107 +104 +89 +107 +103 +91 +107 +103 +92 +107 +103 +94 +106 +102 +91 +104 +102 +90 +101 +102 +86 +104 +105 +87 +101 +106 +84 +100 +109 +90 +103 +116 +99 +111 +124 +115 +127 +143 +142 +157 +172 +179 +182 +196 +205 +204 +214 +223 +221 +230 +235 +239 +246 +252 +246 +254 +255 +249 +255 +253 +248 +255 +248 +248 +251 +242 +245 +249 +235 +244 +245 +231 +241 +242 +224 +236 +233 +216 +226 +223 +204 +222 +217 +198 +216 +211 +192 +208 +201 +183 +199 +190 +173 +192 +180 +164 +188 +174 +161 +187 +175 +163 +194 +181 +173 +204 +193 +191 +215 +205 +206 +227 +216 +222 +234 +227 +234 +251 +243 +254 +253 +247 +255 +254 +251 +255 +254 +253 +255 +253 +252 +255 +252 +253 +255 +252 +254 +253 +253 +255 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +255 +253 +255 +254 +252 +255 +253 +250 +255 +253 +250 +255 +252 +249 +255 +252 +249 +255 +252 +248 +255 +253 +248 +255 +254 +253 +254 +253 +251 +252 +252 +252 +253 +253 +253 +254 +254 +254 +255 +255 +255 +254 +254 +254 +253 +253 +253 +255 +255 +253 +255 +255 +251 +255 +253 +250 +249 +242 +236 +232 +223 +216 +223 +213 +204 +234 +221 +212 +246 +237 +230 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +252 +255 +255 +252 +255 +255 +255 +254 +255 +254 +254 +252 +255 +253 +244 +255 +254 +236 +255 +253 +231 +255 +254 +229 +249 +247 +224 +254 +252 +231 +228 +223 +201 +138 +134 +109 +80 +74 +48 +82 +77 +48 +82 +75 +46 +82 +75 +46 +84 +78 +46 +85 +79 +47 +84 +79 +49 +85 +80 +50 +84 +80 +51 +83 +79 +50 +81 +80 +52 +80 +79 +51 +81 +77 +50 +79 +78 +50 +80 +78 +53 +77 +80 +53 +77 +79 +55 +74 +80 +54 +73 +78 +55 +70 +78 +54 +72 +81 +54 +69 +78 +49 +67 +76 +47 +66 +76 +42 +70 +77 +44 +73 +80 +46 +79 +85 +49 +81 +89 +50 +80 +91 +48 +85 +98 +52 +103 +116 +73 +119 +130 +90 +112 +120 +83 +88 +95 +61 +76 +81 +51 +78 +81 +52 +80 +80 +56 +81 +81 +57 +84 +79 +59 +85 +80 +60 +87 +80 +61 +88 +81 +62 +91 +83 +62 +92 +84 +63 +89 +83 +61 +86 +80 +58 +81 +76 +57 +77 +72 +53 +71 +68 +53 +68 +66 +53 +67 +65 +53 +63 +65 +54 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +58 +66 +55 +58 +66 +55 +57 +65 +54 +57 +65 +54 +57 +65 +54 +57 +65 +54 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +59 +67 +56 +60 +68 +57 +62 +70 +59 +60 +70 +59 +64 +74 +66 +63 +75 +65 +64 +74 +63 +64 +75 +59 +65 +73 +58 +63 +71 +56 +63 +69 +57 +62 +67 +60 +62 +69 +62 +57 +67 +59 +54 +64 +55 +52 +66 +49 +57 +73 +47 +66 +86 +51 +80 +103 +61 +88 +114 +66 +94 +127 +74 +91 +125 +74 +87 +116 +72 +77 +104 +69 +67 +90 +64 +57 +79 +58 +54 +71 +53 +52 +69 +50 +60 +78 +56 +69 +87 +61 +77 +96 +68 +82 +101 +71 +82 +102 +74 +78 +98 +70 +65 +88 +62 +56 +75 +53 +47 +57 +46 +47 +54 +46 +44 +51 +43 +89 +103 +77 +90 +104 +78 +92 +104 +80 +94 +106 +82 +98 +108 +84 +100 +110 +86 +104 +109 +89 +105 +110 +90 +107 +108 +90 +107 +108 +90 +109 +106 +91 +108 +105 +90 +110 +104 +90 +110 +104 +90 +111 +103 +92 +111 +105 +91 +109 +103 +89 +107 +104 +89 +107 +103 +91 +107 +103 +92 +106 +102 +93 +106 +102 +91 +104 +102 +90 +102 +103 +87 +102 +103 +85 +97 +102 +80 +95 +104 +85 +100 +113 +96 +112 +125 +116 +127 +143 +142 +151 +166 +173 +171 +185 +194 +199 +209 +218 +217 +226 +231 +237 +244 +250 +245 +253 +255 +248 +254 +252 +245 +252 +245 +243 +246 +237 +238 +242 +228 +234 +235 +221 +228 +229 +211 +221 +218 +201 +212 +209 +190 +208 +203 +184 +202 +197 +178 +195 +188 +170 +189 +180 +163 +196 +184 +168 +198 +184 +171 +203 +191 +179 +213 +200 +192 +224 +213 +211 +234 +224 +225 +244 +233 +239 +248 +241 +248 +252 +244 +255 +253 +247 +255 +254 +251 +255 +254 +253 +255 +253 +252 +255 +251 +252 +254 +252 +254 +253 +253 +255 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +253 +250 +255 +252 +249 +255 +252 +249 +255 +252 +249 +255 +251 +247 +255 +252 +247 +255 +253 +252 +253 +252 +250 +251 +251 +251 +252 +252 +252 +254 +254 +254 +255 +255 +255 +254 +254 +254 +253 +253 +253 +254 +253 +251 +255 +255 +251 +255 +253 +250 +250 +243 +237 +234 +225 +218 +227 +217 +208 +239 +226 +217 +251 +242 +235 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +252 +255 +255 +252 +255 +255 +255 +254 +255 +254 +254 +252 +255 +253 +244 +255 +254 +236 +255 +252 +230 +255 +253 +228 +252 +250 +227 +255 +254 +233 +228 +223 +201 +137 +133 +108 +80 +74 +48 +82 +77 +48 +84 +77 +48 +84 +77 +48 +84 +78 +46 +85 +79 +47 +85 +80 +50 +85 +80 +50 +84 +80 +51 +83 +79 +50 +80 +79 +51 +79 +78 +50 +81 +77 +50 +79 +78 +50 +79 +77 +52 +76 +79 +52 +76 +78 +54 +74 +80 +54 +74 +79 +56 +71 +79 +55 +74 +83 +56 +71 +80 +51 +70 +79 +50 +72 +82 +48 +76 +83 +50 +78 +85 +51 +85 +91 +55 +91 +99 +60 +103 +114 +71 +115 +128 +82 +135 +148 +105 +144 +156 +116 +133 +143 +106 +110 +117 +83 +90 +95 +65 +82 +87 +57 +79 +79 +55 +78 +78 +54 +80 +75 +55 +79 +74 +54 +82 +75 +56 +85 +78 +59 +89 +81 +60 +91 +83 +62 +90 +84 +62 +88 +82 +60 +84 +79 +60 +80 +75 +56 +74 +71 +56 +71 +69 +56 +69 +67 +55 +65 +67 +56 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +59 +67 +56 +58 +66 +55 +57 +65 +54 +57 +65 +54 +57 +65 +54 +57 +65 +54 +58 +66 +55 +59 +67 +56 +59 +67 +56 +58 +66 +55 +58 +66 +55 +59 +67 +56 +59 +67 +56 +61 +69 +58 +62 +70 +59 +61 +71 +60 +61 +71 +63 +60 +72 +62 +62 +72 +61 +62 +73 +57 +64 +72 +57 +63 +71 +56 +63 +69 +57 +63 +68 +61 +61 +68 +61 +57 +67 +59 +54 +64 +55 +52 +66 +49 +57 +73 +47 +68 +88 +53 +82 +105 +63 +91 +117 +69 +89 +122 +69 +87 +121 +70 +84 +113 +69 +73 +100 +65 +62 +85 +59 +51 +73 +52 +48 +65 +47 +46 +63 +44 +54 +72 +50 +64 +82 +56 +75 +94 +66 +82 +101 +71 +83 +103 +75 +79 +99 +71 +65 +88 +62 +54 +73 +51 +49 +59 +48 +48 +55 +47 +45 +52 +44 +89 +103 +77 +90 +104 +78 +92 +104 +80 +94 +106 +82 +98 +108 +84 +100 +110 +86 +105 +110 +90 +106 +111 +91 +109 +110 +92 +108 +109 +91 +110 +107 +92 +109 +106 +91 +110 +104 +90 +110 +104 +90 +112 +104 +93 +111 +105 +91 +109 +103 +89 +107 +104 +89 +106 +102 +90 +106 +102 +91 +105 +101 +92 +105 +101 +90 +104 +102 +90 +102 +103 +87 +103 +104 +86 +97 +102 +80 +94 +103 +84 +100 +113 +96 +112 +125 +116 +125 +141 +140 +145 +160 +167 +161 +175 +184 +194 +204 +213 +214 +223 +228 +234 +241 +247 +243 +251 +253 +245 +251 +249 +242 +249 +242 +239 +242 +233 +233 +237 +223 +227 +228 +214 +218 +219 +201 +211 +208 +191 +204 +201 +182 +201 +196 +177 +195 +190 +171 +190 +183 +165 +187 +178 +161 +202 +190 +174 +209 +195 +182 +218 +206 +194 +229 +216 +208 +238 +227 +225 +248 +238 +239 +255 +245 +251 +255 +249 +255 +252 +244 +255 +253 +247 +255 +253 +250 +255 +253 +252 +255 +252 +251 +255 +251 +252 +254 +252 +254 +253 +254 +255 +255 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +252 +249 +255 +252 +249 +255 +252 +249 +255 +251 +248 +255 +251 +247 +255 +252 +247 +255 +252 +251 +252 +251 +249 +251 +251 +251 +252 +252 +252 +254 +254 +254 +255 +255 +255 +254 +254 +254 +253 +253 +253 +254 +253 +251 +254 +253 +249 +255 +252 +249 +254 +247 +241 +245 +236 +229 +239 +229 +220 +247 +234 +225 +254 +245 +238 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +251 +255 +255 +251 +255 +255 +254 +253 +255 +254 +254 +252 +255 +254 +245 +255 +254 +236 +255 +252 +230 +255 +252 +227 +254 +252 +229 +255 +255 +235 +229 +224 +202 +138 +134 +109 +81 +75 +49 +84 +79 +50 +86 +79 +50 +87 +80 +51 +84 +78 +46 +85 +79 +47 +86 +81 +51 +86 +81 +51 +85 +81 +52 +83 +79 +50 +79 +78 +50 +78 +77 +49 +81 +77 +50 +79 +78 +50 +79 +77 +52 +76 +79 +52 +76 +78 +54 +74 +80 +54 +74 +79 +56 +73 +81 +57 +76 +85 +58 +73 +82 +53 +74 +83 +54 +78 +88 +54 +81 +88 +55 +82 +89 +55 +91 +97 +61 +99 +107 +68 +129 +142 +98 +146 +162 +115 +161 +174 +131 +157 +169 +129 +148 +158 +121 +138 +145 +111 +115 +120 +90 +90 +95 +65 +80 +80 +56 +78 +78 +54 +78 +73 +53 +76 +71 +51 +78 +71 +52 +81 +74 +55 +86 +78 +57 +88 +80 +59 +88 +82 +60 +86 +80 +58 +83 +78 +59 +80 +75 +56 +76 +73 +58 +73 +71 +58 +71 +69 +57 +67 +69 +58 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +59 +67 +56 +59 +67 +56 +58 +66 +55 +57 +65 +54 +57 +65 +54 +58 +66 +55 +59 +67 +56 +59 +67 +56 +59 +67 +56 +59 +67 +56 +59 +67 +56 +59 +67 +56 +60 +68 +57 +61 +69 +58 +62 +70 +59 +61 +71 +60 +59 +69 +61 +58 +70 +60 +60 +70 +59 +60 +71 +55 +62 +70 +55 +61 +69 +54 +62 +68 +56 +61 +66 +59 +58 +65 +58 +55 +65 +57 +53 +63 +54 +52 +66 +49 +57 +73 +47 +66 +86 +51 +78 +101 +59 +85 +111 +63 +83 +116 +63 +81 +115 +64 +79 +108 +64 +69 +96 +61 +57 +80 +54 +46 +68 +47 +44 +61 +43 +44 +61 +42 +49 +67 +45 +60 +78 +52 +73 +92 +64 +80 +99 +69 +82 +102 +74 +78 +98 +70 +63 +86 +60 +52 +71 +49 +43 +53 +42 +43 +50 +42 +40 +47 +39 diff --git a/hl/tools/h52jpeg/image8.txt b/hl/tools/h52jpeg/image8.txt new file mode 100644 index 0000000..4ba5980 --- /dev/null +++ b/hl/tools/h52jpeg/image8.txt @@ -0,0 +1,120006 @@ +components +1 +height +400 +width +300 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +12 +8 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +61 +52 +39 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +86 +77 +65 +48 +16 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +108 +106 +104 +99 +88 +48 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +109 +107 +106 +106 +105 +98 +60 +26 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +107 +105 +104 +104 +105 +105 +100 +73 +37 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +108 +105 +104 +104 +105 +105 +104 +93 +69 +29 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +109 +105 +103 +103 +104 +106 +106 +103 +89 +59 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +111 +105 +103 +103 +104 +106 +107 +106 +100 +86 +29 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +113 +105 +102 +101 +102 +105 +107 +108 +106 +100 +55 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +115 +107 +102 +101 +100 +101 +104 +107 +108 +107 +88 +42 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +118 +109 +103 +100 +99 +100 +102 +105 +108 +108 +99 +63 +30 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +119 +111 +104 +100 +97 +100 +101 +103 +106 +109 +105 +82 +48 +17 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +3 +4 +5 +6 +7 +7 +8 +9 +9 +9 +9 +9 +8 +7 +7 +6 +4 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +119 +113 +106 +100 +97 +100 +101 +102 +104 +108 +108 +95 +65 +30 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +4 +6 +7 +9 +11 +13 +16 +18 +20 +22 +24 +26 +27 +27 +28 +28 +27 +25 +24 +22 +20 +16 +13 +11 +8 +6 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +119 +115 +109 +102 +97 +100 +103 +104 +104 +106 +108 +103 +79 +46 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +4 +6 +9 +12 +17 +21 +25 +30 +34 +40 +44 +48 +52 +55 +58 +60 +61 +62 +62 +60 +58 +56 +52 +48 +41 +35 +29 +23 +18 +11 +7 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +115 +114 +111 +106 +99 +97 +104 +106 +106 +106 +107 +106 +91 +65 +30 +7 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +6 +9 +13 +20 +26 +33 +41 +49 +59 +66 +74 +80 +87 +94 +98 +102 +106 +109 +112 +113 +114 +115 +115 +115 +114 +112 +109 +105 +98 +91 +82 +72 +61 +46 +36 +26 +18 +12 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +109 +111 +110 +107 +103 +97 +104 +107 +108 +107 +107 +107 +97 +77 +44 +16 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +6 +11 +17 +24 +31 +40 +52 +62 +71 +79 +87 +95 +100 +104 +107 +110 +113 +115 +117 +119 +120 +121 +122 +123 +124 +124 +125 +125 +124 +124 +123 +120 +118 +113 +108 +101 +87 +75 +62 +49 +36 +21 +13 +7 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +104 +106 +107 +106 +98 +101 +106 +109 +108 +108 +107 +101 +85 +56 +27 +14 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +6 +10 +15 +22 +33 +43 +53 +64 +74 +85 +93 +99 +104 +109 +113 +115 +117 +119 +120 +121 +122 +123 +124 +124 +125 +126 +126 +127 +128 +128 +129 +129 +129 +129 +129 +129 +127 +125 +122 +115 +106 +96 +84 +70 +50 +37 +25 +16 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +97 +101 +104 +106 +100 +99 +104 +109 +110 +108 +108 +104 +92 +67 +38 +23 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +6 +12 +18 +27 +36 +48 +63 +75 +85 +95 +103 +110 +113 +116 +117 +118 +119 +120 +120 +121 +121 +122 +122 +122 +123 +123 +124 +124 +125 +126 +126 +127 +128 +129 +129 +130 +130 +130 +131 +131 +130 +129 +127 +122 +114 +104 +85 +69 +53 +38 +25 +11 +6 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +90 +92 +95 +99 +105 +105 +98 +102 +108 +111 +110 +109 +106 +98 +79 +48 +33 +19 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +10 +17 +29 +41 +55 +69 +83 +99 +107 +112 +115 +116 +117 +118 +118 +119 +119 +120 +120 +120 +120 +120 +119 +119 +119 +119 +119 +119 +119 +120 +121 +122 +123 +124 +126 +127 +128 +129 +130 +131 +131 +131 +131 +131 +131 +129 +128 +120 +108 +91 +73 +53 +31 +18 +10 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +90 +93 +96 +99 +105 +100 +98 +101 +110 +111 +110 +108 +101 +85 +68 +54 +37 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +16 +26 +38 +52 +74 +88 +100 +109 +114 +115 +116 +117 +117 +118 +118 +117 +117 +115 +113 +111 +110 +109 +108 +108 +108 +109 +109 +110 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +121 +123 +124 +126 +128 +129 +131 +131 +131 +131 +132 +131 +130 +127 +120 +108 +83 +62 +43 +26 +14 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +88 +89 +91 +95 +98 +104 +103 +99 +98 +106 +110 +110 +108 +102 +90 +71 +62 +50 +36 +18 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +8 +15 +29 +42 +58 +73 +88 +102 +108 +111 +114 +116 +116 +116 +116 +115 +113 +110 +108 +107 +106 +105 +105 +105 +106 +106 +107 +107 +108 +109 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +123 +124 +125 +126 +128 +129 +130 +131 +132 +132 +132 +131 +129 +126 +115 +101 +83 +63 +44 +21 +11 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +88 +90 +93 +99 +103 +104 +101 +97 +99 +107 +109 +108 +103 +92 +74 +65 +57 +47 +31 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +15 +25 +38 +59 +74 +88 +99 +107 +114 +115 +115 +115 +115 +113 +111 +109 +107 +105 +103 +102 +102 +102 +102 +103 +104 +105 +106 +108 +109 +111 +112 +113 +114 +116 +117 +118 +118 +119 +119 +120 +120 +120 +121 +122 +122 +123 +124 +125 +126 +128 +129 +130 +131 +132 +132 +133 +133 +133 +130 +124 +113 +99 +81 +53 +34 +20 +10 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +87 +88 +92 +100 +103 +104 +103 +99 +93 +101 +104 +105 +101 +93 +75 +66 +60 +54 +44 +18 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +11 +22 +35 +51 +68 +90 +102 +110 +114 +115 +115 +115 +113 +111 +110 +106 +103 +100 +99 +98 +99 +100 +101 +102 +104 +106 +108 +110 +113 +115 +118 +120 +123 +124 +126 +128 +129 +130 +130 +130 +130 +129 +129 +128 +127 +126 +126 +126 +126 +126 +126 +127 +128 +129 +130 +131 +132 +133 +133 +134 +134 +133 +131 +125 +115 +90 +68 +46 +27 +13 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +87 +88 +92 +102 +105 +105 +104 +102 +95 +90 +97 +99 +97 +93 +76 +66 +61 +57 +54 +32 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +12 +28 +46 +66 +86 +104 +113 +114 +115 +115 +115 +114 +112 +107 +102 +98 +95 +95 +96 +96 +98 +99 +101 +103 +106 +109 +114 +119 +124 +129 +133 +138 +142 +145 +148 +150 +152 +153 +153 +153 +152 +150 +149 +147 +144 +142 +138 +136 +133 +131 +129 +128 +128 +128 +129 +129 +130 +131 +132 +133 +134 +134 +135 +135 +134 +133 +125 +108 +84 +58 +33 +11 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +90 +90 +91 +95 +104 +108 +107 +106 +104 +102 +91 +86 +86 +89 +89 +83 +71 +63 +60 +58 +48 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +13 +26 +44 +74 +94 +107 +113 +114 +115 +115 +114 +112 +108 +100 +96 +94 +93 +93 +95 +96 +97 +100 +103 +110 +117 +125 +133 +141 +151 +158 +164 +169 +174 +178 +181 +183 +185 +186 +187 +187 +187 +187 +186 +185 +183 +182 +179 +176 +172 +168 +164 +159 +154 +148 +143 +139 +136 +133 +132 +132 +132 +133 +133 +134 +135 +135 +135 +135 +134 +132 +125 +110 +87 +49 +25 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +93 +96 +102 +107 +108 +107 +106 +105 +104 +96 +88 +83 +81 +82 +80 +75 +69 +64 +61 +55 +35 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +9 +20 +38 +59 +81 +101 +108 +112 +114 +114 +113 +110 +105 +100 +96 +93 +92 +92 +93 +94 +98 +102 +109 +117 +127 +139 +149 +157 +164 +171 +178 +182 +185 +187 +189 +191 +192 +193 +193 +194 +194 +194 +193 +193 +193 +192 +191 +189 +188 +186 +184 +181 +179 +176 +173 +169 +164 +160 +155 +150 +143 +140 +137 +135 +134 +134 +135 +135 +135 +135 +135 +134 +132 +127 +117 +89 +61 +36 +17 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +97 +101 +106 +109 +109 +107 +106 +105 +105 +101 +95 +87 +80 +77 +76 +75 +71 +67 +63 +59 +43 +23 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +9 +27 +47 +69 +88 +103 +112 +113 +113 +113 +111 +105 +100 +96 +92 +90 +91 +92 +94 +98 +103 +114 +123 +134 +145 +155 +167 +174 +179 +184 +188 +192 +193 +195 +195 +196 +196 +196 +196 +196 +195 +195 +194 +194 +193 +193 +192 +192 +191 +190 +189 +188 +186 +185 +183 +182 +179 +177 +174 +170 +166 +160 +155 +150 +145 +141 +138 +136 +136 +135 +135 +135 +135 +135 +134 +131 +117 +96 +71 +44 +22 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +99 +100 +104 +109 +110 +108 +106 +105 +105 +105 +104 +101 +95 +86 +76 +72 +72 +71 +69 +66 +62 +50 +30 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +13 +26 +55 +78 +96 +108 +112 +113 +112 +111 +108 +103 +95 +91 +89 +89 +89 +93 +97 +103 +112 +122 +139 +152 +163 +172 +180 +187 +190 +193 +195 +196 +196 +196 +196 +196 +196 +195 +194 +193 +192 +191 +189 +188 +187 +186 +186 +185 +185 +185 +185 +185 +185 +184 +184 +183 +183 +182 +181 +181 +179 +178 +174 +170 +165 +159 +153 +146 +142 +139 +137 +136 +136 +135 +135 +135 +135 +132 +123 +105 +80 +51 +19 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +103 +107 +110 +110 +104 +103 +103 +104 +105 +105 +105 +101 +94 +81 +70 +69 +69 +68 +67 +64 +56 +36 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +14 +30 +55 +93 +104 +110 +113 +114 +112 +110 +104 +97 +90 +87 +87 +87 +89 +91 +99 +110 +124 +140 +155 +171 +180 +186 +190 +193 +195 +196 +197 +197 +197 +197 +196 +195 +193 +192 +189 +186 +184 +181 +179 +175 +173 +172 +170 +169 +169 +169 +170 +171 +173 +175 +177 +178 +179 +180 +181 +181 +181 +180 +179 +178 +178 +176 +173 +170 +162 +155 +149 +143 +139 +137 +136 +136 +135 +135 +135 +134 +129 +116 +92 +47 +23 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +103 +105 +108 +110 +110 +103 +101 +102 +103 +105 +105 +105 +103 +98 +87 +70 +68 +67 +67 +66 +65 +60 +42 +20 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +23 +47 +75 +100 +109 +112 +113 +113 +111 +104 +95 +89 +86 +84 +86 +88 +92 +100 +111 +135 +151 +165 +177 +185 +191 +194 +195 +196 +197 +197 +196 +195 +194 +192 +189 +185 +181 +177 +172 +165 +159 +154 +149 +144 +138 +134 +130 +127 +125 +123 +123 +124 +125 +127 +132 +136 +141 +146 +151 +158 +164 +169 +173 +176 +177 +177 +177 +176 +175 +174 +172 +168 +163 +156 +146 +141 +138 +136 +136 +135 +135 +135 +132 +128 +104 +68 +37 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +104 +105 +107 +109 +110 +103 +101 +101 +102 +104 +104 +104 +101 +95 +86 +70 +67 +66 +66 +66 +65 +61 +44 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +27 +54 +79 +97 +107 +112 +112 +111 +108 +101 +92 +87 +85 +85 +86 +90 +99 +112 +128 +144 +164 +175 +183 +188 +193 +195 +196 +196 +196 +195 +194 +192 +189 +185 +180 +173 +167 +160 +153 +145 +135 +128 +122 +115 +110 +103 +99 +95 +92 +89 +87 +87 +87 +87 +88 +91 +94 +98 +103 +108 +117 +125 +133 +141 +149 +159 +165 +170 +173 +174 +174 +173 +172 +170 +167 +161 +154 +148 +142 +138 +136 +136 +135 +134 +133 +124 +104 +76 +45 +18 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +103 +105 +107 +109 +110 +105 +102 +101 +102 +104 +104 +102 +97 +91 +84 +71 +66 +65 +65 +65 +65 +62 +46 +24 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +24 +58 +82 +98 +107 +111 +112 +110 +105 +98 +91 +84 +83 +84 +87 +92 +106 +122 +138 +155 +170 +182 +188 +192 +195 +196 +196 +196 +195 +193 +191 +186 +182 +176 +169 +162 +151 +142 +133 +124 +115 +104 +97 +91 +85 +80 +76 +73 +71 +69 +67 +66 +66 +66 +66 +66 +68 +69 +72 +74 +78 +84 +89 +96 +103 +112 +125 +135 +145 +153 +161 +168 +171 +172 +172 +171 +168 +164 +159 +154 +147 +141 +138 +136 +135 +135 +133 +124 +107 +81 +48 +15 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +103 +104 +106 +108 +109 +106 +103 +102 +103 +104 +103 +99 +92 +85 +82 +74 +67 +64 +64 +65 +65 +62 +46 +24 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +10 +26 +51 +88 +101 +108 +111 +112 +109 +103 +96 +88 +84 +81 +84 +88 +95 +107 +130 +150 +165 +177 +187 +192 +195 +196 +196 +196 +195 +193 +190 +187 +182 +174 +166 +157 +148 +137 +123 +112 +103 +93 +85 +76 +71 +67 +63 +61 +59 +58 +57 +57 +57 +57 +57 +57 +57 +57 +57 +58 +58 +59 +60 +62 +64 +67 +72 +78 +88 +98 +110 +121 +134 +150 +158 +164 +168 +170 +171 +170 +168 +165 +159 +150 +144 +140 +137 +136 +135 +133 +127 +112 +85 +39 +18 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +103 +105 +106 +107 +107 +105 +104 +104 +105 +104 +93 +85 +80 +80 +78 +69 +65 +64 +65 +65 +62 +45 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +25 +52 +86 +106 +109 +110 +111 +111 +103 +92 +85 +81 +80 +82 +87 +98 +114 +135 +161 +175 +185 +191 +195 +197 +197 +197 +196 +194 +191 +187 +182 +176 +169 +156 +144 +132 +120 +107 +91 +81 +73 +66 +61 +57 +56 +55 +55 +54 +54 +54 +54 +54 +55 +55 +55 +55 +55 +55 +56 +56 +56 +56 +57 +57 +57 +58 +59 +60 +62 +66 +72 +80 +92 +112 +129 +143 +156 +165 +170 +171 +171 +170 +169 +163 +155 +147 +141 +137 +136 +135 +134 +130 +122 +79 +42 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +100 +101 +102 +103 +104 +107 +106 +106 +107 +108 +97 +85 +80 +80 +81 +80 +73 +67 +64 +65 +65 +61 +42 +19 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +33 +64 +92 +106 +109 +110 +110 +107 +101 +87 +82 +79 +79 +82 +93 +110 +131 +153 +171 +186 +191 +195 +197 +197 +197 +195 +193 +190 +187 +180 +172 +162 +151 +138 +119 +104 +91 +80 +70 +61 +58 +55 +54 +53 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +54 +55 +55 +55 +55 +55 +55 +56 +56 +56 +56 +56 +57 +57 +57 +58 +59 +60 +62 +68 +76 +89 +105 +123 +145 +159 +166 +170 +170 +169 +167 +164 +157 +148 +140 +137 +136 +135 +133 +124 +94 +58 +26 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +99 +99 +99 +100 +102 +103 +105 +106 +107 +109 +91 +82 +80 +81 +82 +80 +72 +67 +65 +65 +65 +57 +36 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +31 +64 +88 +103 +108 +109 +109 +105 +98 +89 +81 +79 +79 +84 +93 +116 +138 +157 +174 +185 +194 +196 +197 +197 +196 +193 +191 +187 +182 +176 +164 +151 +138 +123 +108 +90 +78 +69 +63 +58 +55 +54 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +54 +54 +55 +55 +55 +55 +55 +55 +56 +56 +56 +56 +57 +57 +58 +58 +59 +61 +64 +69 +76 +86 +106 +124 +139 +153 +164 +168 +168 +168 +165 +160 +150 +144 +139 +136 +135 +131 +119 +94 +62 +26 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +98 +97 +97 +99 +100 +103 +105 +107 +109 +88 +81 +80 +81 +81 +78 +70 +66 +65 +65 +64 +52 +30 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +21 +61 +87 +101 +107 +109 +109 +105 +98 +89 +81 +77 +79 +85 +96 +113 +142 +162 +177 +187 +194 +197 +197 +196 +195 +193 +189 +184 +178 +169 +159 +141 +125 +110 +96 +82 +69 +62 +58 +55 +53 +52 +52 +52 +52 +52 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +55 +55 +55 +56 +56 +56 +57 +57 +57 +58 +59 +60 +62 +66 +78 +90 +105 +122 +139 +156 +164 +168 +168 +166 +160 +154 +147 +142 +137 +135 +131 +118 +95 +61 +19 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +97 +96 +95 +96 +98 +100 +103 +106 +109 +90 +82 +81 +81 +78 +74 +68 +66 +65 +66 +63 +44 +22 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +19 +45 +88 +101 +107 +108 +108 +106 +98 +88 +81 +77 +78 +84 +97 +115 +138 +167 +181 +190 +195 +198 +198 +196 +194 +191 +188 +182 +174 +164 +151 +137 +114 +98 +84 +73 +64 +57 +54 +53 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +53 +53 +53 +53 +53 +53 +52 +52 +52 +52 +52 +52 +52 +53 +53 +53 +53 +53 +54 +54 +54 +55 +55 +56 +56 +56 +57 +57 +58 +58 +59 +62 +66 +75 +89 +106 +132 +148 +159 +165 +167 +166 +163 +157 +150 +143 +137 +135 +131 +120 +98 +47 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +97 +96 +95 +95 +96 +96 +99 +104 +109 +98 +83 +80 +80 +73 +70 +67 +66 +66 +66 +60 +33 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +39 +75 +103 +106 +108 +108 +107 +99 +87 +80 +76 +75 +82 +96 +117 +141 +165 +185 +192 +196 +198 +198 +196 +193 +190 +187 +182 +172 +160 +144 +127 +109 +87 +74 +65 +58 +54 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +53 +53 +54 +54 +55 +55 +56 +57 +57 +57 +58 +58 +59 +61 +65 +71 +94 +116 +136 +153 +164 +167 +168 +166 +162 +153 +141 +138 +135 +132 +126 +88 +46 +18 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +97 +97 +96 +95 +95 +95 +95 +96 +100 +107 +107 +79 +76 +80 +73 +70 +68 +67 +66 +64 +40 +17 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +14 +41 +73 +100 +107 +108 +107 +105 +99 +85 +78 +75 +76 +80 +101 +126 +150 +172 +188 +196 +198 +199 +198 +195 +191 +188 +183 +176 +167 +147 +129 +110 +92 +77 +63 +58 +54 +52 +52 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +52 +52 +52 +52 +52 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +53 +53 +54 +55 +56 +56 +57 +58 +58 +59 +60 +64 +72 +87 +108 +132 +158 +165 +167 +166 +164 +157 +148 +141 +137 +134 +125 +96 +58 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +97 +97 +96 +95 +95 +95 +95 +96 +98 +102 +108 +78 +75 +80 +75 +71 +69 +67 +63 +54 +23 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +32 +64 +91 +104 +107 +107 +105 +99 +90 +77 +75 +76 +82 +94 +125 +150 +171 +186 +194 +198 +199 +197 +195 +191 +186 +181 +173 +162 +147 +122 +104 +87 +74 +63 +56 +54 +52 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +52 +52 +52 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +52 +52 +53 +54 +54 +56 +56 +57 +58 +59 +60 +63 +70 +80 +96 +125 +144 +157 +164 +165 +164 +159 +151 +143 +138 +132 +120 +93 +58 +21 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +97 +97 +96 +96 +96 +96 +95 +95 +96 +99 +108 +80 +75 +78 +76 +72 +69 +64 +55 +38 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +21 +55 +83 +101 +106 +107 +105 +99 +91 +81 +74 +75 +81 +94 +114 +149 +171 +185 +194 +198 +199 +197 +194 +191 +187 +180 +171 +158 +143 +124 +99 +83 +71 +62 +56 +53 +52 +51 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +52 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +51 +51 +51 +52 +52 +54 +54 +55 +56 +57 +58 +60 +62 +66 +73 +92 +113 +132 +149 +160 +166 +164 +159 +153 +145 +137 +132 +117 +92 +54 +14 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +97 +96 +96 +96 +97 +96 +95 +95 +96 +107 +87 +77 +74 +77 +72 +67 +58 +43 +22 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +41 +76 +96 +105 +107 +105 +100 +92 +83 +74 +73 +78 +91 +111 +138 +171 +186 +194 +198 +199 +198 +194 +190 +186 +181 +171 +157 +140 +121 +101 +78 +67 +59 +55 +52 +51 +51 +51 +50 +50 +50 +51 +51 +51 +51 +52 +52 +52 +52 +52 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +49 +49 +49 +50 +50 +50 +50 +51 +51 +52 +52 +53 +54 +56 +57 +58 +59 +60 +62 +69 +83 +102 +123 +145 +161 +164 +164 +161 +154 +144 +138 +132 +119 +92 +38 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +96 +96 +96 +96 +97 +98 +97 +95 +95 +103 +101 +83 +69 +75 +69 +61 +47 +29 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +17 +65 +91 +103 +106 +106 +102 +95 +84 +76 +72 +74 +86 +107 +133 +161 +188 +195 +198 +199 +198 +195 +190 +186 +181 +174 +158 +139 +118 +98 +79 +63 +57 +54 +52 +51 +51 +50 +50 +50 +50 +50 +51 +51 +51 +52 +52 +52 +52 +52 +51 +51 +50 +50 +50 +50 +50 +49 +49 +49 +49 +49 +49 +48 +48 +48 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +46 +47 +47 +47 +48 +49 +49 +50 +50 +50 +51 +51 +51 +52 +53 +55 +56 +57 +58 +59 +61 +65 +75 +91 +114 +147 +159 +164 +164 +163 +155 +145 +139 +133 +125 +79 +36 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +96 +96 +96 +96 +97 +99 +99 +98 +95 +96 +103 +90 +72 +66 +65 +53 +36 +19 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +16 +42 +92 +101 +105 +106 +103 +94 +83 +75 +71 +72 +85 +108 +135 +162 +185 +198 +199 +198 +197 +195 +189 +184 +178 +170 +157 +132 +110 +90 +74 +62 +54 +53 +52 +51 +51 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +52 +51 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +45 +45 +45 +45 +45 +45 +45 +46 +46 +47 +48 +49 +50 +50 +51 +51 +51 +52 +53 +54 +56 +57 +59 +60 +62 +66 +74 +101 +126 +146 +160 +165 +164 +159 +150 +142 +136 +124 +88 +48 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +96 +96 +95 +95 +97 +99 +101 +101 +97 +96 +102 +98 +86 +65 +57 +49 +34 +18 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +10 +30 +64 +99 +104 +105 +103 +99 +87 +77 +72 +72 +76 +101 +129 +156 +179 +194 +199 +199 +197 +195 +191 +184 +178 +169 +157 +139 +111 +91 +75 +63 +56 +53 +52 +51 +51 +50 +50 +50 +50 +50 +51 +52 +52 +52 +52 +52 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +47 +47 +47 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +45 +45 +45 +45 +45 +45 +45 +45 +46 +46 +48 +49 +50 +50 +51 +51 +52 +52 +53 +54 +57 +58 +60 +62 +65 +77 +95 +117 +138 +156 +164 +163 +159 +152 +143 +133 +117 +85 +47 +13 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +95 +95 +95 +95 +97 +99 +101 +103 +101 +96 +99 +101 +94 +72 +50 +41 +29 +16 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +19 +45 +82 +103 +105 +104 +100 +94 +80 +73 +72 +75 +86 +120 +149 +173 +190 +199 +199 +198 +195 +191 +186 +179 +170 +158 +141 +120 +91 +75 +64 +56 +53 +52 +51 +50 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +47 +47 +47 +47 +46 +46 +45 +45 +44 +44 +44 +44 +45 +45 +46 +47 +49 +50 +51 +51 +51 +52 +53 +54 +56 +58 +59 +61 +66 +75 +91 +111 +134 +156 +162 +162 +159 +152 +141 +132 +113 +83 +42 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +95 +95 +95 +95 +97 +99 +101 +104 +104 +98 +98 +100 +98 +84 +48 +34 +22 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +30 +60 +95 +105 +105 +102 +96 +88 +74 +71 +73 +82 +100 +139 +167 +186 +197 +200 +198 +196 +192 +187 +181 +172 +160 +143 +123 +100 +75 +63 +56 +53 +52 +51 +50 +50 +50 +49 +50 +50 +51 +52 +52 +53 +53 +52 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +47 +47 +46 +45 +45 +44 +44 +44 +44 +44 +45 +46 +48 +49 +50 +51 +51 +51 +52 +53 +55 +57 +59 +61 +64 +72 +85 +105 +137 +153 +161 +162 +160 +149 +141 +132 +114 +80 +25 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +95 +94 +95 +95 +97 +99 +102 +104 +106 +103 +98 +99 +101 +98 +57 +33 +17 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +43 +76 +101 +106 +103 +98 +91 +81 +70 +70 +77 +92 +117 +159 +183 +195 +200 +200 +196 +193 +188 +183 +176 +164 +147 +126 +104 +82 +63 +56 +53 +52 +51 +50 +50 +49 +49 +49 +50 +51 +52 +52 +53 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +51 +51 +50 +50 +49 +47 +46 +45 +44 +44 +44 +44 +44 +44 +45 +47 +48 +50 +51 +51 +51 +52 +53 +54 +56 +59 +61 +63 +68 +77 +106 +134 +152 +162 +163 +160 +150 +140 +131 +119 +59 +22 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +94 +94 +95 +95 +99 +102 +104 +105 +107 +107 +102 +100 +100 +103 +89 +47 +20 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +27 +61 +92 +104 +105 +100 +93 +83 +73 +68 +74 +88 +111 +142 +182 +194 +200 +200 +198 +193 +188 +182 +175 +167 +147 +125 +102 +82 +65 +55 +53 +52 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +53 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +51 +51 +51 +52 +52 +52 +51 +50 +48 +46 +44 +44 +43 +43 +43 +44 +45 +47 +48 +50 +51 +51 +52 +52 +52 +55 +58 +60 +62 +64 +73 +93 +119 +143 +160 +163 +161 +153 +143 +133 +115 +66 +28 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +94 +94 +95 +96 +101 +103 +105 +107 +107 +108 +105 +102 +100 +102 +97 +67 +34 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +39 +72 +97 +104 +104 +96 +87 +78 +70 +69 +79 +99 +127 +160 +191 +198 +200 +198 +195 +190 +183 +177 +168 +157 +131 +108 +87 +70 +58 +53 +52 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +53 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +47 +47 +46 +46 +46 +46 +46 +47 +47 +48 +48 +49 +50 +51 +51 +52 +52 +53 +53 +52 +52 +50 +48 +46 +45 +44 +43 +43 +44 +44 +46 +47 +50 +51 +51 +52 +52 +53 +54 +57 +59 +62 +66 +75 +91 +114 +140 +159 +161 +159 +153 +142 +127 +101 +61 +23 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +94 +94 +95 +97 +102 +104 +106 +107 +108 +109 +108 +104 +101 +102 +101 +84 +51 +18 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +16 +51 +81 +100 +103 +102 +92 +82 +74 +69 +72 +87 +113 +144 +176 +198 +200 +199 +196 +192 +186 +179 +171 +160 +145 +115 +92 +74 +62 +55 +52 +51 +50 +50 +49 +49 +49 +50 +50 +52 +53 +53 +53 +53 +53 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +47 +46 +46 +45 +44 +44 +44 +44 +44 +45 +45 +46 +47 +48 +48 +50 +50 +51 +52 +52 +53 +53 +54 +53 +53 +51 +50 +48 +46 +44 +43 +43 +43 +44 +45 +47 +49 +50 +51 +52 +52 +53 +54 +56 +59 +62 +66 +74 +89 +112 +145 +156 +160 +159 +152 +136 +122 +92 +53 +15 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +94 +94 +96 +98 +103 +105 +107 +107 +108 +109 +109 +106 +103 +101 +102 +96 +68 +32 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +25 +63 +88 +102 +103 +99 +88 +78 +72 +69 +75 +97 +127 +160 +188 +202 +200 +198 +194 +189 +181 +174 +164 +150 +131 +99 +79 +65 +56 +53 +51 +51 +50 +49 +49 +49 +49 +50 +51 +53 +53 +54 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +46 +45 +44 +43 +43 +43 +43 +43 +43 +44 +44 +45 +46 +46 +47 +48 +49 +50 +51 +52 +52 +53 +54 +54 +54 +54 +54 +53 +51 +49 +47 +44 +44 +43 +43 +44 +45 +47 +49 +50 +51 +52 +52 +52 +54 +56 +60 +62 +66 +72 +85 +120 +143 +156 +161 +160 +146 +135 +116 +86 +38 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +93 +94 +96 +100 +105 +106 +107 +108 +108 +109 +109 +108 +106 +101 +102 +101 +83 +52 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +33 +74 +95 +102 +103 +95 +83 +75 +70 +69 +80 +109 +143 +174 +197 +203 +199 +195 +191 +185 +177 +168 +155 +138 +116 +84 +68 +58 +54 +52 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +54 +54 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +49 +48 +47 +45 +43 +42 +42 +42 +42 +42 +43 +43 +43 +44 +44 +45 +46 +47 +47 +48 +49 +50 +51 +52 +52 +53 +54 +54 +54 +55 +55 +55 +54 +53 +51 +47 +45 +44 +43 +43 +43 +44 +46 +48 +50 +52 +52 +52 +52 +53 +56 +60 +62 +65 +69 +88 +119 +143 +158 +162 +158 +144 +132 +112 +77 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +93 +95 +97 +102 +106 +107 +107 +107 +108 +108 +109 +109 +108 +103 +102 +102 +96 +77 +35 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +49 +83 +98 +101 +101 +90 +79 +73 +70 +71 +91 +128 +162 +188 +201 +202 +196 +192 +187 +180 +170 +158 +142 +121 +96 +69 +59 +54 +52 +51 +50 +49 +48 +48 +48 +49 +51 +52 +53 +54 +54 +53 +53 +52 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +49 +47 +44 +43 +42 +41 +42 +42 +42 +43 +43 +44 +45 +46 +47 +47 +48 +49 +49 +49 +50 +50 +51 +51 +52 +52 +53 +54 +54 +54 +55 +55 +55 +55 +55 +54 +52 +50 +47 +45 +43 +43 +43 +44 +45 +47 +50 +51 +52 +52 +52 +53 +55 +58 +62 +64 +69 +83 +109 +137 +157 +161 +157 +145 +131 +118 +57 +20 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +96 +99 +103 +107 +107 +107 +107 +107 +107 +108 +109 +108 +106 +102 +102 +100 +86 +54 +10 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +13 +60 +88 +99 +101 +100 +85 +76 +71 +70 +73 +102 +142 +174 +195 +202 +201 +194 +189 +183 +175 +164 +150 +130 +107 +83 +62 +56 +53 +52 +51 +49 +48 +48 +48 +49 +50 +52 +53 +54 +54 +54 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +49 +48 +46 +43 +42 +41 +41 +41 +42 +43 +44 +45 +46 +47 +48 +48 +49 +49 +50 +50 +50 +50 +50 +51 +51 +52 +52 +53 +53 +54 +54 +55 +55 +55 +55 +55 +55 +55 +54 +52 +50 +48 +46 +44 +43 +43 +44 +45 +48 +50 +51 +52 +52 +53 +54 +55 +58 +62 +66 +72 +86 +108 +138 +159 +159 +154 +143 +127 +94 +46 +16 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +96 +100 +104 +107 +107 +107 +107 +106 +106 +107 +108 +109 +108 +103 +103 +102 +94 +73 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +19 +69 +91 +100 +100 +98 +82 +74 +70 +71 +77 +115 +155 +183 +199 +202 +199 +191 +186 +180 +171 +157 +140 +118 +94 +73 +57 +54 +52 +51 +50 +49 +48 +48 +48 +49 +51 +52 +53 +54 +54 +54 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +49 +48 +46 +43 +41 +41 +41 +41 +42 +44 +45 +46 +47 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +52 +52 +53 +54 +54 +55 +55 +55 +55 +55 +55 +55 +55 +54 +52 +50 +48 +45 +44 +43 +43 +44 +45 +48 +50 +51 +52 +53 +53 +54 +56 +58 +63 +66 +73 +87 +111 +146 +157 +158 +152 +140 +116 +75 +37 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +97 +101 +105 +107 +107 +107 +107 +106 +105 +106 +107 +109 +109 +104 +103 +102 +99 +88 +29 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +25 +77 +94 +100 +99 +95 +78 +72 +69 +72 +82 +128 +167 +190 +201 +202 +196 +188 +182 +176 +166 +150 +129 +106 +83 +64 +54 +53 +51 +50 +49 +48 +48 +48 +49 +50 +51 +53 +53 +54 +54 +53 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +48 +46 +43 +41 +40 +41 +42 +43 +44 +46 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +52 +53 +54 +54 +55 +55 +55 +55 +55 +55 +55 +55 +54 +53 +51 +47 +45 +44 +43 +43 +44 +46 +48 +50 +52 +53 +53 +53 +54 +56 +60 +63 +67 +73 +85 +124 +147 +157 +158 +152 +130 +103 +62 +24 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +98 +102 +106 +107 +107 +107 +106 +105 +104 +105 +106 +108 +109 +105 +103 +103 +101 +97 +46 +16 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +11 +32 +84 +96 +100 +98 +93 +75 +70 +68 +73 +89 +141 +177 +196 +202 +201 +193 +186 +179 +172 +162 +141 +118 +94 +73 +59 +53 +52 +51 +50 +48 +48 +48 +48 +49 +50 +52 +53 +53 +54 +54 +53 +52 +51 +50 +50 +50 +49 +49 +49 +49 +49 +50 +50 +50 +50 +49 +46 +43 +41 +40 +40 +41 +43 +45 +47 +48 +49 +49 +49 +50 +50 +50 +50 +50 +50 +51 +51 +51 +50 +50 +50 +50 +49 +49 +49 +50 +51 +53 +53 +54 +55 +55 +55 +55 +55 +55 +55 +55 +54 +53 +50 +47 +45 +44 +43 +43 +44 +46 +48 +50 +52 +53 +53 +54 +54 +57 +61 +64 +67 +71 +93 +127 +149 +160 +160 +142 +126 +90 +47 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +98 +103 +107 +107 +107 +106 +106 +105 +103 +104 +105 +106 +109 +107 +104 +103 +102 +101 +65 +27 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +15 +42 +90 +97 +100 +97 +88 +72 +69 +69 +78 +100 +157 +186 +199 +202 +201 +189 +182 +175 +166 +154 +128 +103 +81 +64 +55 +52 +51 +50 +49 +48 +48 +48 +49 +49 +51 +53 +53 +53 +53 +53 +53 +51 +50 +50 +50 +50 +50 +49 +49 +50 +50 +50 +50 +50 +50 +46 +42 +40 +40 +40 +42 +44 +46 +48 +48 +49 +49 +49 +50 +50 +51 +52 +53 +54 +55 +56 +56 +55 +54 +53 +51 +50 +49 +49 +48 +47 +47 +48 +50 +51 +53 +54 +54 +55 +55 +55 +55 +55 +55 +54 +52 +50 +48 +46 +44 +43 +44 +44 +46 +48 +51 +52 +53 +53 +54 +55 +58 +61 +64 +67 +73 +92 +122 +149 +161 +159 +140 +120 +88 +35 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +99 +103 +107 +107 +107 +106 +105 +104 +103 +103 +104 +105 +108 +107 +104 +103 +102 +102 +78 +34 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +19 +49 +93 +98 +99 +95 +85 +70 +68 +70 +82 +109 +167 +190 +200 +201 +199 +186 +179 +171 +161 +147 +118 +93 +73 +59 +54 +52 +51 +50 +48 +48 +48 +48 +49 +50 +51 +53 +53 +53 +53 +53 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +48 +42 +40 +40 +40 +41 +44 +46 +47 +48 +48 +49 +49 +50 +51 +53 +58 +62 +67 +71 +74 +77 +77 +76 +74 +71 +65 +60 +56 +52 +49 +47 +47 +47 +47 +48 +50 +51 +53 +54 +54 +55 +55 +55 +55 +54 +53 +52 +50 +47 +45 +44 +44 +44 +45 +46 +49 +51 +52 +53 +54 +55 +57 +59 +62 +65 +69 +78 +99 +126 +154 +161 +153 +136 +108 +68 +15 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +99 +103 +107 +107 +107 +106 +105 +103 +103 +103 +103 +105 +108 +108 +104 +103 +103 +102 +87 +42 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +23 +55 +94 +98 +98 +94 +83 +69 +68 +72 +87 +118 +175 +194 +201 +201 +197 +183 +176 +168 +156 +139 +108 +85 +67 +56 +53 +51 +50 +49 +48 +48 +48 +48 +49 +50 +51 +53 +53 +53 +53 +53 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +45 +40 +39 +39 +40 +42 +46 +47 +48 +48 +48 +49 +51 +53 +58 +64 +73 +80 +86 +91 +96 +100 +101 +101 +100 +97 +91 +84 +76 +69 +61 +54 +50 +48 +46 +47 +48 +49 +51 +52 +53 +54 +54 +54 +54 +54 +54 +53 +51 +49 +47 +45 +44 +44 +44 +45 +48 +50 +52 +53 +53 +54 +56 +58 +60 +63 +67 +71 +82 +103 +134 +160 +159 +147 +127 +99 +34 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +96 +99 +104 +107 +107 +107 +106 +104 +103 +102 +102 +103 +104 +108 +108 +104 +103 +103 +102 +93 +50 +20 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +3 +5 +6 +7 +7 +6 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +26 +61 +95 +98 +98 +93 +81 +69 +68 +73 +91 +126 +183 +196 +201 +200 +195 +181 +173 +164 +151 +131 +99 +77 +62 +55 +53 +51 +50 +49 +48 +48 +48 +49 +49 +50 +51 +52 +53 +53 +53 +53 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +47 +42 +39 +39 +40 +41 +44 +47 +47 +48 +48 +48 +50 +54 +60 +68 +77 +88 +96 +102 +108 +112 +117 +119 +121 +121 +121 +117 +111 +103 +94 +83 +69 +61 +54 +50 +47 +47 +48 +49 +50 +52 +53 +53 +54 +54 +54 +54 +53 +52 +50 +48 +46 +44 +44 +44 +44 +46 +49 +51 +52 +53 +54 +55 +57 +59 +62 +66 +68 +72 +84 +108 +150 +159 +155 +142 +122 +61 +25 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +96 +99 +104 +107 +107 +107 +106 +104 +103 +102 +102 +102 +104 +108 +108 +105 +103 +103 +103 +97 +58 +25 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +4 +5 +6 +6 +6 +6 +5 +5 +4 +4 +4 +6 +8 +14 +18 +21 +21 +19 +14 +9 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +10 +29 +67 +96 +98 +97 +91 +79 +68 +68 +75 +95 +134 +189 +198 +202 +199 +192 +179 +170 +160 +145 +123 +90 +70 +59 +54 +52 +51 +49 +48 +48 +48 +48 +49 +50 +50 +51 +52 +52 +53 +53 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +48 +45 +40 +39 +39 +40 +43 +46 +47 +47 +47 +48 +49 +54 +62 +71 +82 +90 +98 +103 +108 +112 +116 +120 +123 +125 +127 +129 +131 +131 +129 +124 +114 +96 +82 +69 +58 +50 +47 +47 +47 +48 +50 +52 +52 +53 +53 +54 +54 +53 +53 +51 +50 +47 +45 +44 +44 +44 +45 +47 +50 +52 +53 +54 +54 +56 +58 +61 +65 +68 +70 +74 +82 +127 +153 +161 +154 +134 +93 +44 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +96 +99 +103 +107 +107 +107 +106 +104 +102 +102 +102 +102 +104 +108 +108 +105 +103 +103 +103 +100 +65 +30 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +9 +14 +23 +30 +36 +41 +44 +45 +44 +41 +37 +33 +28 +27 +28 +32 +41 +57 +69 +76 +79 +79 +71 +57 +41 +25 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +12 +34 +74 +97 +98 +96 +90 +77 +68 +68 +76 +99 +143 +193 +200 +202 +198 +189 +176 +167 +154 +137 +113 +80 +64 +56 +53 +52 +50 +49 +48 +48 +48 +48 +49 +50 +51 +51 +52 +52 +52 +52 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +49 +46 +42 +39 +38 +39 +42 +45 +46 +47 +47 +47 +49 +53 +63 +73 +81 +87 +92 +99 +103 +107 +109 +112 +115 +118 +121 +125 +128 +132 +133 +134 +134 +134 +130 +119 +104 +88 +71 +56 +50 +48 +47 +48 +50 +51 +52 +53 +53 +53 +53 +53 +52 +51 +49 +47 +45 +44 +43 +44 +46 +48 +50 +53 +54 +54 +55 +57 +59 +65 +67 +69 +70 +73 +90 +129 +152 +160 +156 +125 +77 +37 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +99 +103 +107 +107 +107 +106 +105 +103 +102 +102 +103 +105 +108 +108 +104 +102 +102 +103 +101 +69 +33 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +10 +20 +32 +44 +55 +65 +70 +74 +77 +79 +80 +79 +78 +76 +73 +69 +65 +64 +67 +73 +85 +91 +95 +97 +98 +96 +90 +82 +70 +53 +25 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +14 +38 +78 +97 +98 +96 +89 +76 +67 +68 +77 +102 +149 +195 +200 +202 +197 +187 +174 +164 +150 +131 +106 +74 +61 +54 +52 +52 +50 +48 +48 +48 +48 +48 +49 +50 +50 +51 +51 +52 +52 +52 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +51 +50 +48 +44 +40 +38 +38 +40 +43 +46 +46 +46 +47 +48 +51 +57 +68 +75 +81 +87 +90 +92 +91 +89 +87 +86 +86 +89 +93 +98 +105 +116 +123 +129 +133 +135 +135 +132 +126 +116 +100 +76 +63 +54 +49 +47 +48 +50 +51 +52 +52 +53 +53 +53 +52 +52 +50 +48 +46 +45 +44 +44 +45 +47 +49 +52 +54 +54 +55 +56 +58 +63 +67 +69 +70 +72 +79 +105 +135 +158 +161 +138 +104 +61 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +98 +103 +107 +107 +107 +107 +105 +103 +103 +102 +104 +106 +109 +108 +103 +102 +102 +104 +102 +72 +35 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +12 +23 +41 +53 +64 +73 +80 +86 +88 +90 +92 +93 +94 +94 +93 +93 +92 +90 +88 +88 +89 +92 +98 +101 +103 +105 +105 +105 +104 +101 +95 +85 +64 +43 +23 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +16 +42 +81 +97 +98 +96 +88 +75 +67 +68 +78 +104 +152 +196 +201 +202 +197 +185 +172 +162 +146 +125 +99 +69 +59 +54 +52 +51 +49 +48 +48 +48 +48 +49 +49 +50 +50 +51 +51 +51 +52 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +51 +51 +50 +47 +43 +39 +38 +38 +41 +44 +46 +46 +46 +46 +49 +53 +60 +70 +75 +79 +81 +80 +75 +70 +67 +64 +62 +62 +64 +66 +70 +75 +86 +96 +106 +117 +127 +135 +137 +136 +132 +124 +103 +84 +68 +57 +50 +48 +49 +50 +51 +52 +53 +53 +53 +52 +52 +50 +49 +47 +45 +44 +44 +44 +46 +48 +51 +53 +54 +54 +55 +57 +61 +67 +70 +71 +72 +74 +87 +115 +145 +162 +152 +125 +85 +42 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +98 +102 +107 +107 +107 +107 +106 +104 +103 +103 +105 +107 +109 +108 +103 +101 +102 +104 +103 +74 +37 +7 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +11 +22 +36 +53 +74 +83 +88 +90 +91 +91 +91 +91 +92 +93 +94 +95 +96 +96 +97 +99 +99 +99 +100 +101 +103 +104 +105 +105 +106 +106 +106 +105 +105 +104 +97 +79 +54 +29 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +19 +45 +84 +98 +98 +95 +88 +74 +67 +68 +79 +106 +155 +197 +202 +202 +196 +183 +170 +159 +142 +120 +93 +65 +57 +53 +52 +51 +49 +48 +48 +48 +48 +49 +49 +50 +50 +51 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +51 +51 +50 +46 +41 +38 +37 +39 +42 +45 +46 +46 +46 +47 +49 +55 +61 +69 +73 +73 +71 +65 +56 +52 +49 +47 +47 +47 +47 +48 +49 +51 +57 +65 +76 +90 +105 +123 +131 +136 +139 +139 +128 +110 +90 +71 +57 +49 +49 +49 +50 +51 +52 +52 +53 +52 +52 +51 +49 +48 +46 +45 +44 +44 +45 +47 +50 +53 +54 +54 +55 +56 +60 +66 +70 +73 +73 +73 +76 +95 +125 +157 +162 +142 +107 +66 +23 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +97 +101 +106 +107 +107 +108 +107 +105 +104 +105 +107 +109 +109 +106 +101 +101 +102 +105 +103 +75 +38 +8 +3 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +13 +34 +57 +77 +87 +90 +91 +92 +91 +90 +86 +84 +84 +83 +84 +87 +90 +93 +95 +98 +100 +101 +102 +103 +103 +104 +105 +105 +105 +105 +105 +105 +106 +106 +106 +105 +103 +93 +69 +28 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +21 +48 +85 +98 +98 +95 +88 +74 +67 +67 +79 +107 +156 +198 +202 +201 +195 +182 +168 +157 +138 +115 +88 +62 +56 +53 +52 +51 +49 +48 +48 +48 +48 +49 +49 +50 +50 +50 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +51 +51 +51 +49 +44 +40 +38 +37 +39 +43 +45 +46 +46 +46 +47 +50 +55 +61 +67 +67 +64 +57 +48 +45 +44 +44 +43 +43 +44 +44 +44 +44 +45 +45 +47 +50 +55 +66 +92 +114 +129 +139 +142 +142 +135 +118 +95 +71 +53 +50 +49 +49 +50 +52 +52 +52 +52 +52 +51 +50 +49 +47 +45 +44 +44 +45 +46 +49 +53 +54 +54 +55 +56 +59 +64 +70 +74 +76 +74 +74 +80 +101 +144 +164 +152 +128 +92 +41 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +95 +97 +100 +106 +107 +107 +108 +108 +108 +107 +108 +108 +109 +109 +103 +100 +100 +102 +105 +102 +73 +37 +9 +6 +7 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +13 +31 +68 +82 +88 +90 +91 +88 +82 +75 +70 +65 +62 +61 +61 +62 +64 +68 +73 +79 +86 +93 +100 +102 +103 +104 +104 +104 +103 +103 +103 +102 +102 +102 +102 +103 +104 +105 +105 +104 +100 +90 +30 +10 +2 +1 +1 +3 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +23 +51 +85 +98 +98 +95 +88 +75 +67 +67 +79 +107 +156 +198 +202 +201 +195 +181 +165 +153 +134 +109 +83 +59 +55 +52 +51 +50 +48 +48 +48 +48 +48 +49 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +51 +51 +51 +51 +49 +43 +39 +37 +37 +40 +44 +45 +45 +45 +45 +46 +50 +54 +59 +59 +57 +51 +46 +44 +43 +43 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +45 +46 +51 +64 +85 +110 +133 +143 +145 +142 +131 +108 +73 +59 +52 +49 +50 +51 +52 +52 +52 +52 +52 +51 +49 +48 +46 +45 +44 +44 +45 +47 +51 +53 +54 +55 +55 +58 +62 +69 +75 +80 +79 +76 +76 +83 +103 +158 +163 +151 +121 +75 +20 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +96 +99 +106 +107 +107 +108 +108 +108 +109 +109 +109 +109 +108 +101 +100 +100 +102 +105 +101 +69 +36 +12 +9 +9 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +11 +29 +50 +69 +82 +87 +88 +86 +82 +74 +69 +65 +62 +60 +58 +57 +58 +59 +61 +65 +70 +77 +85 +93 +100 +101 +102 +102 +102 +103 +102 +102 +102 +102 +101 +100 +99 +99 +99 +101 +102 +103 +103 +100 +73 +34 +12 +2 +1 +2 +7 +9 +8 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +24 +52 +85 +98 +98 +95 +88 +75 +67 +68 +78 +106 +156 +198 +202 +201 +194 +180 +164 +151 +131 +105 +79 +58 +54 +52 +51 +50 +48 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +42 +38 +37 +37 +41 +44 +45 +45 +45 +45 +46 +49 +53 +55 +55 +51 +47 +44 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +44 +46 +50 +59 +74 +97 +130 +141 +145 +142 +133 +101 +76 +61 +52 +50 +50 +51 +52 +52 +52 +52 +51 +50 +49 +47 +45 +44 +44 +45 +46 +51 +53 +54 +55 +55 +57 +61 +67 +73 +81 +83 +80 +77 +78 +85 +140 +159 +156 +136 +103 +38 +14 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +91 +94 +96 +98 +105 +107 +107 +107 +108 +109 +109 +109 +109 +108 +106 +100 +99 +100 +102 +104 +99 +65 +35 +15 +13 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +20 +39 +57 +73 +84 +86 +85 +82 +78 +73 +66 +63 +60 +58 +57 +56 +56 +57 +58 +60 +64 +70 +77 +85 +94 +100 +101 +101 +102 +102 +102 +102 +101 +100 +98 +97 +96 +95 +95 +95 +96 +97 +99 +101 +103 +95 +66 +36 +11 +3 +3 +8 +15 +20 +19 +12 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +5 +24 +52 +85 +98 +98 +95 +88 +76 +67 +68 +77 +103 +154 +198 +202 +201 +194 +180 +164 +150 +128 +103 +76 +57 +54 +52 +51 +50 +48 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +41 +38 +37 +37 +41 +44 +45 +45 +45 +45 +45 +48 +50 +51 +51 +47 +45 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +44 +47 +54 +67 +101 +125 +139 +146 +145 +126 +99 +76 +59 +52 +50 +51 +51 +52 +52 +52 +52 +51 +49 +48 +45 +45 +44 +45 +46 +50 +53 +54 +55 +55 +56 +60 +65 +72 +81 +86 +84 +81 +78 +77 +113 +148 +159 +150 +127 +61 +26 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +93 +95 +97 +104 +106 +106 +107 +108 +109 +109 +109 +108 +106 +103 +99 +98 +100 +103 +104 +96 +60 +33 +18 +17 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +19 +47 +69 +79 +82 +83 +82 +79 +74 +70 +67 +63 +61 +59 +58 +57 +56 +56 +56 +58 +60 +65 +71 +78 +87 +95 +101 +101 +102 +102 +103 +102 +100 +97 +95 +93 +91 +90 +90 +91 +92 +93 +93 +95 +97 +101 +102 +93 +66 +34 +11 +5 +7 +17 +29 +36 +29 +17 +8 +3 +1 +1 +1 +1 +1 +1 +1 +5 +23 +52 +85 +98 +98 +95 +89 +76 +67 +68 +76 +100 +151 +198 +202 +202 +194 +180 +163 +149 +126 +100 +74 +56 +53 +52 +51 +50 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +41 +38 +37 +37 +41 +43 +44 +44 +44 +44 +45 +47 +48 +49 +48 +45 +44 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +45 +48 +68 +99 +124 +141 +148 +144 +123 +97 +72 +56 +51 +51 +51 +52 +52 +52 +52 +51 +50 +48 +46 +45 +45 +45 +45 +49 +52 +54 +55 +55 +56 +59 +65 +72 +81 +88 +88 +85 +81 +76 +88 +132 +156 +161 +145 +86 +42 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +88 +93 +95 +97 +102 +106 +106 +106 +106 +108 +108 +108 +107 +104 +99 +97 +97 +100 +103 +104 +93 +55 +32 +22 +20 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +24 +56 +77 +81 +82 +81 +78 +72 +70 +68 +66 +64 +63 +61 +59 +58 +57 +56 +56 +57 +59 +62 +67 +72 +79 +88 +96 +103 +105 +105 +104 +103 +99 +94 +90 +87 +85 +84 +84 +85 +87 +90 +92 +92 +93 +93 +95 +101 +102 +97 +76 +32 +10 +11 +15 +26 +50 +53 +40 +22 +7 +2 +1 +1 +1 +1 +1 +1 +4 +22 +50 +83 +98 +98 +96 +89 +77 +67 +67 +74 +97 +146 +198 +203 +202 +195 +180 +163 +148 +125 +99 +73 +56 +53 +52 +51 +50 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +41 +38 +36 +37 +41 +43 +44 +44 +44 +44 +44 +45 +47 +47 +46 +44 +44 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +42 +42 +42 +42 +42 +42 +42 +42 +43 +43 +47 +67 +97 +127 +145 +149 +142 +120 +92 +65 +52 +51 +51 +51 +52 +52 +52 +51 +50 +49 +46 +45 +45 +45 +45 +48 +51 +54 +55 +55 +56 +58 +64 +71 +79 +90 +91 +89 +85 +79 +77 +115 +148 +165 +157 +113 +61 +26 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +92 +94 +96 +100 +106 +106 +106 +105 +105 +106 +106 +104 +100 +96 +96 +97 +100 +103 +103 +84 +50 +32 +25 +22 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +18 +46 +72 +80 +79 +75 +73 +72 +71 +69 +68 +67 +66 +65 +64 +63 +61 +59 +57 +56 +56 +59 +62 +66 +70 +78 +89 +99 +106 +107 +106 +104 +100 +95 +86 +83 +81 +80 +80 +80 +81 +83 +86 +89 +91 +92 +92 +92 +93 +94 +100 +102 +101 +96 +53 +30 +23 +26 +32 +64 +66 +58 +39 +12 +2 +1 +1 +1 +1 +1 +3 +18 +44 +79 +97 +98 +96 +91 +79 +67 +67 +72 +91 +136 +195 +202 +202 +196 +182 +164 +147 +124 +98 +71 +55 +53 +52 +51 +49 +49 +48 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +42 +38 +36 +36 +40 +42 +44 +44 +44 +44 +44 +44 +45 +45 +45 +44 +44 +44 +44 +44 +44 +44 +44 +43 +43 +43 +42 +42 +42 +42 +42 +41 +40 +40 +39 +40 +40 +41 +42 +43 +46 +63 +91 +128 +147 +148 +141 +123 +90 +59 +53 +51 +51 +52 +52 +52 +52 +51 +49 +47 +46 +45 +45 +45 +47 +51 +53 +55 +55 +56 +57 +63 +70 +77 +90 +93 +94 +92 +85 +76 +87 +123 +157 +164 +142 +92 +48 +16 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +92 +94 +95 +98 +106 +106 +106 +104 +103 +103 +103 +100 +97 +96 +95 +98 +101 +103 +102 +76 +46 +32 +26 +21 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +24 +52 +69 +76 +76 +74 +73 +72 +72 +73 +71 +69 +68 +67 +67 +66 +64 +61 +59 +57 +57 +58 +62 +66 +70 +80 +92 +100 +105 +107 +106 +103 +97 +91 +85 +80 +78 +76 +75 +74 +75 +77 +80 +83 +87 +91 +92 +92 +92 +93 +94 +96 +99 +101 +101 +89 +71 +51 +36 +37 +51 +65 +67 +59 +40 +9 +3 +1 +1 +1 +1 +2 +15 +39 +75 +97 +98 +97 +92 +81 +68 +67 +70 +87 +127 +191 +202 +203 +197 +183 +165 +148 +125 +98 +71 +55 +53 +52 +51 +49 +49 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +49 +42 +38 +36 +36 +39 +42 +43 +44 +43 +43 +43 +44 +44 +45 +45 +45 +44 +44 +44 +44 +44 +44 +44 +43 +43 +42 +42 +42 +41 +41 +41 +40 +39 +38 +37 +37 +38 +39 +41 +42 +44 +51 +68 +101 +139 +146 +146 +136 +113 +72 +59 +53 +52 +52 +52 +52 +52 +51 +50 +48 +46 +45 +45 +45 +47 +50 +53 +55 +55 +56 +57 +62 +70 +77 +89 +94 +97 +95 +91 +79 +80 +108 +142 +165 +155 +115 +69 +28 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +91 +94 +95 +97 +105 +106 +106 +105 +102 +101 +100 +98 +96 +95 +96 +99 +101 +102 +99 +67 +44 +32 +26 +17 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +18 +52 +70 +75 +75 +73 +74 +77 +77 +76 +75 +73 +70 +69 +69 +68 +66 +64 +61 +59 +58 +59 +62 +67 +72 +78 +90 +100 +105 +107 +106 +102 +96 +89 +83 +78 +73 +71 +69 +68 +68 +70 +72 +76 +80 +84 +90 +91 +92 +92 +93 +94 +95 +96 +99 +101 +101 +93 +79 +64 +51 +50 +61 +68 +68 +60 +28 +11 +3 +1 +1 +1 +2 +11 +32 +69 +95 +97 +97 +93 +83 +68 +67 +69 +83 +117 +186 +200 +204 +198 +185 +166 +149 +126 +99 +72 +55 +53 +51 +51 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +50 +43 +39 +36 +36 +38 +41 +42 +43 +43 +43 +43 +43 +44 +44 +45 +44 +44 +44 +44 +44 +44 +44 +43 +43 +42 +42 +41 +40 +40 +40 +40 +39 +38 +37 +36 +35 +35 +36 +38 +41 +42 +45 +54 +75 +124 +141 +147 +143 +131 +89 +67 +56 +52 +52 +52 +52 +52 +52 +51 +48 +47 +45 +45 +45 +46 +50 +53 +55 +56 +56 +57 +62 +69 +77 +87 +95 +98 +98 +96 +84 +79 +94 +123 +161 +161 +135 +90 +44 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +79 +90 +94 +94 +95 +104 +105 +106 +105 +102 +99 +98 +97 +96 +96 +97 +100 +101 +100 +93 +59 +41 +31 +24 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +18 +42 +74 +75 +74 +72 +75 +80 +84 +85 +82 +76 +73 +71 +70 +69 +68 +66 +64 +61 +60 +60 +63 +67 +72 +78 +86 +99 +104 +106 +105 +103 +95 +87 +81 +75 +71 +66 +63 +62 +62 +63 +65 +68 +72 +76 +81 +88 +90 +92 +92 +93 +95 +95 +95 +96 +98 +100 +100 +98 +90 +71 +60 +60 +66 +71 +72 +51 +25 +9 +3 +1 +1 +1 +8 +26 +61 +94 +97 +97 +94 +86 +70 +67 +68 +79 +107 +179 +198 +204 +199 +187 +167 +150 +127 +100 +73 +55 +53 +51 +51 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +50 +45 +40 +37 +36 +37 +39 +41 +42 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +44 +44 +44 +43 +43 +42 +41 +40 +40 +40 +39 +39 +39 +38 +38 +37 +34 +33 +33 +33 +35 +40 +41 +43 +46 +55 +103 +132 +144 +147 +143 +108 +78 +61 +53 +52 +52 +52 +52 +52 +51 +49 +47 +46 +45 +45 +46 +49 +53 +55 +56 +56 +57 +61 +68 +77 +86 +94 +99 +100 +100 +90 +81 +84 +106 +153 +164 +150 +111 +64 +21 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +77 +90 +94 +94 +94 +102 +105 +106 +105 +102 +99 +97 +96 +96 +96 +98 +100 +101 +97 +86 +50 +37 +29 +20 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +16 +39 +71 +76 +72 +70 +74 +84 +92 +92 +90 +86 +77 +73 +71 +70 +70 +68 +66 +64 +63 +62 +62 +66 +70 +77 +85 +94 +104 +105 +105 +103 +96 +84 +78 +72 +67 +61 +58 +58 +59 +60 +61 +62 +64 +67 +72 +77 +85 +89 +91 +92 +93 +95 +96 +96 +95 +94 +94 +95 +95 +94 +93 +77 +69 +67 +71 +76 +73 +46 +22 +6 +2 +1 +1 +5 +19 +52 +91 +96 +97 +95 +89 +72 +67 +67 +75 +96 +170 +196 +205 +201 +190 +170 +152 +129 +102 +75 +55 +53 +51 +51 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +49 +49 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +46 +41 +37 +36 +37 +38 +40 +41 +42 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +43 +42 +41 +40 +40 +40 +39 +39 +39 +39 +38 +38 +37 +36 +33 +32 +31 +31 +32 +37 +40 +42 +44 +46 +78 +119 +140 +147 +147 +126 +91 +68 +55 +52 +52 +52 +52 +52 +52 +49 +47 +46 +45 +45 +46 +49 +52 +55 +56 +56 +57 +61 +67 +77 +86 +93 +99 +102 +102 +96 +84 +81 +95 +138 +164 +159 +130 +86 +34 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +75 +89 +93 +93 +94 +99 +103 +105 +106 +105 +100 +98 +97 +97 +97 +100 +100 +99 +92 +74 +43 +30 +22 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +43 +68 +75 +71 +70 +77 +87 +98 +101 +100 +95 +88 +81 +74 +73 +73 +72 +71 +67 +65 +64 +64 +66 +74 +85 +95 +103 +107 +106 +101 +95 +87 +79 +71 +65 +59 +56 +55 +56 +56 +56 +56 +55 +56 +57 +60 +64 +69 +77 +84 +88 +90 +92 +94 +97 +98 +98 +98 +97 +95 +93 +92 +91 +90 +83 +77 +74 +75 +79 +75 +54 +28 +7 +1 +1 +3 +12 +36 +84 +94 +97 +96 +92 +75 +69 +67 +71 +83 +155 +190 +204 +203 +193 +173 +156 +133 +106 +78 +56 +53 +51 +51 +50 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +49 +49 +50 +50 +50 +51 +51 +52 +52 +51 +51 +51 +51 +52 +51 +49 +44 +39 +37 +37 +38 +38 +39 +39 +41 +42 +42 +43 +43 +43 +43 +43 +43 +42 +41 +40 +40 +40 +40 +40 +40 +40 +40 +39 +39 +39 +38 +37 +36 +33 +31 +29 +29 +29 +33 +38 +41 +43 +44 +56 +96 +127 +145 +147 +140 +109 +81 +60 +53 +52 +52 +52 +52 +52 +50 +48 +47 +46 +46 +46 +49 +52 +55 +56 +56 +57 +60 +67 +76 +86 +91 +98 +102 +103 +102 +90 +83 +87 +109 +160 +161 +147 +114 +58 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +73 +88 +93 +93 +93 +97 +101 +104 +106 +106 +102 +101 +100 +99 +99 +100 +100 +96 +85 +65 +35 +25 +17 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +37 +59 +72 +73 +70 +74 +85 +96 +104 +106 +104 +99 +93 +87 +81 +79 +77 +75 +72 +68 +67 +69 +74 +84 +93 +99 +101 +102 +102 +95 +88 +83 +77 +70 +59 +56 +53 +52 +51 +51 +50 +51 +51 +53 +54 +55 +57 +59 +63 +70 +77 +82 +86 +89 +92 +95 +97 +98 +99 +99 +99 +98 +97 +95 +93 +90 +84 +78 +76 +78 +77 +69 +51 +23 +3 +1 +2 +8 +24 +74 +91 +96 +96 +94 +79 +70 +67 +69 +77 +139 +182 +202 +204 +196 +177 +160 +137 +110 +81 +57 +53 +51 +51 +50 +49 +49 +49 +49 +50 +50 +51 +50 +50 +50 +50 +49 +49 +49 +50 +50 +51 +51 +52 +52 +52 +51 +51 +51 +52 +52 +50 +46 +41 +38 +37 +38 +38 +38 +38 +39 +40 +40 +41 +41 +42 +42 +41 +41 +40 +39 +39 +39 +40 +40 +40 +41 +41 +42 +42 +42 +42 +41 +40 +38 +34 +31 +29 +28 +28 +31 +36 +40 +42 +44 +51 +82 +116 +141 +147 +143 +120 +91 +66 +54 +53 +53 +53 +52 +52 +51 +49 +47 +46 +46 +46 +49 +52 +55 +56 +57 +57 +60 +66 +76 +85 +90 +96 +101 +104 +103 +95 +86 +84 +94 +151 +159 +154 +130 +80 +21 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +72 +87 +93 +93 +92 +95 +98 +103 +106 +106 +104 +102 +101 +101 +101 +101 +99 +91 +75 +53 +27 +20 +12 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +24 +53 +68 +73 +71 +70 +80 +92 +102 +107 +108 +105 +101 +97 +91 +86 +83 +81 +77 +74 +72 +77 +82 +89 +96 +101 +101 +98 +95 +92 +85 +78 +70 +63 +57 +51 +48 +47 +45 +44 +44 +44 +46 +48 +50 +52 +53 +54 +55 +57 +63 +69 +75 +81 +84 +87 +90 +93 +95 +98 +100 +101 +101 +100 +99 +97 +96 +92 +88 +83 +80 +79 +76 +67 +45 +11 +4 +2 +5 +15 +62 +86 +95 +96 +95 +82 +72 +67 +68 +73 +122 +173 +198 +205 +199 +180 +164 +141 +115 +85 +59 +54 +52 +51 +50 +49 +49 +49 +49 +50 +51 +51 +51 +50 +50 +50 +50 +49 +50 +50 +50 +51 +51 +52 +52 +52 +51 +51 +51 +52 +52 +51 +49 +44 +39 +38 +38 +38 +38 +38 +38 +38 +39 +39 +39 +40 +39 +39 +39 +39 +39 +39 +40 +40 +41 +43 +44 +44 +45 +45 +46 +46 +45 +44 +42 +37 +32 +29 +28 +28 +29 +34 +39 +42 +43 +48 +71 +105 +136 +147 +145 +128 +101 +73 +56 +53 +53 +53 +53 +52 +51 +49 +47 +46 +46 +47 +49 +52 +55 +56 +57 +57 +60 +66 +76 +85 +89 +94 +99 +104 +104 +99 +90 +83 +86 +138 +156 +158 +142 +102 +33 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +71 +87 +92 +92 +92 +93 +96 +101 +105 +106 +105 +103 +102 +102 +102 +101 +96 +83 +64 +40 +20 +14 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +44 +65 +73 +72 +69 +73 +87 +98 +106 +109 +108 +106 +103 +100 +95 +90 +87 +84 +82 +80 +81 +89 +95 +100 +101 +100 +96 +90 +85 +79 +72 +65 +57 +51 +46 +44 +42 +40 +38 +37 +37 +39 +41 +43 +46 +48 +50 +51 +52 +53 +56 +61 +67 +73 +78 +82 +85 +87 +91 +94 +98 +100 +101 +102 +101 +101 +100 +99 +97 +92 +84 +82 +80 +76 +66 +26 +10 +3 +4 +8 +48 +79 +93 +96 +96 +86 +74 +68 +67 +70 +107 +161 +192 +205 +202 +185 +168 +146 +120 +90 +61 +55 +52 +51 +50 +49 +49 +49 +49 +50 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +51 +51 +51 +52 +52 +51 +48 +42 +39 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +39 +40 +41 +42 +44 +45 +46 +47 +47 +48 +49 +49 +49 +49 +47 +41 +34 +30 +28 +28 +29 +33 +38 +41 +43 +46 +63 +96 +130 +146 +146 +134 +108 +79 +58 +53 +53 +53 +53 +53 +51 +49 +48 +47 +47 +47 +50 +53 +55 +57 +57 +58 +60 +66 +75 +85 +88 +93 +97 +103 +104 +102 +93 +85 +84 +122 +151 +160 +150 +123 +48 +18 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +70 +86 +92 +92 +91 +91 +92 +98 +104 +106 +105 +104 +103 +103 +102 +101 +88 +71 +50 +28 +13 +9 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +19 +63 +72 +73 +71 +69 +76 +92 +103 +108 +110 +108 +107 +105 +102 +99 +95 +92 +91 +90 +91 +96 +98 +99 +99 +98 +93 +89 +83 +75 +65 +52 +46 +43 +42 +40 +37 +35 +35 +34 +34 +34 +35 +36 +38 +40 +44 +46 +48 +48 +49 +50 +53 +58 +65 +71 +78 +80 +82 +84 +87 +94 +98 +101 +102 +102 +101 +101 +100 +99 +98 +91 +86 +83 +81 +78 +51 +20 +7 +4 +5 +32 +69 +88 +96 +96 +89 +77 +70 +67 +68 +92 +147 +185 +204 +204 +189 +173 +152 +126 +96 +64 +56 +52 +51 +50 +49 +49 +49 +49 +50 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +51 +51 +51 +52 +52 +52 +50 +47 +40 +39 +39 +39 +39 +38 +38 +38 +38 +38 +38 +38 +38 +38 +39 +41 +43 +44 +46 +47 +47 +48 +48 +48 +48 +49 +51 +52 +52 +51 +46 +38 +32 +28 +28 +29 +33 +38 +41 +43 +45 +58 +89 +124 +145 +146 +138 +114 +85 +61 +54 +53 +53 +53 +53 +52 +50 +48 +47 +47 +47 +50 +53 +56 +57 +57 +58 +61 +66 +75 +85 +88 +91 +95 +101 +104 +103 +96 +87 +83 +107 +145 +159 +156 +140 +66 +27 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +69 +86 +91 +91 +91 +89 +88 +92 +98 +105 +106 +105 +105 +103 +101 +89 +71 +50 +30 +14 +7 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +16 +42 +73 +75 +72 +68 +68 +79 +95 +104 +109 +109 +109 +108 +107 +106 +105 +103 +102 +101 +100 +100 +99 +98 +97 +93 +86 +72 +63 +55 +48 +43 +40 +38 +37 +36 +35 +35 +34 +34 +34 +34 +34 +34 +34 +35 +37 +40 +42 +44 +45 +45 +45 +45 +47 +51 +56 +66 +72 +77 +80 +81 +84 +90 +95 +99 +101 +101 +101 +101 +101 +102 +101 +97 +92 +87 +85 +76 +46 +21 +6 +6 +16 +52 +79 +94 +95 +93 +81 +72 +67 +67 +78 +124 +169 +201 +207 +195 +180 +160 +136 +105 +69 +58 +53 +51 +50 +49 +49 +49 +49 +49 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +51 +52 +52 +52 +52 +52 +51 +51 +51 +52 +52 +52 +51 +46 +42 +40 +40 +40 +40 +40 +39 +39 +39 +39 +40 +41 +42 +44 +46 +46 +47 +47 +47 +48 +48 +48 +48 +48 +49 +51 +53 +53 +53 +50 +41 +34 +30 +29 +30 +33 +38 +41 +43 +45 +55 +84 +118 +144 +146 +140 +119 +91 +64 +54 +54 +53 +53 +53 +52 +50 +49 +48 +48 +48 +51 +54 +56 +57 +57 +58 +61 +67 +75 +84 +87 +89 +92 +97 +103 +103 +99 +91 +84 +93 +135 +155 +159 +153 +92 +42 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +68 +85 +91 +91 +90 +88 +85 +85 +90 +100 +103 +103 +101 +97 +91 +74 +53 +33 +17 +9 +6 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +27 +59 +75 +74 +70 +67 +67 +80 +95 +104 +108 +109 +109 +108 +108 +107 +106 +104 +102 +101 +100 +99 +96 +91 +82 +72 +62 +51 +46 +43 +40 +38 +37 +37 +37 +38 +38 +38 +38 +38 +38 +37 +36 +35 +35 +35 +36 +38 +40 +41 +43 +43 +43 +43 +43 +44 +46 +52 +58 +64 +71 +75 +80 +83 +89 +94 +98 +99 +100 +100 +100 +100 +101 +99 +96 +93 +89 +84 +66 +39 +15 +7 +12 +38 +67 +89 +95 +94 +85 +75 +68 +67 +72 +107 +153 +193 +207 +199 +185 +167 +143 +114 +75 +61 +54 +51 +50 +49 +49 +49 +49 +49 +50 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +51 +52 +53 +53 +52 +52 +52 +51 +51 +52 +52 +52 +52 +50 +46 +43 +42 +41 +41 +42 +42 +42 +42 +43 +43 +44 +45 +46 +47 +47 +47 +47 +48 +48 +48 +48 +49 +49 +50 +52 +54 +55 +55 +51 +42 +35 +31 +30 +31 +35 +39 +42 +43 +45 +54 +83 +117 +143 +146 +141 +121 +93 +66 +55 +54 +53 +53 +53 +52 +51 +49 +48 +48 +49 +51 +54 +57 +57 +58 +58 +61 +67 +76 +83 +85 +87 +89 +94 +102 +103 +100 +94 +84 +89 +126 +150 +161 +157 +110 +55 +21 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +67 +84 +90 +91 +90 +89 +82 +79 +81 +89 +94 +95 +91 +84 +75 +51 +33 +20 +11 +7 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +17 +40 +70 +77 +72 +68 +66 +67 +80 +94 +103 +108 +109 +108 +108 +108 +107 +105 +103 +101 +99 +95 +90 +79 +70 +61 +53 +46 +41 +40 +39 +39 +40 +41 +42 +43 +44 +44 +45 +45 +44 +43 +42 +40 +38 +37 +36 +35 +37 +38 +40 +41 +42 +42 +42 +42 +42 +42 +44 +48 +52 +57 +63 +69 +74 +80 +87 +94 +98 +99 +99 +99 +99 +100 +100 +99 +96 +93 +90 +80 +56 +30 +11 +11 +27 +55 +82 +94 +94 +88 +79 +70 +66 +69 +92 +137 +181 +205 +203 +191 +174 +152 +123 +82 +65 +55 +52 +50 +49 +49 +49 +49 +49 +50 +51 +52 +52 +52 +52 +52 +51 +51 +50 +50 +50 +51 +52 +53 +53 +53 +52 +52 +51 +51 +52 +52 +52 +52 +52 +50 +47 +45 +43 +42 +43 +43 +43 +44 +44 +45 +45 +46 +46 +47 +47 +47 +47 +48 +48 +48 +49 +49 +50 +51 +54 +55 +56 +56 +51 +42 +35 +31 +31 +32 +36 +39 +42 +43 +45 +55 +83 +117 +143 +145 +141 +121 +94 +66 +55 +54 +53 +53 +53 +52 +51 +50 +49 +49 +49 +52 +55 +57 +58 +58 +58 +62 +68 +76 +82 +84 +85 +87 +91 +100 +102 +101 +96 +85 +87 +117 +144 +161 +160 +126 +69 +29 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +67 +84 +90 +90 +90 +89 +81 +74 +71 +75 +80 +80 +74 +65 +53 +28 +17 +11 +8 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +27 +53 +75 +77 +70 +66 +65 +66 +80 +93 +101 +106 +107 +107 +107 +106 +104 +102 +98 +94 +89 +82 +72 +58 +50 +44 +41 +40 +40 +41 +42 +43 +44 +47 +48 +49 +49 +50 +50 +50 +50 +49 +48 +45 +43 +40 +38 +36 +36 +37 +38 +39 +41 +41 +41 +41 +41 +41 +41 +42 +43 +45 +49 +57 +62 +69 +76 +85 +94 +97 +98 +99 +99 +99 +100 +100 +99 +96 +93 +89 +73 +48 +18 +12 +19 +44 +72 +92 +93 +91 +82 +72 +66 +67 +81 +119 +166 +202 +205 +195 +181 +160 +132 +90 +69 +58 +52 +50 +49 +49 +49 +49 +49 +50 +51 +52 +52 +53 +53 +53 +52 +51 +51 +51 +51 +51 +52 +53 +53 +53 +53 +52 +52 +51 +51 +52 +52 +52 +52 +52 +51 +49 +47 +45 +44 +44 +44 +45 +45 +46 +46 +46 +47 +47 +47 +48 +48 +48 +49 +49 +50 +50 +51 +54 +56 +57 +57 +57 +51 +41 +35 +32 +32 +33 +37 +40 +43 +44 +46 +58 +86 +119 +143 +145 +140 +120 +93 +66 +55 +54 +54 +53 +53 +52 +51 +50 +49 +49 +50 +53 +56 +58 +58 +58 +59 +62 +68 +77 +81 +82 +83 +84 +87 +98 +101 +101 +97 +87 +86 +109 +138 +160 +161 +139 +83 +39 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +66 +83 +89 +90 +90 +89 +81 +71 +64 +62 +63 +58 +50 +39 +26 +17 +14 +10 +7 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +12 +37 +63 +78 +77 +68 +65 +64 +65 +78 +90 +98 +103 +105 +105 +103 +102 +99 +95 +86 +76 +66 +56 +48 +43 +42 +41 +41 +41 +45 +46 +48 +49 +49 +49 +50 +50 +50 +51 +51 +52 +52 +52 +52 +50 +48 +45 +42 +39 +36 +36 +37 +38 +40 +40 +41 +41 +41 +41 +41 +41 +41 +41 +42 +44 +47 +53 +60 +69 +84 +92 +96 +98 +98 +99 +99 +100 +99 +99 +96 +94 +87 +68 +32 +15 +17 +33 +59 +87 +93 +92 +85 +76 +67 +66 +73 +103 +146 +195 +205 +200 +188 +169 +143 +99 +75 +61 +53 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +54 +54 +54 +53 +52 +51 +51 +51 +51 +52 +53 +53 +53 +53 +53 +52 +51 +51 +51 +52 +52 +53 +53 +52 +52 +50 +48 +47 +46 +46 +46 +46 +46 +46 +47 +47 +48 +48 +48 +48 +49 +50 +50 +51 +52 +53 +56 +58 +58 +58 +57 +48 +39 +34 +32 +32 +34 +38 +41 +43 +44 +47 +61 +91 +122 +143 +144 +138 +118 +91 +66 +55 +54 +54 +53 +53 +53 +51 +50 +50 +50 +51 +54 +57 +58 +58 +58 +59 +62 +69 +77 +80 +80 +81 +82 +84 +95 +100 +101 +98 +89 +86 +102 +132 +158 +162 +149 +97 +49 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +66 +82 +88 +89 +89 +90 +87 +74 +60 +53 +49 +41 +35 +30 +24 +17 +14 +9 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +22 +50 +74 +80 +75 +67 +63 +63 +63 +71 +79 +84 +87 +88 +87 +81 +76 +70 +62 +53 +48 +45 +44 +43 +43 +44 +45 +47 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +51 +52 +52 +53 +54 +54 +54 +54 +52 +49 +46 +41 +38 +36 +36 +37 +39 +39 +40 +40 +40 +40 +40 +40 +40 +41 +41 +42 +43 +45 +48 +60 +75 +87 +95 +98 +99 +99 +99 +100 +99 +98 +97 +95 +85 +64 +23 +20 +25 +42 +74 +92 +92 +89 +82 +70 +66 +68 +85 +119 +175 +206 +204 +195 +180 +158 +114 +86 +67 +56 +51 +50 +49 +49 +49 +48 +49 +51 +52 +53 +54 +55 +55 +55 +54 +53 +52 +52 +52 +52 +53 +54 +54 +54 +53 +53 +52 +51 +51 +51 +51 +52 +52 +53 +53 +53 +53 +52 +51 +50 +49 +49 +48 +48 +48 +48 +49 +49 +49 +50 +51 +52 +52 +53 +54 +56 +59 +59 +59 +57 +53 +43 +37 +34 +34 +34 +37 +41 +43 +45 +45 +50 +70 +101 +129 +144 +144 +134 +112 +85 +63 +55 +54 +54 +54 +54 +53 +52 +51 +51 +51 +52 +56 +58 +58 +59 +59 +59 +63 +70 +77 +78 +78 +78 +78 +80 +91 +98 +100 +98 +91 +85 +95 +124 +154 +162 +156 +114 +65 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +65 +81 +87 +88 +88 +90 +88 +79 +66 +54 +49 +42 +37 +32 +27 +19 +15 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +33 +59 +78 +81 +74 +66 +62 +61 +61 +65 +69 +72 +72 +71 +68 +62 +58 +54 +50 +47 +45 +44 +44 +45 +46 +47 +48 +48 +49 +49 +48 +48 +48 +48 +48 +48 +48 +49 +50 +51 +52 +53 +55 +56 +57 +57 +55 +53 +50 +46 +42 +39 +37 +36 +37 +38 +38 +39 +39 +40 +40 +40 +40 +40 +41 +41 +41 +42 +43 +48 +56 +68 +82 +93 +98 +99 +99 +100 +100 +99 +98 +97 +92 +82 +39 +27 +25 +35 +59 +88 +91 +90 +85 +74 +66 +67 +76 +102 +154 +200 +204 +200 +188 +169 +127 +96 +74 +59 +52 +50 +49 +49 +49 +48 +49 +50 +52 +53 +55 +56 +56 +56 +56 +55 +53 +53 +53 +53 +53 +54 +54 +54 +54 +53 +52 +51 +51 +51 +51 +51 +52 +52 +53 +53 +53 +53 +53 +52 +52 +51 +51 +51 +51 +51 +51 +51 +52 +52 +53 +53 +54 +55 +56 +58 +59 +59 +58 +55 +49 +39 +36 +35 +35 +36 +40 +43 +44 +45 +46 +54 +80 +110 +135 +144 +143 +129 +105 +80 +61 +55 +54 +54 +54 +54 +53 +52 +52 +52 +52 +54 +57 +58 +59 +59 +59 +59 +64 +70 +77 +77 +76 +75 +76 +77 +88 +96 +99 +98 +92 +85 +92 +120 +150 +163 +159 +125 +76 +31 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +65 +80 +86 +87 +87 +89 +89 +84 +73 +59 +52 +47 +41 +36 +32 +22 +16 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +43 +67 +81 +82 +73 +65 +61 +60 +59 +60 +61 +61 +60 +58 +55 +51 +49 +47 +45 +45 +45 +45 +46 +47 +48 +48 +49 +49 +48 +48 +48 +48 +48 +47 +47 +47 +48 +48 +49 +51 +52 +54 +55 +57 +58 +59 +59 +57 +55 +50 +46 +43 +40 +37 +37 +37 +38 +38 +39 +39 +39 +39 +40 +40 +40 +40 +40 +41 +41 +43 +46 +54 +65 +80 +93 +97 +99 +99 +100 +99 +98 +98 +96 +92 +59 +36 +28 +32 +46 +82 +88 +90 +87 +79 +67 +66 +70 +88 +129 +191 +202 +202 +195 +179 +141 +108 +82 +64 +54 +50 +50 +49 +49 +48 +49 +50 +51 +53 +55 +57 +57 +57 +57 +57 +55 +54 +54 +54 +54 +54 +54 +54 +54 +54 +53 +52 +51 +51 +51 +51 +51 +52 +52 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +54 +54 +55 +56 +57 +58 +59 +60 +58 +55 +50 +44 +37 +36 +36 +36 +38 +42 +44 +45 +46 +48 +63 +92 +119 +139 +144 +141 +122 +97 +74 +59 +55 +54 +54 +54 +54 +53 +52 +52 +52 +53 +56 +58 +59 +59 +59 +59 +60 +65 +71 +76 +76 +74 +74 +73 +74 +85 +94 +98 +97 +93 +85 +90 +115 +145 +163 +161 +135 +88 +39 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +64 +79 +85 +86 +86 +89 +89 +87 +80 +66 +57 +53 +48 +43 +39 +27 +17 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +22 +53 +74 +83 +83 +72 +65 +61 +59 +57 +56 +55 +54 +52 +50 +48 +46 +46 +45 +45 +45 +46 +47 +48 +48 +49 +49 +49 +49 +49 +49 +48 +48 +47 +47 +47 +47 +48 +48 +49 +52 +54 +55 +57 +58 +60 +61 +61 +61 +59 +54 +50 +47 +43 +40 +37 +37 +37 +38 +38 +39 +39 +39 +39 +39 +39 +39 +39 +40 +40 +41 +42 +44 +50 +62 +82 +92 +97 +99 +99 +99 +99 +98 +98 +96 +78 +49 +35 +32 +38 +72 +85 +89 +88 +83 +69 +66 +67 +78 +105 +176 +197 +204 +200 +189 +155 +122 +93 +70 +57 +51 +50 +49 +49 +48 +48 +49 +51 +53 +55 +58 +58 +59 +58 +58 +57 +56 +55 +55 +55 +55 +55 +55 +55 +55 +54 +52 +51 +51 +51 +50 +51 +51 +51 +52 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +54 +55 +55 +55 +56 +58 +59 +59 +60 +59 +56 +51 +45 +40 +36 +36 +37 +38 +41 +44 +45 +46 +48 +52 +75 +105 +128 +142 +144 +137 +113 +88 +68 +57 +55 +54 +54 +54 +54 +53 +53 +53 +53 +54 +58 +59 +60 +60 +59 +59 +60 +65 +71 +76 +76 +73 +72 +71 +72 +82 +93 +97 +97 +93 +85 +88 +111 +141 +163 +162 +143 +98 +48 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +62 +78 +83 +84 +85 +87 +89 +89 +85 +76 +64 +60 +56 +52 +45 +33 +19 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +30 +62 +79 +85 +84 +71 +65 +61 +59 +56 +52 +51 +49 +47 +46 +46 +45 +45 +45 +45 +47 +48 +48 +49 +49 +50 +51 +51 +51 +51 +49 +49 +48 +47 +47 +47 +47 +48 +49 +50 +54 +57 +59 +60 +61 +62 +62 +63 +63 +62 +60 +55 +50 +46 +44 +40 +38 +38 +38 +38 +39 +39 +38 +38 +37 +37 +37 +38 +38 +39 +40 +41 +42 +43 +45 +63 +81 +92 +97 +99 +99 +99 +99 +98 +98 +91 +63 +44 +34 +35 +60 +80 +88 +89 +87 +73 +67 +66 +71 +85 +156 +190 +203 +203 +197 +169 +136 +105 +79 +61 +52 +50 +49 +49 +48 +48 +49 +50 +52 +54 +58 +59 +60 +60 +59 +58 +57 +57 +56 +56 +55 +55 +55 +55 +55 +54 +53 +52 +51 +51 +50 +50 +50 +50 +51 +52 +52 +53 +53 +53 +54 +54 +54 +55 +55 +55 +55 +55 +56 +57 +58 +59 +59 +59 +59 +56 +51 +45 +41 +38 +37 +37 +39 +41 +44 +46 +46 +47 +51 +59 +90 +119 +136 +144 +143 +130 +102 +79 +62 +55 +55 +54 +54 +54 +54 +54 +54 +54 +54 +56 +59 +60 +60 +60 +59 +59 +61 +66 +72 +75 +75 +72 +70 +70 +70 +80 +91 +96 +97 +94 +85 +87 +108 +136 +163 +163 +150 +108 +57 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +60 +75 +81 +82 +82 +85 +88 +89 +88 +83 +72 +66 +62 +58 +52 +39 +21 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +43 +72 +84 +86 +85 +71 +65 +62 +59 +56 +50 +48 +47 +46 +46 +46 +46 +46 +46 +47 +49 +49 +50 +51 +51 +52 +52 +52 +52 +51 +48 +47 +47 +47 +47 +48 +50 +52 +55 +58 +60 +61 +61 +62 +62 +63 +63 +64 +64 +64 +63 +61 +57 +51 +47 +44 +42 +41 +41 +40 +39 +39 +38 +38 +37 +37 +37 +37 +38 +38 +39 +40 +41 +42 +42 +44 +55 +72 +88 +97 +98 +98 +99 +98 +98 +96 +82 +59 +41 +38 +47 +71 +84 +88 +88 +80 +70 +66 +67 +72 +120 +169 +196 +206 +204 +186 +157 +125 +95 +71 +55 +52 +50 +49 +49 +48 +48 +49 +51 +53 +57 +59 +60 +61 +61 +60 +60 +59 +58 +57 +57 +57 +57 +56 +56 +55 +54 +53 +52 +51 +50 +50 +49 +49 +49 +49 +50 +50 +51 +52 +52 +53 +53 +53 +54 +55 +55 +56 +57 +57 +58 +58 +58 +57 +53 +47 +43 +40 +39 +38 +39 +41 +43 +45 +46 +47 +48 +51 +61 +78 +112 +133 +142 +143 +139 +112 +86 +68 +57 +55 +55 +55 +55 +54 +54 +54 +55 +55 +56 +59 +61 +61 +61 +60 +60 +60 +62 +67 +73 +75 +74 +70 +69 +68 +69 +77 +89 +95 +96 +94 +85 +86 +104 +131 +162 +164 +156 +119 +69 +21 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +57 +73 +79 +80 +80 +82 +86 +88 +88 +86 +78 +73 +69 +65 +59 +45 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +14 +52 +77 +86 +87 +85 +71 +65 +62 +60 +56 +50 +48 +46 +46 +45 +46 +46 +47 +48 +49 +50 +50 +51 +51 +52 +52 +51 +51 +49 +48 +47 +46 +47 +48 +49 +53 +55 +57 +58 +59 +60 +61 +61 +62 +62 +63 +63 +63 +63 +63 +63 +63 +60 +57 +52 +46 +44 +43 +42 +41 +40 +40 +39 +38 +37 +37 +37 +38 +38 +38 +39 +40 +41 +41 +42 +42 +46 +55 +69 +88 +97 +98 +98 +98 +98 +97 +90 +70 +50 +40 +44 +63 +78 +87 +88 +83 +73 +67 +66 +68 +98 +149 +184 +202 +206 +196 +172 +142 +110 +82 +60 +54 +51 +49 +49 +48 +48 +49 +50 +52 +56 +58 +60 +61 +62 +62 +61 +60 +60 +59 +58 +58 +58 +58 +57 +57 +55 +54 +52 +51 +50 +49 +49 +49 +48 +48 +49 +49 +50 +50 +51 +51 +52 +52 +53 +54 +54 +55 +56 +56 +56 +55 +52 +49 +46 +43 +41 +40 +40 +40 +42 +44 +45 +46 +47 +48 +51 +60 +76 +97 +127 +138 +142 +138 +129 +96 +75 +62 +56 +55 +55 +55 +55 +55 +55 +55 +56 +57 +58 +60 +62 +62 +61 +60 +60 +60 +62 +68 +73 +74 +73 +70 +68 +68 +68 +76 +88 +94 +95 +93 +84 +86 +102 +128 +161 +165 +159 +126 +79 +27 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +55 +71 +77 +78 +77 +78 +85 +88 +88 +87 +81 +77 +74 +70 +65 +48 +26 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +60 +80 +88 +89 +86 +72 +66 +63 +61 +58 +51 +48 +46 +45 +45 +46 +46 +47 +48 +50 +50 +51 +51 +51 +51 +51 +50 +49 +47 +46 +46 +48 +49 +51 +54 +56 +58 +59 +59 +60 +60 +60 +60 +60 +60 +60 +60 +60 +61 +61 +62 +62 +61 +59 +55 +50 +47 +45 +43 +42 +41 +40 +39 +38 +38 +38 +38 +39 +40 +40 +40 +40 +41 +41 +42 +42 +43 +46 +55 +70 +90 +96 +98 +98 +98 +98 +94 +79 +60 +43 +44 +56 +72 +85 +87 +85 +77 +69 +65 +65 +82 +127 +167 +196 +206 +203 +185 +159 +128 +96 +68 +58 +52 +50 +49 +48 +48 +48 +49 +50 +54 +57 +59 +61 +62 +63 +62 +62 +61 +60 +59 +59 +59 +59 +59 +58 +57 +55 +54 +52 +50 +49 +49 +48 +47 +47 +47 +47 +48 +48 +49 +49 +50 +51 +51 +52 +52 +53 +52 +52 +50 +49 +46 +44 +43 +41 +41 +41 +42 +43 +44 +46 +46 +47 +48 +50 +59 +75 +94 +115 +136 +140 +138 +130 +113 +81 +66 +58 +55 +55 +55 +55 +55 +55 +56 +56 +57 +59 +60 +62 +62 +62 +61 +60 +60 +60 +63 +69 +73 +74 +72 +69 +68 +68 +68 +75 +87 +93 +94 +93 +84 +85 +100 +125 +160 +166 +161 +133 +88 +33 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +52 +68 +74 +75 +74 +75 +82 +87 +88 +88 +84 +81 +77 +73 +68 +48 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +23 +66 +83 +90 +90 +87 +73 +66 +63 +62 +60 +53 +48 +46 +46 +45 +46 +46 +47 +48 +49 +50 +50 +51 +50 +50 +49 +47 +47 +46 +47 +48 +51 +53 +56 +57 +58 +58 +58 +58 +58 +57 +56 +55 +55 +54 +54 +54 +55 +55 +56 +58 +59 +59 +59 +57 +53 +49 +46 +44 +43 +42 +41 +40 +39 +39 +39 +40 +41 +42 +42 +42 +42 +42 +42 +43 +43 +42 +43 +45 +52 +77 +90 +96 +98 +98 +98 +97 +86 +69 +48 +45 +52 +67 +81 +87 +86 +80 +72 +66 +64 +71 +104 +147 +185 +204 +207 +196 +175 +146 +113 +78 +64 +55 +51 +50 +49 +48 +48 +48 +49 +52 +55 +58 +61 +62 +63 +63 +63 +62 +62 +61 +60 +60 +60 +60 +59 +58 +57 +55 +54 +51 +50 +49 +48 +47 +46 +46 +45 +45 +46 +46 +47 +47 +48 +48 +48 +48 +48 +47 +46 +45 +43 +42 +42 +42 +41 +42 +43 +44 +45 +46 +47 +47 +48 +50 +58 +75 +94 +113 +130 +140 +138 +131 +117 +95 +68 +59 +56 +55 +55 +55 +56 +56 +56 +57 +58 +59 +61 +62 +63 +63 +62 +61 +60 +60 +60 +64 +69 +73 +73 +71 +69 +68 +68 +68 +75 +86 +92 +94 +92 +84 +84 +98 +123 +159 +167 +163 +138 +96 +40 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +49 +64 +70 +71 +71 +72 +79 +85 +88 +88 +85 +82 +79 +74 +67 +45 +22 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +26 +72 +86 +91 +91 +88 +74 +67 +64 +63 +61 +55 +50 +47 +46 +45 +46 +46 +47 +48 +49 +50 +49 +49 +48 +47 +46 +46 +46 +47 +50 +54 +56 +57 +58 +58 +58 +57 +55 +54 +52 +49 +48 +47 +47 +46 +46 +46 +47 +47 +48 +51 +52 +54 +56 +56 +55 +51 +48 +46 +44 +43 +42 +41 +40 +40 +40 +42 +43 +44 +44 +44 +44 +45 +45 +45 +44 +43 +43 +43 +44 +57 +78 +91 +97 +98 +98 +97 +91 +77 +54 +46 +49 +62 +77 +86 +86 +83 +75 +67 +63 +66 +84 +123 +167 +200 +208 +203 +189 +165 +133 +92 +72 +60 +53 +50 +49 +49 +48 +48 +48 +50 +53 +56 +60 +62 +63 +64 +64 +63 +63 +62 +61 +61 +61 +60 +60 +59 +58 +57 +55 +53 +51 +49 +48 +47 +45 +44 +44 +43 +42 +42 +42 +42 +42 +42 +42 +42 +41 +41 +41 +41 +41 +41 +41 +42 +43 +44 +45 +46 +47 +47 +48 +48 +50 +54 +75 +97 +115 +129 +138 +139 +132 +118 +99 +76 +59 +56 +55 +55 +56 +56 +56 +57 +58 +59 +60 +61 +63 +63 +63 +63 +63 +61 +60 +60 +61 +66 +70 +73 +73 +70 +68 +68 +68 +68 +74 +85 +91 +93 +91 +83 +84 +96 +121 +158 +168 +165 +143 +104 +47 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +46 +58 +64 +65 +65 +66 +74 +81 +86 +87 +85 +81 +77 +69 +58 +35 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +14 +33 +76 +87 +92 +92 +90 +76 +68 +64 +63 +63 +59 +54 +49 +46 +45 +45 +45 +46 +46 +46 +46 +46 +46 +46 +46 +47 +50 +53 +55 +57 +58 +57 +57 +55 +52 +49 +47 +45 +44 +43 +43 +42 +42 +42 +43 +43 +43 +43 +43 +43 +44 +45 +46 +47 +47 +48 +48 +48 +46 +45 +43 +43 +42 +42 +42 +43 +43 +44 +44 +44 +44 +45 +46 +48 +52 +51 +49 +46 +43 +43 +44 +57 +75 +90 +97 +98 +98 +94 +83 +60 +47 +48 +58 +71 +85 +86 +85 +79 +71 +64 +63 +70 +96 +134 +178 +207 +208 +202 +187 +161 +118 +91 +71 +59 +52 +49 +49 +49 +48 +48 +48 +50 +53 +56 +59 +63 +64 +64 +64 +64 +64 +63 +63 +63 +62 +62 +61 +60 +58 +56 +54 +52 +50 +49 +47 +45 +44 +43 +42 +42 +41 +40 +40 +40 +40 +40 +40 +40 +40 +41 +42 +42 +44 +45 +46 +47 +47 +47 +47 +48 +49 +50 +54 +64 +82 +110 +124 +133 +137 +138 +128 +112 +93 +75 +60 +56 +55 +56 +56 +56 +57 +58 +59 +60 +61 +63 +64 +64 +64 +64 +64 +62 +61 +60 +60 +62 +67 +71 +73 +73 +69 +68 +68 +68 +68 +74 +84 +90 +91 +90 +83 +83 +95 +119 +157 +169 +166 +149 +113 +56 +10 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +43 +53 +58 +60 +60 +60 +66 +75 +81 +83 +82 +78 +71 +61 +48 +25 +11 +3 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +16 +37 +79 +88 +92 +92 +91 +79 +69 +64 +63 +63 +61 +58 +54 +49 +47 +46 +46 +46 +46 +46 +46 +46 +47 +48 +51 +54 +56 +57 +57 +57 +54 +51 +49 +47 +45 +44 +43 +42 +42 +42 +42 +42 +42 +42 +42 +42 +43 +43 +43 +43 +44 +44 +45 +45 +46 +46 +46 +45 +45 +44 +43 +43 +43 +43 +43 +44 +44 +44 +45 +45 +45 +45 +46 +49 +55 +58 +57 +53 +48 +44 +43 +48 +62 +80 +94 +98 +97 +94 +84 +63 +47 +48 +56 +68 +83 +86 +85 +81 +74 +66 +62 +66 +81 +110 +155 +195 +205 +207 +198 +180 +140 +110 +86 +68 +57 +51 +50 +49 +48 +48 +48 +48 +50 +52 +55 +59 +62 +63 +64 +65 +64 +64 +64 +64 +64 +64 +63 +62 +61 +59 +56 +54 +52 +50 +48 +46 +45 +44 +43 +42 +41 +41 +41 +41 +41 +41 +42 +43 +44 +45 +46 +46 +47 +47 +47 +48 +48 +48 +48 +49 +52 +60 +73 +90 +109 +128 +133 +136 +136 +130 +109 +91 +75 +63 +57 +55 +56 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +65 +64 +64 +63 +62 +61 +61 +61 +63 +69 +72 +73 +72 +69 +68 +68 +68 +69 +74 +84 +89 +91 +89 +82 +82 +94 +118 +156 +169 +167 +152 +118 +62 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +41 +48 +52 +53 +53 +51 +56 +63 +70 +73 +72 +67 +59 +48 +35 +14 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +39 +81 +89 +93 +93 +91 +81 +70 +65 +63 +63 +63 +61 +58 +55 +52 +49 +48 +48 +48 +49 +50 +51 +53 +54 +56 +57 +56 +55 +53 +50 +47 +46 +44 +43 +42 +42 +41 +41 +41 +41 +42 +42 +42 +42 +42 +42 +43 +43 +43 +43 +43 +44 +44 +45 +45 +45 +45 +45 +44 +44 +44 +44 +44 +44 +44 +44 +45 +45 +45 +45 +46 +47 +49 +52 +58 +65 +65 +63 +57 +49 +44 +45 +53 +67 +87 +96 +96 +94 +85 +64 +47 +48 +54 +66 +81 +86 +86 +83 +77 +69 +63 +63 +71 +91 +129 +178 +198 +207 +206 +196 +163 +132 +104 +81 +64 +54 +51 +50 +49 +48 +48 +48 +48 +50 +52 +56 +59 +61 +63 +64 +64 +64 +64 +64 +64 +64 +64 +64 +63 +62 +59 +58 +56 +54 +52 +50 +48 +47 +46 +45 +45 +44 +44 +44 +45 +45 +46 +46 +47 +47 +48 +48 +48 +48 +48 +48 +48 +49 +51 +56 +67 +83 +99 +114 +127 +136 +136 +133 +125 +112 +89 +74 +64 +57 +55 +56 +57 +57 +58 +59 +61 +62 +63 +64 +65 +65 +65 +65 +64 +64 +63 +62 +61 +61 +61 +65 +70 +72 +73 +72 +68 +68 +68 +68 +69 +73 +83 +88 +89 +88 +81 +82 +93 +118 +156 +170 +168 +155 +124 +68 +14 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +40 +43 +45 +46 +46 +42 +43 +47 +51 +53 +53 +48 +40 +30 +20 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +19 +42 +83 +90 +93 +93 +91 +83 +72 +65 +62 +62 +63 +63 +62 +60 +58 +54 +53 +53 +53 +53 +55 +57 +58 +58 +57 +55 +52 +49 +46 +44 +42 +42 +41 +41 +41 +41 +41 +41 +41 +41 +42 +42 +42 +42 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +45 +45 +45 +45 +45 +44 +44 +44 +44 +45 +45 +45 +45 +46 +47 +48 +49 +53 +56 +60 +65 +73 +73 +72 +68 +59 +46 +45 +47 +56 +74 +92 +93 +92 +83 +63 +47 +47 +53 +64 +80 +86 +86 +84 +79 +72 +64 +62 +65 +77 +103 +156 +184 +202 +209 +206 +184 +156 +126 +99 +76 +59 +54 +51 +50 +49 +48 +48 +48 +48 +49 +52 +55 +57 +60 +62 +63 +64 +64 +64 +64 +64 +64 +64 +64 +63 +62 +60 +59 +57 +56 +54 +52 +51 +50 +50 +49 +49 +49 +49 +49 +50 +49 +49 +49 +49 +49 +49 +48 +49 +49 +49 +52 +55 +62 +72 +92 +109 +122 +132 +136 +137 +132 +122 +107 +90 +70 +62 +58 +56 +56 +57 +58 +59 +60 +61 +63 +64 +65 +66 +66 +66 +65 +65 +64 +64 +63 +61 +61 +61 +61 +67 +71 +72 +72 +71 +68 +68 +68 +69 +69 +73 +82 +87 +88 +87 +81 +81 +93 +117 +156 +170 +169 +157 +128 +74 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +38 +39 +39 +39 +39 +31 +29 +27 +26 +24 +22 +17 +12 +7 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +8 +21 +46 +84 +91 +93 +93 +91 +85 +75 +67 +61 +61 +61 +62 +62 +62 +61 +60 +60 +59 +59 +59 +59 +59 +58 +55 +50 +45 +43 +42 +42 +41 +41 +41 +41 +41 +41 +41 +41 +41 +42 +42 +42 +43 +43 +44 +44 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +46 +46 +46 +46 +46 +46 +47 +47 +48 +50 +52 +56 +62 +68 +75 +79 +82 +83 +82 +80 +74 +52 +47 +46 +49 +57 +82 +87 +86 +78 +59 +45 +46 +52 +63 +79 +86 +86 +85 +81 +75 +67 +63 +63 +68 +81 +129 +165 +191 +206 +212 +202 +179 +151 +121 +93 +68 +59 +54 +51 +50 +49 +48 +48 +48 +48 +49 +50 +52 +55 +58 +61 +62 +63 +64 +64 +64 +64 +64 +64 +63 +62 +61 +61 +60 +59 +57 +56 +56 +55 +54 +53 +53 +52 +52 +51 +51 +50 +50 +49 +49 +49 +49 +49 +49 +50 +52 +59 +70 +84 +101 +123 +131 +135 +136 +137 +133 +119 +102 +84 +68 +59 +57 +56 +57 +57 +59 +60 +61 +62 +63 +65 +66 +67 +67 +67 +66 +65 +65 +64 +64 +62 +61 +61 +61 +62 +69 +72 +73 +72 +70 +68 +68 +68 +69 +70 +73 +81 +86 +87 +86 +80 +81 +93 +117 +156 +171 +169 +160 +132 +79 +20 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +37 +36 +34 +32 +30 +25 +22 +18 +15 +13 +8 +7 +5 +3 +3 +2 +2 +1 +1 +1 +1 +1 +2 +2 +3 +3 +5 +11 +24 +47 +85 +91 +93 +93 +92 +86 +77 +68 +61 +57 +58 +59 +61 +61 +61 +61 +60 +59 +58 +56 +49 +44 +42 +42 +42 +41 +41 +41 +41 +40 +40 +41 +41 +41 +41 +42 +43 +45 +46 +48 +50 +52 +54 +55 +56 +58 +58 +58 +58 +58 +58 +57 +56 +55 +53 +52 +51 +51 +50 +50 +50 +50 +51 +52 +53 +56 +59 +62 +66 +71 +80 +86 +92 +98 +105 +106 +103 +99 +95 +92 +73 +56 +48 +47 +49 +59 +66 +67 +63 +52 +44 +44 +51 +63 +79 +87 +87 +85 +82 +78 +70 +65 +62 +62 +65 +94 +131 +165 +191 +207 +212 +202 +184 +158 +129 +93 +74 +61 +54 +51 +49 +49 +48 +48 +48 +48 +48 +48 +49 +50 +52 +54 +56 +57 +59 +60 +61 +61 +62 +62 +61 +61 +60 +59 +58 +57 +56 +56 +55 +54 +53 +52 +52 +51 +50 +50 +49 +49 +49 +49 +49 +50 +52 +57 +64 +81 +97 +112 +125 +133 +135 +136 +136 +132 +124 +101 +83 +71 +63 +59 +57 +57 +58 +59 +60 +61 +63 +64 +65 +67 +68 +68 +68 +67 +67 +66 +65 +65 +64 +63 +62 +61 +61 +62 +65 +71 +72 +72 +72 +70 +68 +68 +69 +70 +71 +73 +80 +84 +86 +85 +80 +80 +92 +117 +156 +171 +170 +162 +137 +86 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +37 +35 +33 +30 +28 +24 +21 +18 +14 +12 +9 +8 +7 +6 +5 +4 +3 +3 +2 +2 +2 +2 +2 +3 +3 +4 +5 +11 +24 +47 +84 +90 +93 +93 +92 +87 +78 +69 +61 +56 +54 +55 +56 +57 +57 +55 +54 +51 +49 +47 +45 +44 +43 +43 +42 +40 +40 +40 +40 +40 +42 +43 +45 +47 +49 +53 +55 +58 +60 +62 +65 +67 +69 +70 +72 +73 +74 +75 +75 +76 +76 +75 +75 +75 +74 +73 +72 +71 +71 +70 +71 +71 +73 +74 +77 +80 +84 +89 +94 +99 +107 +112 +117 +121 +124 +125 +123 +118 +111 +105 +91 +69 +55 +48 +48 +51 +53 +52 +49 +43 +41 +42 +51 +65 +80 +87 +87 +86 +83 +79 +72 +68 +64 +61 +61 +74 +104 +138 +170 +195 +210 +208 +199 +182 +158 +121 +96 +77 +64 +56 +52 +51 +50 +49 +49 +48 +48 +48 +48 +49 +50 +50 +51 +52 +53 +55 +55 +56 +56 +56 +56 +56 +56 +55 +54 +54 +53 +52 +52 +51 +50 +50 +50 +49 +49 +49 +49 +50 +51 +52 +58 +65 +74 +86 +100 +116 +124 +130 +133 +136 +135 +130 +121 +109 +93 +76 +68 +63 +59 +58 +58 +59 +60 +61 +62 +64 +66 +67 +68 +68 +69 +68 +68 +67 +67 +66 +65 +64 +64 +63 +62 +62 +62 +64 +67 +72 +72 +72 +71 +69 +69 +69 +70 +71 +71 +73 +79 +83 +85 +84 +79 +80 +92 +117 +157 +172 +171 +163 +140 +91 +26 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +37 +35 +32 +29 +27 +23 +21 +19 +17 +16 +14 +13 +12 +11 +10 +7 +6 +5 +4 +3 +3 +3 +3 +3 +3 +4 +6 +13 +26 +49 +83 +90 +93 +93 +92 +88 +80 +71 +62 +55 +52 +51 +51 +52 +52 +52 +51 +51 +50 +49 +47 +44 +41 +40 +39 +39 +40 +41 +43 +46 +49 +53 +56 +59 +61 +65 +67 +70 +72 +74 +77 +78 +80 +82 +83 +85 +86 +87 +88 +89 +90 +90 +91 +92 +92 +92 +93 +93 +93 +94 +95 +97 +99 +101 +104 +109 +113 +117 +122 +127 +133 +136 +139 +141 +143 +142 +141 +136 +129 +121 +109 +86 +66 +52 +49 +48 +47 +44 +40 +38 +38 +41 +52 +67 +81 +87 +88 +86 +84 +80 +74 +70 +66 +63 +59 +64 +82 +110 +143 +175 +202 +208 +207 +198 +183 +150 +124 +101 +82 +67 +56 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +51 +51 +51 +51 +52 +52 +51 +51 +51 +51 +51 +50 +50 +50 +50 +49 +49 +49 +50 +51 +53 +56 +60 +66 +73 +86 +96 +106 +116 +125 +133 +135 +135 +134 +130 +120 +109 +96 +84 +73 +64 +61 +59 +59 +59 +60 +61 +62 +64 +65 +67 +68 +69 +69 +69 +69 +68 +68 +67 +66 +65 +65 +64 +63 +63 +62 +62 +64 +66 +70 +72 +72 +72 +71 +69 +69 +70 +71 +72 +72 +74 +78 +82 +83 +83 +79 +80 +92 +118 +158 +172 +171 +164 +142 +95 +29 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +36 +34 +31 +28 +27 +24 +23 +22 +21 +21 +20 +20 +19 +17 +16 +14 +11 +9 +7 +5 +4 +3 +3 +4 +4 +5 +8 +15 +29 +52 +83 +90 +93 +93 +93 +90 +83 +73 +63 +55 +50 +49 +48 +48 +49 +50 +51 +51 +51 +49 +46 +41 +37 +36 +37 +39 +42 +45 +49 +54 +60 +64 +67 +70 +73 +75 +77 +79 +81 +82 +84 +86 +88 +89 +91 +93 +94 +96 +97 +99 +100 +102 +103 +105 +106 +108 +110 +111 +113 +115 +117 +120 +123 +126 +130 +135 +139 +143 +146 +150 +153 +156 +157 +159 +159 +158 +156 +153 +147 +137 +126 +105 +81 +60 +50 +48 +45 +40 +36 +35 +36 +41 +55 +70 +83 +88 +88 +87 +85 +82 +77 +72 +69 +65 +60 +60 +66 +85 +114 +148 +186 +201 +208 +208 +201 +178 +155 +130 +106 +85 +66 +59 +55 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +50 +50 +51 +52 +54 +56 +59 +63 +70 +77 +85 +94 +105 +119 +127 +134 +137 +138 +136 +133 +128 +122 +113 +95 +82 +72 +66 +62 +60 +60 +59 +60 +61 +62 +64 +65 +67 +68 +70 +70 +70 +70 +70 +69 +68 +68 +67 +66 +65 +65 +64 +63 +63 +63 +64 +66 +68 +71 +72 +72 +71 +70 +69 +69 +71 +73 +73 +74 +74 +78 +81 +82 +81 +79 +80 +92 +119 +160 +172 +172 +165 +144 +100 +31 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +36 +34 +31 +28 +27 +25 +25 +24 +24 +24 +24 +24 +24 +24 +23 +22 +20 +17 +13 +8 +5 +4 +4 +4 +5 +7 +10 +18 +33 +56 +83 +89 +92 +93 +93 +91 +86 +77 +65 +56 +51 +49 +48 +48 +50 +52 +52 +48 +41 +34 +32 +33 +34 +36 +38 +43 +49 +54 +60 +64 +69 +72 +74 +76 +78 +80 +82 +83 +85 +86 +89 +91 +92 +94 +96 +98 +100 +102 +103 +105 +107 +109 +111 +112 +114 +117 +119 +121 +124 +126 +131 +135 +139 +143 +147 +152 +155 +158 +161 +164 +167 +168 +169 +170 +171 +171 +169 +167 +163 +154 +141 +126 +100 +73 +52 +49 +45 +40 +36 +35 +36 +44 +58 +73 +84 +88 +88 +87 +86 +83 +79 +74 +71 +67 +62 +60 +59 +66 +84 +115 +162 +188 +204 +211 +212 +201 +184 +162 +137 +112 +84 +69 +60 +55 +53 +51 +51 +50 +50 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +49 +49 +49 +50 +50 +51 +52 +53 +55 +60 +66 +74 +84 +95 +110 +121 +130 +136 +140 +141 +142 +141 +140 +137 +131 +120 +106 +92 +78 +67 +64 +62 +61 +60 +60 +60 +61 +62 +63 +66 +68 +69 +70 +71 +71 +71 +71 +70 +70 +69 +68 +68 +67 +66 +65 +65 +64 +64 +64 +64 +66 +68 +71 +72 +72 +72 +71 +70 +70 +70 +73 +74 +75 +75 +75 +77 +79 +81 +80 +78 +79 +93 +120 +161 +173 +172 +166 +146 +103 +34 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +36 +33 +30 +27 +27 +25 +25 +25 +25 +25 +25 +26 +25 +25 +25 +24 +24 +24 +24 +23 +17 +12 +9 +8 +12 +20 +27 +35 +44 +58 +79 +87 +91 +91 +91 +91 +89 +84 +75 +63 +54 +53 +53 +54 +54 +51 +43 +36 +31 +31 +33 +35 +36 +37 +40 +46 +52 +58 +64 +69 +74 +77 +80 +82 +85 +88 +91 +93 +96 +99 +102 +105 +107 +110 +112 +115 +117 +119 +121 +123 +125 +127 +129 +131 +133 +136 +139 +142 +145 +149 +155 +159 +162 +165 +168 +171 +172 +174 +175 +176 +177 +178 +178 +179 +179 +179 +178 +178 +176 +173 +161 +150 +130 +102 +68 +52 +48 +42 +37 +35 +37 +47 +61 +75 +85 +89 +90 +89 +87 +84 +80 +77 +74 +71 +67 +62 +60 +59 +62 +72 +113 +148 +178 +200 +210 +212 +207 +198 +184 +164 +134 +112 +92 +75 +64 +57 +55 +53 +52 +51 +51 +50 +50 +50 +50 +50 +51 +51 +52 +53 +55 +58 +61 +65 +71 +80 +89 +98 +107 +117 +129 +135 +140 +142 +144 +145 +146 +146 +145 +143 +139 +133 +123 +111 +98 +81 +73 +68 +64 +63 +62 +61 +61 +61 +61 +62 +63 +65 +67 +69 +71 +72 +72 +72 +72 +72 +71 +71 +70 +70 +69 +68 +68 +67 +66 +65 +65 +65 +65 +65 +67 +69 +71 +72 +72 +72 +71 +71 +70 +70 +72 +76 +77 +78 +77 +76 +77 +78 +79 +79 +78 +79 +93 +121 +163 +174 +173 +167 +148 +107 +37 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +37 +33 +30 +27 +26 +25 +25 +26 +26 +26 +27 +27 +28 +27 +27 +25 +24 +24 +24 +24 +23 +22 +21 +20 +22 +35 +45 +52 +57 +63 +77 +84 +89 +90 +90 +90 +89 +86 +81 +72 +63 +60 +58 +57 +54 +44 +36 +32 +32 +33 +35 +36 +37 +38 +40 +48 +55 +63 +69 +75 +81 +84 +88 +91 +94 +98 +101 +104 +107 +110 +114 +116 +119 +121 +124 +127 +129 +131 +134 +136 +139 +142 +145 +148 +152 +157 +161 +165 +168 +171 +174 +175 +176 +177 +177 +178 +179 +179 +179 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +179 +173 +164 +150 +126 +92 +59 +51 +45 +41 +38 +39 +47 +61 +75 +86 +91 +91 +91 +89 +86 +81 +77 +75 +73 +70 +66 +62 +60 +59 +62 +80 +109 +140 +170 +195 +209 +210 +207 +201 +193 +175 +157 +139 +121 +104 +87 +78 +71 +67 +64 +62 +62 +63 +64 +66 +70 +74 +79 +85 +91 +99 +106 +112 +118 +123 +128 +131 +135 +138 +141 +143 +144 +144 +144 +143 +139 +134 +127 +120 +112 +100 +92 +85 +79 +74 +68 +65 +63 +62 +62 +61 +61 +62 +63 +64 +66 +68 +70 +71 +72 +73 +73 +73 +73 +73 +72 +72 +71 +71 +70 +69 +68 +68 +67 +67 +66 +66 +67 +67 +68 +70 +71 +72 +72 +72 +72 +71 +71 +71 +71 +74 +79 +80 +80 +79 +77 +77 +78 +78 +78 +77 +79 +94 +123 +165 +174 +173 +168 +150 +110 +39 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +38 +34 +30 +27 +26 +25 +25 +26 +26 +27 +27 +27 +28 +29 +29 +27 +25 +24 +24 +24 +24 +25 +27 +31 +35 +46 +57 +66 +72 +75 +81 +85 +87 +88 +89 +89 +89 +88 +85 +79 +70 +66 +62 +56 +49 +36 +32 +31 +32 +34 +36 +37 +38 +39 +41 +50 +59 +67 +75 +81 +87 +90 +94 +98 +101 +105 +109 +112 +115 +118 +121 +124 +126 +129 +131 +135 +137 +140 +143 +146 +150 +154 +158 +163 +167 +172 +175 +178 +179 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +179 +174 +165 +148 +118 +75 +59 +49 +43 +41 +41 +48 +60 +74 +85 +92 +93 +92 +90 +87 +82 +78 +76 +74 +72 +69 +65 +62 +59 +58 +64 +80 +103 +131 +162 +191 +202 +207 +207 +205 +196 +187 +175 +163 +149 +132 +122 +114 +108 +104 +101 +101 +103 +104 +107 +112 +116 +120 +124 +128 +133 +136 +139 +141 +143 +144 +144 +144 +142 +140 +135 +130 +126 +121 +116 +108 +102 +96 +90 +84 +76 +71 +68 +66 +64 +63 +62 +62 +62 +62 +63 +64 +65 +67 +69 +71 +72 +73 +74 +74 +74 +74 +74 +74 +74 +73 +72 +72 +71 +71 +70 +69 +69 +68 +68 +68 +68 +69 +69 +70 +71 +72 +72 +72 +72 +72 +71 +71 +71 +72 +77 +82 +84 +84 +82 +77 +77 +77 +77 +77 +77 +78 +95 +125 +166 +175 +174 +168 +151 +113 +41 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +40 +36 +32 +28 +26 +25 +25 +25 +26 +26 +26 +26 +27 +29 +30 +29 +26 +24 +23 +23 +23 +24 +28 +34 +39 +47 +59 +71 +81 +85 +86 +86 +87 +87 +88 +88 +88 +87 +86 +83 +76 +69 +62 +53 +42 +32 +31 +31 +32 +35 +37 +38 +39 +40 +43 +54 +64 +72 +79 +85 +91 +95 +99 +103 +107 +112 +115 +118 +121 +124 +128 +131 +133 +136 +139 +143 +146 +149 +152 +155 +161 +166 +171 +175 +178 +182 +183 +183 +183 +183 +182 +182 +182 +181 +181 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +181 +181 +181 +181 +181 +181 +180 +176 +165 +145 +98 +72 +55 +47 +44 +44 +49 +59 +73 +85 +93 +94 +94 +92 +89 +84 +80 +77 +75 +73 +71 +69 +65 +61 +58 +59 +63 +75 +94 +120 +158 +181 +195 +203 +205 +204 +201 +197 +191 +184 +173 +165 +158 +153 +148 +145 +145 +145 +147 +148 +150 +151 +152 +151 +151 +149 +146 +144 +140 +137 +133 +130 +126 +121 +116 +108 +102 +96 +89 +83 +76 +72 +69 +67 +65 +64 +64 +63 +63 +63 +63 +63 +64 +64 +65 +67 +69 +70 +72 +73 +75 +75 +76 +76 +76 +75 +75 +75 +75 +74 +74 +73 +72 +72 +72 +71 +70 +70 +70 +70 +70 +70 +71 +71 +72 +72 +72 +72 +72 +72 +72 +71 +71 +72 +73 +81 +86 +88 +87 +86 +78 +77 +76 +76 +76 +76 +78 +96 +127 +168 +176 +174 +169 +152 +115 +43 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +45 +42 +36 +30 +26 +24 +24 +24 +24 +25 +24 +24 +26 +28 +29 +29 +26 +24 +23 +23 +24 +24 +23 +23 +24 +32 +48 +64 +77 +85 +89 +89 +89 +88 +88 +87 +86 +86 +85 +83 +77 +69 +59 +48 +36 +31 +31 +31 +33 +36 +39 +40 +41 +42 +44 +57 +67 +76 +83 +89 +95 +100 +105 +109 +113 +118 +122 +125 +128 +132 +136 +139 +142 +145 +148 +153 +157 +160 +165 +169 +177 +181 +184 +186 +186 +185 +184 +184 +183 +182 +181 +181 +181 +181 +181 +182 +182 +183 +183 +184 +185 +185 +184 +184 +183 +182 +181 +181 +181 +181 +182 +182 +181 +178 +168 +127 +91 +66 +51 +46 +46 +49 +58 +71 +84 +93 +95 +95 +94 +91 +86 +82 +79 +76 +73 +72 +71 +68 +65 +60 +59 +59 +62 +68 +81 +112 +141 +167 +188 +199 +203 +201 +199 +197 +194 +190 +187 +183 +180 +176 +173 +170 +167 +165 +162 +159 +157 +154 +151 +148 +142 +135 +127 +119 +110 +98 +90 +83 +78 +73 +69 +68 +66 +65 +65 +64 +64 +64 +64 +63 +63 +63 +63 +63 +64 +65 +66 +68 +69 +71 +73 +74 +75 +76 +77 +77 +77 +77 +77 +77 +76 +76 +75 +75 +75 +74 +73 +73 +73 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +73 +75 +86 +90 +92 +92 +90 +80 +77 +76 +76 +76 +76 +78 +97 +129 +170 +176 +174 +169 +152 +117 +45 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +26 +33 +36 +37 +36 +34 +32 +30 +30 +30 +32 +32 +32 +30 +29 +23 +22 +22 +22 +23 +26 +28 +28 +28 +26 +25 +27 +33 +44 +59 +77 +83 +87 +89 +89 +88 +87 +86 +84 +82 +77 +69 +59 +48 +37 +32 +32 +33 +36 +41 +42 +42 +42 +44 +49 +65 +76 +85 +92 +98 +106 +111 +116 +120 +125 +130 +134 +137 +141 +144 +149 +153 +156 +160 +163 +169 +173 +179 +184 +189 +191 +190 +190 +188 +187 +183 +181 +180 +180 +180 +180 +181 +182 +184 +186 +189 +191 +194 +196 +198 +199 +199 +199 +198 +196 +192 +188 +184 +182 +181 +181 +181 +182 +182 +181 +166 +131 +95 +66 +50 +47 +48 +54 +65 +80 +93 +96 +97 +97 +94 +89 +85 +81 +78 +75 +72 +72 +71 +69 +66 +61 +60 +59 +60 +61 +68 +84 +105 +128 +151 +175 +185 +191 +192 +192 +189 +186 +183 +179 +176 +171 +167 +163 +158 +152 +141 +131 +120 +108 +97 +84 +78 +73 +70 +67 +66 +65 +65 +64 +64 +64 +64 +64 +64 +65 +65 +65 +65 +66 +66 +67 +69 +70 +71 +73 +74 +75 +76 +77 +77 +78 +79 +79 +79 +79 +79 +78 +78 +77 +77 +76 +76 +75 +75 +75 +74 +74 +74 +74 +74 +73 +73 +73 +73 +73 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +73 +74 +77 +81 +92 +97 +99 +98 +96 +84 +78 +76 +75 +75 +75 +78 +99 +132 +172 +177 +175 +169 +153 +119 +47 +18 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +16 +18 +19 +20 +21 +21 +21 +21 +22 +22 +22 +22 +22 +22 +21 +21 +21 +23 +25 +29 +34 +36 +36 +36 +35 +30 +29 +29 +33 +37 +46 +53 +61 +70 +79 +86 +87 +86 +85 +83 +78 +72 +63 +52 +41 +37 +38 +41 +44 +45 +43 +42 +43 +47 +56 +73 +83 +91 +98 +104 +112 +117 +121 +126 +130 +136 +140 +144 +148 +151 +156 +160 +163 +168 +172 +179 +184 +188 +191 +192 +192 +189 +186 +183 +180 +179 +179 +179 +180 +182 +185 +188 +190 +193 +196 +200 +203 +205 +207 +209 +210 +211 +211 +210 +209 +206 +202 +197 +192 +186 +182 +181 +182 +182 +182 +177 +157 +126 +92 +62 +49 +49 +52 +60 +74 +90 +96 +99 +99 +98 +92 +87 +83 +79 +76 +73 +72 +72 +71 +69 +65 +63 +61 +59 +59 +61 +67 +76 +89 +104 +125 +138 +149 +158 +164 +166 +166 +163 +159 +154 +145 +136 +127 +117 +107 +96 +89 +83 +79 +75 +71 +70 +68 +68 +67 +67 +68 +69 +69 +70 +71 +72 +72 +73 +74 +74 +75 +75 +76 +77 +77 +78 +78 +79 +79 +80 +80 +80 +80 +81 +80 +80 +80 +80 +79 +79 +78 +78 +77 +77 +76 +76 +75 +75 +75 +75 +74 +74 +74 +74 +74 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +72 +72 +72 +73 +73 +75 +78 +81 +86 +97 +103 +104 +104 +101 +87 +80 +76 +75 +74 +75 +78 +100 +134 +173 +178 +175 +170 +154 +120 +48 +18 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +19 +19 +19 +19 +19 +20 +20 +20 +20 +20 +20 +20 +21 +22 +23 +25 +27 +30 +34 +37 +41 +42 +43 +42 +42 +38 +35 +33 +32 +31 +34 +37 +42 +49 +57 +65 +72 +78 +82 +82 +80 +76 +70 +63 +53 +50 +51 +52 +51 +47 +43 +42 +46 +53 +66 +81 +89 +97 +104 +110 +117 +122 +127 +132 +136 +143 +147 +151 +155 +159 +164 +167 +172 +178 +183 +189 +192 +193 +194 +192 +187 +182 +179 +178 +176 +178 +180 +183 +185 +188 +191 +194 +197 +200 +203 +207 +210 +212 +214 +215 +217 +217 +217 +217 +216 +215 +212 +208 +203 +197 +188 +184 +182 +182 +182 +181 +173 +153 +122 +86 +56 +51 +50 +55 +65 +85 +93 +98 +100 +100 +96 +90 +85 +81 +77 +74 +73 +72 +71 +70 +68 +66 +64 +61 +59 +58 +60 +63 +68 +75 +87 +97 +106 +115 +122 +127 +127 +125 +121 +116 +107 +99 +92 +86 +80 +74 +72 +70 +70 +70 +71 +72 +73 +74 +75 +76 +77 +77 +78 +79 +79 +80 +80 +81 +81 +81 +82 +82 +82 +82 +83 +83 +83 +83 +83 +82 +82 +82 +82 +82 +81 +81 +80 +80 +79 +78 +78 +78 +77 +77 +76 +76 +76 +75 +75 +75 +75 +75 +74 +74 +74 +74 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +74 +75 +78 +82 +87 +92 +103 +108 +110 +110 +107 +91 +82 +77 +75 +74 +74 +78 +101 +136 +175 +179 +175 +170 +154 +121 +49 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +29 +28 +28 +27 +26 +26 +25 +25 +25 +25 +25 +26 +27 +28 +30 +33 +37 +40 +42 +45 +46 +47 +47 +47 +47 +46 +43 +40 +38 +35 +34 +34 +33 +34 +37 +42 +51 +62 +70 +73 +75 +76 +74 +70 +64 +61 +59 +57 +52 +46 +42 +45 +52 +63 +76 +89 +96 +103 +110 +116 +123 +129 +134 +139 +144 +150 +154 +159 +163 +167 +172 +177 +183 +189 +193 +196 +196 +194 +191 +186 +179 +175 +174 +175 +177 +181 +184 +188 +191 +193 +196 +199 +202 +205 +209 +213 +215 +216 +218 +219 +219 +220 +220 +220 +220 +220 +219 +216 +213 +209 +199 +190 +185 +183 +182 +182 +181 +171 +151 +118 +72 +58 +51 +52 +57 +76 +88 +96 +101 +102 +100 +95 +89 +83 +78 +75 +74 +73 +72 +71 +70 +69 +67 +64 +61 +59 +59 +59 +60 +61 +64 +68 +73 +78 +84 +88 +88 +86 +84 +80 +74 +71 +70 +69 +69 +70 +71 +72 +73 +75 +77 +79 +81 +82 +83 +84 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +84 +84 +84 +83 +83 +82 +82 +81 +81 +80 +80 +79 +79 +78 +78 +77 +77 +77 +76 +76 +76 +76 +75 +75 +75 +75 +75 +75 +74 +74 +74 +74 +73 +73 +73 +73 +73 +73 +74 +74 +74 +75 +76 +78 +82 +87 +93 +98 +109 +114 +116 +116 +113 +96 +84 +78 +75 +74 +74 +78 +103 +139 +176 +179 +175 +170 +154 +122 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +38 +38 +38 +37 +37 +36 +36 +35 +35 +35 +35 +36 +37 +39 +40 +43 +45 +46 +47 +48 +50 +50 +50 +50 +50 +49 +48 +46 +44 +42 +39 +37 +35 +34 +34 +34 +35 +37 +42 +48 +59 +65 +66 +65 +63 +58 +52 +46 +42 +40 +42 +51 +64 +76 +86 +96 +103 +110 +117 +123 +130 +136 +141 +147 +152 +158 +163 +167 +171 +175 +182 +188 +194 +198 +199 +198 +195 +189 +182 +173 +172 +172 +174 +177 +183 +189 +190 +192 +193 +194 +198 +201 +205 +210 +213 +217 +219 +220 +220 +221 +221 +221 +221 +221 +221 +221 +222 +221 +219 +216 +210 +202 +193 +185 +183 +183 +182 +181 +172 +153 +101 +72 +56 +50 +51 +63 +80 +92 +99 +103 +103 +100 +94 +87 +80 +76 +74 +73 +72 +71 +71 +71 +70 +68 +65 +61 +59 +59 +59 +60 +60 +61 +62 +63 +64 +65 +65 +65 +65 +65 +65 +66 +67 +69 +71 +74 +77 +79 +81 +83 +84 +85 +85 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +85 +85 +85 +85 +85 +85 +85 +84 +84 +84 +83 +82 +82 +81 +80 +80 +79 +79 +78 +78 +78 +77 +77 +77 +77 +76 +76 +76 +76 +76 +76 +76 +76 +76 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +76 +77 +78 +79 +83 +88 +94 +100 +105 +114 +120 +122 +122 +120 +101 +87 +79 +75 +73 +74 +78 +104 +141 +177 +180 +176 +170 +155 +122 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +51 +51 +50 +50 +50 +49 +49 +49 +49 +49 +49 +49 +50 +51 +52 +54 +55 +56 +57 +58 +60 +60 +60 +60 +60 +59 +57 +56 +54 +52 +50 +48 +46 +44 +42 +39 +38 +37 +37 +37 +38 +39 +39 +39 +39 +39 +39 +40 +42 +46 +61 +72 +81 +89 +95 +106 +113 +120 +126 +131 +139 +145 +150 +155 +161 +167 +171 +176 +180 +186 +195 +200 +201 +201 +199 +190 +177 +170 +167 +168 +172 +179 +184 +188 +190 +191 +191 +192 +193 +196 +203 +209 +213 +216 +218 +219 +219 +219 +218 +216 +213 +213 +213 +214 +216 +219 +221 +222 +223 +223 +219 +215 +207 +198 +188 +183 +183 +183 +181 +177 +147 +110 +79 +58 +50 +51 +62 +77 +91 +100 +104 +104 +102 +97 +90 +80 +76 +74 +72 +72 +71 +71 +71 +70 +69 +67 +64 +63 +61 +61 +61 +60 +60 +60 +61 +61 +62 +63 +64 +65 +68 +71 +73 +75 +76 +77 +76 +75 +73 +70 +67 +66 +66 +67 +68 +69 +71 +74 +77 +79 +81 +81 +82 +82 +83 +83 +83 +83 +83 +83 +82 +82 +82 +82 +81 +81 +80 +80 +80 +79 +79 +79 +78 +78 +78 +78 +78 +78 +78 +79 +79 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +79 +80 +80 +80 +81 +82 +83 +84 +87 +92 +97 +103 +109 +113 +121 +127 +129 +130 +128 +110 +93 +82 +76 +73 +74 +79 +106 +144 +178 +180 +176 +170 +155 +123 +51 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +60 +60 +60 +60 +59 +59 +59 +59 +58 +58 +59 +59 +59 +60 +61 +62 +63 +64 +65 +65 +66 +67 +67 +67 +66 +65 +64 +63 +61 +60 +58 +56 +55 +53 +51 +49 +48 +46 +45 +43 +43 +43 +43 +43 +44 +46 +48 +52 +58 +65 +76 +83 +90 +97 +104 +114 +121 +127 +132 +138 +146 +152 +157 +162 +168 +174 +179 +184 +190 +197 +201 +202 +201 +196 +186 +171 +168 +167 +168 +173 +183 +186 +188 +189 +190 +189 +189 +191 +194 +200 +207 +211 +214 +216 +217 +215 +212 +208 +203 +199 +196 +194 +195 +196 +198 +203 +209 +215 +219 +222 +222 +220 +216 +208 +199 +187 +184 +183 +182 +181 +169 +141 +109 +80 +58 +50 +54 +63 +76 +92 +102 +103 +103 +101 +97 +88 +82 +77 +74 +72 +71 +71 +71 +70 +70 +69 +68 +66 +65 +64 +62 +61 +61 +61 +61 +62 +63 +65 +67 +70 +73 +74 +74 +73 +70 +65 +61 +57 +54 +52 +50 +49 +48 +47 +47 +49 +50 +52 +54 +56 +62 +66 +71 +74 +77 +79 +80 +81 +81 +81 +81 +81 +81 +81 +81 +80 +80 +80 +80 +79 +79 +79 +80 +80 +81 +82 +82 +83 +84 +85 +86 +86 +86 +87 +87 +87 +87 +88 +88 +87 +87 +87 +87 +86 +86 +86 +86 +86 +86 +86 +87 +88 +89 +91 +95 +99 +105 +110 +115 +118 +124 +131 +134 +135 +134 +117 +98 +84 +77 +73 +74 +79 +108 +145 +179 +180 +176 +170 +155 +123 +51 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +70 +70 +69 +69 +69 +69 +68 +68 +68 +68 +68 +68 +69 +69 +70 +71 +71 +72 +72 +73 +73 +73 +73 +73 +73 +72 +71 +70 +69 +67 +65 +64 +63 +61 +60 +58 +57 +56 +55 +53 +52 +52 +52 +53 +55 +58 +62 +66 +72 +78 +86 +92 +99 +106 +113 +122 +128 +134 +139 +145 +153 +159 +164 +170 +174 +181 +187 +193 +198 +203 +203 +200 +191 +181 +171 +163 +165 +170 +176 +182 +188 +189 +189 +188 +186 +186 +187 +191 +196 +202 +209 +211 +213 +213 +211 +206 +200 +195 +190 +186 +184 +184 +185 +186 +189 +194 +198 +204 +210 +216 +222 +223 +221 +217 +209 +196 +188 +185 +183 +183 +179 +163 +138 +107 +77 +55 +52 +54 +63 +77 +95 +100 +102 +102 +100 +95 +89 +84 +79 +75 +72 +72 +71 +71 +70 +70 +69 +68 +67 +66 +64 +63 +62 +62 +63 +65 +67 +69 +71 +73 +74 +72 +69 +65 +61 +57 +55 +53 +53 +52 +52 +53 +53 +52 +51 +49 +47 +45 +44 +44 +47 +50 +54 +57 +61 +67 +70 +74 +76 +78 +79 +80 +80 +80 +80 +80 +80 +80 +80 +81 +81 +82 +83 +84 +86 +88 +89 +90 +91 +92 +93 +94 +94 +94 +95 +95 +95 +95 +95 +95 +95 +95 +94 +94 +94 +93 +93 +93 +93 +93 +94 +95 +97 +99 +102 +106 +111 +115 +119 +122 +127 +134 +138 +140 +139 +125 +103 +88 +78 +74 +74 +80 +109 +147 +180 +181 +176 +170 +154 +123 +51 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +79 +79 +79 +79 +79 +78 +78 +78 +78 +78 +78 +78 +78 +78 +79 +79 +79 +80 +80 +80 +81 +81 +80 +80 +80 +79 +78 +77 +76 +75 +73 +72 +71 +70 +69 +68 +67 +66 +65 +64 +64 +64 +65 +66 +68 +72 +75 +80 +84 +89 +95 +102 +109 +115 +122 +129 +135 +141 +146 +152 +160 +166 +171 +177 +181 +189 +195 +201 +205 +205 +200 +190 +177 +165 +160 +163 +170 +178 +185 +189 +189 +188 +186 +184 +183 +183 +186 +191 +198 +204 +208 +210 +210 +208 +203 +195 +189 +184 +180 +178 +178 +180 +181 +183 +186 +189 +192 +195 +200 +207 +218 +222 +223 +222 +218 +206 +195 +188 +185 +184 +183 +178 +162 +137 +105 +69 +57 +51 +53 +61 +83 +94 +99 +101 +101 +99 +95 +91 +86 +81 +76 +74 +73 +72 +71 +71 +70 +70 +69 +68 +66 +66 +66 +66 +67 +70 +72 +74 +74 +74 +71 +66 +61 +57 +54 +53 +54 +55 +57 +59 +62 +64 +66 +67 +66 +62 +58 +53 +48 +44 +41 +40 +40 +42 +45 +51 +56 +61 +65 +69 +72 +74 +76 +77 +78 +79 +80 +80 +81 +82 +83 +85 +87 +89 +91 +94 +95 +97 +98 +99 +100 +101 +101 +102 +102 +103 +103 +103 +103 +103 +102 +102 +102 +102 +101 +101 +101 +100 +101 +101 +101 +102 +104 +106 +109 +113 +116 +120 +123 +125 +129 +137 +142 +144 +144 +133 +110 +92 +79 +74 +74 +80 +110 +149 +180 +181 +176 +169 +154 +123 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +89 +88 +88 +88 +88 +88 +87 +87 +87 +87 +87 +87 +87 +87 +88 +88 +88 +88 +88 +88 +88 +88 +87 +87 +86 +85 +84 +83 +82 +81 +80 +79 +78 +77 +76 +76 +75 +75 +75 +75 +75 +76 +78 +80 +83 +86 +90 +94 +99 +107 +113 +119 +124 +129 +137 +142 +148 +153 +159 +167 +173 +178 +183 +188 +198 +204 +206 +206 +204 +188 +168 +159 +157 +159 +171 +182 +188 +190 +189 +187 +183 +181 +180 +180 +181 +185 +192 +198 +204 +206 +206 +205 +201 +196 +187 +182 +178 +176 +176 +177 +179 +181 +183 +186 +189 +192 +195 +198 +200 +209 +217 +222 +224 +223 +216 +205 +195 +187 +184 +184 +183 +177 +163 +137 +93 +70 +55 +49 +51 +64 +82 +94 +99 +99 +98 +96 +94 +92 +88 +83 +80 +76 +74 +73 +72 +71 +71 +71 +70 +70 +71 +72 +73 +75 +76 +76 +75 +74 +71 +62 +56 +53 +52 +52 +53 +53 +55 +56 +59 +63 +67 +72 +76 +80 +82 +80 +75 +68 +59 +48 +42 +39 +37 +37 +38 +39 +42 +45 +50 +57 +62 +66 +70 +73 +76 +78 +80 +81 +82 +84 +87 +89 +92 +95 +98 +99 +101 +102 +103 +104 +105 +106 +107 +108 +108 +109 +109 +109 +109 +109 +109 +108 +108 +108 +108 +107 +107 +107 +108 +108 +109 +110 +112 +114 +117 +119 +122 +125 +128 +131 +139 +145 +149 +149 +141 +117 +97 +81 +75 +75 +81 +111 +150 +181 +181 +176 +170 +154 +122 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +101 +101 +101 +101 +101 +101 +100 +100 +100 +100 +100 +99 +99 +99 +99 +99 +99 +99 +99 +99 +98 +98 +98 +97 +97 +96 +95 +94 +93 +92 +91 +90 +90 +89 +88 +88 +87 +87 +87 +87 +88 +89 +90 +92 +94 +98 +101 +105 +109 +113 +119 +124 +129 +134 +140 +147 +152 +157 +163 +169 +177 +182 +187 +193 +200 +207 +208 +206 +198 +182 +154 +153 +155 +161 +176 +189 +190 +190 +188 +183 +178 +178 +179 +179 +179 +181 +186 +192 +199 +202 +203 +203 +200 +195 +187 +178 +174 +172 +172 +174 +178 +182 +187 +192 +195 +198 +199 +199 +200 +201 +204 +209 +216 +222 +224 +223 +217 +207 +197 +187 +184 +184 +183 +179 +170 +135 +104 +78 +59 +49 +50 +59 +74 +88 +96 +95 +94 +94 +92 +91 +89 +87 +85 +83 +81 +79 +78 +78 +77 +77 +77 +78 +78 +78 +78 +77 +75 +71 +65 +57 +52 +51 +51 +52 +52 +52 +53 +53 +53 +53 +57 +63 +71 +78 +85 +91 +92 +91 +87 +81 +71 +63 +56 +49 +44 +39 +38 +38 +38 +39 +40 +42 +45 +49 +53 +60 +66 +71 +75 +79 +83 +86 +89 +92 +95 +99 +100 +102 +103 +104 +106 +107 +108 +109 +110 +111 +112 +112 +112 +113 +113 +113 +113 +113 +113 +112 +112 +113 +113 +113 +114 +115 +115 +116 +118 +120 +121 +124 +127 +130 +133 +141 +148 +153 +154 +149 +128 +105 +85 +76 +75 +82 +113 +152 +182 +182 +176 +170 +154 +121 +48 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +111 +111 +111 +110 +110 +110 +110 +110 +109 +109 +109 +109 +108 +108 +108 +108 +107 +107 +107 +107 +106 +106 +105 +105 +104 +103 +103 +102 +101 +100 +99 +98 +98 +97 +96 +96 +96 +96 +96 +97 +98 +99 +100 +102 +104 +108 +111 +114 +118 +122 +128 +133 +138 +143 +147 +154 +159 +164 +170 +176 +183 +188 +194 +201 +207 +208 +206 +193 +176 +157 +150 +154 +165 +178 +187 +190 +189 +186 +181 +178 +177 +177 +177 +178 +178 +180 +187 +193 +198 +201 +202 +201 +196 +189 +180 +173 +171 +171 +174 +178 +188 +196 +202 +207 +211 +213 +213 +212 +210 +207 +206 +209 +213 +218 +223 +225 +222 +215 +206 +195 +186 +185 +184 +183 +179 +160 +133 +105 +80 +61 +49 +52 +59 +71 +84 +92 +92 +91 +90 +88 +88 +87 +86 +85 +83 +82 +81 +81 +80 +80 +80 +80 +79 +79 +78 +74 +69 +63 +57 +52 +51 +51 +51 +52 +52 +52 +52 +53 +53 +53 +56 +61 +68 +77 +87 +96 +100 +100 +98 +93 +84 +76 +68 +61 +54 +48 +45 +42 +41 +39 +40 +41 +43 +46 +49 +55 +61 +66 +71 +76 +81 +85 +89 +92 +95 +99 +101 +102 +104 +105 +107 +108 +110 +111 +112 +113 +113 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +115 +115 +116 +117 +118 +119 +121 +122 +125 +129 +132 +136 +142 +150 +156 +158 +155 +136 +112 +89 +77 +76 +82 +114 +153 +182 +182 +176 +170 +153 +119 +47 +18 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +120 +120 +120 +120 +120 +120 +119 +119 +119 +119 +118 +118 +118 +117 +117 +116 +116 +116 +115 +115 +114 +114 +113 +112 +112 +111 +110 +109 +108 +108 +107 +106 +105 +105 +105 +104 +104 +105 +105 +106 +107 +108 +110 +112 +114 +117 +121 +124 +128 +132 +137 +141 +146 +150 +155 +161 +166 +171 +177 +182 +189 +196 +202 +207 +209 +206 +191 +173 +157 +147 +153 +166 +178 +187 +191 +189 +185 +180 +177 +176 +176 +176 +177 +178 +178 +181 +188 +194 +198 +200 +200 +197 +191 +183 +175 +171 +171 +173 +179 +187 +200 +208 +214 +219 +222 +223 +223 +221 +220 +217 +212 +211 +213 +216 +221 +225 +224 +220 +214 +204 +191 +187 +185 +184 +183 +175 +157 +133 +106 +81 +58 +52 +52 +58 +69 +82 +87 +87 +86 +85 +84 +84 +84 +84 +84 +83 +82 +82 +81 +81 +81 +80 +78 +77 +74 +67 +61 +56 +52 +50 +50 +50 +51 +51 +51 +51 +51 +52 +53 +53 +55 +60 +67 +77 +87 +100 +105 +107 +106 +103 +94 +86 +78 +70 +63 +56 +52 +48 +46 +44 +43 +43 +43 +45 +48 +54 +59 +64 +69 +74 +80 +85 +89 +92 +96 +99 +102 +104 +106 +107 +110 +111 +113 +114 +115 +116 +117 +117 +117 +117 +117 +117 +116 +116 +116 +116 +116 +116 +116 +116 +117 +118 +118 +119 +120 +123 +124 +127 +131 +135 +139 +144 +152 +159 +162 +159 +145 +120 +94 +78 +77 +83 +115 +153 +182 +182 +177 +170 +153 +118 +46 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +130 +130 +129 +129 +129 +129 +129 +128 +128 +127 +127 +127 +126 +126 +125 +125 +124 +123 +123 +122 +121 +121 +120 +119 +118 +117 +117 +116 +115 +114 +114 +113 +113 +113 +113 +113 +113 +114 +114 +116 +117 +119 +121 +123 +127 +130 +133 +137 +140 +145 +149 +153 +157 +162 +168 +173 +178 +184 +188 +196 +203 +208 +210 +208 +194 +169 +153 +145 +149 +164 +180 +188 +190 +189 +184 +179 +176 +175 +175 +176 +177 +177 +178 +179 +182 +188 +194 +197 +198 +197 +193 +186 +178 +171 +170 +172 +178 +187 +199 +212 +219 +224 +226 +228 +228 +228 +228 +227 +225 +220 +216 +215 +216 +219 +224 +225 +224 +220 +212 +198 +190 +187 +185 +185 +183 +174 +157 +134 +107 +76 +60 +53 +52 +55 +69 +77 +81 +82 +81 +79 +79 +79 +80 +80 +81 +81 +81 +81 +80 +79 +77 +75 +71 +67 +58 +53 +51 +49 +49 +50 +50 +49 +49 +48 +49 +50 +52 +53 +53 +55 +59 +67 +77 +88 +102 +109 +113 +113 +111 +102 +94 +86 +78 +71 +63 +58 +55 +52 +50 +48 +47 +47 +48 +50 +55 +60 +65 +69 +74 +80 +85 +89 +93 +97 +101 +103 +106 +108 +110 +113 +115 +116 +118 +119 +120 +121 +121 +121 +121 +120 +120 +120 +119 +119 +118 +118 +118 +118 +118 +119 +120 +120 +121 +123 +126 +127 +130 +133 +138 +143 +147 +154 +161 +165 +164 +152 +128 +100 +80 +78 +84 +115 +154 +183 +182 +177 +170 +152 +116 +44 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +139 +139 +139 +139 +139 +139 +138 +138 +138 +137 +137 +136 +136 +135 +135 +134 +133 +132 +132 +131 +130 +129 +128 +128 +127 +126 +125 +124 +123 +123 +122 +122 +121 +121 +121 +121 +121 +121 +122 +123 +125 +126 +128 +130 +132 +136 +139 +142 +145 +149 +153 +157 +161 +165 +168 +174 +180 +185 +190 +194 +205 +210 +211 +209 +204 +164 +147 +142 +146 +158 +185 +190 +191 +189 +185 +177 +175 +175 +175 +175 +176 +178 +179 +180 +181 +183 +188 +193 +196 +196 +195 +190 +182 +174 +169 +170 +174 +184 +197 +210 +222 +226 +228 +229 +229 +230 +230 +229 +229 +229 +228 +223 +220 +218 +219 +223 +225 +225 +224 +219 +206 +196 +189 +186 +185 +185 +183 +175 +159 +136 +101 +78 +62 +53 +50 +55 +62 +70 +75 +75 +73 +71 +70 +70 +72 +75 +77 +78 +78 +78 +75 +72 +67 +62 +56 +50 +49 +48 +48 +49 +49 +48 +47 +46 +46 +46 +49 +51 +52 +53 +55 +59 +67 +78 +90 +105 +113 +118 +119 +117 +109 +102 +94 +86 +78 +69 +64 +60 +57 +55 +54 +54 +55 +56 +57 +60 +63 +67 +71 +75 +81 +86 +90 +94 +98 +103 +105 +108 +111 +113 +116 +118 +120 +121 +123 +124 +125 +125 +125 +125 +125 +125 +124 +124 +123 +123 +122 +122 +122 +122 +122 +123 +124 +125 +126 +129 +131 +134 +137 +142 +147 +150 +156 +163 +167 +167 +160 +136 +106 +82 +80 +85 +116 +155 +183 +182 +177 +170 +152 +114 +43 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +152 +152 +152 +152 +151 +151 +151 +151 +150 +150 +149 +149 +148 +147 +147 +145 +145 +144 +143 +142 +141 +140 +139 +138 +137 +136 +135 +134 +133 +133 +132 +132 +131 +131 +131 +131 +132 +132 +133 +134 +136 +138 +140 +142 +144 +147 +150 +153 +156 +159 +163 +167 +170 +173 +177 +184 +188 +193 +198 +206 +212 +212 +208 +194 +162 +138 +138 +148 +165 +186 +191 +190 +187 +182 +176 +174 +174 +175 +176 +179 +182 +183 +183 +183 +183 +184 +188 +192 +194 +195 +193 +185 +176 +170 +169 +171 +182 +197 +211 +223 +229 +229 +229 +230 +230 +230 +230 +230 +230 +230 +229 +228 +226 +223 +221 +223 +225 +226 +226 +224 +216 +206 +196 +189 +186 +186 +186 +184 +179 +168 +141 +116 +92 +72 +57 +49 +50 +53 +57 +64 +68 +67 +65 +62 +60 +57 +58 +59 +60 +60 +59 +58 +55 +52 +49 +47 +47 +47 +47 +47 +46 +44 +43 +43 +43 +45 +48 +51 +53 +53 +55 +61 +70 +81 +93 +109 +117 +123 +125 +124 +117 +109 +101 +93 +85 +76 +70 +66 +63 +62 +61 +62 +63 +64 +66 +69 +71 +73 +76 +79 +84 +89 +94 +98 +102 +106 +109 +112 +114 +117 +120 +122 +123 +125 +126 +127 +128 +128 +129 +129 +130 +130 +130 +130 +129 +129 +129 +129 +129 +129 +130 +130 +131 +132 +134 +137 +139 +142 +144 +149 +154 +156 +160 +165 +170 +170 +166 +146 +116 +86 +82 +88 +118 +155 +183 +182 +177 +169 +150 +111 +40 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +161 +161 +161 +161 +161 +161 +160 +160 +160 +159 +159 +158 +157 +156 +156 +154 +153 +152 +151 +150 +149 +148 +147 +146 +144 +143 +142 +141 +141 +140 +139 +139 +139 +139 +139 +139 +139 +140 +141 +142 +144 +146 +148 +150 +152 +156 +158 +161 +164 +166 +170 +173 +176 +180 +184 +190 +194 +199 +206 +212 +213 +209 +191 +165 +141 +136 +148 +165 +181 +190 +190 +186 +181 +177 +175 +174 +175 +178 +182 +186 +187 +187 +185 +184 +183 +184 +188 +191 +193 +193 +191 +181 +173 +169 +168 +174 +190 +206 +219 +226 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +229 +229 +228 +226 +224 +224 +225 +226 +226 +225 +220 +212 +203 +194 +188 +186 +186 +186 +184 +180 +163 +144 +122 +100 +79 +60 +54 +52 +53 +56 +59 +60 +60 +59 +58 +55 +53 +52 +50 +49 +48 +48 +47 +46 +45 +45 +46 +46 +46 +45 +43 +42 +41 +41 +42 +46 +49 +51 +53 +54 +56 +63 +73 +85 +97 +113 +121 +127 +130 +129 +121 +113 +105 +96 +87 +78 +73 +69 +67 +66 +66 +67 +68 +70 +71 +73 +74 +76 +79 +82 +88 +93 +97 +101 +105 +109 +112 +114 +117 +120 +122 +124 +126 +127 +128 +130 +130 +131 +131 +131 +132 +132 +132 +132 +132 +133 +133 +134 +134 +135 +135 +137 +138 +139 +140 +143 +146 +149 +151 +155 +160 +162 +164 +168 +172 +172 +170 +152 +124 +91 +85 +90 +119 +156 +183 +182 +177 +169 +149 +108 +38 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +171 +171 +171 +171 +170 +170 +170 +170 +169 +169 +168 +167 +166 +166 +165 +163 +162 +161 +160 +158 +157 +156 +154 +153 +152 +151 +150 +149 +148 +148 +147 +147 +146 +146 +146 +147 +147 +148 +149 +150 +152 +154 +156 +158 +161 +164 +166 +169 +171 +173 +177 +180 +183 +186 +191 +195 +200 +206 +212 +214 +211 +193 +167 +144 +133 +144 +164 +180 +189 +190 +186 +181 +177 +175 +174 +175 +179 +185 +190 +193 +193 +192 +188 +185 +184 +184 +188 +190 +192 +192 +189 +178 +171 +168 +168 +178 +198 +213 +224 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +226 +225 +226 +226 +226 +226 +223 +218 +209 +200 +192 +187 +187 +187 +186 +185 +178 +165 +148 +128 +107 +82 +68 +59 +54 +53 +54 +56 +56 +57 +56 +54 +52 +49 +47 +46 +44 +43 +43 +42 +42 +43 +43 +43 +43 +42 +41 +41 +41 +41 +43 +47 +50 +52 +53 +54 +58 +67 +77 +89 +102 +117 +127 +133 +135 +134 +125 +116 +107 +98 +89 +80 +75 +72 +70 +70 +70 +71 +72 +74 +75 +76 +77 +79 +82 +86 +92 +97 +101 +104 +107 +112 +115 +117 +120 +123 +125 +127 +129 +130 +132 +133 +133 +134 +134 +134 +135 +135 +135 +135 +135 +136 +137 +138 +138 +139 +141 +142 +143 +145 +147 +150 +153 +155 +158 +161 +166 +167 +169 +171 +174 +174 +172 +158 +132 +96 +87 +92 +121 +157 +183 +182 +177 +169 +147 +105 +36 +13 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +180 +180 +180 +180 +180 +180 +180 +179 +179 +178 +177 +177 +176 +175 +174 +172 +171 +169 +168 +167 +165 +163 +162 +161 +159 +158 +157 +156 +155 +155 +154 +154 +154 +154 +154 +154 +155 +155 +157 +158 +160 +162 +164 +166 +168 +171 +174 +176 +178 +180 +184 +186 +189 +193 +196 +201 +207 +212 +215 +214 +201 +169 +145 +133 +136 +161 +180 +189 +190 +188 +180 +177 +175 +174 +175 +179 +186 +193 +199 +200 +200 +197 +191 +185 +183 +184 +187 +190 +191 +191 +186 +175 +169 +167 +168 +184 +205 +219 +227 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +227 +227 +227 +227 +227 +225 +221 +215 +207 +198 +189 +188 +187 +187 +187 +186 +180 +169 +155 +136 +109 +91 +75 +64 +57 +54 +53 +54 +54 +54 +54 +52 +50 +48 +46 +44 +42 +41 +40 +40 +40 +41 +41 +41 +41 +40 +41 +41 +42 +45 +49 +52 +53 +54 +55 +61 +72 +83 +94 +106 +123 +133 +139 +141 +138 +129 +118 +108 +98 +89 +80 +76 +74 +73 +73 +73 +74 +75 +76 +77 +78 +80 +83 +86 +91 +96 +100 +104 +107 +110 +115 +118 +121 +123 +126 +129 +131 +132 +134 +135 +136 +137 +137 +138 +138 +138 +138 +138 +138 +139 +140 +140 +141 +142 +144 +145 +147 +149 +150 +152 +156 +159 +161 +164 +167 +171 +173 +174 +175 +176 +176 +175 +163 +140 +102 +91 +95 +123 +158 +183 +182 +177 +168 +146 +101 +33 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +190 +190 +190 +190 +190 +189 +189 +189 +188 +188 +187 +186 +185 +184 +183 +181 +180 +178 +177 +175 +173 +171 +169 +168 +166 +164 +163 +162 +161 +161 +160 +160 +160 +160 +160 +160 +161 +162 +163 +165 +167 +170 +172 +174 +176 +179 +181 +183 +185 +187 +189 +192 +195 +199 +201 +208 +214 +216 +215 +213 +174 +142 +131 +135 +149 +184 +189 +190 +188 +182 +176 +174 +173 +174 +177 +187 +196 +203 +207 +208 +207 +201 +193 +185 +183 +183 +187 +189 +190 +189 +184 +173 +167 +167 +169 +191 +212 +223 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +228 +228 +227 +227 +226 +224 +219 +213 +204 +192 +189 +187 +187 +187 +188 +187 +183 +175 +163 +140 +121 +102 +85 +70 +59 +53 +51 +51 +52 +52 +52 +51 +50 +48 +45 +43 +42 +41 +40 +40 +40 +40 +40 +40 +41 +41 +43 +45 +48 +51 +53 +54 +55 +56 +66 +78 +89 +100 +112 +130 +141 +146 +146 +143 +131 +119 +108 +97 +88 +80 +77 +76 +75 +75 +76 +76 +77 +77 +78 +80 +83 +87 +91 +96 +101 +104 +107 +111 +114 +118 +121 +124 +127 +129 +132 +134 +135 +137 +138 +139 +140 +140 +141 +141 +142 +142 +143 +143 +144 +145 +145 +146 +147 +148 +150 +151 +153 +155 +157 +160 +163 +166 +169 +172 +176 +178 +178 +178 +178 +178 +177 +168 +146 +108 +94 +99 +126 +160 +184 +182 +177 +167 +144 +97 +30 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +202 +202 +202 +202 +202 +202 +202 +202 +201 +201 +200 +199 +198 +196 +195 +193 +191 +189 +188 +186 +184 +182 +180 +179 +177 +176 +175 +174 +173 +172 +172 +171 +171 +171 +171 +172 +173 +174 +175 +177 +179 +181 +183 +185 +186 +189 +190 +192 +193 +195 +197 +200 +203 +206 +210 +217 +217 +216 +208 +185 +133 +129 +136 +154 +183 +191 +190 +186 +181 +175 +172 +172 +175 +181 +190 +202 +208 +212 +215 +215 +214 +205 +194 +185 +182 +183 +185 +187 +188 +188 +181 +171 +166 +166 +170 +199 +217 +226 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +228 +228 +227 +225 +223 +219 +213 +201 +193 +189 +188 +188 +188 +188 +188 +187 +183 +172 +158 +143 +126 +108 +87 +75 +64 +57 +53 +53 +52 +52 +51 +51 +50 +48 +47 +46 +44 +43 +43 +43 +43 +43 +45 +46 +48 +50 +51 +53 +54 +55 +57 +61 +77 +89 +99 +109 +122 +143 +153 +156 +154 +147 +131 +117 +104 +93 +85 +79 +77 +76 +76 +77 +77 +78 +78 +80 +82 +87 +91 +95 +98 +102 +106 +109 +112 +116 +119 +124 +127 +129 +132 +134 +137 +138 +140 +141 +142 +143 +143 +144 +145 +146 +147 +148 +149 +150 +151 +153 +154 +155 +156 +157 +159 +160 +161 +163 +164 +167 +169 +171 +173 +176 +181 +182 +182 +182 +181 +180 +179 +173 +154 +117 +100 +104 +130 +162 +184 +181 +177 +166 +140 +91 +26 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +212 +212 +212 +212 +212 +212 +212 +212 +211 +211 +210 +209 +207 +206 +205 +202 +200 +198 +196 +194 +191 +188 +186 +184 +182 +180 +179 +178 +177 +177 +177 +176 +176 +176 +177 +177 +178 +179 +181 +182 +185 +187 +189 +190 +192 +194 +196 +198 +199 +201 +204 +207 +209 +212 +215 +218 +218 +209 +189 +149 +128 +134 +153 +175 +189 +190 +187 +181 +176 +171 +171 +175 +182 +190 +199 +208 +212 +215 +216 +217 +215 +206 +195 +186 +182 +182 +184 +186 +187 +186 +180 +169 +165 +166 +171 +203 +220 +227 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +227 +226 +224 +221 +217 +207 +199 +193 +189 +188 +188 +188 +189 +189 +188 +184 +176 +166 +154 +139 +118 +104 +90 +78 +68 +59 +56 +54 +53 +52 +51 +50 +50 +49 +48 +47 +47 +47 +47 +48 +48 +49 +50 +52 +53 +54 +54 +56 +62 +71 +87 +97 +106 +118 +133 +156 +162 +163 +158 +147 +127 +112 +100 +90 +83 +78 +77 +77 +77 +78 +79 +80 +83 +85 +88 +93 +96 +99 +102 +106 +110 +113 +117 +120 +124 +128 +131 +134 +136 +138 +140 +142 +143 +144 +145 +146 +147 +148 +149 +151 +152 +154 +155 +156 +158 +159 +160 +162 +163 +164 +165 +167 +168 +169 +170 +172 +174 +175 +176 +178 +182 +184 +184 +184 +183 +182 +181 +175 +159 +123 +105 +109 +134 +164 +184 +181 +176 +164 +137 +86 +24 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +221 +221 +221 +222 +222 +222 +222 +222 +221 +221 +220 +218 +217 +215 +214 +211 +209 +207 +205 +203 +200 +197 +195 +192 +190 +187 +186 +184 +183 +183 +182 +182 +182 +182 +182 +183 +185 +186 +188 +190 +193 +195 +197 +199 +200 +202 +204 +205 +207 +208 +211 +213 +215 +216 +218 +219 +214 +192 +162 +132 +130 +150 +171 +187 +191 +188 +182 +176 +171 +169 +173 +181 +190 +199 +206 +212 +215 +216 +217 +217 +216 +207 +196 +186 +182 +182 +184 +185 +186 +185 +179 +168 +164 +165 +172 +206 +221 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +226 +224 +223 +220 +213 +205 +198 +192 +189 +188 +188 +189 +190 +190 +190 +187 +182 +174 +164 +147 +133 +119 +105 +92 +77 +70 +64 +59 +56 +53 +52 +51 +51 +50 +50 +50 +50 +50 +50 +51 +51 +52 +53 +54 +55 +57 +62 +71 +83 +97 +105 +116 +130 +148 +168 +171 +168 +159 +144 +121 +106 +95 +86 +81 +78 +78 +78 +79 +81 +83 +86 +88 +91 +94 +98 +101 +104 +107 +110 +115 +119 +122 +126 +129 +133 +135 +138 +140 +142 +144 +145 +146 +148 +149 +151 +152 +153 +155 +157 +159 +160 +162 +163 +165 +166 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +184 +185 +186 +186 +185 +183 +182 +178 +162 +129 +110 +114 +137 +166 +184 +181 +176 +163 +133 +81 +21 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +231 +231 +231 +231 +232 +232 +232 +232 +231 +231 +230 +229 +227 +225 +223 +220 +218 +215 +213 +210 +207 +205 +203 +200 +198 +195 +193 +192 +190 +189 +189 +188 +188 +188 +189 +191 +192 +194 +197 +199 +202 +204 +205 +207 +208 +210 +211 +212 +213 +214 +216 +217 +218 +219 +219 +217 +201 +169 +138 +127 +143 +170 +185 +190 +189 +184 +176 +171 +168 +170 +179 +189 +198 +205 +210 +214 +216 +217 +218 +218 +216 +208 +197 +187 +182 +181 +183 +184 +184 +184 +178 +168 +163 +165 +172 +208 +222 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +229 +228 +226 +225 +223 +222 +217 +211 +204 +197 +191 +188 +188 +189 +189 +190 +192 +192 +190 +188 +183 +171 +160 +147 +134 +120 +103 +91 +81 +73 +66 +60 +57 +55 +53 +52 +52 +52 +51 +52 +52 +52 +53 +54 +54 +55 +58 +64 +73 +83 +94 +105 +114 +128 +145 +165 +179 +178 +170 +157 +138 +114 +100 +89 +83 +79 +78 +79 +81 +83 +85 +89 +92 +95 +97 +100 +103 +106 +109 +112 +116 +121 +124 +128 +131 +134 +137 +140 +142 +144 +145 +148 +149 +151 +152 +154 +156 +158 +160 +162 +164 +166 +168 +169 +171 +172 +174 +175 +175 +176 +177 +178 +179 +179 +180 +181 +182 +182 +183 +183 +183 +185 +186 +187 +187 +186 +185 +184 +180 +166 +135 +115 +119 +141 +168 +183 +181 +176 +161 +129 +75 +18 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +240 +241 +241 +241 +242 +242 +241 +241 +241 +241 +241 +240 +239 +237 +235 +231 +227 +223 +219 +215 +212 +209 +207 +206 +204 +202 +200 +199 +198 +197 +196 +196 +196 +197 +197 +199 +201 +203 +205 +207 +209 +210 +211 +212 +213 +214 +214 +215 +216 +217 +218 +219 +219 +220 +219 +213 +173 +142 +127 +130 +170 +186 +191 +189 +186 +179 +170 +167 +168 +173 +189 +196 +203 +208 +212 +216 +217 +218 +218 +218 +216 +209 +198 +187 +181 +181 +182 +183 +183 +183 +178 +167 +163 +164 +171 +208 +222 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +230 +229 +227 +225 +224 +223 +221 +216 +209 +202 +195 +190 +188 +188 +188 +189 +191 +193 +194 +194 +193 +188 +181 +171 +161 +148 +131 +118 +106 +95 +85 +74 +68 +63 +59 +56 +54 +54 +53 +54 +54 +55 +55 +55 +56 +57 +66 +77 +87 +97 +104 +114 +127 +144 +163 +182 +187 +182 +169 +151 +129 +105 +93 +85 +80 +79 +80 +82 +85 +88 +91 +95 +98 +100 +102 +105 +108 +111 +115 +118 +122 +127 +130 +134 +137 +139 +142 +144 +146 +148 +150 +152 +154 +155 +157 +160 +163 +165 +168 +170 +172 +174 +176 +177 +178 +179 +180 +181 +182 +182 +183 +183 +184 +184 +184 +185 +185 +185 +186 +186 +186 +187 +187 +188 +188 +187 +186 +185 +181 +169 +141 +121 +124 +145 +170 +183 +181 +176 +159 +125 +70 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +252 +251 +249 +246 +244 +241 +240 +239 +239 +240 +241 +241 +242 +243 +243 +242 +241 +240 +237 +233 +226 +221 +216 +212 +210 +207 +206 +205 +204 +204 +203 +203 +203 +204 +204 +206 +208 +210 +212 +214 +215 +215 +216 +216 +217 +217 +218 +219 +220 +221 +221 +221 +221 +219 +214 +162 +133 +125 +136 +166 +192 +191 +189 +185 +181 +166 +164 +166 +172 +185 +195 +201 +207 +212 +216 +218 +219 +219 +219 +219 +217 +209 +199 +189 +182 +181 +181 +182 +182 +182 +178 +168 +163 +163 +168 +206 +222 +228 +229 +229 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +230 +230 +229 +227 +226 +224 +223 +222 +220 +216 +210 +202 +194 +191 +189 +188 +188 +189 +191 +193 +195 +197 +197 +195 +191 +185 +177 +163 +152 +140 +128 +117 +104 +95 +87 +81 +75 +69 +66 +64 +62 +61 +61 +62 +65 +70 +78 +90 +97 +103 +110 +118 +135 +153 +172 +187 +196 +192 +177 +157 +134 +112 +91 +84 +82 +81 +82 +87 +91 +95 +98 +100 +103 +105 +107 +110 +113 +117 +120 +124 +128 +131 +135 +138 +141 +143 +146 +148 +150 +152 +154 +157 +160 +162 +165 +168 +171 +174 +176 +178 +180 +182 +183 +185 +186 +186 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +188 +188 +188 +188 +189 +188 +187 +186 +183 +172 +147 +127 +131 +150 +172 +183 +180 +175 +155 +118 +62 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +180 +181 +182 +185 +190 +194 +199 +200 +200 +198 +196 +198 +201 +205 +211 +220 +227 +233 +236 +235 +233 +230 +226 +221 +217 +213 +210 +209 +208 +207 +207 +207 +207 +208 +209 +213 +215 +216 +216 +216 +215 +215 +215 +215 +215 +217 +218 +219 +219 +216 +203 +192 +178 +161 +143 +124 +124 +141 +165 +186 +192 +189 +186 +181 +173 +162 +162 +168 +177 +188 +198 +205 +211 +215 +218 +219 +219 +219 +219 +219 +217 +211 +201 +191 +184 +180 +181 +181 +181 +181 +178 +169 +163 +161 +165 +200 +220 +227 +228 +228 +228 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +230 +230 +230 +229 +227 +226 +224 +223 +222 +222 +219 +214 +208 +199 +194 +191 +189 +188 +188 +190 +191 +194 +196 +198 +199 +198 +195 +190 +180 +170 +160 +149 +139 +125 +115 +107 +99 +92 +85 +81 +78 +76 +76 +78 +81 +85 +90 +96 +102 +107 +114 +125 +138 +158 +175 +189 +198 +200 +187 +165 +140 +117 +99 +86 +84 +83 +85 +89 +94 +98 +100 +103 +105 +108 +110 +113 +116 +119 +124 +128 +131 +135 +138 +142 +144 +147 +149 +151 +154 +157 +159 +162 +164 +168 +171 +174 +177 +179 +182 +184 +186 +187 +188 +188 +189 +189 +189 +189 +189 +189 +189 +189 +189 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +189 +189 +189 +189 +188 +187 +184 +174 +150 +132 +136 +154 +175 +183 +180 +174 +151 +112 +56 +10 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +148 +162 +177 +189 +197 +202 +206 +207 +207 +205 +204 +204 +204 +204 +204 +208 +214 +220 +226 +232 +235 +234 +232 +228 +224 +219 +216 +213 +212 +211 +210 +211 +212 +214 +216 +219 +218 +217 +212 +202 +197 +198 +201 +203 +203 +198 +187 +175 +160 +145 +132 +128 +125 +121 +115 +121 +140 +164 +184 +193 +190 +186 +182 +176 +164 +159 +162 +170 +180 +190 +202 +209 +214 +217 +219 +219 +219 +219 +219 +219 +218 +212 +204 +194 +186 +181 +180 +180 +181 +180 +178 +170 +163 +160 +162 +193 +216 +226 +228 +228 +228 +228 +228 +229 +229 +229 +229 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +229 +227 +226 +224 +223 +223 +222 +221 +218 +212 +203 +197 +193 +190 +189 +188 +189 +190 +192 +194 +198 +200 +201 +201 +198 +192 +185 +176 +167 +157 +144 +134 +126 +118 +111 +103 +99 +97 +95 +95 +96 +99 +102 +105 +108 +114 +122 +133 +146 +160 +179 +192 +201 +203 +198 +173 +146 +122 +103 +90 +85 +86 +88 +92 +97 +101 +104 +106 +108 +110 +114 +117 +120 +124 +127 +132 +136 +139 +142 +145 +148 +151 +153 +155 +158 +161 +164 +167 +170 +173 +177 +180 +183 +185 +187 +189 +189 +190 +191 +191 +192 +192 +192 +192 +192 +191 +191 +191 +191 +191 +190 +190 +190 +190 +190 +189 +189 +189 +189 +189 +189 +189 +189 +189 +189 +188 +188 +185 +176 +153 +137 +140 +158 +177 +183 +180 +173 +147 +105 +49 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +152 +178 +200 +216 +224 +226 +226 +226 +226 +226 +226 +225 +222 +217 +211 +207 +206 +209 +214 +223 +232 +234 +234 +232 +230 +225 +222 +219 +216 +215 +215 +216 +218 +220 +222 +217 +205 +194 +182 +165 +154 +155 +156 +157 +153 +140 +123 +105 +86 +71 +71 +80 +94 +108 +119 +141 +168 +185 +194 +193 +186 +184 +178 +169 +157 +157 +163 +172 +183 +193 +206 +213 +216 +218 +219 +219 +219 +219 +219 +219 +219 +214 +207 +197 +189 +182 +180 +180 +180 +180 +178 +171 +164 +160 +160 +184 +211 +224 +228 +228 +228 +228 +228 +228 +228 +229 +229 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +228 +227 +225 +224 +223 +223 +223 +222 +220 +215 +207 +200 +195 +192 +190 +189 +188 +189 +190 +193 +197 +200 +203 +204 +204 +200 +195 +188 +181 +172 +160 +151 +143 +136 +129 +122 +118 +116 +114 +113 +113 +114 +115 +118 +121 +131 +143 +156 +170 +182 +197 +204 +206 +201 +188 +151 +124 +105 +92 +87 +88 +91 +95 +100 +104 +108 +110 +112 +114 +117 +121 +125 +128 +132 +136 +141 +144 +147 +149 +152 +155 +157 +160 +163 +166 +170 +173 +177 +180 +183 +186 +188 +190 +192 +193 +193 +194 +194 +194 +194 +195 +195 +195 +195 +195 +194 +194 +194 +194 +194 +193 +193 +192 +192 +192 +192 +191 +191 +191 +191 +191 +190 +190 +190 +190 +189 +188 +186 +177 +156 +141 +145 +162 +179 +183 +180 +171 +143 +98 +43 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +186 +210 +221 +226 +227 +227 +226 +226 +225 +225 +225 +225 +225 +225 +224 +217 +210 +207 +207 +210 +225 +231 +234 +234 +234 +230 +228 +225 +222 +220 +221 +223 +224 +224 +222 +202 +160 +129 +109 +98 +83 +72 +62 +50 +36 +23 +23 +28 +39 +54 +80 +99 +114 +128 +143 +177 +190 +195 +193 +189 +184 +181 +172 +161 +153 +154 +162 +173 +184 +196 +210 +215 +217 +218 +218 +219 +219 +219 +219 +219 +219 +217 +210 +202 +192 +184 +181 +180 +179 +179 +178 +172 +165 +160 +158 +174 +205 +222 +228 +228 +228 +228 +227 +227 +228 +228 +229 +229 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +229 +228 +226 +225 +224 +223 +223 +223 +223 +221 +218 +209 +203 +198 +194 +191 +189 +189 +189 +190 +192 +197 +200 +203 +205 +206 +205 +201 +196 +190 +184 +174 +166 +159 +152 +145 +139 +134 +131 +127 +125 +123 +123 +126 +132 +141 +159 +171 +181 +190 +199 +208 +210 +205 +192 +165 +123 +103 +92 +88 +88 +93 +98 +103 +107 +109 +112 +114 +117 +120 +124 +129 +133 +137 +141 +145 +149 +151 +154 +156 +159 +163 +166 +169 +173 +176 +181 +184 +187 +190 +192 +194 +195 +195 +196 +196 +197 +198 +198 +199 +199 +199 +199 +199 +199 +199 +199 +199 +199 +198 +198 +197 +197 +196 +196 +196 +195 +195 +194 +193 +193 +192 +192 +191 +191 +190 +189 +189 +187 +178 +159 +145 +150 +165 +180 +183 +179 +170 +138 +91 +37 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +197 +216 +224 +226 +226 +224 +223 +223 +223 +224 +224 +224 +224 +225 +225 +224 +218 +212 +207 +207 +211 +220 +228 +233 +234 +233 +232 +229 +227 +227 +230 +230 +218 +184 +115 +59 +41 +27 +18 +11 +8 +5 +4 +6 +10 +28 +49 +73 +97 +118 +135 +141 +152 +166 +185 +196 +196 +193 +189 +184 +182 +174 +162 +152 +150 +152 +160 +172 +186 +201 +214 +216 +217 +217 +217 +218 +219 +219 +219 +220 +220 +219 +215 +208 +199 +188 +183 +180 +179 +179 +178 +174 +167 +161 +158 +162 +190 +212 +226 +228 +228 +227 +227 +227 +227 +227 +228 +228 +229 +229 +229 +229 +230 +230 +230 +230 +229 +229 +229 +228 +226 +225 +224 +224 +224 +223 +223 +223 +222 +218 +210 +203 +198 +194 +191 +189 +189 +189 +190 +193 +198 +201 +204 +207 +209 +209 +207 +204 +199 +192 +183 +176 +169 +163 +157 +149 +145 +143 +141 +141 +146 +153 +162 +171 +180 +188 +194 +200 +206 +211 +211 +204 +182 +151 +117 +95 +92 +92 +94 +99 +107 +111 +114 +116 +118 +122 +125 +129 +133 +138 +143 +147 +151 +154 +157 +160 +163 +166 +169 +173 +178 +181 +185 +188 +191 +194 +196 +197 +198 +199 +200 +200 +201 +202 +203 +204 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +203 +202 +202 +201 +200 +200 +199 +198 +197 +196 +195 +194 +193 +192 +190 +189 +187 +179 +161 +151 +156 +170 +182 +183 +179 +166 +130 +80 +29 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +205 +219 +225 +226 +225 +223 +223 +223 +223 +224 +224 +224 +224 +224 +225 +225 +222 +216 +210 +207 +211 +219 +227 +232 +234 +234 +233 +232 +231 +231 +226 +189 +138 +87 +47 +24 +17 +12 +8 +6 +4 +5 +13 +27 +50 +83 +103 +120 +133 +141 +152 +162 +175 +186 +194 +197 +194 +189 +185 +183 +181 +167 +156 +149 +148 +150 +158 +172 +188 +205 +216 +216 +216 +216 +216 +217 +219 +219 +219 +220 +220 +220 +218 +214 +206 +193 +186 +182 +179 +179 +177 +175 +169 +163 +158 +159 +177 +200 +220 +227 +228 +227 +227 +227 +227 +227 +227 +227 +227 +228 +228 +228 +228 +228 +228 +228 +228 +227 +227 +226 +225 +225 +224 +224 +224 +224 +224 +223 +220 +216 +207 +201 +196 +193 +190 +189 +190 +191 +194 +197 +202 +206 +209 +211 +212 +212 +210 +207 +204 +198 +190 +184 +178 +173 +168 +164 +163 +163 +164 +167 +172 +177 +183 +188 +192 +199 +204 +209 +211 +212 +199 +171 +142 +116 +101 +94 +95 +98 +103 +108 +114 +116 +119 +122 +125 +131 +135 +140 +144 +148 +154 +157 +161 +164 +168 +173 +176 +180 +184 +187 +191 +193 +196 +197 +199 +200 +201 +202 +203 +203 +204 +205 +205 +205 +206 +206 +206 +207 +207 +207 +207 +207 +208 +208 +208 +208 +208 +208 +207 +207 +207 +207 +206 +205 +205 +204 +203 +202 +201 +200 +199 +197 +196 +195 +193 +191 +190 +187 +180 +162 +154 +160 +172 +183 +183 +178 +162 +123 +72 +24 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +207 +220 +225 +226 +225 +222 +222 +223 +224 +225 +224 +224 +224 +224 +225 +225 +223 +217 +211 +209 +211 +219 +227 +233 +234 +234 +234 +233 +230 +222 +171 +117 +70 +34 +16 +8 +6 +5 +4 +3 +6 +19 +39 +65 +92 +120 +134 +145 +153 +159 +171 +181 +190 +196 +197 +195 +190 +186 +184 +183 +176 +160 +151 +147 +147 +149 +157 +172 +191 +209 +217 +216 +215 +213 +213 +216 +218 +219 +220 +220 +220 +221 +220 +217 +212 +200 +191 +185 +180 +179 +177 +176 +172 +166 +159 +157 +166 +187 +210 +225 +228 +227 +227 +227 +227 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +225 +225 +224 +224 +224 +224 +224 +223 +221 +217 +211 +203 +197 +194 +191 +191 +192 +194 +197 +200 +204 +208 +210 +212 +214 +214 +213 +211 +209 +206 +202 +197 +192 +188 +184 +181 +180 +179 +180 +182 +184 +189 +192 +195 +199 +203 +207 +210 +211 +206 +194 +161 +134 +114 +101 +97 +99 +104 +108 +113 +117 +121 +124 +128 +132 +136 +143 +148 +152 +156 +160 +165 +170 +174 +178 +182 +186 +190 +192 +195 +197 +199 +200 +201 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +207 +207 +207 +207 +207 +207 +208 +208 +208 +208 +208 +209 +209 +209 +209 +209 +209 +209 +209 +209 +208 +208 +207 +206 +205 +204 +204 +202 +200 +199 +197 +194 +191 +190 +188 +180 +164 +158 +164 +175 +183 +183 +177 +158 +115 +64 +19 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +206 +220 +225 +225 +225 +222 +221 +222 +224 +225 +224 +224 +224 +224 +225 +224 +222 +217 +212 +210 +214 +222 +229 +233 +235 +234 +233 +227 +210 +180 +95 +48 +22 +11 +6 +4 +4 +4 +4 +5 +18 +45 +75 +104 +126 +143 +151 +159 +166 +175 +187 +194 +198 +198 +196 +193 +187 +185 +184 +183 +170 +155 +148 +147 +147 +148 +156 +173 +194 +213 +216 +215 +212 +211 +211 +215 +217 +219 +219 +220 +220 +221 +221 +220 +217 +207 +197 +189 +183 +179 +177 +176 +173 +169 +161 +157 +159 +173 +195 +218 +226 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +225 +224 +224 +224 +224 +224 +223 +221 +217 +211 +205 +197 +193 +191 +190 +191 +195 +199 +202 +206 +209 +212 +213 +214 +215 +214 +213 +211 +209 +206 +204 +201 +198 +196 +194 +193 +192 +192 +193 +194 +196 +199 +201 +203 +206 +209 +211 +208 +199 +183 +159 +121 +106 +100 +100 +102 +108 +114 +118 +122 +125 +130 +134 +139 +145 +150 +157 +161 +166 +170 +174 +179 +183 +187 +191 +194 +198 +200 +201 +202 +203 +203 +203 +203 +204 +204 +204 +204 +204 +204 +204 +204 +204 +205 +205 +205 +206 +206 +207 +207 +207 +208 +208 +208 +208 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +209 +209 +208 +207 +206 +205 +203 +201 +199 +196 +192 +191 +188 +180 +165 +161 +168 +177 +184 +182 +176 +152 +106 +55 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +205 +219 +225 +225 +225 +222 +221 +221 +222 +224 +225 +225 +225 +225 +225 +222 +218 +215 +213 +212 +219 +228 +233 +235 +235 +234 +230 +207 +161 +88 +28 +15 +7 +4 +3 +3 +3 +3 +5 +10 +44 +81 +110 +130 +144 +157 +166 +174 +183 +191 +198 +199 +199 +197 +194 +188 +185 +184 +184 +183 +162 +151 +147 +147 +147 +148 +156 +174 +197 +214 +216 +213 +210 +207 +208 +213 +216 +217 +219 +220 +220 +221 +221 +221 +221 +215 +205 +195 +187 +180 +177 +176 +174 +171 +165 +157 +156 +161 +176 +203 +224 +226 +227 +227 +227 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +225 +225 +225 +225 +225 +224 +224 +224 +224 +224 +222 +216 +209 +202 +196 +190 +188 +188 +190 +192 +197 +200 +204 +207 +210 +212 +213 +214 +214 +213 +212 +210 +208 +205 +203 +201 +200 +199 +198 +197 +197 +198 +199 +201 +203 +206 +208 +210 +211 +212 +208 +193 +166 +136 +111 +102 +102 +104 +108 +114 +119 +122 +125 +128 +133 +140 +146 +152 +158 +163 +170 +176 +181 +187 +191 +196 +199 +200 +201 +202 +202 +203 +203 +204 +204 +204 +203 +203 +202 +202 +201 +201 +201 +200 +200 +199 +199 +199 +200 +201 +202 +203 +204 +205 +206 +207 +207 +208 +208 +208 +209 +209 +209 +210 +210 +210 +210 +211 +211 +211 +211 +211 +210 +209 +209 +207 +206 +204 +201 +198 +193 +192 +188 +180 +166 +164 +172 +180 +184 +182 +175 +145 +97 +47 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +198 +216 +224 +225 +226 +222 +221 +221 +221 +221 +221 +221 +221 +220 +219 +217 +217 +217 +220 +225 +232 +234 +234 +234 +232 +216 +166 +106 +52 +21 +8 +4 +3 +2 +2 +3 +3 +5 +15 +39 +91 +117 +137 +152 +166 +180 +187 +193 +197 +199 +200 +199 +197 +193 +191 +186 +185 +185 +184 +180 +155 +149 +147 +147 +147 +148 +155 +176 +200 +216 +216 +210 +205 +202 +203 +208 +211 +214 +216 +218 +219 +220 +221 +221 +222 +220 +215 +207 +197 +187 +179 +177 +175 +173 +171 +161 +157 +156 +160 +171 +205 +219 +225 +227 +227 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +225 +225 +225 +224 +224 +224 +223 +222 +220 +216 +207 +200 +194 +190 +187 +186 +186 +187 +189 +191 +195 +197 +199 +201 +202 +204 +204 +204 +204 +204 +203 +203 +202 +202 +202 +201 +201 +201 +201 +202 +204 +206 +207 +208 +208 +209 +209 +207 +201 +186 +149 +125 +111 +105 +104 +106 +111 +116 +121 +125 +132 +137 +144 +150 +157 +165 +171 +177 +182 +188 +194 +197 +199 +200 +201 +201 +202 +202 +202 +201 +199 +198 +196 +194 +192 +188 +184 +181 +177 +174 +171 +170 +169 +168 +168 +168 +169 +171 +173 +176 +180 +184 +187 +191 +195 +200 +202 +205 +206 +208 +209 +209 +209 +210 +210 +210 +210 +211 +212 +212 +212 +212 +212 +211 +211 +210 +208 +207 +204 +200 +194 +192 +188 +180 +168 +167 +176 +182 +184 +182 +171 +134 +84 +36 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +189 +211 +221 +224 +226 +224 +223 +222 +221 +221 +221 +221 +221 +221 +221 +221 +223 +226 +228 +230 +233 +232 +227 +215 +191 +127 +80 +45 +21 +9 +4 +2 +2 +2 +2 +2 +4 +14 +36 +73 +117 +139 +157 +171 +182 +191 +194 +197 +199 +200 +199 +197 +195 +193 +190 +186 +186 +186 +183 +176 +152 +150 +149 +149 +148 +149 +156 +178 +203 +216 +215 +208 +202 +198 +198 +202 +206 +209 +211 +214 +216 +218 +220 +220 +221 +221 +219 +214 +207 +196 +184 +179 +176 +174 +172 +166 +160 +157 +157 +160 +178 +201 +215 +223 +226 +226 +226 +225 +225 +225 +225 +225 +225 +225 +224 +224 +224 +223 +223 +222 +219 +216 +212 +208 +202 +196 +192 +189 +187 +186 +186 +186 +188 +189 +191 +193 +195 +196 +198 +199 +200 +201 +201 +202 +202 +202 +202 +203 +203 +203 +204 +205 +206 +206 +207 +207 +207 +207 +207 +206 +200 +187 +171 +153 +136 +120 +114 +111 +112 +116 +121 +126 +130 +134 +139 +146 +152 +159 +166 +174 +183 +188 +191 +194 +196 +199 +200 +200 +199 +198 +196 +192 +188 +184 +179 +172 +167 +162 +158 +154 +151 +149 +147 +145 +143 +141 +140 +139 +139 +139 +141 +142 +144 +146 +149 +154 +158 +163 +169 +175 +184 +189 +195 +199 +203 +206 +208 +209 +210 +210 +210 +210 +211 +211 +212 +213 +213 +212 +212 +212 +211 +210 +208 +206 +201 +195 +193 +187 +179 +169 +170 +179 +183 +184 +181 +168 +124 +73 +29 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +175 +202 +215 +221 +225 +224 +224 +223 +223 +222 +222 +222 +223 +223 +224 +225 +226 +228 +229 +228 +222 +205 +181 +149 +111 +56 +30 +14 +6 +3 +2 +1 +2 +2 +2 +3 +8 +30 +64 +104 +141 +160 +174 +185 +192 +196 +198 +199 +200 +199 +198 +196 +194 +192 +190 +186 +187 +187 +183 +173 +152 +152 +152 +151 +149 +149 +157 +180 +205 +216 +214 +205 +198 +194 +192 +195 +199 +202 +205 +208 +212 +215 +217 +218 +220 +221 +220 +218 +214 +206 +193 +185 +180 +176 +173 +170 +164 +159 +156 +155 +162 +178 +196 +211 +221 +225 +225 +225 +225 +224 +224 +223 +223 +222 +221 +220 +219 +218 +216 +214 +210 +207 +203 +199 +195 +191 +189 +188 +187 +186 +187 +188 +189 +191 +192 +195 +196 +198 +199 +200 +202 +202 +203 +204 +205 +206 +206 +206 +207 +207 +208 +208 +208 +208 +207 +205 +202 +197 +189 +180 +164 +151 +138 +126 +117 +113 +115 +117 +120 +125 +132 +138 +144 +150 +157 +167 +173 +179 +184 +189 +194 +196 +197 +198 +197 +193 +190 +185 +180 +175 +168 +163 +158 +154 +149 +144 +140 +137 +134 +132 +130 +129 +128 +128 +127 +126 +125 +125 +125 +125 +125 +126 +127 +129 +131 +134 +138 +142 +148 +154 +164 +172 +180 +188 +194 +201 +204 +207 +209 +210 +210 +210 +211 +211 +212 +213 +213 +213 +213 +213 +212 +211 +210 +207 +202 +195 +193 +187 +179 +171 +173 +181 +184 +184 +180 +163 +113 +63 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +157 +188 +204 +212 +220 +222 +223 +223 +223 +223 +223 +223 +224 +224 +224 +223 +221 +217 +210 +199 +176 +145 +108 +69 +34 +11 +6 +3 +1 +1 +1 +1 +1 +1 +1 +4 +19 +54 +95 +131 +161 +177 +187 +194 +197 +198 +199 +200 +199 +199 +197 +195 +194 +193 +190 +188 +188 +188 +183 +170 +154 +155 +155 +154 +150 +149 +158 +183 +207 +216 +213 +203 +195 +190 +186 +187 +191 +193 +196 +200 +204 +209 +212 +215 +217 +220 +220 +220 +219 +215 +204 +194 +186 +180 +175 +172 +168 +163 +158 +155 +153 +160 +173 +190 +207 +220 +222 +223 +224 +223 +222 +221 +220 +219 +218 +216 +214 +212 +210 +207 +203 +200 +197 +195 +193 +191 +191 +190 +190 +191 +192 +193 +195 +197 +198 +201 +202 +203 +205 +206 +207 +207 +208 +208 +209 +209 +210 +210 +209 +209 +207 +206 +203 +200 +196 +188 +181 +171 +159 +145 +129 +122 +118 +116 +117 +120 +124 +129 +134 +139 +148 +154 +162 +170 +178 +187 +191 +195 +196 +197 +195 +193 +190 +186 +181 +173 +166 +159 +152 +145 +138 +133 +130 +127 +125 +124 +123 +123 +122 +122 +121 +121 +121 +121 +121 +121 +121 +121 +121 +120 +119 +119 +119 +119 +120 +122 +124 +127 +130 +135 +145 +154 +163 +173 +182 +192 +198 +203 +206 +209 +209 +210 +210 +211 +212 +213 +213 +214 +214 +214 +213 +212 +211 +208 +202 +196 +193 +186 +178 +173 +175 +183 +185 +183 +179 +155 +102 +53 +17 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +167 +185 +197 +209 +215 +218 +220 +220 +221 +221 +221 +221 +220 +218 +212 +202 +183 +157 +123 +72 +42 +22 +10 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +40 +83 +125 +154 +179 +190 +195 +197 +197 +199 +199 +199 +199 +198 +197 +196 +195 +194 +191 +189 +190 +189 +183 +168 +157 +158 +159 +157 +151 +150 +160 +185 +209 +215 +211 +201 +192 +186 +180 +179 +181 +182 +185 +189 +194 +200 +204 +208 +212 +217 +218 +220 +220 +219 +215 +206 +196 +187 +179 +174 +172 +168 +163 +156 +153 +152 +154 +162 +179 +206 +215 +221 +224 +223 +223 +221 +220 +219 +217 +214 +212 +210 +208 +206 +202 +200 +198 +196 +195 +195 +195 +197 +199 +201 +205 +207 +209 +211 +212 +213 +214 +214 +214 +214 +213 +213 +213 +212 +211 +210 +210 +209 +207 +205 +201 +195 +186 +176 +163 +146 +135 +127 +122 +119 +117 +117 +118 +120 +124 +133 +140 +148 +157 +165 +176 +183 +189 +193 +195 +197 +197 +197 +196 +193 +184 +174 +163 +152 +142 +133 +128 +126 +124 +123 +122 +122 +122 +121 +121 +121 +122 +122 +122 +123 +123 +123 +123 +123 +123 +123 +122 +122 +121 +121 +120 +119 +118 +118 +117 +117 +117 +118 +120 +122 +128 +136 +145 +156 +166 +180 +189 +196 +202 +206 +209 +209 +210 +211 +212 +213 +213 +214 +214 +214 +214 +213 +212 +209 +203 +197 +193 +186 +178 +174 +179 +185 +185 +182 +177 +146 +89 +43 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +114 +131 +144 +154 +166 +173 +177 +180 +180 +178 +172 +165 +154 +139 +121 +92 +70 +50 +34 +21 +10 +6 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +23 +78 +122 +155 +176 +193 +195 +196 +197 +197 +199 +199 +199 +199 +198 +198 +198 +197 +195 +192 +191 +192 +191 +184 +169 +163 +164 +164 +160 +151 +150 +164 +188 +210 +215 +209 +198 +189 +182 +173 +169 +167 +166 +167 +170 +175 +181 +187 +193 +199 +207 +211 +215 +218 +219 +219 +216 +211 +203 +193 +181 +176 +173 +170 +167 +158 +154 +151 +150 +150 +158 +174 +191 +206 +217 +220 +221 +221 +220 +219 +218 +216 +215 +214 +213 +212 +211 +211 +212 +213 +214 +214 +215 +215 +216 +216 +216 +215 +215 +215 +214 +213 +213 +212 +210 +208 +205 +202 +198 +193 +185 +177 +169 +161 +153 +141 +135 +130 +127 +125 +124 +124 +125 +126 +128 +133 +138 +144 +149 +154 +159 +165 +171 +178 +185 +191 +194 +197 +197 +196 +188 +177 +164 +151 +139 +129 +125 +123 +122 +121 +121 +121 +121 +121 +122 +124 +126 +128 +130 +132 +136 +138 +141 +143 +146 +148 +148 +148 +148 +146 +144 +141 +139 +135 +132 +127 +124 +122 +120 +118 +116 +115 +115 +115 +115 +117 +121 +127 +135 +145 +161 +172 +183 +192 +200 +205 +207 +209 +210 +211 +212 +213 +214 +214 +215 +214 +214 +213 +210 +203 +197 +193 +185 +178 +176 +182 +186 +185 +181 +174 +130 +72 +31 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +110 +115 +119 +123 +125 +122 +120 +115 +109 +100 +94 +86 +77 +67 +54 +44 +34 +25 +17 +9 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +7 +48 +105 +144 +170 +186 +195 +195 +196 +196 +197 +199 +199 +199 +199 +199 +200 +200 +198 +196 +193 +193 +194 +192 +186 +172 +168 +168 +167 +161 +150 +150 +166 +191 +211 +214 +208 +197 +188 +180 +170 +163 +159 +156 +155 +156 +158 +163 +169 +175 +182 +192 +199 +205 +211 +215 +218 +217 +215 +211 +206 +195 +186 +179 +174 +171 +166 +161 +157 +153 +150 +150 +155 +160 +167 +179 +194 +203 +210 +214 +215 +216 +216 +215 +215 +214 +214 +213 +213 +213 +213 +213 +213 +213 +212 +212 +210 +208 +205 +202 +198 +192 +187 +183 +178 +173 +167 +163 +158 +154 +150 +146 +143 +140 +137 +134 +131 +130 +128 +128 +127 +128 +130 +132 +136 +140 +146 +153 +161 +169 +177 +187 +191 +195 +197 +198 +194 +186 +175 +164 +153 +142 +136 +131 +127 +124 +122 +121 +121 +122 +123 +126 +129 +134 +139 +144 +152 +157 +162 +167 +171 +175 +178 +179 +180 +181 +182 +182 +181 +180 +179 +176 +173 +169 +164 +159 +151 +145 +138 +131 +125 +120 +117 +114 +113 +113 +113 +115 +119 +124 +133 +147 +159 +171 +182 +192 +201 +204 +207 +208 +210 +212 +213 +214 +215 +215 +215 +214 +213 +210 +203 +198 +191 +184 +178 +178 +185 +186 +184 +179 +170 +115 +59 +23 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +97 +98 +97 +95 +92 +88 +84 +80 +75 +69 +65 +61 +56 +51 +47 +42 +35 +28 +21 +12 +6 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +13 +76 +130 +162 +180 +192 +195 +195 +195 +196 +197 +199 +199 +199 +199 +200 +201 +201 +199 +197 +194 +195 +195 +194 +189 +177 +172 +172 +169 +161 +150 +150 +169 +193 +211 +214 +208 +196 +187 +178 +168 +159 +154 +148 +145 +144 +144 +147 +151 +157 +163 +174 +181 +190 +198 +205 +213 +215 +216 +215 +213 +206 +198 +190 +182 +176 +171 +168 +164 +159 +155 +151 +149 +148 +149 +154 +165 +171 +178 +183 +187 +193 +195 +197 +198 +199 +200 +199 +199 +198 +196 +194 +192 +190 +187 +184 +180 +176 +172 +169 +165 +160 +157 +153 +150 +146 +142 +140 +137 +135 +133 +132 +131 +130 +130 +130 +131 +132 +133 +135 +137 +142 +148 +154 +161 +167 +176 +182 +187 +192 +196 +197 +193 +187 +179 +171 +161 +152 +144 +135 +128 +123 +121 +120 +120 +121 +124 +128 +132 +138 +144 +152 +159 +165 +171 +176 +182 +186 +190 +193 +196 +198 +199 +200 +200 +201 +201 +201 +200 +200 +199 +197 +195 +192 +188 +184 +177 +169 +161 +152 +142 +131 +124 +118 +114 +112 +111 +111 +113 +117 +123 +135 +147 +159 +172 +184 +195 +200 +204 +207 +209 +211 +213 +214 +215 +215 +215 +215 +213 +209 +203 +198 +190 +183 +179 +180 +187 +186 +183 +176 +163 +99 +47 +17 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +89 +89 +87 +83 +75 +71 +68 +66 +65 +64 +64 +63 +62 +61 +58 +54 +47 +39 +30 +16 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +22 +104 +151 +175 +187 +195 +195 +194 +194 +195 +198 +200 +199 +199 +200 +201 +203 +202 +200 +197 +196 +197 +197 +196 +191 +181 +176 +175 +169 +160 +149 +150 +172 +195 +212 +214 +208 +196 +186 +178 +168 +157 +151 +144 +138 +135 +132 +133 +136 +139 +144 +153 +161 +169 +179 +189 +201 +208 +212 +214 +214 +213 +209 +203 +195 +186 +178 +174 +170 +167 +163 +157 +153 +150 +147 +145 +145 +146 +148 +151 +156 +163 +167 +170 +172 +173 +174 +174 +173 +171 +169 +166 +163 +160 +156 +152 +147 +144 +141 +139 +137 +135 +134 +133 +133 +132 +132 +132 +132 +132 +133 +133 +134 +135 +136 +137 +141 +144 +148 +153 +159 +167 +174 +182 +189 +196 +201 +201 +199 +195 +191 +181 +170 +158 +145 +133 +124 +120 +118 +118 +118 +120 +122 +125 +129 +134 +142 +149 +158 +166 +174 +184 +191 +196 +199 +202 +205 +206 +207 +207 +208 +208 +209 +209 +209 +209 +209 +209 +209 +209 +209 +208 +207 +206 +204 +202 +197 +191 +184 +175 +164 +149 +137 +127 +119 +114 +110 +109 +110 +112 +115 +125 +135 +148 +161 +174 +188 +196 +201 +205 +207 +210 +212 +214 +215 +215 +215 +215 +213 +209 +203 +197 +188 +182 +180 +182 +188 +186 +182 +173 +154 +82 +36 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +86 +86 +85 +83 +74 +70 +67 +65 +65 +69 +73 +77 +80 +82 +78 +72 +64 +54 +41 +22 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +12 +36 +129 +164 +182 +190 +196 +194 +192 +193 +195 +198 +200 +199 +199 +200 +202 +204 +203 +200 +198 +198 +199 +199 +197 +193 +185 +179 +176 +168 +158 +149 +150 +174 +197 +212 +213 +208 +196 +187 +178 +168 +157 +150 +142 +135 +131 +126 +124 +124 +125 +127 +132 +138 +146 +155 +165 +182 +194 +204 +212 +214 +215 +214 +213 +210 +204 +190 +181 +175 +171 +168 +166 +163 +160 +157 +152 +147 +145 +143 +142 +142 +141 +142 +142 +142 +142 +142 +142 +141 +141 +140 +139 +138 +137 +136 +136 +136 +135 +135 +135 +134 +134 +134 +134 +134 +134 +135 +135 +136 +137 +138 +141 +144 +147 +151 +155 +163 +171 +179 +187 +195 +203 +207 +210 +212 +211 +201 +185 +169 +153 +140 +128 +123 +119 +116 +115 +115 +115 +116 +117 +119 +125 +133 +143 +155 +167 +182 +191 +197 +201 +204 +206 +207 +208 +208 +209 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +208 +206 +201 +195 +186 +171 +157 +142 +129 +119 +111 +108 +108 +108 +110 +116 +126 +137 +150 +164 +181 +190 +198 +202 +206 +209 +212 +214 +215 +215 +215 +215 +213 +208 +203 +195 +187 +182 +182 +184 +189 +185 +180 +168 +142 +66 +26 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +84 +85 +85 +84 +77 +73 +71 +71 +74 +94 +102 +106 +106 +105 +95 +86 +74 +60 +45 +25 +12 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +19 +55 +150 +175 +187 +192 +196 +193 +191 +192 +194 +198 +198 +198 +199 +201 +204 +205 +203 +201 +201 +201 +202 +202 +199 +194 +187 +178 +173 +164 +155 +148 +150 +176 +198 +212 +213 +209 +200 +190 +180 +172 +160 +152 +144 +137 +131 +126 +122 +120 +119 +118 +119 +120 +122 +126 +131 +143 +155 +170 +184 +199 +210 +213 +214 +214 +214 +212 +206 +198 +188 +179 +172 +169 +166 +165 +163 +160 +158 +156 +153 +151 +149 +147 +146 +145 +144 +143 +142 +142 +141 +140 +140 +140 +140 +140 +140 +140 +140 +141 +142 +143 +143 +144 +145 +147 +149 +152 +154 +157 +161 +167 +175 +182 +189 +195 +201 +208 +211 +213 +214 +213 +199 +180 +162 +146 +136 +129 +124 +121 +118 +116 +114 +113 +113 +113 +114 +117 +124 +134 +146 +161 +180 +190 +197 +202 +205 +207 +207 +208 +208 +209 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +211 +211 +211 +211 +211 +211 +211 +210 +210 +208 +204 +194 +182 +167 +150 +134 +117 +110 +107 +106 +106 +109 +116 +126 +138 +151 +170 +183 +192 +199 +204 +208 +211 +213 +215 +216 +216 +215 +212 +207 +202 +192 +185 +183 +183 +187 +189 +184 +177 +159 +121 +45 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +85 +86 +87 +86 +82 +79 +78 +81 +91 +112 +116 +117 +116 +111 +99 +87 +72 +57 +40 +23 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +23 +64 +157 +177 +187 +192 +196 +193 +191 +191 +192 +195 +196 +197 +200 +203 +206 +206 +204 +203 +203 +204 +204 +202 +198 +191 +182 +172 +167 +160 +153 +148 +150 +175 +197 +211 +213 +210 +203 +196 +188 +179 +167 +158 +150 +143 +137 +130 +126 +123 +121 +119 +118 +118 +118 +119 +121 +125 +130 +138 +149 +163 +183 +195 +205 +211 +214 +214 +212 +209 +205 +200 +191 +184 +177 +172 +168 +164 +162 +160 +159 +157 +155 +153 +152 +151 +150 +149 +149 +149 +149 +148 +148 +148 +148 +148 +148 +149 +149 +150 +151 +153 +156 +159 +163 +168 +173 +180 +185 +190 +195 +199 +203 +205 +207 +208 +206 +188 +171 +159 +152 +149 +144 +139 +133 +128 +123 +119 +115 +112 +111 +111 +111 +113 +119 +128 +139 +157 +169 +179 +187 +193 +200 +203 +205 +207 +208 +208 +209 +209 +209 +210 +210 +211 +211 +211 +212 +212 +212 +213 +213 +213 +213 +213 +213 +213 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +211 +211 +211 +210 +210 +208 +203 +195 +182 +167 +149 +126 +115 +108 +105 +104 +106 +111 +119 +130 +142 +163 +177 +188 +196 +202 +207 +211 +213 +215 +216 +216 +215 +211 +206 +201 +190 +185 +183 +185 +189 +188 +182 +172 +148 +101 +31 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +86 +89 +90 +90 +87 +85 +85 +91 +107 +124 +126 +126 +122 +114 +99 +83 +66 +50 +35 +18 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +24 +68 +158 +177 +187 +192 +196 +194 +192 +191 +191 +193 +196 +198 +202 +206 +207 +207 +205 +205 +206 +206 +204 +199 +191 +181 +170 +164 +161 +156 +151 +147 +149 +173 +194 +209 +211 +210 +206 +201 +195 +189 +178 +170 +162 +155 +148 +139 +134 +130 +126 +123 +120 +118 +117 +117 +117 +117 +119 +122 +127 +135 +150 +163 +177 +190 +201 +209 +212 +213 +213 +211 +205 +200 +195 +190 +185 +178 +174 +171 +169 +166 +164 +162 +161 +160 +159 +158 +157 +157 +156 +157 +157 +158 +159 +161 +162 +166 +169 +172 +175 +178 +183 +186 +190 +193 +197 +201 +204 +205 +202 +193 +173 +167 +165 +164 +163 +153 +142 +135 +129 +126 +123 +120 +116 +113 +110 +109 +107 +108 +112 +118 +131 +142 +154 +164 +175 +188 +195 +201 +204 +206 +208 +208 +209 +209 +210 +210 +211 +211 +212 +213 +213 +214 +214 +214 +215 +215 +215 +215 +215 +216 +216 +216 +215 +215 +215 +215 +214 +214 +213 +213 +212 +212 +212 +211 +211 +211 +211 +211 +211 +210 +208 +203 +194 +181 +164 +137 +121 +111 +105 +103 +104 +108 +114 +123 +135 +155 +171 +184 +194 +201 +207 +210 +213 +215 +216 +216 +215 +210 +205 +199 +188 +185 +184 +186 +190 +186 +180 +165 +135 +82 +20 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +89 +93 +95 +96 +93 +92 +94 +103 +122 +132 +133 +131 +124 +113 +93 +74 +56 +41 +28 +14 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +23 +66 +156 +175 +185 +191 +196 +196 +193 +192 +192 +194 +197 +201 +205 +208 +208 +208 +208 +208 +207 +206 +199 +188 +175 +163 +154 +154 +155 +154 +150 +146 +147 +168 +190 +206 +209 +209 +208 +205 +202 +199 +191 +185 +178 +171 +165 +154 +148 +142 +137 +132 +126 +123 +120 +118 +117 +116 +116 +116 +117 +118 +123 +132 +144 +159 +174 +191 +200 +206 +210 +212 +213 +213 +211 +208 +203 +197 +192 +188 +184 +182 +178 +177 +175 +174 +173 +172 +171 +171 +172 +172 +174 +176 +178 +180 +183 +187 +192 +196 +200 +204 +207 +206 +203 +199 +194 +189 +186 +183 +176 +162 +132 +125 +122 +122 +122 +124 +124 +123 +121 +117 +113 +109 +106 +103 +103 +108 +114 +122 +133 +145 +165 +180 +191 +199 +203 +206 +207 +208 +208 +209 +210 +210 +211 +211 +212 +213 +214 +214 +215 +216 +216 +217 +217 +217 +217 +218 +218 +218 +218 +218 +218 +218 +217 +217 +217 +217 +217 +216 +216 +215 +214 +214 +213 +212 +212 +211 +211 +211 +211 +210 +210 +208 +203 +193 +177 +149 +129 +115 +106 +102 +102 +105 +110 +118 +128 +149 +166 +181 +192 +200 +206 +210 +213 +215 +216 +217 +214 +209 +203 +196 +186 +185 +185 +188 +191 +184 +177 +156 +119 +62 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +84 +93 +99 +102 +102 +99 +98 +105 +117 +134 +139 +138 +132 +121 +107 +80 +60 +44 +31 +18 +10 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +20 +58 +150 +171 +182 +189 +197 +198 +197 +195 +195 +196 +202 +206 +209 +210 +210 +210 +210 +209 +207 +203 +185 +165 +149 +138 +132 +144 +150 +151 +149 +145 +145 +162 +184 +203 +207 +208 +208 +207 +206 +206 +203 +201 +197 +192 +186 +176 +168 +160 +153 +146 +138 +132 +128 +124 +120 +117 +116 +115 +115 +115 +115 +116 +118 +123 +132 +152 +169 +184 +197 +206 +212 +214 +214 +214 +214 +214 +213 +211 +208 +204 +200 +198 +196 +195 +195 +197 +198 +200 +201 +202 +205 +207 +209 +210 +211 +212 +213 +213 +212 +212 +208 +198 +181 +160 +138 +117 +110 +108 +111 +119 +129 +136 +138 +138 +133 +126 +118 +109 +100 +96 +93 +94 +95 +99 +106 +127 +149 +169 +186 +197 +203 +205 +207 +207 +208 +208 +209 +209 +210 +211 +212 +213 +214 +215 +216 +217 +217 +217 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +217 +217 +216 +215 +214 +213 +212 +211 +211 +211 +211 +210 +210 +207 +201 +189 +162 +139 +121 +108 +102 +100 +103 +107 +113 +122 +143 +163 +179 +191 +199 +206 +211 +214 +215 +216 +217 +213 +207 +201 +193 +186 +185 +187 +189 +191 +182 +173 +145 +101 +43 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +99 +106 +109 +109 +108 +110 +120 +133 +143 +144 +138 +128 +111 +87 +55 +42 +29 +19 +10 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +14 +43 +133 +160 +173 +181 +192 +199 +200 +201 +202 +204 +209 +210 +211 +211 +211 +211 +209 +205 +194 +176 +141 +120 +108 +103 +103 +128 +142 +148 +148 +144 +142 +150 +172 +193 +201 +204 +206 +207 +207 +207 +207 +207 +207 +207 +206 +202 +197 +190 +183 +175 +165 +157 +150 +143 +136 +130 +125 +121 +119 +116 +115 +114 +114 +114 +114 +117 +120 +127 +136 +149 +167 +180 +192 +201 +208 +213 +216 +218 +220 +221 +221 +220 +219 +218 +217 +215 +215 +215 +215 +215 +214 +213 +212 +209 +205 +193 +175 +156 +137 +122 +106 +105 +108 +116 +129 +144 +148 +149 +149 +145 +137 +124 +111 +99 +92 +90 +89 +89 +90 +93 +102 +118 +139 +162 +183 +197 +202 +205 +206 +207 +208 +208 +209 +209 +210 +211 +213 +214 +215 +216 +217 +217 +217 +218 +218 +218 +218 +218 +218 +218 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +218 +218 +218 +218 +217 +216 +215 +214 +212 +212 +211 +211 +210 +210 +210 +207 +200 +176 +151 +130 +113 +102 +99 +101 +104 +108 +116 +139 +160 +177 +190 +199 +207 +211 +214 +216 +217 +216 +211 +205 +197 +190 +186 +186 +189 +190 +189 +178 +163 +124 +73 +23 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +86 +102 +110 +113 +114 +115 +121 +131 +141 +147 +145 +134 +116 +94 +72 +53 +39 +25 +15 +8 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +9 +29 +114 +148 +163 +169 +177 +196 +202 +204 +206 +209 +211 +212 +212 +212 +211 +209 +202 +187 +166 +140 +116 +105 +98 +95 +95 +110 +132 +142 +145 +144 +140 +142 +159 +179 +191 +196 +201 +204 +205 +205 +207 +207 +208 +208 +208 +207 +205 +202 +198 +192 +183 +176 +169 +161 +154 +145 +140 +135 +130 +127 +122 +119 +117 +115 +114 +114 +115 +117 +119 +123 +129 +135 +142 +150 +159 +169 +176 +183 +188 +193 +196 +199 +200 +202 +202 +201 +198 +192 +184 +174 +160 +152 +144 +137 +130 +125 +124 +127 +131 +136 +142 +144 +145 +146 +149 +149 +141 +131 +120 +109 +101 +97 +93 +90 +89 +89 +94 +102 +114 +131 +158 +172 +184 +193 +200 +204 +206 +207 +208 +208 +209 +210 +212 +213 +214 +215 +216 +216 +217 +217 +218 +218 +218 +218 +218 +219 +219 +219 +220 +221 +222 +222 +223 +223 +224 +224 +224 +224 +224 +224 +223 +222 +221 +221 +220 +220 +219 +219 +219 +219 +219 +218 +218 +218 +217 +215 +214 +213 +212 +211 +210 +210 +210 +208 +205 +185 +160 +137 +118 +104 +99 +101 +102 +106 +113 +137 +159 +177 +191 +200 +208 +212 +215 +216 +217 +215 +209 +202 +195 +188 +186 +187 +190 +190 +185 +174 +150 +104 +53 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +105 +114 +117 +118 +122 +131 +141 +147 +150 +143 +126 +106 +87 +71 +57 +44 +30 +17 +9 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +16 +89 +134 +152 +156 +160 +180 +196 +203 +207 +210 +211 +212 +212 +211 +209 +198 +182 +160 +138 +121 +106 +99 +95 +92 +91 +98 +117 +133 +143 +144 +138 +137 +147 +162 +176 +182 +189 +194 +197 +198 +202 +204 +206 +207 +208 +208 +209 +208 +206 +203 +196 +191 +184 +176 +169 +159 +153 +147 +142 +139 +134 +130 +126 +123 +120 +117 +116 +114 +114 +113 +114 +116 +119 +123 +128 +134 +139 +143 +146 +149 +151 +153 +154 +154 +152 +149 +146 +143 +138 +132 +127 +127 +128 +128 +127 +129 +133 +139 +146 +152 +157 +157 +154 +148 +139 +125 +115 +107 +98 +91 +87 +87 +88 +91 +96 +107 +122 +138 +155 +171 +190 +198 +202 +205 +206 +207 +208 +209 +210 +211 +213 +214 +215 +216 +216 +217 +217 +218 +218 +218 +218 +218 +219 +220 +220 +221 +222 +223 +224 +225 +227 +227 +228 +229 +229 +230 +229 +229 +229 +229 +228 +227 +226 +225 +224 +223 +222 +221 +220 +219 +219 +219 +219 +219 +218 +217 +216 +214 +212 +211 +210 +210 +210 +209 +207 +192 +168 +144 +122 +106 +99 +100 +101 +104 +110 +137 +160 +179 +192 +201 +209 +213 +215 +216 +216 +213 +206 +199 +192 +187 +187 +189 +191 +189 +181 +169 +133 +83 +36 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +88 +109 +118 +121 +122 +130 +141 +148 +151 +151 +138 +118 +102 +90 +83 +73 +60 +45 +31 +18 +7 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +59 +115 +140 +146 +145 +157 +180 +194 +202 +207 +209 +209 +208 +205 +199 +178 +155 +135 +120 +114 +108 +104 +101 +98 +93 +93 +104 +122 +138 +143 +137 +133 +135 +143 +156 +163 +170 +176 +180 +182 +189 +193 +196 +200 +203 +205 +207 +209 +209 +208 +205 +201 +196 +190 +182 +173 +166 +159 +153 +149 +145 +142 +138 +135 +131 +126 +123 +120 +118 +117 +115 +114 +114 +114 +114 +114 +114 +115 +115 +115 +114 +114 +114 +113 +112 +111 +111 +112 +113 +115 +123 +132 +140 +148 +153 +159 +161 +163 +163 +162 +156 +149 +140 +129 +114 +96 +90 +87 +86 +86 +88 +91 +96 +105 +117 +140 +160 +177 +192 +200 +205 +206 +207 +208 +208 +209 +210 +212 +213 +214 +216 +217 +217 +217 +217 +218 +218 +218 +218 +219 +219 +220 +221 +222 +223 +225 +226 +227 +229 +230 +231 +232 +232 +233 +233 +233 +233 +233 +233 +233 +232 +231 +231 +230 +228 +227 +225 +224 +222 +221 +220 +219 +219 +219 +219 +218 +217 +215 +213 +212 +211 +210 +210 +210 +209 +197 +175 +150 +127 +107 +99 +99 +100 +103 +109 +138 +162 +180 +194 +203 +210 +214 +216 +216 +216 +211 +203 +196 +190 +187 +187 +190 +191 +187 +177 +160 +112 +62 +22 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +90 +112 +121 +124 +126 +138 +148 +153 +153 +150 +130 +113 +106 +105 +106 +105 +89 +76 +60 +39 +16 +6 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +25 +92 +127 +139 +137 +132 +149 +172 +192 +198 +204 +204 +200 +192 +178 +148 +130 +122 +118 +116 +117 +121 +121 +114 +100 +93 +95 +109 +126 +139 +140 +132 +128 +128 +133 +140 +144 +148 +153 +154 +160 +167 +174 +181 +189 +196 +202 +206 +209 +210 +211 +210 +208 +203 +196 +187 +178 +169 +161 +155 +151 +149 +147 +146 +144 +141 +138 +135 +132 +130 +126 +123 +120 +118 +116 +115 +114 +114 +113 +113 +114 +115 +117 +121 +126 +135 +141 +145 +148 +151 +155 +159 +161 +163 +165 +166 +166 +165 +163 +159 +143 +124 +108 +96 +89 +86 +85 +85 +86 +87 +95 +102 +116 +133 +154 +184 +195 +202 +205 +206 +207 +207 +208 +209 +210 +213 +215 +216 +217 +217 +217 +217 +218 +218 +218 +218 +218 +219 +220 +221 +222 +223 +224 +225 +226 +228 +229 +230 +230 +231 +232 +233 +233 +234 +234 +234 +234 +234 +234 +233 +233 +233 +232 +232 +231 +230 +229 +228 +226 +224 +221 +220 +220 +219 +219 +219 +218 +217 +215 +212 +211 +210 +210 +210 +209 +201 +180 +156 +131 +109 +99 +99 +100 +103 +109 +141 +165 +183 +196 +204 +212 +215 +216 +216 +216 +208 +200 +193 +189 +187 +188 +192 +190 +184 +173 +146 +89 +42 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +116 +126 +128 +131 +145 +153 +156 +154 +146 +124 +120 +121 +124 +125 +119 +110 +103 +92 +73 +49 +27 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +38 +90 +133 +139 +119 +117 +124 +137 +152 +159 +162 +159 +151 +136 +126 +124 +123 +125 +134 +147 +150 +152 +150 +144 +114 +100 +98 +108 +132 +140 +137 +130 +122 +121 +119 +118 +118 +118 +117 +117 +119 +122 +127 +134 +149 +164 +180 +194 +204 +211 +214 +216 +216 +213 +208 +202 +193 +183 +172 +161 +156 +152 +150 +149 +148 +147 +146 +145 +145 +144 +144 +143 +143 +143 +143 +143 +143 +144 +144 +145 +147 +149 +151 +153 +155 +155 +157 +159 +163 +167 +170 +173 +174 +174 +170 +165 +155 +142 +125 +105 +97 +91 +88 +86 +85 +87 +89 +94 +103 +118 +139 +161 +182 +197 +204 +206 +207 +207 +208 +209 +210 +212 +214 +216 +217 +217 +217 +217 +217 +218 +218 +218 +218 +219 +220 +221 +222 +223 +224 +224 +225 +226 +226 +227 +228 +229 +230 +231 +232 +232 +233 +233 +233 +233 +233 +232 +232 +232 +232 +232 +232 +232 +232 +231 +231 +230 +229 +229 +228 +225 +223 +221 +220 +220 +219 +219 +218 +216 +214 +211 +210 +210 +210 +210 +204 +186 +161 +135 +112 +100 +99 +99 +103 +112 +148 +171 +187 +199 +207 +213 +216 +217 +216 +214 +203 +195 +191 +188 +188 +191 +192 +185 +175 +166 +115 +58 +22 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +118 +129 +131 +133 +148 +155 +157 +153 +142 +128 +129 +132 +136 +137 +131 +123 +115 +105 +91 +72 +52 +32 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +14 +51 +97 +135 +130 +117 +113 +117 +126 +138 +140 +138 +134 +129 +126 +126 +130 +137 +144 +150 +152 +154 +154 +154 +142 +122 +106 +101 +112 +137 +138 +132 +124 +120 +117 +114 +113 +112 +112 +110 +110 +110 +110 +111 +114 +122 +134 +149 +166 +188 +200 +207 +212 +214 +213 +211 +207 +201 +194 +179 +171 +164 +158 +154 +152 +150 +149 +148 +148 +147 +147 +146 +146 +146 +146 +147 +147 +148 +149 +150 +152 +154 +157 +159 +163 +166 +169 +172 +174 +176 +177 +177 +175 +171 +161 +149 +137 +124 +112 +99 +93 +89 +87 +86 +88 +93 +100 +110 +124 +152 +173 +188 +198 +204 +206 +207 +208 +208 +210 +212 +214 +215 +216 +217 +217 +217 +217 +217 +218 +218 +218 +219 +220 +221 +222 +222 +223 +223 +224 +224 +225 +225 +225 +226 +227 +228 +229 +229 +230 +230 +230 +230 +229 +229 +229 +229 +228 +228 +229 +229 +229 +230 +230 +230 +230 +230 +230 +229 +228 +227 +225 +223 +221 +220 +220 +219 +219 +217 +214 +212 +211 +210 +210 +210 +205 +188 +164 +137 +113 +100 +99 +99 +104 +117 +155 +176 +191 +202 +209 +214 +216 +216 +215 +210 +199 +193 +189 +188 +189 +192 +192 +182 +168 +153 +85 +38 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +120 +131 +133 +135 +149 +156 +158 +153 +141 +133 +136 +140 +144 +144 +141 +135 +128 +118 +105 +85 +70 +52 +32 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +22 +56 +105 +134 +125 +115 +110 +112 +120 +126 +128 +129 +128 +128 +132 +137 +143 +148 +150 +152 +154 +156 +157 +155 +142 +123 +106 +101 +122 +134 +135 +129 +121 +117 +114 +112 +111 +110 +108 +106 +105 +103 +102 +100 +101 +105 +112 +122 +145 +167 +184 +198 +207 +213 +214 +213 +211 +207 +197 +188 +179 +171 +165 +160 +157 +156 +154 +153 +152 +151 +151 +151 +151 +151 +152 +153 +154 +155 +158 +160 +163 +165 +168 +171 +174 +177 +179 +180 +181 +179 +176 +172 +165 +151 +139 +127 +115 +104 +94 +90 +88 +88 +89 +95 +103 +116 +132 +152 +180 +194 +201 +205 +206 +207 +208 +210 +211 +213 +215 +216 +217 +217 +217 +217 +217 +217 +218 +218 +219 +220 +220 +221 +222 +223 +223 +223 +223 +223 +223 +223 +223 +224 +225 +226 +227 +228 +228 +228 +228 +228 +228 +227 +227 +227 +227 +227 +227 +227 +227 +227 +228 +228 +229 +229 +229 +229 +229 +228 +228 +226 +225 +223 +221 +220 +220 +219 +218 +215 +212 +211 +210 +210 +210 +206 +189 +165 +138 +114 +101 +99 +100 +107 +123 +163 +182 +195 +204 +211 +216 +216 +216 +213 +207 +195 +191 +189 +189 +190 +193 +188 +177 +159 +132 +58 +23 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +121 +132 +135 +137 +149 +156 +158 +153 +141 +137 +142 +147 +149 +150 +149 +145 +139 +130 +117 +95 +81 +67 +50 +27 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +20 +58 +117 +128 +123 +114 +109 +108 +117 +123 +128 +130 +131 +137 +142 +145 +147 +149 +151 +153 +155 +157 +158 +156 +142 +121 +100 +103 +124 +135 +136 +126 +119 +116 +113 +112 +110 +109 +108 +106 +104 +102 +97 +94 +91 +89 +88 +101 +125 +149 +171 +189 +207 +212 +213 +214 +214 +209 +203 +195 +187 +178 +170 +166 +164 +161 +160 +158 +157 +156 +156 +156 +156 +157 +158 +160 +162 +166 +168 +171 +173 +176 +179 +180 +182 +183 +183 +182 +179 +174 +167 +158 +143 +132 +120 +109 +99 +90 +89 +89 +90 +94 +105 +119 +137 +158 +180 +199 +204 +206 +207 +207 +209 +210 +212 +214 +216 +217 +217 +217 +217 +217 +217 +217 +218 +218 +219 +220 +221 +221 +222 +222 +222 +222 +222 +221 +221 +221 +221 +222 +223 +224 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +227 +228 +228 +229 +229 +228 +228 +227 +226 +224 +222 +220 +220 +219 +218 +215 +212 +211 +210 +210 +210 +206 +190 +165 +138 +115 +101 +99 +101 +110 +133 +171 +187 +199 +207 +212 +216 +216 +215 +210 +202 +192 +190 +189 +190 +191 +192 +181 +169 +146 +106 +34 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +91 +121 +133 +137 +138 +149 +156 +157 +153 +142 +141 +148 +152 +154 +154 +153 +152 +148 +141 +129 +104 +88 +75 +63 +50 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +65 +114 +131 +128 +117 +106 +107 +115 +125 +132 +137 +140 +142 +144 +145 +146 +148 +150 +154 +157 +159 +158 +155 +142 +111 +93 +107 +127 +140 +137 +123 +120 +117 +114 +113 +113 +112 +112 +110 +108 +100 +95 +90 +85 +81 +77 +85 +105 +130 +157 +191 +205 +211 +213 +215 +213 +211 +207 +201 +192 +182 +176 +171 +169 +167 +164 +163 +162 +161 +161 +161 +162 +163 +165 +167 +169 +171 +174 +177 +179 +183 +185 +186 +187 +186 +183 +178 +172 +163 +153 +138 +125 +112 +101 +94 +90 +90 +92 +96 +102 +119 +140 +162 +183 +200 +205 +206 +207 +208 +209 +211 +214 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +219 +219 +220 +221 +221 +221 +222 +221 +221 +220 +219 +219 +219 +220 +221 +222 +223 +225 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +227 +227 +228 +228 +228 +227 +226 +225 +223 +221 +220 +220 +218 +215 +212 +211 +210 +210 +210 +206 +189 +165 +138 +115 +101 +100 +103 +116 +144 +179 +193 +203 +209 +215 +216 +216 +213 +207 +197 +190 +189 +189 +191 +193 +191 +174 +157 +129 +74 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +118 +133 +137 +139 +148 +156 +157 +153 +146 +146 +152 +155 +155 +155 +154 +154 +153 +152 +150 +127 +101 +82 +68 +61 +35 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +34 +81 +121 +133 +127 +115 +111 +113 +118 +127 +134 +138 +139 +139 +139 +141 +145 +151 +157 +160 +160 +159 +156 +149 +99 +91 +100 +119 +141 +139 +130 +125 +122 +120 +122 +125 +127 +129 +129 +124 +117 +106 +93 +82 +74 +69 +67 +73 +91 +137 +167 +190 +204 +212 +215 +213 +213 +211 +207 +198 +189 +182 +176 +172 +169 +167 +165 +164 +163 +164 +165 +166 +169 +171 +176 +179 +182 +184 +186 +188 +188 +188 +188 +187 +182 +176 +169 +159 +148 +131 +118 +107 +98 +93 +91 +93 +97 +105 +118 +147 +170 +189 +202 +206 +207 +207 +209 +210 +212 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +219 +219 +220 +220 +220 +220 +220 +219 +218 +217 +218 +218 +219 +219 +220 +222 +223 +225 +225 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +227 +227 +227 +227 +226 +225 +224 +222 +221 +220 +218 +215 +212 +211 +210 +210 +210 +206 +187 +161 +135 +114 +101 +102 +109 +128 +162 +189 +199 +207 +213 +216 +216 +215 +208 +200 +192 +189 +189 +190 +192 +192 +182 +165 +136 +94 +37 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +84 +113 +130 +137 +140 +147 +155 +157 +154 +148 +149 +154 +155 +155 +154 +154 +154 +154 +155 +154 +146 +120 +93 +71 +62 +47 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +10 +28 +56 +94 +119 +122 +123 +123 +123 +124 +126 +128 +128 +128 +130 +136 +142 +148 +155 +161 +161 +160 +159 +156 +132 +102 +91 +97 +114 +139 +137 +134 +130 +127 +128 +130 +132 +133 +133 +132 +131 +126 +117 +103 +81 +71 +64 +62 +63 +83 +114 +146 +177 +202 +213 +213 +213 +212 +210 +206 +202 +195 +188 +181 +176 +173 +171 +169 +168 +168 +168 +170 +172 +174 +179 +181 +184 +186 +188 +189 +189 +190 +189 +187 +182 +175 +167 +157 +145 +127 +114 +104 +97 +93 +93 +97 +105 +119 +138 +168 +187 +199 +205 +207 +208 +209 +211 +213 +215 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +219 +219 +219 +220 +220 +219 +218 +217 +217 +217 +217 +217 +218 +219 +220 +222 +224 +225 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +227 +227 +226 +226 +225 +224 +222 +222 +220 +218 +215 +211 +211 +210 +210 +210 +204 +184 +158 +132 +112 +102 +103 +118 +142 +175 +195 +203 +210 +215 +216 +216 +211 +204 +196 +191 +190 +190 +191 +192 +191 +169 +152 +113 +64 +19 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +82 +107 +126 +137 +140 +147 +155 +157 +154 +149 +152 +155 +155 +155 +154 +154 +154 +155 +157 +158 +156 +138 +108 +77 +60 +52 +33 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +18 +42 +70 +94 +109 +118 +123 +128 +130 +131 +131 +132 +134 +139 +144 +149 +154 +160 +161 +162 +161 +159 +150 +123 +100 +87 +92 +117 +132 +137 +137 +134 +133 +133 +134 +135 +135 +136 +136 +136 +132 +124 +103 +84 +69 +58 +52 +54 +71 +98 +133 +171 +204 +210 +213 +213 +212 +210 +208 +203 +198 +191 +183 +179 +176 +174 +172 +170 +171 +171 +173 +176 +180 +184 +186 +188 +190 +190 +191 +190 +190 +188 +181 +174 +165 +154 +142 +123 +111 +102 +96 +93 +95 +103 +116 +134 +156 +184 +198 +204 +207 +208 +209 +211 +213 +215 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +218 +219 +219 +219 +219 +218 +217 +216 +216 +216 +216 +217 +218 +219 +221 +223 +225 +225 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +225 +224 +223 +222 +220 +217 +214 +211 +211 +210 +210 +209 +201 +179 +154 +129 +109 +104 +107 +129 +159 +185 +199 +207 +213 +216 +216 +214 +207 +199 +193 +190 +190 +191 +192 +190 +184 +160 +133 +87 +39 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +102 +121 +135 +141 +147 +154 +157 +155 +151 +154 +155 +155 +154 +153 +153 +154 +156 +159 +161 +161 +153 +125 +89 +58 +51 +42 +22 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +19 +48 +70 +87 +101 +117 +125 +130 +135 +139 +143 +147 +150 +153 +155 +159 +161 +162 +162 +160 +158 +145 +120 +94 +80 +89 +113 +129 +138 +140 +137 +137 +136 +136 +136 +136 +137 +139 +139 +139 +128 +106 +83 +64 +51 +43 +44 +58 +85 +124 +180 +199 +210 +214 +214 +212 +210 +208 +205 +200 +191 +186 +181 +178 +175 +173 +172 +173 +174 +177 +182 +185 +188 +191 +191 +191 +191 +191 +190 +188 +181 +173 +163 +152 +139 +120 +109 +100 +96 +94 +100 +111 +128 +149 +172 +196 +204 +207 +208 +209 +210 +213 +215 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +218 +218 +219 +218 +218 +217 +216 +215 +215 +215 +215 +216 +218 +219 +221 +223 +225 +226 +226 +226 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +226 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +225 +225 +223 +223 +222 +219 +216 +213 +211 +210 +210 +210 +209 +197 +173 +148 +126 +108 +106 +115 +144 +175 +193 +203 +211 +215 +216 +216 +211 +201 +195 +191 +190 +190 +192 +191 +186 +173 +151 +107 +59 +20 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +80 +96 +115 +132 +142 +147 +154 +157 +155 +152 +155 +156 +155 +153 +153 +153 +154 +158 +162 +165 +166 +162 +143 +108 +57 +43 +43 +26 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +39 +72 +91 +109 +124 +138 +151 +155 +157 +157 +157 +159 +160 +162 +162 +162 +160 +157 +144 +120 +82 +72 +79 +103 +128 +141 +142 +140 +139 +137 +136 +136 +138 +139 +141 +142 +142 +133 +110 +82 +54 +41 +37 +37 +44 +65 +133 +177 +202 +213 +215 +214 +211 +210 +208 +206 +199 +192 +187 +182 +178 +175 +174 +175 +176 +178 +183 +187 +190 +191 +192 +192 +192 +191 +190 +187 +180 +172 +162 +150 +136 +117 +106 +99 +96 +96 +105 +122 +142 +164 +186 +205 +207 +208 +209 +210 +212 +214 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +218 +218 +218 +217 +216 +215 +215 +214 +214 +215 +215 +217 +220 +223 +225 +226 +226 +226 +226 +226 +226 +225 +225 +224 +224 +224 +224 +224 +224 +224 +224 +225 +225 +225 +226 +226 +226 +227 +227 +227 +227 +227 +226 +226 +226 +225 +225 +225 +225 +225 +224 +223 +223 +222 +219 +215 +212 +210 +210 +210 +210 +209 +192 +167 +142 +120 +108 +108 +131 +162 +188 +198 +208 +214 +216 +216 +215 +205 +196 +192 +190 +190 +192 +192 +190 +181 +161 +135 +77 +33 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +91 +109 +129 +143 +149 +155 +157 +156 +154 +155 +155 +154 +153 +153 +153 +155 +161 +168 +174 +175 +171 +161 +135 +85 +37 +39 +29 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +7 +15 +29 +48 +72 +106 +127 +141 +151 +155 +157 +159 +160 +161 +162 +161 +160 +158 +150 +130 +77 +67 +66 +80 +113 +141 +142 +143 +142 +140 +138 +139 +140 +142 +144 +145 +143 +135 +117 +85 +44 +36 +32 +30 +31 +52 +103 +156 +197 +215 +216 +214 +212 +210 +209 +206 +202 +196 +191 +185 +180 +177 +176 +177 +178 +184 +187 +190 +192 +192 +193 +192 +192 +190 +187 +180 +171 +160 +147 +133 +114 +104 +98 +97 +100 +117 +137 +158 +180 +199 +207 +208 +209 +210 +211 +214 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +217 +218 +217 +217 +216 +215 +214 +214 +213 +214 +214 +216 +219 +222 +225 +226 +226 +226 +226 +226 +225 +224 +224 +223 +223 +223 +223 +223 +223 +223 +222 +222 +222 +222 +222 +223 +223 +224 +225 +226 +227 +227 +227 +227 +227 +226 +225 +225 +225 +225 +225 +224 +224 +223 +223 +220 +217 +213 +211 +210 +210 +210 +208 +205 +181 +159 +133 +113 +109 +118 +159 +184 +198 +203 +214 +216 +216 +214 +210 +196 +192 +191 +191 +191 +192 +190 +179 +164 +151 +89 +38 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +89 +107 +128 +144 +150 +155 +157 +157 +155 +156 +155 +154 +153 +153 +153 +155 +162 +169 +177 +179 +177 +169 +148 +110 +34 +27 +22 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +10 +18 +31 +59 +85 +108 +127 +140 +149 +153 +156 +158 +160 +161 +160 +159 +156 +149 +113 +79 +62 +59 +71 +115 +135 +143 +144 +143 +142 +142 +143 +144 +146 +147 +146 +140 +128 +107 +63 +41 +30 +27 +26 +33 +55 +98 +149 +196 +216 +216 +215 +213 +210 +207 +204 +200 +195 +189 +183 +180 +178 +178 +179 +184 +188 +191 +192 +193 +193 +193 +192 +190 +187 +179 +170 +159 +145 +130 +111 +102 +98 +99 +106 +126 +147 +169 +189 +203 +208 +209 +210 +211 +213 +215 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +217 +217 +217 +216 +215 +214 +213 +213 +213 +214 +216 +219 +222 +225 +226 +226 +226 +226 +225 +224 +223 +223 +223 +223 +223 +223 +223 +222 +222 +221 +221 +220 +220 +220 +221 +221 +222 +223 +224 +225 +226 +227 +227 +227 +227 +226 +225 +225 +224 +224 +224 +224 +223 +223 +222 +219 +215 +212 +210 +210 +210 +209 +206 +199 +175 +145 +124 +113 +112 +146 +177 +193 +202 +209 +215 +216 +215 +211 +202 +193 +191 +191 +191 +192 +191 +183 +170 +151 +127 +52 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +87 +106 +129 +145 +151 +156 +157 +157 +155 +156 +155 +154 +153 +153 +154 +155 +161 +169 +179 +182 +180 +175 +160 +129 +38 +22 +17 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +10 +25 +46 +68 +91 +112 +129 +138 +145 +150 +154 +157 +158 +159 +158 +157 +139 +105 +74 +51 +45 +76 +112 +133 +144 +145 +145 +145 +146 +147 +149 +150 +149 +145 +136 +122 +81 +49 +31 +23 +22 +25 +32 +57 +97 +152 +205 +213 +216 +215 +212 +210 +206 +203 +199 +194 +187 +183 +181 +181 +181 +184 +189 +191 +192 +193 +193 +193 +192 +190 +187 +179 +169 +157 +144 +128 +109 +101 +99 +102 +111 +135 +157 +178 +195 +206 +209 +209 +210 +212 +214 +216 +216 +216 +216 +216 +216 +217 +217 +217 +217 +217 +217 +217 +216 +215 +214 +213 +212 +213 +213 +216 +219 +222 +224 +226 +226 +226 +225 +224 +223 +222 +222 +223 +223 +223 +223 +223 +222 +221 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +223 +225 +226 +227 +227 +227 +226 +225 +225 +224 +224 +224 +224 +223 +223 +222 +220 +217 +213 +211 +210 +210 +209 +208 +203 +194 +161 +133 +119 +117 +126 +171 +190 +200 +206 +213 +216 +216 +212 +205 +196 +191 +191 +191 +191 +192 +187 +173 +158 +134 +91 +25 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +86 +106 +130 +146 +152 +156 +158 +157 +155 +156 +154 +154 +154 +154 +154 +155 +160 +167 +178 +183 +182 +180 +169 +144 +49 +22 +13 +10 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +16 +32 +52 +75 +99 +114 +126 +135 +142 +149 +153 +155 +157 +158 +154 +132 +97 +60 +34 +39 +77 +111 +136 +145 +147 +148 +149 +150 +152 +153 +152 +149 +142 +131 +98 +61 +35 +20 +17 +20 +22 +31 +54 +98 +177 +203 +214 +217 +215 +212 +209 +206 +203 +199 +192 +187 +184 +183 +183 +184 +189 +191 +193 +193 +193 +193 +192 +190 +187 +179 +169 +156 +142 +126 +108 +101 +100 +106 +117 +143 +165 +185 +200 +208 +209 +210 +211 +213 +215 +216 +216 +216 +216 +216 +216 +216 +217 +217 +217 +217 +216 +216 +215 +214 +212 +212 +212 +213 +214 +218 +221 +224 +225 +226 +225 +224 +223 +222 +221 +221 +222 +223 +223 +223 +223 +222 +221 +220 +220 +220 +220 +220 +220 +220 +220 +220 +221 +221 +223 +225 +226 +227 +227 +227 +226 +225 +224 +224 +224 +223 +223 +223 +222 +221 +218 +214 +212 +210 +210 +209 +209 +206 +199 +184 +143 +125 +119 +126 +149 +189 +198 +205 +210 +215 +216 +213 +206 +198 +192 +191 +191 +191 +191 +190 +178 +162 +142 +108 +52 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +82 +87 +108 +132 +147 +153 +157 +158 +157 +156 +156 +155 +155 +155 +155 +155 +155 +157 +162 +173 +181 +182 +181 +174 +159 +69 +25 +8 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +7 +16 +31 +58 +78 +94 +108 +120 +133 +142 +149 +154 +156 +156 +151 +126 +86 +35 +18 +34 +73 +116 +143 +147 +149 +151 +152 +154 +156 +155 +153 +148 +140 +114 +78 +44 +19 +12 +13 +18 +23 +31 +48 +130 +182 +208 +217 +216 +215 +212 +209 +205 +201 +196 +191 +187 +186 +186 +187 +190 +191 +193 +193 +193 +193 +192 +190 +187 +178 +168 +155 +140 +124 +106 +101 +102 +110 +124 +150 +172 +191 +204 +209 +210 +211 +212 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +212 +212 +213 +216 +220 +223 +225 +226 +226 +224 +223 +221 +221 +220 +221 +222 +223 +224 +224 +223 +221 +220 +220 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +223 +225 +226 +227 +227 +227 +226 +225 +224 +223 +223 +223 +222 +222 +221 +220 +216 +212 +210 +210 +209 +209 +208 +204 +192 +167 +125 +121 +125 +143 +179 +199 +204 +209 +214 +216 +215 +208 +200 +193 +191 +191 +191 +191 +190 +185 +164 +152 +118 +70 +19 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +90 +113 +136 +147 +154 +157 +158 +157 +156 +156 +155 +156 +157 +157 +155 +155 +155 +157 +162 +178 +182 +182 +178 +165 +86 +31 +8 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +12 +23 +38 +54 +72 +95 +114 +130 +143 +151 +155 +154 +148 +124 +71 +14 +10 +22 +54 +106 +142 +147 +151 +153 +155 +156 +155 +153 +151 +147 +126 +99 +64 +32 +11 +7 +9 +14 +21 +28 +56 +122 +175 +208 +217 +216 +215 +213 +210 +206 +201 +198 +194 +191 +190 +190 +191 +192 +193 +193 +193 +193 +192 +190 +187 +178 +167 +153 +138 +121 +105 +102 +105 +115 +131 +158 +179 +196 +206 +210 +211 +211 +213 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +212 +213 +215 +218 +222 +224 +225 +225 +224 +222 +220 +219 +219 +220 +222 +223 +224 +224 +224 +222 +221 +220 +220 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +224 +226 +226 +227 +227 +226 +225 +223 +223 +222 +222 +222 +221 +221 +220 +216 +212 +210 +209 +209 +209 +208 +205 +191 +167 +134 +125 +127 +150 +179 +198 +205 +211 +214 +215 +215 +208 +198 +193 +192 +191 +191 +191 +189 +181 +167 +153 +119 +69 +23 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +84 +95 +117 +139 +148 +155 +158 +158 +157 +156 +156 +156 +157 +158 +159 +157 +156 +155 +155 +158 +172 +180 +182 +179 +171 +98 +37 +10 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +8 +14 +23 +36 +60 +83 +106 +127 +141 +151 +153 +150 +134 +97 +22 +9 +9 +23 +52 +108 +133 +145 +151 +154 +155 +154 +152 +150 +146 +129 +103 +71 +38 +13 +6 +6 +9 +13 +22 +40 +79 +136 +187 +212 +216 +216 +215 +213 +210 +204 +201 +198 +195 +193 +193 +193 +193 +194 +194 +194 +193 +192 +190 +187 +178 +166 +153 +137 +120 +105 +103 +108 +119 +135 +162 +183 +198 +208 +210 +211 +212 +213 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +211 +211 +212 +213 +215 +219 +223 +224 +224 +224 +223 +220 +219 +218 +219 +220 +223 +224 +224 +224 +224 +222 +221 +221 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +224 +225 +226 +226 +226 +226 +225 +223 +222 +222 +221 +221 +221 +221 +219 +216 +212 +210 +209 +209 +208 +208 +206 +193 +169 +146 +132 +129 +151 +174 +194 +204 +210 +213 +215 +214 +211 +199 +194 +192 +192 +191 +191 +188 +180 +169 +159 +128 +76 +35 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +99 +122 +142 +149 +157 +159 +159 +157 +156 +156 +157 +158 +159 +159 +159 +157 +155 +155 +156 +166 +177 +182 +180 +174 +106 +42 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +8 +14 +30 +51 +77 +103 +127 +144 +148 +148 +137 +109 +28 +10 +3 +7 +19 +61 +97 +124 +141 +149 +152 +152 +150 +146 +142 +127 +105 +75 +42 +14 +6 +5 +6 +8 +13 +27 +52 +98 +151 +199 +214 +216 +215 +214 +213 +208 +204 +201 +199 +197 +195 +195 +195 +194 +194 +194 +194 +193 +190 +187 +177 +166 +152 +136 +119 +105 +104 +110 +122 +138 +165 +185 +200 +208 +211 +211 +212 +213 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +212 +213 +216 +219 +223 +223 +223 +223 +221 +218 +217 +217 +218 +220 +224 +224 +224 +224 +224 +223 +222 +222 +221 +220 +220 +220 +220 +220 +221 +222 +223 +224 +225 +226 +226 +226 +225 +224 +223 +221 +221 +221 +221 +221 +220 +218 +215 +212 +210 +208 +208 +208 +208 +206 +194 +172 +152 +138 +133 +148 +174 +192 +203 +208 +213 +214 +213 +210 +203 +194 +192 +192 +192 +192 +189 +181 +171 +158 +141 +86 +40 +13 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +104 +126 +144 +150 +158 +159 +159 +157 +156 +156 +157 +159 +160 +160 +159 +159 +157 +155 +155 +161 +174 +181 +181 +175 +111 +46 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +10 +24 +45 +71 +100 +126 +135 +137 +129 +107 +31 +10 +2 +2 +3 +20 +54 +87 +116 +136 +143 +145 +144 +141 +137 +122 +104 +75 +44 +14 +5 +5 +4 +5 +6 +17 +34 +65 +112 +175 +210 +214 +216 +215 +214 +212 +207 +205 +202 +200 +197 +197 +196 +195 +195 +194 +194 +193 +191 +187 +178 +166 +151 +135 +117 +106 +106 +112 +124 +141 +167 +187 +200 +209 +211 +212 +212 +213 +214 +215 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +212 +213 +216 +219 +222 +222 +222 +221 +219 +216 +216 +216 +217 +220 +224 +225 +225 +225 +225 +224 +223 +223 +222 +222 +221 +221 +221 +222 +222 +224 +225 +225 +226 +226 +226 +225 +224 +222 +221 +220 +220 +220 +220 +219 +217 +214 +211 +209 +208 +208 +208 +207 +204 +198 +174 +152 +142 +140 +144 +174 +193 +203 +209 +212 +214 +213 +210 +204 +196 +192 +192 +192 +191 +190 +182 +171 +159 +140 +109 +41 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +110 +131 +147 +151 +158 +160 +159 +157 +156 +156 +158 +159 +160 +160 +160 +159 +158 +156 +155 +158 +171 +179 +181 +177 +115 +48 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +14 +30 +54 +94 +107 +111 +105 +92 +29 +10 +2 +1 +1 +3 +13 +37 +71 +108 +126 +133 +134 +132 +129 +116 +98 +73 +43 +13 +4 +4 +4 +4 +4 +7 +21 +45 +81 +134 +201 +211 +215 +216 +215 +214 +211 +207 +204 +203 +199 +198 +198 +197 +196 +195 +194 +193 +191 +187 +178 +166 +151 +134 +117 +107 +108 +114 +126 +143 +169 +187 +201 +209 +211 +212 +213 +213 +214 +215 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +212 +213 +216 +219 +221 +221 +221 +220 +218 +215 +215 +215 +216 +220 +224 +225 +225 +225 +225 +225 +225 +224 +224 +224 +224 +224 +224 +225 +225 +225 +226 +226 +226 +226 +225 +223 +222 +221 +220 +220 +220 +219 +217 +216 +212 +210 +208 +208 +208 +208 +207 +205 +196 +178 +149 +144 +142 +148 +168 +197 +205 +209 +212 +214 +214 +210 +203 +196 +192 +192 +192 +191 +189 +184 +171 +162 +144 +111 +58 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +118 +138 +149 +152 +159 +161 +159 +157 +157 +157 +158 +159 +160 +160 +160 +160 +159 +157 +155 +157 +169 +178 +181 +177 +117 +48 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +4 +7 +24 +36 +39 +37 +30 +10 +4 +2 +1 +1 +1 +2 +6 +16 +39 +80 +97 +106 +108 +106 +95 +80 +55 +29 +7 +2 +2 +3 +3 +3 +4 +7 +21 +47 +88 +169 +200 +213 +216 +216 +215 +214 +210 +207 +205 +203 +201 +199 +198 +197 +195 +194 +193 +191 +188 +178 +166 +151 +134 +117 +108 +109 +116 +127 +143 +168 +186 +200 +209 +211 +212 +213 +213 +214 +214 +215 +215 +215 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +211 +211 +211 +211 +213 +215 +218 +220 +220 +219 +218 +216 +214 +213 +213 +215 +219 +224 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +226 +225 +225 +224 +222 +220 +220 +219 +218 +217 +215 +214 +212 +210 +208 +208 +208 +208 +207 +205 +198 +183 +166 +152 +147 +148 +161 +180 +199 +209 +211 +213 +213 +213 +208 +200 +195 +192 +192 +192 +191 +186 +180 +172 +160 +136 +94 +48 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +91 +124 +143 +151 +153 +160 +161 +159 +157 +157 +157 +158 +159 +160 +160 +160 +160 +159 +157 +155 +157 +169 +178 +181 +177 +114 +46 +13 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +8 +12 +13 +12 +10 +4 +2 +1 +1 +1 +1 +1 +3 +6 +14 +37 +59 +74 +81 +82 +74 +61 +41 +20 +5 +2 +2 +2 +3 +3 +3 +5 +13 +30 +61 +133 +182 +206 +214 +216 +216 +215 +213 +210 +206 +204 +202 +201 +200 +199 +196 +195 +193 +191 +188 +179 +167 +152 +135 +118 +109 +110 +117 +128 +143 +166 +184 +198 +208 +211 +212 +213 +213 +214 +214 +215 +215 +215 +215 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +211 +212 +214 +217 +218 +218 +218 +217 +215 +212 +212 +212 +213 +216 +223 +224 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +224 +224 +222 +221 +220 +218 +217 +216 +215 +214 +213 +212 +210 +210 +209 +208 +208 +207 +205 +203 +190 +176 +165 +157 +152 +155 +168 +184 +199 +208 +211 +212 +213 +212 +208 +199 +195 +193 +192 +192 +189 +185 +179 +172 +163 +133 +90 +50 +19 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +129 +147 +153 +154 +160 +161 +160 +158 +157 +157 +158 +159 +159 +160 +160 +160 +159 +157 +156 +157 +169 +178 +181 +176 +108 +43 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +13 +28 +41 +51 +56 +51 +41 +27 +13 +4 +1 +1 +1 +2 +3 +3 +4 +7 +18 +39 +101 +158 +194 +212 +215 +216 +216 +215 +212 +209 +206 +204 +203 +201 +200 +197 +195 +194 +192 +188 +180 +168 +153 +136 +119 +110 +111 +117 +127 +141 +163 +181 +196 +206 +211 +212 +213 +213 +214 +214 +215 +215 +215 +215 +215 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +211 +212 +213 +215 +217 +217 +217 +216 +215 +212 +211 +211 +211 +213 +220 +223 +224 +225 +225 +225 +225 +225 +224 +224 +224 +224 +223 +223 +222 +221 +220 +218 +217 +216 +215 +214 +213 +212 +212 +210 +210 +209 +208 +208 +207 +205 +201 +195 +187 +174 +165 +159 +157 +159 +174 +189 +201 +208 +211 +212 +212 +210 +206 +201 +195 +193 +192 +191 +189 +184 +179 +171 +159 +139 +89 +48 +21 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +133 +150 +155 +156 +161 +161 +160 +158 +157 +157 +158 +158 +159 +160 +160 +160 +159 +157 +156 +157 +170 +179 +181 +174 +100 +38 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +7 +16 +24 +30 +28 +23 +15 +8 +3 +1 +1 +1 +1 +2 +2 +3 +4 +9 +22 +72 +128 +175 +206 +214 +215 +216 +216 +215 +212 +208 +207 +205 +203 +201 +198 +196 +194 +192 +189 +181 +170 +155 +138 +120 +111 +112 +117 +127 +139 +160 +177 +192 +204 +210 +212 +213 +213 +214 +214 +214 +214 +215 +215 +215 +215 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +211 +211 +212 +214 +216 +216 +216 +215 +214 +211 +210 +209 +209 +210 +216 +221 +223 +224 +225 +225 +224 +224 +223 +223 +222 +222 +221 +220 +219 +217 +216 +215 +214 +213 +212 +211 +211 +210 +210 +209 +208 +208 +207 +206 +202 +197 +190 +181 +171 +163 +161 +162 +166 +175 +195 +205 +210 +212 +212 +212 +209 +205 +200 +195 +193 +192 +191 +188 +185 +178 +171 +157 +134 +99 +42 +17 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +136 +151 +156 +157 +161 +161 +160 +158 +157 +157 +157 +158 +159 +159 +159 +159 +159 +157 +156 +158 +172 +180 +180 +171 +87 +32 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +5 +8 +9 +7 +5 +3 +2 +1 +1 +1 +1 +1 +2 +2 +3 +4 +7 +44 +98 +154 +197 +212 +215 +216 +216 +216 +216 +211 +209 +207 +205 +202 +200 +196 +194 +192 +190 +182 +171 +157 +140 +122 +113 +113 +117 +125 +137 +156 +172 +188 +200 +208 +211 +213 +213 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +215 +215 +215 +215 +214 +213 +212 +211 +211 +211 +212 +213 +214 +215 +215 +214 +214 +211 +209 +208 +208 +208 +210 +216 +220 +223 +224 +224 +224 +223 +222 +222 +220 +219 +218 +217 +216 +214 +213 +212 +212 +211 +211 +210 +210 +209 +209 +208 +207 +206 +204 +200 +190 +181 +174 +168 +164 +163 +164 +172 +184 +200 +210 +211 +212 +212 +212 +209 +203 +198 +195 +193 +192 +190 +187 +183 +179 +172 +159 +130 +91 +45 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +108 +137 +152 +157 +158 +162 +162 +161 +159 +157 +157 +157 +158 +158 +159 +159 +159 +158 +157 +156 +160 +175 +181 +177 +162 +65 +22 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +5 +19 +58 +113 +168 +206 +214 +215 +216 +217 +217 +215 +212 +210 +208 +205 +201 +198 +195 +193 +191 +184 +174 +160 +144 +126 +114 +114 +117 +124 +133 +149 +164 +180 +193 +203 +209 +211 +213 +213 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +215 +215 +214 +214 +213 +212 +211 +211 +211 +212 +213 +213 +213 +213 +213 +211 +209 +208 +206 +206 +205 +207 +211 +215 +218 +221 +222 +221 +221 +220 +219 +218 +217 +215 +214 +213 +212 +211 +211 +210 +210 +209 +208 +207 +206 +202 +197 +192 +185 +179 +173 +170 +169 +168 +167 +176 +189 +200 +207 +211 +212 +212 +211 +209 +206 +199 +196 +194 +193 +192 +188 +184 +180 +176 +170 +145 +105 +63 +28 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +111 +138 +152 +158 +159 +162 +162 +161 +159 +158 +157 +158 +158 +158 +159 +159 +159 +158 +157 +157 +164 +178 +182 +173 +146 +47 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +12 +38 +83 +138 +194 +212 +214 +215 +216 +217 +216 +214 +212 +210 +206 +202 +198 +196 +193 +192 +185 +176 +163 +148 +130 +116 +115 +117 +123 +131 +144 +157 +172 +186 +197 +205 +209 +212 +213 +213 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +215 +215 +214 +213 +212 +212 +211 +211 +212 +212 +212 +212 +212 +212 +211 +209 +208 +206 +205 +204 +204 +205 +207 +209 +212 +214 +216 +216 +217 +216 +215 +215 +214 +213 +211 +210 +209 +208 +207 +205 +203 +200 +197 +194 +188 +184 +181 +178 +175 +172 +172 +174 +179 +185 +196 +203 +208 +210 +211 +211 +209 +207 +204 +200 +196 +194 +192 +189 +187 +183 +180 +173 +161 +140 +92 +54 +27 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +115 +139 +152 +159 +160 +163 +163 +161 +160 +158 +158 +158 +158 +158 +158 +159 +158 +158 +157 +157 +169 +180 +181 +165 +124 +31 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +23 +57 +107 +171 +208 +212 +214 +215 +217 +217 +216 +214 +211 +208 +203 +199 +196 +194 +192 +186 +178 +166 +152 +134 +118 +116 +118 +122 +128 +139 +151 +164 +178 +190 +200 +206 +209 +212 +213 +213 +214 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +214 +214 +213 +212 +212 +212 +212 +212 +212 +212 +212 +212 +211 +209 +208 +207 +205 +203 +203 +202 +203 +203 +205 +206 +207 +208 +209 +209 +208 +208 +207 +206 +205 +204 +202 +200 +199 +196 +193 +191 +188 +185 +181 +179 +177 +176 +176 +178 +181 +187 +193 +200 +207 +210 +211 +211 +210 +208 +205 +202 +199 +196 +193 +190 +188 +185 +182 +178 +169 +152 +127 +93 +45 +22 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +118 +139 +152 +159 +161 +163 +163 +162 +160 +158 +158 +158 +158 +158 +158 +159 +158 +158 +157 +159 +175 +181 +178 +154 +96 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +12 +36 +77 +139 +200 +209 +213 +214 +216 +217 +216 +215 +213 +209 +204 +200 +197 +195 +193 +188 +180 +170 +156 +139 +121 +118 +118 +121 +126 +135 +144 +156 +168 +181 +194 +200 +205 +209 +212 +213 +213 +213 +213 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +214 +214 +213 +213 +212 +212 +212 +212 +212 +212 +211 +211 +210 +209 +207 +206 +204 +203 +202 +201 +200 +200 +200 +200 +200 +200 +200 +200 +200 +199 +198 +197 +195 +194 +192 +190 +187 +185 +183 +182 +181 +179 +179 +179 +181 +183 +189 +195 +201 +206 +210 +212 +211 +210 +209 +207 +204 +200 +197 +195 +193 +189 +186 +184 +180 +177 +165 +145 +116 +81 +45 +13 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +120 +140 +152 +159 +161 +164 +164 +163 +161 +158 +158 +158 +158 +158 +158 +159 +158 +157 +158 +161 +181 +182 +173 +138 +64 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +19 +49 +102 +187 +204 +212 +214 +214 +216 +216 +215 +213 +211 +205 +201 +198 +196 +194 +189 +182 +173 +161 +145 +124 +120 +119 +121 +125 +132 +138 +147 +158 +171 +185 +193 +200 +205 +209 +212 +213 +213 +213 +213 +213 +213 +214 +214 +214 +214 +214 +214 +214 +214 +214 +214 +213 +213 +212 +212 +212 +212 +211 +211 +211 +210 +209 +208 +207 +204 +203 +202 +201 +200 +198 +198 +197 +196 +195 +194 +194 +193 +192 +191 +190 +189 +188 +187 +186 +184 +184 +183 +182 +181 +182 +184 +187 +192 +198 +205 +209 +211 +211 +212 +211 +209 +207 +205 +202 +199 +196 +193 +190 +187 +184 +182 +180 +175 +167 +138 +101 +63 +31 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +123 +140 +152 +159 +162 +164 +164 +164 +162 +160 +158 +158 +158 +158 +159 +159 +158 +158 +161 +170 +183 +181 +152 +100 +29 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +25 +59 +145 +188 +207 +213 +214 +215 +215 +215 +214 +211 +207 +203 +200 +197 +195 +191 +186 +178 +167 +154 +132 +124 +121 +121 +124 +129 +133 +138 +146 +156 +170 +180 +188 +195 +201 +207 +210 +211 +212 +213 +213 +213 +213 +213 +213 +213 +214 +214 +214 +214 +214 +214 +214 +213 +213 +213 +212 +212 +212 +211 +211 +210 +210 +209 +208 +207 +205 +204 +202 +200 +199 +198 +197 +196 +195 +194 +193 +192 +192 +191 +190 +189 +188 +187 +187 +186 +187 +188 +191 +194 +199 +203 +207 +209 +210 +211 +211 +211 +210 +208 +206 +204 +202 +199 +197 +193 +190 +186 +184 +182 +179 +174 +164 +145 +114 +65 +34 +14 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +124 +139 +151 +159 +162 +165 +165 +164 +163 +161 +159 +159 +159 +159 +159 +159 +158 +159 +164 +177 +181 +171 +124 +64 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +15 +36 +103 +165 +198 +211 +213 +214 +215 +215 +214 +212 +208 +205 +201 +199 +196 +192 +188 +181 +173 +162 +141 +129 +124 +122 +124 +128 +131 +134 +139 +146 +158 +167 +176 +184 +192 +200 +204 +207 +210 +211 +212 +212 +212 +212 +213 +213 +213 +213 +213 +214 +214 +214 +214 +213 +213 +213 +213 +213 +212 +212 +212 +211 +211 +210 +210 +209 +208 +206 +205 +204 +202 +201 +200 +198 +197 +196 +195 +195 +194 +194 +193 +194 +194 +195 +195 +197 +199 +201 +203 +205 +207 +209 +209 +210 +210 +210 +209 +208 +206 +205 +202 +200 +197 +194 +190 +186 +184 +182 +180 +177 +168 +150 +124 +93 +60 +26 +13 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +125 +139 +150 +158 +162 +165 +165 +165 +164 +162 +160 +159 +159 +160 +160 +158 +158 +162 +170 +180 +179 +148 +91 +35 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +68 +134 +180 +207 +213 +214 +214 +214 +214 +213 +209 +206 +203 +200 +197 +194 +190 +185 +178 +169 +150 +137 +128 +124 +124 +127 +129 +132 +135 +139 +148 +156 +164 +172 +180 +190 +196 +201 +205 +208 +210 +211 +212 +212 +212 +212 +212 +212 +212 +213 +213 +213 +213 +213 +213 +213 +213 +213 +213 +213 +212 +212 +212 +212 +211 +210 +210 +209 +208 +207 +206 +205 +204 +203 +203 +202 +201 +201 +201 +201 +201 +202 +202 +203 +204 +206 +207 +208 +209 +210 +210 +210 +209 +209 +209 +207 +206 +204 +203 +200 +197 +194 +191 +187 +184 +181 +179 +176 +170 +161 +135 +107 +77 +48 +25 +7 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +126 +139 +149 +157 +162 +165 +165 +165 +164 +163 +161 +161 +161 +161 +160 +158 +160 +167 +175 +181 +170 +115 +57 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +7 +39 +98 +155 +197 +211 +213 +214 +214 +214 +213 +210 +207 +204 +201 +199 +195 +192 +188 +182 +175 +160 +146 +135 +128 +126 +126 +129 +131 +133 +135 +140 +146 +152 +160 +167 +178 +185 +191 +197 +201 +206 +208 +210 +211 +211 +211 +211 +212 +212 +212 +212 +212 +213 +213 +213 +213 +213 +213 +213 +213 +213 +213 +212 +212 +212 +212 +211 +211 +211 +211 +210 +209 +209 +209 +208 +208 +208 +208 +208 +208 +208 +209 +209 +209 +210 +210 +210 +210 +210 +210 +209 +209 +208 +207 +206 +204 +202 +200 +198 +195 +190 +187 +184 +181 +179 +176 +172 +163 +149 +128 +89 +59 +34 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +138 +148 +156 +161 +164 +165 +165 +165 +164 +163 +163 +162 +161 +159 +159 +163 +172 +179 +178 +149 +72 +25 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +14 +61 +122 +177 +208 +213 +213 +214 +214 +214 +211 +209 +206 +203 +200 +196 +194 +190 +185 +180 +168 +156 +144 +134 +128 +128 +129 +130 +132 +133 +135 +138 +143 +148 +154 +164 +171 +179 +185 +192 +199 +203 +206 +208 +210 +210 +211 +211 +211 +211 +211 +211 +211 +212 +212 +212 +212 +212 +213 +213 +213 +213 +212 +212 +212 +212 +212 +212 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +211 +211 +211 +210 +210 +210 +210 +210 +209 +209 +208 +207 +206 +206 +204 +203 +201 +198 +194 +191 +187 +182 +180 +178 +177 +175 +169 +157 +136 +109 +76 +39 +18 +7 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +138 +147 +155 +160 +163 +164 +165 +165 +164 +164 +163 +161 +159 +159 +161 +170 +174 +172 +160 +76 +28 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +24 +70 +130 +191 +211 +213 +213 +214 +214 +212 +210 +208 +205 +202 +199 +196 +193 +189 +185 +178 +169 +158 +148 +138 +132 +131 +131 +132 +133 +135 +135 +137 +139 +142 +148 +154 +160 +167 +173 +182 +188 +193 +198 +202 +206 +208 +209 +209 +210 +210 +210 +210 +210 +210 +210 +211 +211 +211 +211 +211 +212 +212 +212 +212 +212 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +211 +210 +210 +210 +209 +209 +209 +208 +207 +207 +207 +206 +206 +204 +203 +200 +197 +194 +189 +185 +182 +179 +177 +176 +174 +171 +166 +156 +128 +100 +70 +42 +23 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +138 +147 +153 +158 +163 +164 +164 +165 +164 +164 +162 +161 +160 +161 +167 +173 +171 +154 +111 +39 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +13 +43 +89 +153 +204 +211 +213 +213 +213 +213 +211 +209 +207 +204 +201 +198 +195 +192 +188 +183 +176 +168 +159 +150 +140 +137 +135 +134 +134 +135 +136 +137 +138 +140 +143 +146 +150 +154 +160 +167 +173 +179 +184 +190 +196 +200 +203 +205 +207 +208 +209 +209 +209 +209 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +209 +209 +209 +209 +209 +208 +208 +208 +207 +207 +206 +205 +204 +202 +200 +197 +194 +190 +187 +183 +179 +177 +175 +174 +172 +169 +162 +150 +133 +111 +77 +51 +31 +18 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +139 +147 +152 +157 +161 +163 +164 +164 +164 +162 +161 +160 +161 +162 +170 +171 +156 +123 +73 +23 +10 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +23 +56 +111 +185 +204 +212 +213 +213 +213 +212 +210 +208 +206 +203 +200 +197 +194 +191 +186 +182 +177 +170 +162 +152 +146 +143 +140 +138 +137 +138 +138 +139 +139 +141 +143 +145 +148 +151 +156 +161 +165 +170 +176 +183 +188 +192 +196 +199 +202 +204 +206 +207 +207 +208 +208 +208 +208 +208 +208 +208 +209 +209 +209 +209 +209 +209 +209 +209 +209 +209 +209 +208 +208 +208 +208 +207 +207 +207 +206 +206 +205 +204 +203 +200 +198 +196 +193 +190 +186 +183 +180 +177 +175 +173 +171 +169 +166 +161 +147 +131 +111 +89 +65 +36 +20 +11 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +129 +140 +147 +152 +155 +160 +162 +163 +164 +163 +161 +160 +161 +162 +164 +171 +162 +132 +91 +49 +19 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +10 +31 +69 +153 +190 +207 +212 +213 +213 +213 +211 +210 +208 +205 +202 +199 +197 +194 +190 +187 +183 +178 +173 +164 +158 +153 +149 +145 +142 +141 +141 +140 +141 +141 +142 +143 +145 +146 +149 +152 +155 +159 +163 +169 +174 +178 +183 +187 +193 +196 +199 +201 +203 +204 +205 +206 +206 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +206 +206 +206 +205 +205 +204 +203 +202 +200 +199 +197 +195 +191 +188 +185 +182 +179 +176 +173 +172 +170 +169 +166 +163 +157 +148 +136 +111 +88 +66 +45 +28 +9 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +141 +147 +151 +154 +159 +162 +163 +162 +160 +160 +161 +161 +163 +167 +169 +144 +107 +70 +44 +23 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +12 +32 +108 +166 +198 +211 +213 +213 +213 +212 +211 +209 +207 +204 +201 +199 +196 +192 +190 +187 +185 +182 +175 +170 +166 +162 +158 +153 +150 +147 +145 +143 +142 +142 +143 +144 +145 +146 +149 +150 +152 +154 +158 +161 +165 +169 +172 +178 +182 +186 +190 +193 +197 +199 +201 +203 +204 +204 +205 +205 +205 +205 +205 +205 +205 +204 +204 +204 +204 +203 +203 +202 +201 +200 +199 +197 +196 +193 +190 +188 +185 +182 +178 +175 +173 +171 +169 +168 +167 +166 +165 +163 +157 +147 +132 +114 +91 +61 +41 +26 +15 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +131 +142 +148 +151 +153 +159 +160 +159 +159 +160 +161 +159 +159 +162 +170 +155 +117 +90 +70 +52 +25 +12 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +48 +109 +163 +200 +211 +212 +213 +213 +212 +211 +209 +207 +204 +202 +199 +196 +193 +191 +190 +188 +185 +182 +179 +177 +175 +172 +169 +166 +163 +159 +154 +151 +148 +146 +146 +146 +148 +149 +150 +152 +154 +155 +157 +158 +160 +162 +165 +167 +169 +172 +175 +178 +181 +184 +186 +189 +191 +192 +194 +194 +195 +195 +195 +195 +194 +194 +192 +191 +190 +188 +186 +184 +182 +180 +178 +175 +173 +171 +169 +167 +166 +165 +164 +164 +163 +161 +158 +153 +144 +131 +107 +87 +68 +49 +31 +13 +9 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +131 +143 +149 +151 +153 +158 +158 +159 +160 +161 +159 +157 +161 +167 +168 +131 +108 +95 +83 +65 +32 +16 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +24 +68 +121 +170 +203 +211 +212 +212 +212 +212 +210 +209 +206 +204 +202 +198 +196 +194 +192 +191 +190 +188 +186 +184 +183 +181 +180 +178 +176 +174 +171 +168 +164 +161 +157 +152 +151 +150 +150 +151 +153 +154 +155 +156 +158 +160 +161 +162 +164 +165 +167 +168 +169 +170 +172 +173 +174 +175 +177 +177 +178 +179 +179 +180 +180 +179 +179 +178 +177 +176 +174 +173 +171 +170 +168 +166 +165 +164 +163 +163 +162 +161 +159 +156 +152 +141 +129 +115 +100 +83 +60 +45 +32 +20 +10 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +133 +144 +149 +151 +153 +157 +158 +159 +160 +160 +156 +156 +164 +168 +158 +120 +113 +110 +105 +92 +52 +27 +11 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +35 +79 +130 +180 +207 +210 +212 +212 +212 +211 +210 +208 +206 +204 +201 +199 +196 +194 +193 +192 +191 +191 +190 +188 +188 +187 +186 +186 +185 +183 +181 +178 +176 +172 +167 +163 +160 +157 +155 +155 +155 +155 +156 +157 +158 +159 +160 +161 +162 +163 +163 +164 +164 +165 +165 +166 +166 +166 +167 +167 +167 +168 +168 +167 +167 +167 +166 +166 +165 +164 +163 +163 +162 +161 +160 +159 +159 +158 +157 +153 +148 +142 +134 +123 +105 +90 +73 +57 +43 +27 +19 +12 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +134 +145 +149 +151 +153 +157 +159 +161 +161 +157 +154 +160 +168 +166 +144 +121 +127 +130 +130 +123 +84 +49 +23 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +12 +41 +85 +143 +194 +206 +211 +212 +212 +212 +211 +210 +208 +207 +204 +202 +199 +197 +195 +194 +193 +193 +193 +192 +192 +192 +192 +191 +191 +191 +190 +189 +188 +186 +183 +179 +175 +171 +166 +162 +161 +159 +159 +158 +159 +159 +160 +161 +161 +162 +162 +163 +163 +163 +163 +163 +162 +162 +162 +162 +161 +161 +161 +160 +160 +159 +159 +159 +158 +158 +158 +157 +157 +157 +156 +155 +154 +151 +148 +138 +128 +116 +102 +86 +65 +49 +35 +24 +15 +7 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +136 +146 +150 +151 +153 +157 +163 +163 +159 +153 +154 +169 +172 +160 +131 +135 +145 +150 +150 +148 +127 +82 +43 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +13 +42 +92 +166 +195 +208 +211 +212 +212 +212 +211 +210 +209 +207 +204 +202 +200 +197 +195 +195 +194 +194 +194 +195 +195 +195 +195 +195 +195 +195 +194 +194 +193 +193 +192 +191 +189 +186 +181 +177 +172 +168 +165 +162 +161 +161 +161 +162 +162 +163 +163 +163 +163 +163 +163 +163 +162 +162 +162 +161 +161 +160 +160 +159 +159 +158 +158 +158 +157 +156 +156 +155 +154 +153 +151 +147 +141 +133 +114 +99 +83 +66 +49 +29 +18 +11 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +137 +146 +150 +151 +154 +162 +164 +161 +156 +155 +168 +177 +163 +144 +135 +153 +155 +155 +153 +151 +146 +127 +86 +41 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +10 +30 +96 +151 +187 +207 +211 +211 +212 +212 +211 +210 +209 +208 +206 +204 +202 +199 +197 +196 +195 +195 +195 +196 +196 +196 +196 +196 +196 +197 +197 +197 +197 +197 +197 +197 +196 +195 +193 +192 +190 +187 +184 +181 +179 +176 +174 +172 +171 +171 +170 +170 +170 +169 +169 +169 +168 +167 +167 +166 +166 +165 +164 +163 +163 +162 +161 +160 +159 +157 +156 +154 +150 +144 +134 +120 +102 +77 +60 +44 +30 +18 +8 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +146 +150 +153 +158 +167 +164 +160 +158 +162 +179 +179 +159 +140 +144 +157 +157 +156 +153 +150 +147 +139 +110 +69 +22 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +12 +49 +97 +145 +185 +206 +211 +211 +212 +212 +212 +210 +209 +208 +207 +205 +203 +201 +199 +198 +197 +196 +196 +196 +196 +196 +196 +197 +197 +197 +198 +198 +198 +198 +198 +198 +198 +197 +197 +196 +196 +194 +193 +191 +190 +189 +187 +185 +184 +183 +183 +182 +181 +181 +180 +180 +179 +178 +178 +177 +177 +175 +174 +172 +170 +169 +165 +162 +159 +156 +152 +144 +132 +115 +96 +76 +52 +37 +24 +14 +7 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +139 +147 +150 +154 +162 +169 +163 +161 +164 +174 +184 +174 +154 +140 +151 +160 +160 +157 +153 +149 +146 +143 +125 +91 +38 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +20 +53 +97 +143 +183 +207 +210 +211 +212 +212 +211 +211 +210 +209 +208 +206 +205 +203 +201 +200 +199 +199 +198 +198 +197 +197 +197 +198 +198 +198 +199 +199 +199 +199 +199 +199 +199 +199 +199 +200 +199 +199 +198 +198 +198 +197 +196 +195 +194 +193 +192 +191 +191 +190 +189 +188 +187 +186 +185 +184 +181 +179 +177 +174 +171 +167 +162 +157 +150 +141 +123 +105 +86 +67 +50 +31 +20 +11 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +141 +147 +151 +156 +166 +170 +163 +164 +171 +185 +186 +166 +149 +142 +156 +163 +162 +157 +152 +147 +145 +143 +134 +107 +54 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +21 +51 +92 +141 +189 +202 +209 +211 +211 +212 +211 +211 +210 +210 +209 +207 +206 +205 +204 +203 +202 +201 +200 +200 +199 +199 +199 +199 +200 +200 +200 +201 +201 +201 +200 +200 +201 +201 +201 +201 +201 +202 +202 +202 +202 +202 +202 +201 +201 +200 +199 +198 +197 +196 +194 +193 +191 +189 +186 +182 +179 +176 +172 +167 +159 +151 +142 +131 +116 +91 +72 +54 +39 +26 +15 +9 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +143 +148 +152 +158 +170 +169 +164 +168 +177 +188 +186 +157 +145 +147 +159 +164 +163 +157 +151 +145 +143 +142 +137 +117 +70 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +19 +44 +82 +147 +184 +203 +210 +210 +211 +212 +211 +211 +211 +210 +210 +209 +208 +207 +206 +205 +204 +203 +202 +202 +202 +202 +202 +202 +203 +203 +203 +203 +202 +202 +202 +202 +202 +201 +201 +202 +202 +203 +203 +204 +204 +204 +204 +204 +204 +203 +201 +200 +198 +195 +193 +190 +187 +184 +179 +175 +169 +162 +154 +137 +123 +107 +90 +73 +52 +37 +25 +15 +8 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +144 +148 +155 +163 +173 +166 +165 +173 +184 +189 +181 +150 +141 +147 +160 +161 +155 +149 +144 +143 +143 +142 +138 +122 +83 +19 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +26 +68 +110 +150 +183 +204 +210 +211 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +210 +210 +210 +209 +209 +208 +208 +208 +207 +207 +207 +206 +206 +205 +204 +203 +203 +202 +202 +202 +202 +203 +203 +203 +204 +204 +205 +205 +203 +201 +198 +195 +191 +185 +180 +172 +164 +154 +140 +128 +115 +102 +88 +71 +58 +44 +32 +23 +14 +10 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +144 +149 +157 +166 +173 +164 +165 +176 +187 +190 +173 +147 +141 +146 +155 +151 +147 +144 +143 +142 +141 +140 +137 +123 +88 +21 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +32 +60 +93 +127 +159 +189 +200 +206 +209 +211 +211 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +210 +210 +210 +209 +209 +208 +208 +207 +206 +205 +205 +204 +203 +202 +202 +202 +202 +203 +203 +202 +202 +201 +198 +191 +185 +178 +170 +161 +148 +138 +127 +116 +105 +89 +78 +67 +56 +45 +35 +26 +19 +13 +8 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +146 +150 +159 +167 +170 +162 +167 +179 +189 +189 +164 +144 +139 +143 +146 +144 +142 +142 +141 +141 +139 +139 +136 +123 +90 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +11 +27 +48 +74 +104 +140 +161 +177 +189 +198 +204 +206 +208 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +209 +209 +209 +208 +208 +207 +206 +205 +204 +203 +202 +201 +201 +201 +201 +200 +199 +196 +192 +186 +178 +164 +154 +143 +131 +119 +103 +91 +80 +70 +60 +48 +39 +31 +24 +19 +13 +8 +6 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +147 +151 +159 +166 +166 +160 +170 +181 +190 +188 +156 +141 +138 +139 +139 +140 +141 +141 +140 +139 +138 +137 +135 +122 +90 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +18 +33 +52 +83 +106 +128 +147 +163 +176 +183 +188 +192 +195 +197 +199 +200 +201 +201 +202 +202 +202 +203 +203 +203 +203 +203 +203 +203 +202 +201 +201 +200 +199 +197 +196 +195 +193 +190 +184 +177 +168 +157 +144 +126 +112 +99 +86 +74 +59 +49 +40 +32 +25 +19 +14 +9 +6 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +147 +152 +160 +165 +162 +159 +174 +184 +189 +184 +148 +139 +136 +136 +137 +141 +141 +140 +139 +137 +137 +136 +133 +120 +87 +22 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +17 +34 +50 +66 +81 +96 +115 +128 +139 +149 +157 +165 +169 +172 +175 +178 +180 +182 +184 +186 +188 +189 +190 +191 +192 +192 +192 +192 +191 +190 +189 +187 +184 +179 +174 +166 +153 +140 +126 +112 +98 +80 +67 +55 +43 +33 +24 +18 +12 +8 +5 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +147 +152 +157 +159 +155 +159 +180 +187 +183 +172 +142 +137 +136 +138 +141 +141 +141 +140 +138 +137 +136 +136 +132 +115 +77 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +11 +18 +24 +31 +37 +41 +45 +50 +54 +60 +64 +67 +71 +74 +78 +81 +85 +89 +93 +100 +104 +108 +112 +115 +119 +121 +122 +122 +121 +117 +112 +106 +99 +91 +79 +70 +60 +50 +41 +30 +23 +17 +11 +6 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +145 +151 +154 +154 +152 +168 +183 +184 +176 +163 +141 +139 +139 +141 +142 +142 +141 +140 +140 +138 +137 +136 +130 +110 +67 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +6 +9 +11 +14 +15 +17 +18 +20 +22 +23 +25 +26 +28 +30 +31 +33 +35 +38 +41 +44 +47 +50 +53 +56 +58 +60 +61 +61 +59 +56 +53 +49 +45 +38 +33 +27 +22 +17 +11 +8 +6 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +142 +148 +150 +150 +153 +177 +183 +178 +167 +154 +141 +141 +142 +143 +142 +142 +142 +142 +142 +141 +139 +137 +128 +103 +55 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +3 +4 +4 +4 +4 +5 +5 +6 +6 +7 +8 +8 +9 +10 +11 +12 +14 +15 +17 +18 +20 +21 +22 +23 +23 +23 +22 +20 +19 +17 +14 +11 +9 +7 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +144 +147 +150 +158 +182 +179 +169 +157 +148 +143 +144 +143 +143 +143 +143 +145 +145 +145 +143 +141 +137 +123 +93 +43 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +4 +4 +4 +5 +5 +5 +5 +4 +4 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +142 +145 +153 +171 +181 +171 +159 +150 +145 +145 +144 +143 +143 +143 +146 +148 +149 +148 +146 +143 +138 +117 +81 +31 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +139 +143 +151 +162 +175 +168 +157 +150 +146 +145 +145 +143 +144 +146 +150 +156 +157 +155 +153 +149 +145 +136 +104 +62 +18 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +142 +148 +158 +167 +170 +157 +150 +147 +146 +145 +143 +144 +148 +153 +157 +159 +158 +156 +153 +150 +146 +130 +92 +47 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +145 +153 +161 +165 +159 +149 +147 +146 +145 +144 +143 +149 +154 +158 +160 +160 +159 +157 +154 +152 +146 +120 +78 +35 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +148 +157 +160 +158 +148 +145 +145 +145 +145 +144 +146 +155 +158 +159 +159 +159 +158 +157 +155 +153 +143 +108 +64 +24 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +148 +157 +154 +147 +143 +144 +145 +145 +145 +144 +155 +158 +157 +156 +155 +157 +157 +157 +156 +153 +139 +93 +49 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +148 +148 +143 +138 +143 +144 +145 +144 +145 +148 +159 +153 +151 +150 +151 +153 +155 +156 +155 +151 +118 +68 +30 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +143 +139 +137 +138 +143 +144 +145 +145 +147 +153 +155 +151 +149 +149 +150 +151 +152 +152 +149 +141 +92 +47 +18 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +134 +135 +138 +143 +145 +145 +145 +148 +154 +152 +150 +149 +149 +149 +149 +149 +147 +138 +121 +65 +29 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +134 +131 +134 +138 +143 +145 +145 +145 +148 +153 +151 +150 +149 +149 +148 +147 +145 +138 +123 +94 +40 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +130 +134 +139 +143 +145 +144 +145 +148 +151 +150 +150 +149 +149 +148 +146 +140 +126 +101 +64 +19 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +144 +145 +144 +146 +149 +150 +151 +150 +150 +149 +148 +144 +129 +101 +67 +31 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +144 +145 +144 +146 +149 +150 +151 +151 +150 +148 +147 +141 +115 +81 +46 +17 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +144 +145 +144 +146 +148 +150 +151 +150 +149 +148 +146 +135 +99 +61 +29 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +145 +145 +144 +146 +148 +150 +151 +150 +148 +147 +145 +126 +82 +44 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +140 +145 +145 +145 +146 +148 +150 +150 +149 +148 +146 +143 +112 +64 +28 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +145 +145 +145 +146 +147 +149 +149 +148 +146 +143 +137 +87 +39 +13 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +129 +133 +139 +145 +145 +145 +146 +147 +149 +148 +146 +144 +140 +129 +62 +25 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +129 +133 +139 +145 +146 +146 +147 +148 +148 +147 +145 +143 +134 +112 +39 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +128 +132 +138 +145 +146 +147 +147 +148 +147 +145 +144 +140 +124 +88 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +128 +131 +137 +145 +146 +147 +147 +147 +145 +143 +142 +135 +111 +58 +7 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +127 +130 +136 +143 +146 +146 +145 +144 +142 +142 +139 +118 +78 +22 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +127 +130 +134 +139 +144 +143 +142 +142 +142 +141 +130 +93 +46 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +127 +130 +133 +137 +140 +140 +141 +141 +141 +137 +108 +64 +22 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +128 +129 +132 +135 +138 +139 +140 +140 +139 +123 +76 +35 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +128 +129 +132 +135 +136 +139 +140 +139 +136 +94 +39 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +129 +130 +131 +132 +134 +138 +139 +138 +129 +107 +29 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +131 +132 +133 +136 +139 +138 +127 +101 +52 +10 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +132 +133 +134 +136 +138 +137 +126 +97 +59 +18 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +135 +135 +136 +137 +137 +125 +97 +57 +20 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +137 +137 +137 +137 +134 +94 +44 +16 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +136 +134 +125 +104 +66 +18 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +105 +88 +67 +45 +22 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +55 +41 +26 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +13 +7 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/hl/tools/h52jpeg/testfiles/h52jpegtst.h5 b/hl/tools/h52jpeg/testfiles/h52jpegtst.h5 new file mode 100644 index 0000000..048e568 Binary files /dev/null and b/hl/tools/h52jpeg/testfiles/h52jpegtst.h5 differ diff --git a/hl/tools/testfiles/h52giftst.h5 b/hl/tools/testfiles/h52giftst.h5 deleted file mode 100644 index a827b3b..0000000 Binary files a/hl/tools/testfiles/h52giftst.h5 and /dev/null differ diff --git a/hl/tools/testfiles/image1.gif b/hl/tools/testfiles/image1.gif deleted file mode 100644 index b90b23a..0000000 Binary files a/hl/tools/testfiles/image1.gif and /dev/null differ diff --git a/perform/pio_engine.c b/perform/pio_engine.c index f42a849..6f300c8 100644 --- a/perform/pio_engine.c +++ b/perform/pio_engine.c @@ -50,25 +50,25 @@ #define ELMT_MPI_TYPE MPI_BYTE #define ELMT_H5_TYPE H5T_NATIVE_UCHAR -#define GOTOERROR(errcode) { ret_code = errcode; goto done; } -#define GOTODONE { goto done; } +#define GOTOERROR(errcode) { ret_code = errcode; goto done; } +#define GOTODONE { goto done; } #define ERRMSG(mesg) { \ fprintf(stderr, "Proc %d: ", pio_mpi_rank_g); \ fprintf(stderr, "*** Assertion failed (%s) at line %4d in %s\n", \ - mesg, (int)__LINE__, __FILE__); \ + mesg, (int)__LINE__, __FILE__); \ } #define MSG(mesg) { \ fprintf(stderr, "Proc %d: ", pio_mpi_rank_g); \ fprintf(stderr, "(%s) at line %4d in %s\n", \ - mesg, (int)__LINE__, __FILE__); \ + mesg, (int)__LINE__, __FILE__); \ } /* verify: if val is false (0), print mesg. */ #define VRFY(val, mesg) do { \ if (!val) { \ - ERRMSG(mesg); \ - GOTOERROR(FAIL); \ + ERRMSG(mesg); \ + GOTOERROR(FAIL); \ } \ } while(0) @@ -88,7 +88,7 @@ enum { }; /* Global variables */ -static int clean_file_g = -1; /*whether to cleanup temporary test */ +static int clean_file_g = -1; /*whether to cleanup temporary test */ /*files. -1 is not defined; */ /*0 is no cleanup; 1 is do cleanup */ @@ -120,13 +120,13 @@ typedef union _file_descr { /* local functions */ static char *pio_create_filename(iotype iot, const char *base_name, - char *fullname, size_t size); + char *fullname, size_t size); static herr_t do_write(results *res, file_descr *fd, parameters *parms, - long ndsets, off_t nelmts, size_t buf_size, void *buffer); + long ndsets, off_t nelmts, size_t buf_size, void *buffer); static herr_t do_read(results *res, file_descr *fd, parameters *parms, - long ndsets, off_t nelmts, size_t buf_size, void *buffer /*out*/); + long ndsets, off_t nelmts, size_t buf_size, void *buffer /*out*/); static herr_t do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, - int flags); + int flags); static herr_t do_fclose(iotype iot, file_descr *fd); static void do_cleanupfile(iotype iot, char *fname); @@ -138,16 +138,16 @@ static void gpfs_clear_file_cache(int handle); static void gpfs_cancel_hints(int handle); static void gpfs_start_data_shipping(int handle, int num_insts); static void gpfs_start_data_ship_map(int handle, int partition_size, - int agent_count, int *agent_node_num); + int agent_count, int *agent_node_num); static void gpfs_stop_data_shipping(int handle); static void gpfs_invalidate_file_cache(const char *filename); #endif /* H5_HAVE_GPFS */ /* - * Function: do_pio - * Purpose: PIO Engine where Parallel IO are executed. - * Return: results - * Programmer: Albert Cheng, Bill Wendling 2001/12/12 + * Function: do_pio + * Purpose: PIO Engine where Parallel IO are executed. + * Return: results + * Programmer: Albert Cheng, Bill Wendling 2001/12/12 * Modifications: * Added 2D testing (Christian Chilan, 10. August 2005) */ @@ -158,28 +158,25 @@ do_pio(parameters param) herr_t ret_code = 0; /*return code */ results res; - file_descr fd; + file_descr fd; iotype iot; char fname[FILENAME_MAX]; - long nf; + long nf; long ndsets; - off_t nbytes; /*number of bytes per dataset */ - off_t snbytes; /*general dataset size */ - /*for 1D, it is the actual dataset size */ - /*for 2D, it is the size of a side of the dataset square */ - - char *buffer = NULL; /*data buffer pointer */ - - size_t buf_size; /*general buffer size in bytes */ - /*for 1D, it is the actual buffer size */ - /*for 2D, it is the length of the buffer rectangle */ - - size_t blk_size; /*data block size in bytes */ - size_t bsize; /*actual buffer size */ + off_t nbytes; /*number of bytes per dataset */ + off_t snbytes; /*general dataset size */ + /*for 1D, it is the actual dataset size */ + /*for 2D, it is the size of a side of the dataset square */ + char *buffer = NULL; /*data buffer pointer */ + size_t buf_size; /*general buffer size in bytes */ + /*for 1D, it is the actual buffer size */ + /*for 2D, it is the length of the buffer rectangle */ + size_t blk_size; /*data block size in bytes */ + size_t bsize; /*actual buffer size */ /* HDF5 variables */ - herr_t hrc; /*HDF5 return code */ + herr_t hrc; /*HDF5 return code */ /* Sanity check parameters */ @@ -187,22 +184,22 @@ do_pio(parameters param) iot = param.io_type; switch (iot) { - case MPIO: - fd.mpifd = MPI_FILE_NULL; - res.timers = pio_time_new(MPI_TIMER); - break; - case POSIXIO: - fd.posixfd = -1; - res.timers = pio_time_new(MPI_TIMER); - break; - case PHDF5: - fd.h5fd = -1; - res.timers = pio_time_new(MPI_TIMER); - break; - default: - /* unknown request */ - fprintf(stderr, "Unknown IO type request (%d)\n", iot); - GOTOERROR(FAIL); + case MPIO: + fd.mpifd = MPI_FILE_NULL; + res.timers = pio_time_new(MPI_TIMER); + break; + case POSIXIO: + fd.posixfd = -1; + res.timers = pio_time_new(MPI_TIMER); + break; + case PHDF5: + fd.h5fd = -1; + res.timers = pio_time_new(MPI_TIMER); + break; + default: + /* unknown request */ + fprintf(stderr, "Unknown IO type request (%d)\n", iot); + GOTOERROR(FAIL); } ndsets = param.num_dsets; /* number of datasets per file */ @@ -210,152 +207,164 @@ do_pio(parameters param) buf_size = param.buf_size; blk_size = param.blk_size; - if (param.dim2d==0){ - snbytes = nbytes; /* General dataset size */ - bsize = buf_size; /* Actual buffer size */ + if (!param.dim2d){ + snbytes = nbytes; /* General dataset size */ + bsize = buf_size; /* Actual buffer size */ } else { - snbytes = (off_t)sqrt(nbytes); /* General dataset size */ - bsize = buf_size * blk_size; /* Actual buffer size */ + snbytes = (off_t)sqrt(nbytes); /* General dataset size */ + bsize = buf_size * blk_size; /* Actual buffer size */ } if (param.num_files < 0 ) { - fprintf(stderr, - "number of files must be >= 0 (%ld)\n", - param.num_files); - GOTOERROR(FAIL); + fprintf(stderr, + "number of files must be >= 0 (%ld)\n", + param.num_files); + GOTOERROR(FAIL); } if (ndsets < 0 ) { - fprintf(stderr, - "number of datasets per file must be >= 0 (%ld)\n", - ndsets); - GOTOERROR(FAIL); + fprintf(stderr, + "number of datasets per file must be >= 0 (%ld)\n", + ndsets); + GOTOERROR(FAIL); } if (param.num_procs <= 0 ) { - fprintf(stderr, - "maximum number of process to use must be > 0 (%d)\n", - param.num_procs); - GOTOERROR(FAIL); + fprintf(stderr, + "maximum number of process to use must be > 0 (%d)\n", + param.num_procs); + GOTOERROR(FAIL); } /* Validate transfer buffer size & block size*/ if(blk_size<=0) { - HDfprintf(stderr, - "Transfer block size (%Hd) must be > 0\n", (long_long)blk_size); - GOTOERROR(FAIL); + HDfprintf(stderr, + "Transfer block size (%Hd) must be > 0\n", (long_long)blk_size); + GOTOERROR(FAIL); } if(buf_size<=0) { - HDfprintf(stderr, - "Transfer buffer size (%Hd) must be > 0\n", (long_long)buf_size); - GOTOERROR(FAIL); + HDfprintf(stderr, + "Transfer buffer size (%Hd) must be > 0\n", (long_long)buf_size); + GOTOERROR(FAIL); } if ((buf_size % blk_size) != 0){ - HDfprintf(stderr, - "Transfer buffer size (%Hd) must be a multiple of the " - "interleaved I/O block size (%Hd)\n", - (long_long)buf_size, (long_long)blk_size); - GOTOERROR(FAIL); + HDfprintf(stderr, + "Transfer buffer size (%Hd) must be a multiple of the " + "interleaved I/O block size (%Hd)\n", + (long_long)buf_size, (long_long)blk_size); + GOTOERROR(FAIL); } if((snbytes%pio_mpi_nprocs_g)!=0) { - HDfprintf(stderr, - "Dataset size (%Hd) must be a multiple of the " - "number of processes (%d)\n", - (long_long)nbytes, pio_mpi_nprocs_g); - GOTOERROR(FAIL); + HDfprintf(stderr, + "Dataset size (%Hd) must be a multiple of the " + "number of processes (%d)\n", + (long_long)snbytes, pio_mpi_nprocs_g); + GOTOERROR(FAIL); } - if(((snbytes/pio_mpi_nprocs_g)%buf_size)!=0) { - HDfprintf(stderr, - "Dataset size/process (%Hd) must be a multiple of the " - "trasfer buffer size (%Hd)\n", - (long_long)(nbytes/pio_mpi_nprocs_g), (long_long)buf_size); - GOTOERROR(FAIL); + + if (!param.dim2d){ + if(((snbytes/pio_mpi_nprocs_g)%buf_size)!=0) { + HDfprintf(stderr, + "Dataset size/process (%Hd) must be a multiple of the " + "trasfer buffer size (%Hd)\n", + (long_long)(snbytes/pio_mpi_nprocs_g), (long_long)buf_size); + GOTOERROR(FAIL); + } + } + else { + if((snbytes%buf_size)!=0) { + HDfprintf(stderr, + "Dataset side size (%Hd) must be a multiple of the " + "trasfer buffer size (%Hd)\n", + (long_long)snbytes, (long_long)buf_size); + GOTOERROR(FAIL); + } } /* Allocate transfer buffer */ if ((buffer = malloc(bsize)) == NULL){ - HDfprintf(stderr, "malloc for transfer buffer size (%Hd) failed\n", - (long_long)(bsize)); - GOTOERROR(FAIL); + HDfprintf(stderr, "malloc for transfer buffer size (%Hd) failed\n", + (long_long)(bsize)); + GOTOERROR(FAIL); } if (pio_debug_level >= 4) { - int myrank; + int myrank; - MPI_Comm_rank(pio_comm_g, &myrank); + MPI_Comm_rank(pio_comm_g, &myrank); - /* output all of the times for all iterations */ - if (myrank == 0) - fprintf(output, "Timer details:\n"); + /* output all of the times for all iterations */ + if (myrank == 0) + fprintf(output, "Timer details:\n"); } for (nf = 1; nf <= param.num_files; nf++) { - /* - * Write performance measurement - */ - /* Open file for write */ - char base_name[256]; - - sprintf(base_name, "#pio_tmp_%lu", nf); - pio_create_filename(iot, base_name, fname, sizeof(fname)); - if (pio_debug_level > 0) - HDfprintf(output, "rank %d: data filename=%s\n", - pio_mpi_rank_g, fname); - - /* Need barrier to make sure everyone starts at the same time */ - MPI_Barrier(pio_comm_g); - - set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, START); - hrc = do_fopen(¶m, fname, &fd, PIO_CREATE | PIO_WRITE); - - VRFY((hrc == SUCCESS), "do_fopen failed"); - - set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, START); - hrc = do_write(&res, &fd, ¶m, ndsets, nbytes, buf_size, buffer); - hrc == SUCCESS; - set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, STOP); - - VRFY((hrc == SUCCESS), "do_write failed"); - - /* Close file for write */ - hrc = do_fclose(iot, &fd); - - set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, STOP); - VRFY((hrc == SUCCESS), "do_fclose failed"); - - if (!param.h5_write_only) { - /* - * Read performance measurement - */ - /* Need barrier to make sure everyone is done writing and has - * closed the file. Also to make sure everyone starts reading - * at the same time. - */ - MPI_Barrier(pio_comm_g); - - /* Open file for read */ - set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, START); - hrc = do_fopen(¶m, fname, &fd, PIO_READ); - - VRFY((hrc == SUCCESS), "do_fopen failed"); - - set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, START); - hrc = do_read(&res, &fd, ¶m, ndsets, nbytes, buf_size, buffer); - set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, STOP); - VRFY((hrc == SUCCESS), "do_read failed"); - - /* Close file for read */ - hrc = do_fclose(iot, &fd); - - set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, STOP); - VRFY((hrc == SUCCESS), "do_fclose failed"); - } - - /* Need barrier to make sure everyone is done with the file */ - /* before it may be removed by do_cleanupfile */ - MPI_Barrier(pio_comm_g); - do_cleanupfile(iot, fname); + /* + * Write performance measurement + */ + /* Open file for write */ + char base_name[256]; + + sprintf(base_name, "#pio_tmp_%lu", nf); + pio_create_filename(iot, base_name, fname, sizeof(fname)); + if (pio_debug_level > 0) + HDfprintf(output, "rank %d: data filename=%s\n", + pio_mpi_rank_g, fname); + + /* Need barrier to make sure everyone starts at the same time */ + MPI_Barrier(pio_comm_g); + + set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, START); + hrc = do_fopen(¶m, fname, &fd, PIO_CREATE | PIO_WRITE); + + VRFY((hrc == SUCCESS), "do_fopen failed"); + + set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, START); + hrc = do_write(&res, &fd, ¶m, ndsets, nbytes, buf_size, buffer); + hrc == SUCCESS; + set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, STOP); + + VRFY((hrc == SUCCESS), "do_write failed"); + + /* Close file for write */ + hrc = do_fclose(iot, &fd); + + set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, STOP); + VRFY((hrc == SUCCESS), "do_fclose failed"); + + if (!param.h5_write_only) { + /* + * Read performance measurement + */ + /* Need barrier to make sure everyone is done writing and has + * closed the file. Also to make sure everyone starts reading + * at the same time. + */ + MPI_Barrier(pio_comm_g); + + /* Open file for read */ + set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, START); + hrc = do_fopen(¶m, fname, &fd, PIO_READ); + + VRFY((hrc == SUCCESS), "do_fopen failed"); + + set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, START); + hrc = do_read(&res, &fd, ¶m, ndsets, nbytes, buf_size, buffer); + set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, STOP); + VRFY((hrc == SUCCESS), "do_read failed"); + + /* Close file for read */ + hrc = do_fclose(iot, &fd); + + set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, STOP); + VRFY((hrc == SUCCESS), "do_fclose failed"); + } + + /* Need barrier to make sure everyone is done with the file */ + /* before it may be removed by do_cleanupfile */ + MPI_Barrier(pio_comm_g); + do_cleanupfile(iot, fname); } done: @@ -365,23 +374,23 @@ done: /* close any opened files */ /* no remove(fname) because that should have happened normally. */ switch (iot) { - case POSIXIO: - if (fd.posixfd != -1) - hrc = do_fclose(iot, &fd); - break; - case MPIO: - if (fd.mpifd != MPI_FILE_NULL) - hrc = do_fclose(iot, &fd); - break; - case PHDF5: - if (fd.h5fd != -1) - hrc = do_fclose(iot, &fd); - break; + case POSIXIO: + if (fd.posixfd != -1) + hrc = do_fclose(iot, &fd); + break; + case MPIO: + if (fd.mpifd != MPI_FILE_NULL) + hrc = do_fclose(iot, &fd); + break; + case PHDF5: + if (fd.h5fd != -1) + hrc = do_fclose(iot, &fd); + break; } /* release generic resources */ if(buffer) - free(buffer); + free(buffer); res.ret_code = ret_code; return res; } @@ -404,20 +413,20 @@ pio_create_filename(iotype iot, const char *base_name, char *fullname, size_t si size_t i, j; if (!base_name || !fullname || size < 1) - return NULL; + return NULL; memset(fullname, 0, size); switch (iot) { - case POSIXIO: - suffix = ".posix"; - break; - case MPIO: - suffix = ".mpio"; - break; - case PHDF5: - suffix = ".h5"; - break; + case POSIXIO: + suffix = ".posix"; + break; + case MPIO: + suffix = ".mpio"; + break; + case PHDF5: + suffix = ".h5"; + break; } /* First use the environment variable and then try the constant */ @@ -425,118 +434,125 @@ pio_create_filename(iotype iot, const char *base_name, char *fullname, size_t si #ifdef HDF5_PARAPREFIX if (!prefix) - prefix = HDF5_PARAPREFIX; + prefix = HDF5_PARAPREFIX; #endif /* HDF5_PARAPREFIX */ /* Prepend the prefix value to the base name */ if (prefix && *prefix) { - /* If the prefix specifies the HDF5_PARAPREFIX directory, then - * default to using the "/tmp/$USER" or "/tmp/$LOGIN" - * directory instead. */ - register char *user, *login, *subdir; - - user = getenv("USER"); - login = getenv("LOGIN"); - subdir = (user ? user : login); - - if (subdir) { - for (i = 0; i < size && prefix[i]; i++) - fullname[i] = prefix[i]; - - fullname[i++] = '/'; - - for (j = 0; i < size && subdir[j]; i++, j++) - fullname[i] = subdir[j]; - } else { - /* We didn't append the prefix yet */ - strncpy(fullname, prefix, MIN(strlen(prefix), size)); - } - - if ((strlen(fullname) + strlen(base_name) + 1) < size) { - /* Append the base_name with a slash first. Multiple slashes are - * handled below. */ - h5_stat_t buf; - - if (HDstat(fullname, &buf) < 0) - /* The directory doesn't exist just yet */ - if (mkdir(fullname, (mode_t)0755) < 0 && errno != EEXIST) { - /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory. - * Default to PREFIX's original prefix value. */ - strcpy(fullname, prefix); - } - - strcat(fullname, "/"); - strcat(fullname, base_name); - } else { - /* Buffer is too small */ - return NULL; - } + /* If the prefix specifies the HDF5_PARAPREFIX directory, then + * default to using the "/tmp/$USER" or "/tmp/$LOGIN" + * directory instead. */ + register char *user, *login, *subdir; + + user = getenv("USER"); + login = getenv("LOGIN"); + subdir = (user ? user : login); + + if (subdir) { + for (i = 0; i < size && prefix[i]; i++) + fullname[i] = prefix[i]; + + fullname[i++] = '/'; + + for (j = 0; i < size && subdir[j]; i++, j++) + fullname[i] = subdir[j]; + } else { + /* We didn't append the prefix yet */ + strncpy(fullname, prefix, MIN(strlen(prefix), size)); + } + + if ((strlen(fullname) + strlen(base_name) + 1) < size) { + /* Append the base_name with a slash first. Multiple slashes are + * handled below. */ + h5_stat_t buf; + + if (HDstat(fullname, &buf) < 0) + /* The directory doesn't exist just yet */ + if (mkdir(fullname, (mode_t)0755) < 0 && errno != EEXIST) { + /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory. + * Default to PREFIX's original prefix value. */ + strcpy(fullname, prefix); + } + + strcat(fullname, "/"); + strcat(fullname, base_name); + } else { + /* Buffer is too small */ + return NULL; + } } else if (strlen(base_name) >= size) { - /* Buffer is too small */ - return NULL; + /* Buffer is too small */ + return NULL; } else { - strcpy(fullname, base_name); + strcpy(fullname, base_name); } /* Append a suffix */ if (suffix) { - if (strlen(fullname) + strlen(suffix) >= size) - return NULL; + if (strlen(fullname) + strlen(suffix) >= size) + return NULL; - strcat(fullname, suffix); + strcat(fullname, suffix); } /* Remove any double slashes in the filename */ for (ptr = fullname, i = j = 0; ptr && i < size; i++, ptr++) { - if (*ptr != '/' || last != '/') - fullname[j++] = *ptr; + if (*ptr != '/' || last != '/') + fullname[j++] = *ptr; - last = *ptr; + last = *ptr; } return fullname; } /* - * Function: do_write - * Purpose: Write the required amount of data to the file. - * Return: SUCCESS or FAIL - * Programmer: Albert Cheng, Bill Wendling, 2001/12/13 + * Function: do_write + * Purpose: Write the required amount of data to the file. + * Return: SUCCESS or FAIL + * Programmer: Albert Cheng, Bill Wendling, 2001/12/13 * Modifications: * Added 2D testing (Christian Chilan, 10. August 2005) */ static herr_t do_write(results *res, file_descr *fd, parameters *parms, long ndsets, - off_t nbytes, size_t buf_size, void *buffer) + off_t nbytes, size_t buf_size, void *buffer) { int ret_code = SUCCESS; int rc; /*routine return code */ long ndset; size_t blk_size; /* The block size to subdivide the xfer buffer into */ off_t nbytes_xfer; /* Total number of bytes transferred so far */ + size_t nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */ size_t nbytes_toxfer; /* Number of bytes to transfer a particular time */ char dname[64]; off_t dset_offset=0; /*dataset offset in a file */ off_t bytes_begin[2]; /*first elmt this process transfer */ off_t bytes_count; /*number of elmts this process transfer */ - off_t snbytes=0; /*size of a side of the dataset square */ + off_t snbytes=0; /*size of a side of the dataset square */ unsigned char *buf_p; /* Current buffer pointer */ /* POSIX variables */ off_t file_offset; /* File offset of the next transfer */ + off_t file_offset_advance; /* File offset advance after each I/O operation */ off_t posix_file_offset; /* Base file offset of the next transfer */ /* MPI variables */ - MPI_Offset mpi_file_offset;/* Base file offset of the next transfer*/ - MPI_Offset mpi_offset; /* Offset in MPI file */ - MPI_Datatype mpi_file_type; /* MPI derived type for 1D file */ - MPI_Datatype mpi_blk_type; /* MPI derived type for 1D buffer */ - MPI_Datatype mpi_cont_type; /* MPI derived type for 2D contiguous file */ - MPI_Datatype contig_cont; /* MPI derived type for 2D contiguous buffer */ - MPI_Datatype mpi_inter_type;/* MPI derived type for 2D interleaved file */ - MPI_Datatype contig_inter; /* MPI derived type for 2D interleaved buffer*/ - MPI_Status mpi_status; - int mrc; /* MPI return code */ + MPI_Offset mpi_file_offset; /* Base file offset of the next transfer*/ + MPI_Offset mpi_offset; /* Offset in MPI file */ + MPI_Offset mpi_offset_advance; /* Offset advance after each I/O operation */ + MPI_Datatype mpi_file_type; /* MPI derived type for 1D file */ + MPI_Datatype mpi_blk_type; /* MPI derived type for 1D buffer */ + MPI_Datatype mpi_cont_type; /* MPI derived type for 2D contiguous file */ + MPI_Datatype mpi_partial_buffer_cont; /* MPI derived type for partial 2D contiguous buffer */ + MPI_Datatype mpi_inter_type; /* MPI derived type for 2D interleaved file */ + MPI_Datatype mpi_partial_buffer_inter; /* MPI derived type for partial 2D interleaved buffer */ + MPI_Datatype mpi_full_buffer; /* MPI derived type for 2D full buffer */ + MPI_Datatype mpi_full_chunk; /* MPI derived type for 2D full chunk */ + MPI_Datatype mpi_chunk_inter_type; /* MPI derived type for 2D chunk interleaved file */ + MPI_Datatype mpi_collective_type; /* Generic MPI derived type for 2D collective access */ + MPI_Status mpi_status; + int mrc; /* MPI return code */ /* HDF5 variables */ herr_t hrc; /*HDF5 return code */ @@ -544,11 +560,11 @@ do_write(results *res, file_descr *fd, parameters *parms, long ndsets, hid_t h5dset_space_id = -1; /*dataset space ID */ hid_t h5mem_space_id = -1; /*memory dataspace ID */ hid_t h5ds_id = -1; /*dataset handle */ - hsize_t h5block[2]; /*dataspace selection */ - hsize_t h5stride[2]; - hsize_t h5count[2]; - hsize_t h5start[2]; - hssize_t h5offset[2]; /* Selection offset within dataspace */ + hsize_t h5block[2]; /*dataspace selection */ + hsize_t h5stride[2]; + hsize_t h5count[2]; + hsize_t h5start[2]; + hssize_t h5offset[2]; /* Selection offset within dataspace */ hid_t h5dcpl = -1; /* Dataset creation property list */ hid_t h5dxpl = -1; /* Dataset transfer property list */ @@ -566,41 +582,47 @@ do_write(results *res, file_descr *fd, parameters *parms, long ndsets, */ /* 1D dataspace */ - if (parms->dim2d==0){ - if (parms->interleaved==0) { - /* Contiguous Pattern: */ - bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g); - } /* end if */ - else { - /* Interleaved Pattern: */ - bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g); - } /* end else */ - /* Prepare buffer for verifying data */ - if (parms->verify) - memset(buffer,pio_mpi_rank_g+1,buf_size); + if (!parms->dim2d){ + /* Contiguous Pattern: */ + if (!parms->interleaved) { + bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g); + } /* end if */ + /* Interleaved Pattern: */ + else { + bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g); + } /* end else */ + + /* Prepare buffer for verifying data */ + if (parms->verify) + memset(buffer,pio_mpi_rank_g+1,buf_size); }/* end if */ /* 2D dataspace */ else { - snbytes = (off_t)sqrt(nbytes); - /* nbytes is always the number of bytes per dataset (1D or 2D). If the - dataspace is 2D, snbytes is the size of a side of the dataset square. - */ - if (parms->interleaved==0) { - /* Contiguous Pattern: */ - bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g); - bytes_begin[1] = 0; - } /* end if */ - else { - /* Interleaved Pattern: */ - bytes_begin[0] = 0; - bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g); - } /* end else */ - /* Prepare buffer for verifying data */ - if (parms->verify) - memset(buffer,pio_mpi_rank_g+1,buf_size*blk_size); - } + /* nbytes is always the number of bytes per dataset (1D or 2D). If the + dataspace is 2D, snbytes is the size of a side of the dataset square. + */ + snbytes = (off_t)sqrt(nbytes); + + /* Contiguous Pattern: */ + if (!parms->interleaved) { + bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g); + bytes_begin[1] = 0; + } /* end if */ + /* Interleaved Pattern: */ + else { + bytes_begin[0] = 0; + + if(!parms->h5_use_chunks || parms->io_type==PHDF5) + bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g); + else + bytes_begin[1] = (off_t)(blk_size*blk_size*pio_mpi_rank_g); + } /* end else */ + + /* Prepare buffer for verifying data */ + if (parms->verify) + memset(buffer,pio_mpi_rank_g+1,buf_size*blk_size); + } /* end else */ - /* end else */ /* Calculate the total number of bytes (bytes_count) to be * transferred by this process. It may be different for different @@ -613,798 +635,897 @@ do_write(results *res, file_descr *fd, parameters *parms, long ndsets, * (This is tricky, don't mess with the formula, rounding errors * can easily get introduced) */ bytes_count = (off_t)(((double)nbytes*(pio_mpi_rank_g+1)) / pio_mpi_nprocs_g) - - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g); + - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g); /* debug */ if (pio_debug_level >= 4) { - HDprint_rank(output); - HDfprintf(output, "Debug(do_write): " - "buf_size=%Hd, bytes_begin=%Hd, bytes_count=%Hd\n", - (long_long)buf_size, (long_long)bytes_begin, - (long_long)bytes_count); + HDprint_rank(output); + HDfprintf(output, "Debug(do_write): " + "buf_size=%Hd, bytes_begin=%Hd, bytes_count=%Hd\n", + (long_long)buf_size, (long_long)bytes_begin, + (long_long)bytes_count); } /* I/O Access specific setup */ switch (parms->io_type) { - case POSIXIO: - /* No extra setup */ - break; - - case MPIO: /* MPI-I/O setup */ - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Build block's derived type */ - mrc = MPI_Type_contiguous((int)blk_size, - MPI_BYTE, &mpi_blk_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Build file's derived type */ - mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, - (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Commit file type */ - mrc = MPI_Type_commit( &mpi_file_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - - /* Commit buffer type */ - mrc = MPI_Type_commit( &mpi_blk_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - } /* end if */ - /* 2D dataspace */ - else { - /* Build partial buffer derived type for contiguous access */ - mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE, - &contig_cont); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Build contiguous file's derived type */ - mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size), - contig_cont, &mpi_cont_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Commit contiguous file type */ - mrc = MPI_Type_commit(&mpi_cont_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - - /* Build partial buffer derived type for interleaved access */ - mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, - &contig_inter); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Build interleaved file's derived type */ - mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size), - contig_inter, &mpi_inter_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Commit interleaved file type */ - mrc = MPI_Type_commit(&mpi_inter_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - } /* end else */ - break; - - case PHDF5: /* HDF5 setup */ - /* 1D dataspace */ - if (parms->dim2d==0){ - if(nbytes>0) { - /* define a contiguous dataset of nbytes native bytes */ - h5dims[0] = nbytes; - h5dset_space_id = H5Screate_simple(1, h5dims, NULL); - VRFY((h5dset_space_id >= 0), "H5Screate_simple"); - - /* Set up the file dset space id to select the pattern to access */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5start[0] = bytes_begin[0]; - h5stride[0] = h5block[0] = blk_size; - h5count[0] = buf_size/blk_size; - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5start[0] = bytes_begin[0]; - h5stride[0] = blk_size*pio_mpi_nprocs_g; - h5block[0] = blk_size; - h5count[0] = buf_size/blk_size; - } /* end else */ - hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, - h5start, h5stride, h5count, h5block); - VRFY((hrc >= 0), "H5Sselect_hyperslab"); - } /* end if */ - else { - h5dset_space_id = H5Screate(H5S_SCALAR); - VRFY((h5dset_space_id >= 0), "H5Screate"); - } /* end else */ - - /* Create the memory dataspace that corresponds to the xfer buffer */ - if(buf_size>0) { - h5dims[0] = buf_size; - h5mem_space_id = H5Screate_simple(1, h5dims, NULL); - VRFY((h5mem_space_id >= 0), "H5Screate_simple"); - } /* end if */ - else { - h5mem_space_id = H5Screate(H5S_SCALAR); - VRFY((h5mem_space_id >= 0), "H5Screate"); - } /* end else */ - } /* end if */ - /* 2D dataspace */ - else { - if(nbytes>0) { - /* define a contiguous dataset of nbytes native bytes */ - h5dims[0] = snbytes; - h5dims[1] = snbytes; - h5dset_space_id = H5Screate_simple(2, h5dims, NULL); - VRFY((h5dset_space_id >= 0), "H5Screate_simple"); - - /* Set up the file dset space id to select the pattern to access */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5start[0] = bytes_begin[0]; - h5start[1] = bytes_begin[1]; - h5stride[0] = 1; - h5stride[1] = h5block[0] = h5block[1] = blk_size; - h5count[0] = 1; - h5count[1] = buf_size/blk_size; - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5start[0] = bytes_begin[0]; - h5start[1] = bytes_begin[1]; - h5stride[0] = blk_size; - h5stride[1] = blk_size*pio_mpi_nprocs_g; - h5block[0] = h5block[1] = blk_size; - h5count[0] = buf_size/blk_size; - h5count[1] = 1; - } /* end else */ - hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, - h5start, h5stride, h5count, h5block); - VRFY((hrc >= 0), "H5Sselect_hyperslab"); - } /* end if */ - else { - h5dset_space_id = H5Screate(H5S_SCALAR); - VRFY((h5dset_space_id >= 0), "H5Screate"); - } /* end else */ - - /* Create the memory dataspace that corresponds to the xfer buffer */ - if(buf_size>0) { - if (parms->interleaved==0){ - h5dims[0] = blk_size; - h5dims[1] = buf_size; - }else{ - h5dims[0] = buf_size; - h5dims[1] = blk_size; - } - h5mem_space_id = H5Screate_simple(2, h5dims, NULL); - VRFY((h5mem_space_id >= 0), "H5Screate_simple"); - } /* end if */ - else { - h5mem_space_id = H5Screate(H5S_SCALAR); - VRFY((h5mem_space_id >= 0), "H5Screate"); - } /* end else */ - } /* end else */ - - /* Create the dataset transfer property list */ - h5dxpl = H5Pcreate(H5P_DATASET_XFER); - if (h5dxpl < 0) { - fprintf(stderr, "HDF5 Property List Create failed\n"); - GOTOERROR(FAIL); - } - - /* Change to collective I/O, if asked */ - if(parms->collective) { - hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE); - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Set failed\n"); - GOTOERROR(FAIL); - } /* end if */ - } /* end if */ - break; + case POSIXIO: + /* No extra setup */ + break; + + case MPIO: /* MPI-I/O setup */ + /* 1D dataspace */ + if (!parms->dim2d){ + /* Build block's derived type */ + mrc = MPI_Type_contiguous((int)blk_size, + MPI_BYTE, &mpi_blk_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Build file's derived type */ + mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, + (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit file type */ + mrc = MPI_Type_commit( &mpi_file_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Commit buffer type */ + mrc = MPI_Type_commit( &mpi_blk_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + } /* end if */ + /* 2D dataspace */ + else { + /* Build partial buffer derived type for contiguous access */ + + mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE, + &mpi_partial_buffer_cont); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit partial buffer derived type */ + mrc = MPI_Type_commit(&mpi_partial_buffer_cont); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build contiguous file's derived type */ + mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size), + mpi_partial_buffer_cont, &mpi_cont_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit contiguous file type */ + mrc = MPI_Type_commit(&mpi_cont_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build partial buffer derived type for interleaved access */ + mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, + &mpi_partial_buffer_inter); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit partial buffer derived type */ + mrc = MPI_Type_commit(&mpi_partial_buffer_inter); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build interleaved file's derived type */ + mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size), + mpi_partial_buffer_inter, &mpi_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit interleaved file type */ + mrc = MPI_Type_commit(&mpi_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build full buffer derived type */ + mrc = MPI_Type_contiguous((int)(blk_size*buf_size), MPI_BYTE, + &mpi_full_buffer); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit full buffer derived type */ + mrc = MPI_Type_commit(&mpi_full_buffer); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build full chunk derived type */ + mrc = MPI_Type_contiguous((int)(blk_size*blk_size), MPI_BYTE, + &mpi_full_chunk); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit full chunk derived type */ + mrc = MPI_Type_commit(&mpi_full_chunk); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build chunk interleaved file's derived type */ + mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, (int)(snbytes/blk_size), + mpi_full_chunk, &mpi_chunk_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit chunk interleaved file type */ + mrc = MPI_Type_commit(&mpi_chunk_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + } /* end else */ + break; + + case PHDF5: /* HDF5 setup */ + /* 1D dataspace */ + if (!parms->dim2d){ + if(nbytes>0) { + /* define a contiguous dataset of nbytes native bytes */ + h5dims[0] = nbytes; + h5dset_space_id = H5Screate_simple(1, h5dims, NULL); + VRFY((h5dset_space_id >= 0), "H5Screate_simple"); + + /* Set up the file dset space id to select the pattern to access */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5start[0] = bytes_begin[0]; + h5stride[0] = h5block[0] = blk_size; + h5count[0] = buf_size/blk_size; + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5start[0] = bytes_begin[0]; + h5stride[0] = blk_size*pio_mpi_nprocs_g; + h5block[0] = blk_size; + h5count[0] = buf_size/blk_size; + } /* end else */ + hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, + h5start, h5stride, h5count, h5block); + VRFY((hrc >= 0), "H5Sselect_hyperslab"); + } /* end if */ + else { + h5dset_space_id = H5Screate(H5S_SCALAR); + VRFY((h5dset_space_id >= 0), "H5Screate"); + } /* end else */ + + /* Create the memory dataspace that corresponds to the xfer buffer */ + if(buf_size>0) { + h5dims[0] = buf_size; + h5mem_space_id = H5Screate_simple(1, h5dims, NULL); + VRFY((h5mem_space_id >= 0), "H5Screate_simple"); + } /* end if */ + else { + h5mem_space_id = H5Screate(H5S_SCALAR); + VRFY((h5mem_space_id >= 0), "H5Screate"); + } /* end else */ + } /* end if */ + /* 2D dataspace */ + else { + if(nbytes>0) { + /* define a contiguous dataset of nbytes native bytes */ + h5dims[0] = snbytes; + h5dims[1] = snbytes; + h5dset_space_id = H5Screate_simple(2, h5dims, NULL); + VRFY((h5dset_space_id >= 0), "H5Screate_simple"); + + /* Set up the file dset space id to select the pattern to access */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5start[0] = bytes_begin[0]; + h5start[1] = bytes_begin[1]; + h5stride[0] = 1; + h5stride[1] = h5block[0] = h5block[1] = blk_size; + h5count[0] = 1; + h5count[1] = buf_size/blk_size; + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5start[0] = bytes_begin[0]; + h5start[1] = bytes_begin[1]; + h5stride[0] = blk_size; + h5stride[1] = blk_size*pio_mpi_nprocs_g; + h5block[0] = h5block[1] = blk_size; + h5count[0] = buf_size/blk_size; + h5count[1] = 1; + } /* end else */ + hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, + h5start, h5stride, h5count, h5block); + VRFY((hrc >= 0), "H5Sselect_hyperslab"); + } /* end if */ + else { + h5dset_space_id = H5Screate(H5S_SCALAR); + VRFY((h5dset_space_id >= 0), "H5Screate"); + } /* end else */ + + /* Create the memory dataspace that corresponds to the xfer buffer */ + if(buf_size>0) { + if (!parms->interleaved){ + h5dims[0] = blk_size; + h5dims[1] = buf_size; + }else{ + h5dims[0] = buf_size; + h5dims[1] = blk_size; + } + h5mem_space_id = H5Screate_simple(2, h5dims, NULL); + VRFY((h5mem_space_id >= 0), "H5Screate_simple"); + } /* end if */ + else { + h5mem_space_id = H5Screate(H5S_SCALAR); + VRFY((h5mem_space_id >= 0), "H5Screate"); + } /* end else */ + } /* end else */ + + /* Create the dataset transfer property list */ + h5dxpl = H5Pcreate(H5P_DATASET_XFER); + if (h5dxpl < 0) { + fprintf(stderr, "HDF5 Property List Create failed\n"); + GOTOERROR(FAIL); + } + + /* Change to collective I/O, if asked */ + if(parms->collective) { + hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE); + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Set failed\n"); + GOTOERROR(FAIL); + } /* end if */ + } /* end if */ + break; } /* end switch */ for (ndset = 1; ndset <= ndsets; ++ndset) { - /* Calculate dataset offset within a file */ - - /* create dataset */ - switch (parms->io_type) { - case POSIXIO: - case MPIO: - /* both posix and mpi io just need dataset offset in file*/ - dset_offset = (ndset - 1) * nbytes; - break; - - case PHDF5: - h5dcpl = H5Pcreate(H5P_DATASET_CREATE); - if (h5dcpl < 0) { - fprintf(stderr, "HDF5 Property List Create failed\n"); - GOTOERROR(FAIL); - } - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Make the dataset chunked if asked */ - if(parms->h5_use_chunks) { - /* Set the chunk size to be the same as the buffer size */ - h5dims[0] = blk_size; - hrc = H5Pset_chunk(h5dcpl, 1, h5dims); - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Set failed\n"); - GOTOERROR(FAIL); - } /* end if */ - } /* end if */ - }/* end if */ - else{ - /* 2D dataspace */ - if(parms->h5_use_chunks) { - /* Set the chunk size to be the same as the block size */ - h5dims[0] = blk_size; - h5dims[1] = blk_size; - hrc = H5Pset_chunk(h5dcpl, 2, h5dims); - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Set failed\n"); - GOTOERROR(FAIL); - } /* end if */ - } /* end if */ - }/* end else */ - - sprintf(dname, "Dataset_%ld", ndset); - h5ds_id = H5Dcreate2(fd->h5fd, dname, ELMT_H5_TYPE, - h5dset_space_id, H5P_DEFAULT, h5dcpl, H5P_DEFAULT); - - if(h5ds_id < 0) { - fprintf(stderr, "HDF5 Dataset Create failed\n"); - GOTOERROR(FAIL); - } - - hrc = H5Pclose(h5dcpl); - /* verifying the close of the dcpl */ - if(hrc < 0) { - fprintf(stderr, "HDF5 Property List Close failed\n"); - GOTOERROR(FAIL); - } - - break; - } - - /* The task is to transfer bytes_count bytes, starting at - * bytes_begin position, using transfer buffer of buf_size bytes. - * If interleaved, select buf_size at a time, in round robin - * fashion, according to number of process. Otherwise, select - * all bytes_count in contiguous. - */ - nbytes_xfer = 0 ; - - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Set base file offset for all I/O patterns and POSIX access */ - posix_file_offset = dset_offset + bytes_begin[0]; - - /* Set base file offset for all I/O patterns and MPI access */ - mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]); - } /* end if */ - else { - /* Set base file offset for all I/O patterns and POSIX access */ - posix_file_offset=dset_offset + bytes_begin[0]*snbytes+ - bytes_begin[1]; - - /* Set base file offset for all I/O patterns and MPI access */ - mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+ - bytes_begin[1]); - } /* end else */ - - /* Start "raw data" write timer */ - set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, START); - - while (nbytes_xfer < bytes_count){ - /* Write */ - /* Calculate offset of write within a dataset/file */ - switch (parms->io_type) { - case POSIXIO: - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Contiguous pattern */ - if (parms->interleaved==0) { - /* Compute file offset */ - file_offset = posix_file_offset + (off_t)nbytes_xfer; - - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are written */ - rc = ((ssize_t)buf_size == - POSIXWRITE(fd->posixfd, buffer, buf_size)); - VRFY((rc != 0), "POSIXWRITE"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end if */ - /* Interleaved access pattern */ - else { - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size; - - /* Loop over the buffers to write */ - while(nbytes_toxfer>0) { - /* Skip offset over blocks of other processes */ - file_offset = posix_file_offset + - (off_t)(nbytes_xfer*pio_mpi_nprocs_g); - - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are written */ - rc = ((ssize_t)blk_size == - POSIXWRITE(fd->posixfd, buf_p, blk_size)); - VRFY((rc != 0), "POSIXWRITE"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - } /* end while */ - } /* end else */ - } /* end if */ - /* 2D dataspace */ - else { - /* Contiguous pattern */ - if (parms->interleaved==0){ - /* Set the base of user's buffer */ - buf_p = (unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size*blk_size; - - /* Compute file offset */ - file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size)/(snbytes))* - (blk_size*snbytes)+((nbytes_xfer/blk_size)%(snbytes))); - - /* Loop over portions of the buffer to write */ - while(nbytes_toxfer>0){ - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are written */ - rc = ((ssize_t)buf_size == - POSIXWRITE(fd->posixfd, buffer, buf_size)); - VRFY((rc != 0), "POSIXWRITE"); - - /* Advance location in buffer */ - buf_p+=buf_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=buf_size; - - /* Partially advance file offset */ - file_offset+=(off_t)(snbytes); - } /* end while */ - } /* end if */ - /* Interleaved access pattern */ - else{ - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer=buf_size*blk_size; - - /* Compute file offset */ - file_offset=posix_file_offset+(off_t)(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/(snbytes)* - (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%(snbytes)); - - /* Loop over portions of the buffer to write */ - while(nbytes_toxfer>0){ - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are written */ - rc = ((ssize_t)blk_size == - POSIXWRITE(fd->posixfd, buffer, blk_size)); - VRFY((rc != 0), "POSIXWRITE"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - - /* Partially advance file offset */ - file_offset+=(off_t)(snbytes); - } /* end while */ - }/* end else */ - } /* end else */ - break; - - case MPIO: - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Independent file access */ - if(parms->collective==0) { - /* Contiguous pattern */ - if (parms->interleaved==0){ - /* Compute offset in file */ - mpi_offset = mpi_file_offset + - nbytes_xfer; - - /* Perform independent write */ - mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buffer, - (int)(buf_size/blk_size), mpi_blk_type, - &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end if */ - /* Interleaved access pattern */ - else { - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size; - - /* Loop over the buffers to write */ - while(nbytes_toxfer>0) { - /* Skip offset over blocks of other processes */ - mpi_offset = mpi_file_offset + - (nbytes_xfer*pio_mpi_nprocs_g); - - /* Perform independent write */ - mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p, - (int)1, mpi_blk_type, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - } /* end while */ - } /* end else */ - } /* end if */ - /* Collective file access */ - else { - /* Contiguous access pattern */ - if (parms->interleaved==0){ - /* Compute offset in file */ - mpi_offset = mpi_file_offset + - nbytes_xfer; - - /* Perform independent write */ - mrc = MPI_File_write_at_all(fd->mpifd, mpi_offset, buffer, - (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end if */ - /* Interleaved access pattern */ - else { - /* Compute offset in file */ - mpi_offset = mpi_file_offset + - (nbytes_xfer*pio_mpi_nprocs_g); - - /* Set the file view */ - mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type, - mpi_file_type, (char*)"native", h5_io_info_g); - VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); - - /* Perform write */ - mrc = MPI_File_write_at_all(fd->mpifd, 0, buffer, - (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end else */ - } /* end else */ - } /* end if */ - /* 2D dataspace */ - else { - /* Independent file access */ - if (parms->collective==0) - /* Contiguous pattern */ - if (parms->interleaved==0){ - /* Set the base of user's buffer */ - buf_p = (unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size*blk_size; - - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/(snbytes))* - (blk_size*snbytes)+((nbytes_xfer/blk_size)%(snbytes)); - - /* Loop over portions of the buffer to write */ - while(nbytes_toxfer>0){ - - /* Perform independent write */ - mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p, (int)buf_size, MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - /* Advance location in buffer */ - buf_p+=buf_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=buf_size; - - /* Partially advance global offset in dataset */ - mpi_offset+=snbytes; - } /* end while */ - } /* end if */ - /* Interleaved access pattern */ - else{ - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer=buf_size*blk_size; - - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/(snbytes)* - (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%(snbytes); - - /* Loop over portions of the buffer to write */ - while(nbytes_toxfer>0){ - /* Perform independent write */ - mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p, (int)blk_size, MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - - /* Partially advance global offset in dataset */ - mpi_offset+=snbytes; - } /* end while */ - } /* end else */ - /* end if */ - /* Collective file access */ - else - /* Contiguous access pattern */ - if (parms->interleaved==0){ - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/(snbytes))* - (blk_size*snbytes)+((nbytes_xfer/blk_size)%(snbytes)); - - /* Set the file view */ - mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, mpi_cont_type, (char *)"native", h5_io_info_g); - VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); - - /* Perform write */ - MPI_File_write_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size),MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - nbytes_xfer+=buf_size*blk_size; - } /* end if */ - /* Interleaved access pattern */ - else{ - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/(snbytes)* - (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%(snbytes); - - /* Set the file view */ - mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, mpi_inter_type, (char *)"native", h5_io_info_g); - VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); - - /* Perform write */ - MPI_File_write_at_all(fd->mpifd, 0, buffer, (int)(buf_size*blk_size), MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); - - nbytes_xfer+=buf_size*blk_size; - } /* end else */ - /* end else */ - } /* end else */ - break; - - case PHDF5: - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Set up the file dset space id to move the selection to process */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5offset[0] = nbytes_xfer; - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g); - } /* end else */ - hrc = H5Soffset_simple(h5dset_space_id, h5offset); - VRFY((hrc >= 0), "H5Soffset_simple"); - - /* Write the buffer out */ - hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, - h5dset_space_id, h5dxpl, buffer); - VRFY((hrc >= 0), "H5Dwrite"); - - /* Increment number of bytes transferred */ - nbytes_xfer += buf_size; - } /* end if */ - /* 2D dataspace */ - else { - /* Set up the file dset space id to move the selection to process */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size; - h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size; - - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size; - h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size; - - } /* end else */ - hrc = H5Soffset_simple(h5dset_space_id, h5offset); - VRFY((hrc >= 0), "H5Soffset_simple"); - - /* Write the buffer out */ - hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, - h5dset_space_id, h5dxpl, buffer); - VRFY((hrc >= 0), "H5Dwrite"); - - /* Increment number of bytes transferred */ - nbytes_xfer += buf_size*blk_size; - - } /* end else */ - - break; - } /* switch (parms->io_type) */ - } /* end while */ - - /* Stop "raw data" write timer */ - set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, STOP); - - /* Calculate write time */ - - /* Close dataset. Only HDF5 needs to do an explicit close. */ - if (parms->io_type == PHDF5) { - hrc = H5Dclose(h5ds_id); - - if (hrc < 0) { - fprintf(stderr, "HDF5 Dataset Close failed\n"); - GOTOERROR(FAIL); - } - - h5ds_id = -1; - } /* end if */ + /* Calculate dataset offset within a file */ + + /* create dataset */ + switch (parms->io_type) { + case POSIXIO: + case MPIO: + /* both posix and mpi io just need dataset offset in file*/ + dset_offset = (ndset - 1) * nbytes; + break; + + case PHDF5: + h5dcpl = H5Pcreate(H5P_DATASET_CREATE); + if (h5dcpl < 0) { + fprintf(stderr, "HDF5 Property List Create failed\n"); + GOTOERROR(FAIL); + } + /* 1D dataspace */ + if (!parms->dim2d){ + /* Make the dataset chunked if asked */ + if(parms->h5_use_chunks) { + /* Set the chunk size to be the same as the buffer size */ + h5dims[0] = blk_size; + hrc = H5Pset_chunk(h5dcpl, 1, h5dims); + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Set failed\n"); + GOTOERROR(FAIL); + } /* end if */ + } /* end if */ + }/* end if */ + else{ + /* 2D dataspace */ + if(parms->h5_use_chunks) { + /* Set the chunk size to be the same as the block size */ + h5dims[0] = blk_size; + h5dims[1] = blk_size; + hrc = H5Pset_chunk(h5dcpl, 2, h5dims); + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Set failed\n"); + GOTOERROR(FAIL); + } /* end if */ + } /* end if */ + }/* end else */ + + sprintf(dname, "Dataset_%ld", ndset); + h5ds_id = H5Dcreate2(fd->h5fd, dname, ELMT_H5_TYPE, + h5dset_space_id, H5P_DEFAULT, h5dcpl, H5P_DEFAULT); + + if (h5ds_id < 0) { + fprintf(stderr, "HDF5 Dataset Create failed\n"); + GOTOERROR(FAIL); + } + + hrc = H5Pclose(h5dcpl); + /* verifying the close of the dcpl */ + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Close failed\n"); + GOTOERROR(FAIL); + } + + break; + } + + /* The task is to transfer bytes_count bytes, starting at + * bytes_begin position, using transfer buffer of buf_size bytes. + * If interleaved, select buf_size at a time, in round robin + * fashion, according to number of process. Otherwise, select + * all bytes_count in contiguous. + */ + nbytes_xfer = 0 ; + + /* 1D dataspace */ + if (!parms->dim2d){ + /* Set base file offset for all I/O patterns and POSIX access */ + posix_file_offset = dset_offset + bytes_begin[0]; + + /* Set base file offset for all I/O patterns and MPI access */ + mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]); + } /* end if */ + else { + /* Set base file offset for all I/O patterns and POSIX access */ + posix_file_offset=dset_offset + bytes_begin[0]*snbytes+ + bytes_begin[1]; + + /* Set base file offset for all I/O patterns and MPI access */ + mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+ + bytes_begin[1]); + } /* end else */ + + /* Start "raw data" write timer */ + set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, START); + + while (nbytes_xfer < bytes_count){ + /* Write */ + /* Calculate offset of write within a dataset/file */ + switch (parms->io_type) { + case POSIXIO: + /* 1D dataspace */ + if (!parms->dim2d){ + /* Contiguous pattern */ + if (!parms->interleaved) { + /* Compute file offset */ + file_offset = posix_file_offset + (off_t)nbytes_xfer; + + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + + /* check if all bytes are written */ + rc = ((ssize_t)buf_size == + POSIXWRITE(fd->posixfd, buffer, buf_size)); + VRFY((rc != 0), "POSIXWRITE"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Set the base of user's buffer */ + buf_p=(unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size; + + /* Loop over the buffers to write */ + while(nbytes_toxfer>0) { + /* Skip offset over blocks of other processes */ + file_offset = posix_file_offset + + (off_t)(nbytes_xfer*pio_mpi_nprocs_g); + + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + + /* check if all bytes are written */ + rc = ((ssize_t)blk_size == + POSIXWRITE(fd->posixfd, buf_p, blk_size)); + VRFY((rc != 0), "POSIXWRITE"); + + /* Advance location in buffer */ + buf_p+=blk_size; + + /* Advance global offset in dataset */ + nbytes_xfer+=blk_size; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=blk_size; + } /* end while */ + } /* end else */ + } /* end if */ + /* 2D dataspace */ + else { + /* Contiguous storage */ + if (!parms->h5_use_chunks) { + /* Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute file offset */ + file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size) + /snbytes)*(blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes)); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = buf_size; + + /* Global offset advance after each I/O operation */ + file_offset_advance = (off_t)snbytes; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Compute file offset */ + file_offset=posix_file_offset+(off_t)((((nbytes_xfer/buf_size) + *pio_mpi_nprocs_g)/snbytes)*(buf_size*snbytes) + +((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size; + + /* Global offset advance after each I/O operation */ + file_offset_advance = (off_t)snbytes; + } /* end else */ + } /* end if */ + /* Chunked storage */ + else { + /*Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute file offset */ + file_offset=posix_file_offset+(off_t)nbytes_xfer; + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * buf_size; + + /* Global offset advance after each I/O operation */ + file_offset_advance = 0; + } /* end if */ + /*Interleaved access pattern */ + else { + /* Compute file offset */ + /* Before simplification */ + /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size + *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size)) + *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */ + + file_offset=posix_file_offset+(off_t)(((nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)+((nbytes_xfer/(buf_size/blk_size)) + *pio_mpi_nprocs_g)%(snbytes*blk_size)); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * blk_size; + + /* Global offset advance after each I/O operation */ + /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */ + file_offset_advance = (off_t)(snbytes*blk_size); + } /* end else */ + } /* end else */ + + /* Common code for file access */ + + /* Set the base of user's buffer */ + buf_p = (unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size*blk_size; + + /* Loop over portions of the buffer to write */ + while(nbytes_toxfer>0){ + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + + /* check if all bytes are written */ + rc = ((ssize_t)nbytes_xfer_advance == + POSIXWRITE(fd->posixfd, buf_p, nbytes_xfer_advance)); + VRFY((rc != 0), "POSIXWRITE"); + + /* Advance location in buffer */ + buf_p+=nbytes_xfer_advance; + + /* Advance global offset in dataset */ + nbytes_xfer+=nbytes_xfer_advance; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=nbytes_xfer_advance; + + /* Partially advance file offset */ + file_offset+=file_offset_advance; + } /* end while */ + + } /* end else */ + + break; + + case MPIO: + /* 1D dataspace */ + if (!parms->dim2d){ + /* Independent file access */ + if(!parms->collective) { + /* Contiguous pattern */ + if (!parms->interleaved){ + /* Compute offset in file */ + mpi_offset = mpi_file_offset + + nbytes_xfer; + + /* Perform independent write */ + mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buffer, + (int)(buf_size/blk_size), mpi_blk_type, + &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Set the base of user's buffer */ + buf_p=(unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size; + + /* Loop over the buffers to write */ + while(nbytes_toxfer>0) { + /* Skip offset over blocks of other processes */ + mpi_offset = mpi_file_offset + + (nbytes_xfer*pio_mpi_nprocs_g); + + /* Perform independent write */ + mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p, + (int)1, mpi_blk_type, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); + + /* Advance location in buffer */ + buf_p+=blk_size; + + /* Advance global offset in dataset */ + nbytes_xfer+=blk_size; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=blk_size; + } /* end while */ + } /* end else */ + } /* end if */ + /* Collective file access */ + else { + /* Contiguous access pattern */ + if (!parms->interleaved){ + /* Compute offset in file */ + mpi_offset = mpi_file_offset + + nbytes_xfer; + + /* Perform independent write */ + mrc = MPI_File_write_at_all(fd->mpifd, mpi_offset, buffer, + (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Compute offset in file */ + mpi_offset = mpi_file_offset + + (nbytes_xfer*pio_mpi_nprocs_g); + + /* Set the file view */ + mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type, + mpi_file_type, (char*)"native", h5_io_info_g); + VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); + + /* Perform write */ + mrc = MPI_File_write_at_all(fd->mpifd, 0, buffer, + (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end else */ + } /* end else */ + } /* end if */ + /* 2D dataspace */ + else { + /* Contiguous storage */ + if (!parms->h5_use_chunks) { + /* Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute offset in file */ + mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/snbytes)* + (blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = buf_size; + + /* Global offset advance after each I/O operation */ + mpi_offset_advance = snbytes; + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_cont_type; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Compute offset in file */ + mpi_offset=mpi_file_offset+(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/snbytes)* + (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes; + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size; + + /* Global offset advance after each I/O operation */ + mpi_offset_advance = snbytes; + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_inter_type; + } /* end else */ + } /* end if */ + /* Chunked storage */ + else { + /*Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute offset in file */ + mpi_offset=mpi_file_offset+nbytes_xfer; + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * buf_size; + + /* Global offset advance after each I/O operation */ + mpi_offset_advance = 0; + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_full_buffer; + } /* end if */ + /*Interleaved access pattern */ + else { + /* Compute offset in file */ + /* Before simplification */ + /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))* + (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+ + ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes + /blk_size*(blk_size*blk_size)); */ + mpi_offset=mpi_file_offset+((nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes) + +((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes*blk_size); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * blk_size; + + /* Global offset advance after each I/O operation */ + /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */ + mpi_offset_advance = (MPI_Offset)(snbytes*blk_size); + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_chunk_inter_type; + } /* end else */ + } /* end else */ + + /* Common code for independent file access */ + if (!parms->collective) { + /* Set the base of user's buffer */ + buf_p = (unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size * blk_size; + + /* Loop over portions of the buffer to write */ + while(nbytes_toxfer>0){ + /* Perform independent write */ + mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p, + (int)nbytes_xfer_advance, MPI_BYTE, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); + + /* Advance location in buffer */ + buf_p+=nbytes_xfer_advance; + + /* Advance global offset in dataset */ + nbytes_xfer+=nbytes_xfer_advance; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=nbytes_xfer_advance; + + /* Partially advance global offset in dataset */ + mpi_offset+=mpi_offset_advance; + } /* end while */ + } /* end if */ + + /* Common code for collective file access */ + else { + /* Set the file view */ + mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, + mpi_collective_type, (char *)"native", h5_io_info_g); + VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); + + /* Perform write */ + MPI_File_write_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size), + MPI_BYTE, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size*blk_size; + } /* end else */ + + } /* end else */ + + break; + + case PHDF5: + /* 1D dataspace */ + if (!parms->dim2d){ + /* Set up the file dset space id to move the selection to process */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5offset[0] = nbytes_xfer; + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g); + } /* end else */ + hrc = H5Soffset_simple(h5dset_space_id, h5offset); + VRFY((hrc >= 0), "H5Soffset_simple"); + + /* Write the buffer out */ + hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, + h5dset_space_id, h5dxpl, buffer); + VRFY((hrc >= 0), "H5Dwrite"); + + /* Increment number of bytes transferred */ + nbytes_xfer += buf_size; + } /* end if */ + /* 2D dataspace */ + else { + /* Set up the file dset space id to move the selection to process */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size; + h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size; + + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size; + h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size; + + } /* end else */ + hrc = H5Soffset_simple(h5dset_space_id, h5offset); + VRFY((hrc >= 0), "H5Soffset_simple"); + + /* Write the buffer out */ + hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, + h5dset_space_id, h5dxpl, buffer); + VRFY((hrc >= 0), "H5Dwrite"); + + /* Increment number of bytes transferred */ + nbytes_xfer += buf_size*blk_size; + + } /* end else */ + + break; + } /* switch (parms->io_type) */ + } /* end while */ + + /* Stop "raw data" write timer */ + set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, STOP); + + /* Calculate write time */ + + /* Close dataset. Only HDF5 needs to do an explicit close. */ + if (parms->io_type == PHDF5) { + hrc = H5Dclose(h5ds_id); + + if (hrc < 0) { + fprintf(stderr, "HDF5 Dataset Close failed\n"); + GOTOERROR(FAIL); + } + + h5ds_id = -1; + } /* end if */ } /* end for */ done: /* release MPI-I/O objects */ if (parms->io_type == MPIO) { - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Free file type */ - mrc = MPI_Type_free( &mpi_file_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free buffer type */ - mrc = MPI_Type_free( &mpi_blk_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - } /* end if */ - /* 2D dataspace */ - else { - /* Free file type */ - mrc = MPI_Type_free( &mpi_cont_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free partial buffer type */ - mrc = MPI_Type_free( &contig_cont ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free file type */ - mrc = MPI_Type_free( &mpi_inter_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free partial buffer type */ - mrc = MPI_Type_free( &contig_inter ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - } /* end else */ + /* 1D dataspace */ + if (!parms->dim2d){ + /* Free file type */ + mrc = MPI_Type_free( &mpi_file_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free buffer type */ + mrc = MPI_Type_free( &mpi_blk_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + } /* end if */ + /* 2D dataspace */ + else { + /* Free partial buffer type for contiguous access */ + mrc = MPI_Type_free( &mpi_partial_buffer_cont ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free contiguous file type */ + mrc = MPI_Type_free( &mpi_cont_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free partial buffer type for interleaved access */ + mrc = MPI_Type_free( &mpi_partial_buffer_inter ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free interleaved file type */ + mrc = MPI_Type_free( &mpi_inter_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free full buffer type */ + mrc = MPI_Type_free(&mpi_full_buffer); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free full chunk type */ + mrc = MPI_Type_free(&mpi_full_chunk); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free chunk interleaved file type */ + mrc = MPI_Type_free(&mpi_chunk_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + } /* end else */ } /* end if */ /* release HDF5 objects */ if (h5dset_space_id != -1) { - hrc = H5Sclose(h5dset_space_id); - if (hrc < 0){ - fprintf(stderr, "HDF5 Dataset Space Close failed\n"); - ret_code = FAIL; - } else { - h5dset_space_id = -1; - } + hrc = H5Sclose(h5dset_space_id); + if (hrc < 0){ + fprintf(stderr, "HDF5 Dataset Space Close failed\n"); + ret_code = FAIL; + } else { + h5dset_space_id = -1; + } } if (h5mem_space_id != -1) { - hrc = H5Sclose(h5mem_space_id); - if (hrc < 0) { - fprintf(stderr, "HDF5 Memory Space Close failed\n"); - ret_code = FAIL; - } else { - h5mem_space_id = -1; - } + hrc = H5Sclose(h5mem_space_id); + if (hrc < 0) { + fprintf(stderr, "HDF5 Memory Space Close failed\n"); + ret_code = FAIL; + } else { + h5mem_space_id = -1; + } } if (h5dxpl != -1) { - hrc = H5Pclose(h5dxpl); - if (hrc < 0) { - fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n"); - ret_code = FAIL; - } else { - h5dxpl = -1; - } + hrc = H5Pclose(h5dxpl); + if (hrc < 0) { + fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n"); + ret_code = FAIL; + } else { + h5dxpl = -1; + } } return ret_code; } /* - * Function: do_read - * Purpose: read the required amount of data from the file. - * Return: SUCCESS or FAIL - * Programmer: Albert Cheng 2001/12/13 + * Function: do_read + * Purpose: read the required amount of data from the file. + * Return: SUCCESS or FAIL + * Programmer: Albert Cheng 2001/12/13 * Modifications: * Added 2D testing (Christian Chilan, 10. August 2005) */ static herr_t do_read(results *res, file_descr *fd, parameters *parms, long ndsets, - off_t nbytes, size_t buf_size, void *buffer /*out*/) + off_t nbytes, size_t buf_size, void *buffer /*out*/) { int ret_code = SUCCESS; int rc; /*routine return code */ long ndset; size_t blk_size; /* The block size to subdivide the xfer buffer into */ - size_t bsize; + size_t bsize; /* Size of the actual buffer */ off_t nbytes_xfer; /* Total number of bytes transferred so far */ + size_t nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */ size_t nbytes_toxfer; /* Number of bytes to transfer a particular time */ char dname[64]; off_t dset_offset=0; /*dataset offset in a file */ off_t bytes_begin[2]; /*first elmt this process transfer */ off_t bytes_count; /*number of elmts this process transfer */ - off_t snbytes=0; /*size of a side of the dataset square */ + off_t snbytes=0; /*size of a side of the dataset square */ unsigned char *buf_p; /* Current buffer pointer */ /* POSIX variables */ off_t file_offset; /* File offset of the next transfer */ + off_t file_offset_advance; /* File offset advance after each I/O operation */ off_t posix_file_offset; /* Base file offset of the next transfer */ /* MPI variables */ MPI_Offset mpi_file_offset;/* Base file offset of the next transfer*/ - MPI_Offset mpi_offset; /* Offset in MPI file */ + MPI_Offset mpi_offset; /* Offset in MPI file */ + MPI_Offset mpi_offset_advance; /* Offset advance after each I/O operation */ MPI_Datatype mpi_file_type; /* MPI derived type for 1D file */ MPI_Datatype mpi_blk_type; /* MPI derived type for 1D buffer */ MPI_Datatype mpi_cont_type; /* MPI derived type for 2D contiguous file */ - MPI_Datatype contig_cont; /* MPI derived type for 2D contiguous buffer */ - MPI_Datatype mpi_inter_type;/* MPI derived type for 2D interleaved file */ - MPI_Datatype contig_inter; /* MPI derived type for 2D interleaved buffer*/ - MPI_Status mpi_status; + MPI_Datatype mpi_partial_buffer_cont; /* MPI derived type for partial 2D contiguous buffer */ + MPI_Datatype mpi_inter_type; /* MPI derived type for 2D interleaved file */ + MPI_Datatype mpi_partial_buffer_inter; /* MPI derived type for partial 2D interleaved buffer */ + MPI_Datatype mpi_full_buffer; /* MPI derived type for 2D full buffer */ + MPI_Datatype mpi_full_chunk; /* MPI derived type for 2D full chunk */ + MPI_Datatype mpi_chunk_inter_type; /* MPI derived type for 2D chunk interleaved file */ + MPI_Datatype mpi_collective_type; /* Generic MPI derived type for 2D collective access */ + MPI_Status mpi_status; int mrc; /* MPI return code */ /* HDF5 variables */ @@ -1413,11 +1534,11 @@ do_read(results *res, file_descr *fd, parameters *parms, long ndsets, hid_t h5dset_space_id = -1; /*dataset space ID */ hid_t h5mem_space_id = -1; /*memory dataspace ID */ hid_t h5ds_id = -1; /*dataset handle */ - hsize_t h5block[2]; /*dataspace selection */ - hsize_t h5stride[2]; - hsize_t h5count[2]; - hsize_t h5start[2]; - hssize_t h5offset[2]; /* Selection offset within dataspace */ + hsize_t h5block[2]; /*dataspace selection */ + hsize_t h5stride[2]; + hsize_t h5count[2]; + hsize_t h5start[2]; + hssize_t h5offset[2]; /* Selection offset within dataspace */ hid_t h5dxpl = -1; /* Dataset transfer property list */ /* Get the parameters from the parameter block */ @@ -1434,38 +1555,41 @@ do_read(results *res, file_descr *fd, parameters *parms, long ndsets, */ /* 1D dataspace */ - if (parms->dim2d==0){ - bsize = buf_size; - if (parms->interleaved==0) { - /* Contiguous Pattern: */ - bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g); - } /* end if */ - else { - /* Interleaved Pattern: */ - bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g); - } /* end else */ + if (!parms->dim2d){ + bsize = buf_size; + /* Contiguous Pattern: */ + if (!parms->interleaved) { + bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g); + } /* end if */ + /* Interleaved Pattern: */ + else { + bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g); + } /* end else */ }/* end if */ /* 2D dataspace */ else { - snbytes = (off_t)sqrt(nbytes); - bsize = buf_size * blk_size; - /* nbytes is always the number of bytes per dataset (1D or 2D). If the - dataspace is 2D, snbytes is the size of a side of the 'dataset square'. - */ - if (parms->interleaved==0) { - /* Contiguous Pattern: */ - bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g); - bytes_begin[1] = 0; - } /* end if */ - else { - /* Interleaved Pattern: */ - bytes_begin[0] = 0; - bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g); - } /* end else */ - } - - /* end else */ - + /* nbytes is always the number of bytes per dataset (1D or 2D). If the + dataspace is 2D, snbytes is the size of a side of the 'dataset square'. + */ + snbytes = (off_t)sqrt(nbytes); + + bsize = buf_size * blk_size; + + /* Contiguous Pattern: */ + if (!parms->interleaved) { + bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g); + bytes_begin[1] = 0; + } /* end if */ + /* Interleaved Pattern: */ + else { + bytes_begin[0] = 0; + + if (!parms->h5_use_chunks || parms->io_type==PHDF5) + bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g); + else + bytes_begin[1] = (off_t)(blk_size*blk_size*pio_mpi_rank_g); + } /* end else */ + } /* end else */ /* Calculate the total number of bytes (bytes_count) to be * transferred by this process. It may be different for different @@ -1478,737 +1602,826 @@ do_read(results *res, file_descr *fd, parameters *parms, long ndsets, * (This is tricky, don't mess with the formula, rounding errors * can easily get introduced) */ bytes_count = (off_t)(((double)nbytes*(pio_mpi_rank_g+1)) / pio_mpi_nprocs_g) - - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g); + - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g); /* debug */ if (pio_debug_level >= 4) { - HDprint_rank(output); - HDfprintf(output, "Debug(do_read): " - "buf_size=%Hd, bytes_begin=%Hd, bytes_count=%Hd\n", - (long_long)buf_size, (long_long)bytes_begin, - (long_long)bytes_count); + HDprint_rank(output); + HDfprintf(output, "Debug(do_read): " + "buf_size=%Hd, bytes_begin=%Hd, bytes_count=%Hd\n", + (long_long)buf_size, (long_long)bytes_begin, + (long_long)bytes_count); } /* I/O Access specific setup */ switch (parms->io_type) { - case POSIXIO: - /* No extra setup */ - break; - - case MPIO: /* MPI-I/O setup */ - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Build block's derived type */ - mrc = MPI_Type_contiguous((int)blk_size, - MPI_BYTE, &mpi_blk_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Build file's derived type */ - mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, - (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Commit file type */ - mrc = MPI_Type_commit( &mpi_file_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - - /* Commit buffer type */ - mrc = MPI_Type_commit( &mpi_blk_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - } /* end if */ - /* 2D dataspace */ - else { - /* Build partial buffer derived type for contiguous access */ - mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE, - &contig_cont); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Build contiguous file's derived type */ - mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size), - contig_cont, &mpi_cont_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Commit contiguous file type */ - mrc = MPI_Type_commit(&mpi_cont_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - - /* Build partial buffer derived type for interleaved access */ - mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, - &contig_inter); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Build interleaved file's derived type */ - mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size), - contig_inter, &mpi_inter_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); - - /* Commit interleaved buffer type */ - mrc = MPI_Type_commit(&mpi_inter_type); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); - } /* end else */ - break; - - case PHDF5: /* HDF5 setup */ - /* 1D dataspace */ - if (parms->dim2d==0){ - if(nbytes>0) { - /* define a contiguous dataset of nbytes native bytes */ - h5dims[0] = nbytes; - h5dset_space_id = H5Screate_simple(1, h5dims, NULL); - VRFY((h5dset_space_id >= 0), "H5Screate_simple"); - - /* Set up the file dset space id to select the pattern to access */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5start[0] = bytes_begin[0]; - h5stride[0] = h5block[0] = blk_size; - h5count[0] = buf_size/blk_size; - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5start[0] = bytes_begin[0]; - h5stride[0] = blk_size*pio_mpi_nprocs_g; - h5block[0] = blk_size; - h5count[0] = buf_size/blk_size; - } /* end else */ - hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, - h5start, h5stride, h5count, h5block); - VRFY((hrc >= 0), "H5Sselect_hyperslab"); - } /* end if */ - else { - h5dset_space_id = H5Screate(H5S_SCALAR); - VRFY((h5dset_space_id >= 0), "H5Screate"); - } /* end else */ - - /* Create the memory dataspace that corresponds to the xfer buffer */ - if(buf_size>0) { - h5dims[0] = buf_size; - h5mem_space_id = H5Screate_simple(1, h5dims, NULL); - VRFY((h5mem_space_id >= 0), "H5Screate_simple"); - } /* end if */ - else { - h5mem_space_id = H5Screate(H5S_SCALAR); - VRFY((h5mem_space_id >= 0), "H5Screate"); - } /* end else */ - } /* end if */ - /* 2D dataspace */ - else { - if(nbytes>0) { - /* define a contiguous dataset of nbytes native bytes */ - h5dims[0] = snbytes; - h5dims[1] = snbytes; - h5dset_space_id = H5Screate_simple(2, h5dims, NULL); - VRFY((h5dset_space_id >= 0), "H5Screate_simple"); - - /* Set up the file dset space id to select the pattern to access */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5start[0] = bytes_begin[0]; - h5start[1] = bytes_begin[1]; - h5stride[0] = 1; - h5stride[1] = h5block[0] = h5block[1] = blk_size; - h5count[0] = 1; - h5count[1] = buf_size/blk_size; - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5start[0] = bytes_begin[0]; - h5start[1] = bytes_begin[1]; - h5stride[0] = blk_size; - h5stride[1] = blk_size*pio_mpi_nprocs_g; - h5block[0] = h5block[1] = blk_size; - h5count[0] = buf_size/blk_size; - h5count[1] = 1; - } /* end else */ - hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, - h5start, h5stride, h5count, h5block); - VRFY((hrc >= 0), "H5Sselect_hyperslab"); - } /* end if */ - else { - h5dset_space_id = H5Screate(H5S_SCALAR); - VRFY((h5dset_space_id >= 0), "H5Screate"); - } /* end else */ - - /* Create the memory dataspace that corresponds to the xfer buffer */ - if(buf_size>0) { - if (parms->interleaved==0){ - h5dims[0] = blk_size; - h5dims[1] = buf_size; - }else{ - h5dims[0] = buf_size; - h5dims[1] = blk_size; - } - h5mem_space_id = H5Screate_simple(2, h5dims, NULL); - VRFY((h5mem_space_id >= 0), "H5Screate_simple"); - } /* end if */ - else { - h5mem_space_id = H5Screate(H5S_SCALAR); - VRFY((h5mem_space_id >= 0), "H5Screate"); - } /* end else */ - } /* end else */ - - /* Create the dataset transfer property list */ - h5dxpl = H5Pcreate(H5P_DATASET_XFER); - if (h5dxpl < 0) { - fprintf(stderr, "HDF5 Property List Create failed\n"); - GOTOERROR(FAIL); - } - - /* Change to collective I/O, if asked */ - if(parms->collective) { - hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE); - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Set failed\n"); - GOTOERROR(FAIL); - } /* end if */ - } /* end if */ - break; + case POSIXIO: + /* No extra setup */ + break; + + case MPIO: /* MPI-I/O setup */ + /* 1D dataspace */ + if (!parms->dim2d){ + /* Build block's derived type */ + mrc = MPI_Type_contiguous((int)blk_size, + MPI_BYTE, &mpi_blk_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Build file's derived type */ + mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, + (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit file type */ + mrc = MPI_Type_commit( &mpi_file_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Commit buffer type */ + mrc = MPI_Type_commit( &mpi_blk_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + } /* end if */ + /* 2D dataspace */ + else { + /* Build partial buffer derived type for contiguous access */ + mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE, + &mpi_partial_buffer_cont); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit partial buffer derived type */ + mrc = MPI_Type_commit(&mpi_partial_buffer_cont); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build contiguous file's derived type */ + mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size), + mpi_partial_buffer_cont, &mpi_cont_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit contiguous file type */ + mrc = MPI_Type_commit(&mpi_cont_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build partial buffer derived type for interleaved access */ + mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, + &mpi_partial_buffer_inter); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit partial buffer derived type */ + mrc = MPI_Type_commit(&mpi_partial_buffer_inter); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build interleaved file's derived type */ + mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size), + mpi_partial_buffer_inter, &mpi_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit interleaved file type */ + mrc = MPI_Type_commit(&mpi_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build full buffer derived type */ + mrc = MPI_Type_contiguous((int)(blk_size*buf_size), MPI_BYTE, + &mpi_full_buffer); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit full buffer derived type */ + mrc = MPI_Type_commit(&mpi_full_buffer); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build full chunk derived type */ + mrc = MPI_Type_contiguous((int)(blk_size*blk_size), MPI_BYTE, + &mpi_full_chunk); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit full chunk derived type */ + mrc = MPI_Type_commit(&mpi_full_chunk); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + + /* Build chunk interleaved file's derived type */ + mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, (int)(snbytes/blk_size), + mpi_full_chunk, &mpi_chunk_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE"); + + /* Commit chunk interleaved file type */ + mrc = MPI_Type_commit(&mpi_chunk_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT"); + } /* end else */ + break; + + case PHDF5: /* HDF5 setup */ + /* 1D dataspace */ + if (!parms->dim2d){ + if(nbytes>0) { + /* define a contiguous dataset of nbytes native bytes */ + h5dims[0] = nbytes; + h5dset_space_id = H5Screate_simple(1, h5dims, NULL); + VRFY((h5dset_space_id >= 0), "H5Screate_simple"); + + /* Set up the file dset space id to select the pattern to access */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5start[0] = bytes_begin[0]; + h5stride[0] = h5block[0] = blk_size; + h5count[0] = buf_size/blk_size; + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5start[0] = bytes_begin[0]; + h5stride[0] = blk_size*pio_mpi_nprocs_g; + h5block[0] = blk_size; + h5count[0] = buf_size/blk_size; + } /* end else */ + hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, + h5start, h5stride, h5count, h5block); + VRFY((hrc >= 0), "H5Sselect_hyperslab"); + } /* end if */ + else { + h5dset_space_id = H5Screate(H5S_SCALAR); + VRFY((h5dset_space_id >= 0), "H5Screate"); + } /* end else */ + + /* Create the memory dataspace that corresponds to the xfer buffer */ + if(buf_size>0) { + h5dims[0] = buf_size; + h5mem_space_id = H5Screate_simple(1, h5dims, NULL); + VRFY((h5mem_space_id >= 0), "H5Screate_simple"); + } /* end if */ + else { + h5mem_space_id = H5Screate(H5S_SCALAR); + VRFY((h5mem_space_id >= 0), "H5Screate"); + } /* end else */ + } /* end if */ + /* 2D dataspace */ + else { + if(nbytes>0) { + /* define a contiguous dataset of nbytes native bytes */ + h5dims[0] = snbytes; + h5dims[1] = snbytes; + h5dset_space_id = H5Screate_simple(2, h5dims, NULL); + VRFY((h5dset_space_id >= 0), "H5Screate_simple"); + + /* Set up the file dset space id to select the pattern to access */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5start[0] = bytes_begin[0]; + h5start[1] = bytes_begin[1]; + h5stride[0] = 1; + h5stride[1] = h5block[0] = h5block[1] = blk_size; + h5count[0] = 1; + h5count[1] = buf_size/blk_size; + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5start[0] = bytes_begin[0]; + h5start[1] = bytes_begin[1]; + h5stride[0] = blk_size; + h5stride[1] = blk_size*pio_mpi_nprocs_g; + h5block[0] = h5block[1] = blk_size; + h5count[0] = buf_size/blk_size; + h5count[1] = 1; + } /* end else */ + hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, + h5start, h5stride, h5count, h5block); + VRFY((hrc >= 0), "H5Sselect_hyperslab"); + } /* end if */ + else { + h5dset_space_id = H5Screate(H5S_SCALAR); + VRFY((h5dset_space_id >= 0), "H5Screate"); + } /* end else */ + + /* Create the memory dataspace that corresponds to the xfer buffer */ + if(buf_size>0) { + if (!parms->interleaved){ + h5dims[0] = blk_size; + h5dims[1] = buf_size; + }else{ + h5dims[0] = buf_size; + h5dims[1] = blk_size; + } + h5mem_space_id = H5Screate_simple(2, h5dims, NULL); + VRFY((h5mem_space_id >= 0), "H5Screate_simple"); + } /* end if */ + else { + h5mem_space_id = H5Screate(H5S_SCALAR); + VRFY((h5mem_space_id >= 0), "H5Screate"); + } /* end else */ + } /* end else */ + + /* Create the dataset transfer property list */ + h5dxpl = H5Pcreate(H5P_DATASET_XFER); + if (h5dxpl < 0) { + fprintf(stderr, "HDF5 Property List Create failed\n"); + GOTOERROR(FAIL); + } + + /* Change to collective I/O, if asked */ + if(parms->collective) { + hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE); + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Set failed\n"); + GOTOERROR(FAIL); + } /* end if */ + } /* end if */ + break; } /* end switch */ - for(ndset = 1; ndset <= ndsets; ++ndset) { - - /* Calculate dataset offset within a file */ - - /* create dataset */ - switch(parms->io_type) { - case POSIXIO: - case MPIO: - /* both posix and mpi io just need dataset offset in file*/ - dset_offset = (ndset - 1) * nbytes; - break; - - case PHDF5: - sprintf(dname, "Dataset_%ld", ndset); - h5ds_id = H5Dopen2(fd->h5fd, dname, H5P_DEFAULT); - if(h5ds_id < 0) { - fprintf(stderr, "HDF5 Dataset open failed\n"); - GOTOERROR(FAIL); - } - break; - } - - /* The task is to transfer bytes_count bytes, starting at - * bytes_begin position, using transfer buffer of buf_size bytes. - * If interleaved, select buf_size at a time, in round robin - * fashion, according to number of process. Otherwise, select - * all bytes_count in contiguous. - */ - nbytes_xfer = 0 ; - - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Set base file offset for all I/O patterns and POSIX access */ - posix_file_offset = dset_offset + bytes_begin[0]; - - /* Set base file offset for all I/O patterns and MPI access */ - mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]); - } /* end if */ - else { - /* Set base file offset for all I/O patterns and POSIX access */ - posix_file_offset=dset_offset + bytes_begin[0]*snbytes+ - bytes_begin[1]; - - /* Set base file offset for all I/O patterns and MPI access */ - mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+ - bytes_begin[1]); - } /* end else */ - - /* Start "raw data" read timer */ - set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, START); - - while (nbytes_xfer < bytes_count){ - /* Read */ - /* Calculate offset of read within a dataset/file */ - switch (parms->io_type) { - case POSIXIO: - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Contiguous pattern */ - if (parms->interleaved==0) { - /* Compute file offset */ - file_offset = posix_file_offset + (off_t)nbytes_xfer; - - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are read */ - rc = ((ssize_t)buf_size == - POSIXREAD(fd->posixfd, buffer, buf_size)); - VRFY((rc != 0), "POSIXREAD"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end if */ - /* Interleaved access pattern */ - else { - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size; - - /* Loop over the buffers to read */ - while(nbytes_toxfer>0) { - /* Skip offset over blocks of other processes */ - file_offset = posix_file_offset + - (off_t)(nbytes_xfer*pio_mpi_nprocs_g); - - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are read */ - rc = ((ssize_t)blk_size == - POSIXREAD(fd->posixfd, buf_p, blk_size)); - VRFY((rc != 0), "POSIXREAD"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - } /* end while */ - } /* end else */ - } /* end if */ - /* 2D dataspace */ - else { - /* Contiguous pattern */ - if (parms->interleaved==0){ - /* Set the base of user's buffer */ - buf_p = (unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size*blk_size; - - /* Compute file offset */ - file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size)/(snbytes))* - (blk_size*snbytes)+((nbytes_xfer/blk_size)%(snbytes))); - - /* Loop over portions of the buffer to read */ - while(nbytes_toxfer>0){ - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are read */ - rc = ((ssize_t)buf_size == - POSIXREAD(fd->posixfd, buffer, buf_size)); - VRFY((rc != 0), "POSIXREAD"); - - /* Advance location in buffer */ - buf_p+=buf_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=buf_size; - - /* Partially advance file offset */ - file_offset+=(off_t)(snbytes); - } /* end while */ - } /* end if */ - /* Interleaved access pattern */ - else{ - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer=buf_size*blk_size; - - /* Compute file offset */ - file_offset=posix_file_offset+(off_t)(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/(snbytes)* - (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%(snbytes)); - - /* Loop over portions of the buffer to read */ - while(nbytes_toxfer>0){ - /* only care if seek returns error */ - rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; - VRFY((rc==0), "POSIXSEEK"); - - /* check if all bytes are read */ - rc = ((ssize_t)blk_size == - POSIXREAD(fd->posixfd, buffer, blk_size)); - VRFY((rc != 0), "POSIXREAD"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - - /* Partially advance file offset */ - file_offset+=(off_t)(snbytes); - } /* end while */ - }/* end else */ - } /* end else */ - break; - - case MPIO: - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Independent file access */ - if(parms->collective==0) { - /* Contiguous pattern */ - if (parms->interleaved==0){ - /* Compute offset in file */ - mpi_offset = mpi_file_offset + - nbytes_xfer; - - /* Perform independent read */ - mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buffer, - (int)(buf_size/blk_size), mpi_blk_type, - &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end if */ - /* Interleaved access pattern */ - else { - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size; - - /* Loop over the buffers to read */ - while(nbytes_toxfer>0) { - /* Skip offset over blocks of other processes */ - mpi_offset = mpi_file_offset + - (nbytes_xfer*pio_mpi_nprocs_g); - - /* Perform independent read */ - mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p, - (int)1, mpi_blk_type, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - } /* end while */ - } /* end else */ - } /* end if */ - /* Collective file access */ - else { - /* Contiguous access pattern */ - if (parms->interleaved==0){ - /* Compute offset in file */ - mpi_offset = mpi_file_offset + - nbytes_xfer; - - /* Perform collective read */ - mrc = MPI_File_read_at_all(fd->mpifd, mpi_offset, buffer, - (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end if */ - /* Interleaved access pattern */ - else { - /* Compute offset in file */ - mpi_offset = mpi_file_offset + - (nbytes_xfer*pio_mpi_nprocs_g); - - /* Set the file view */ - mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type, - mpi_file_type, (char*)"native", h5_io_info_g); - VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); - - /* Perform collective read */ - mrc = MPI_File_read_at_all(fd->mpifd, 0, buffer, - (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - } /* end else */ - } /* end else */ - } /* end if */ - /* 2D dataspace */ - else { - /* Independent file access */ - if (parms->collective==0) - /* Contiguous pattern */ - if (parms->interleaved==0){ - /* Set the base of user's buffer */ - buf_p = (unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer = buf_size*blk_size; - - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/(snbytes))* - (blk_size*snbytes)+((nbytes_xfer/blk_size)%(snbytes)); - - /* Loop over portions of the buffer to read */ - while(nbytes_toxfer>0){ - - /* Perform independent write */ - mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p, (int)buf_size, MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - /* Advance location in buffer */ - buf_p+=buf_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=buf_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=buf_size; - - /* Partially advance global offset in dataset */ - mpi_offset+=snbytes; - } /* end while */ - } /* end if */ - /* Interleaved access pattern */ - else{ - /* Set the base of user's buffer */ - buf_p=(unsigned char *)buffer; - - /* Set the number of bytes to transfer this time */ - nbytes_toxfer=buf_size*blk_size; - - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/(snbytes)* - (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%(snbytes); - - /* Loop over portions of the buffer to read */ - while(nbytes_toxfer>0){ - /* Perform independent write */ - mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p, (int)blk_size, MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - /* Advance location in buffer */ - buf_p+=blk_size; - - /* Advance global offset in dataset */ - nbytes_xfer+=blk_size; - - /* Decrement number of bytes left this time */ - nbytes_toxfer-=blk_size; - - /* Partially advance global offset in dataset */ - mpi_offset+=snbytes; - } /* end while */ - } /* end else */ - /* end if */ - /* Collective file access */ - else - /* Contiguous access pattern */ - if (parms->interleaved==0){ - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/(snbytes))* - (blk_size*snbytes)+((nbytes_xfer/blk_size)%(snbytes)); - - /* Set the file view */ - mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, mpi_cont_type, (char *)"native", h5_io_info_g); - VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); - - /* Perform read */ - mrc = MPI_File_read_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size),MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - nbytes_xfer+=buf_size*blk_size; - } /* end if */ - /* Interleaved access pattern */ - else{ - /* Compute offset in file */ - mpi_offset=mpi_file_offset+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/(snbytes)* - (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%(snbytes); - - /* Set the file view */ - mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, mpi_inter_type, (char *)"native", h5_io_info_g); - VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); - - /* Perform read */ - mrc = MPI_File_read_at_all(fd->mpifd, 0, buffer, (int)(buf_size*blk_size), MPI_BYTE, &mpi_status); - VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); - - nbytes_xfer+=buf_size*blk_size; - } /* end else */ - /* end else */ - } /* end else */ - break; - - case PHDF5: - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Set up the file dset space id to move the selection to process */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5offset[0] = nbytes_xfer; - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g); - } /* end else */ - hrc = H5Soffset_simple(h5dset_space_id, h5offset); - VRFY((hrc >= 0), "H5Soffset_simple"); - - /* Read the buffer in */ - hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, - h5dset_space_id, h5dxpl, buffer); - VRFY((hrc >= 0), "H5Dread"); - - /* Increment number of bytes transferred */ - nbytes_xfer += buf_size; - } /* end if */ - /* 2D dataspace */ - else { - /* Set up the file dset space id to move the selection to process */ - if (parms->interleaved==0){ - /* Contiguous pattern */ - h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size; - h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size; - } /* end if */ - else { - /* Interleaved access pattern */ - /* Skip offset over blocks of other processes */ - h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size; - h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size; - - } /* end else */ - hrc = H5Soffset_simple(h5dset_space_id, h5offset); - VRFY((hrc >= 0), "H5Soffset_simple"); - - /* Write the buffer out */ - hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, - h5dset_space_id, h5dxpl, buffer); - VRFY((hrc >= 0), "H5Dread"); - - /* Increment number of bytes transferred */ - nbytes_xfer += buf_size*blk_size; - - } /* end else */ - break; - } /* switch (parms->io_type) */ - - /* Verify raw data, if asked */ - if (parms->verify) { - /* Verify data read */ - unsigned char *ucharptr = (unsigned char *)buffer; - size_t i; - int nerror=0; - - for (i = 0; i < bsize; ++i){ - if (*ucharptr++ != pio_mpi_rank_g+1) { - if (++nerror < 20){ - /* report at most 20 errors */ - HDprint_rank(output); - HDfprintf(output, "read data error, expected (%Hd), " - "got (%Hd)\n", - (long_long)pio_mpi_rank_g+1, - (long_long)*(ucharptr-1)); - } /* end if */ - } /* end if */ - } /* end for */ - if (nerror >= 20) { - HDprint_rank(output); - HDfprintf(output, "..."); - HDfprintf(output, "total read data errors=%d\n", - nerror); - } /* end if */ - } /* if (parms->verify) */ - - } /* end while */ - - /* Stop "raw data" read timer */ - set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, STOP); - - /* Calculate read time */ - - /* Close dataset. Only HDF5 needs to do an explicit close. */ - if (parms->io_type == PHDF5) { - hrc = H5Dclose(h5ds_id); - - if (hrc < 0) { - fprintf(stderr, "HDF5 Dataset Close failed\n"); - GOTOERROR(FAIL); - } - - h5ds_id = -1; - } /* end if */ + for (ndset = 1; ndset <= ndsets; ++ndset) { + + /* Calculate dataset offset within a file */ + + /* create dataset */ + switch (parms->io_type) { + case POSIXIO: + case MPIO: + /* both posix and mpi io just need dataset offset in file*/ + dset_offset = (ndset - 1) * nbytes; + break; + + case PHDF5: + sprintf(dname, "Dataset_%ld", ndset); + h5ds_id = H5Dopen2(fd->h5fd, dname, H5P_DEFAULT); + if (h5ds_id < 0) { + fprintf(stderr, "HDF5 Dataset open failed\n"); + GOTOERROR(FAIL); + } + + break; + } + + /* The task is to transfer bytes_count bytes, starting at + * bytes_begin position, using transfer buffer of buf_size bytes. + * If interleaved, select buf_size at a time, in round robin + * fashion, according to number of process. Otherwise, select + * all bytes_count in contiguous. + */ + nbytes_xfer = 0 ; + + /* 1D dataspace */ + if (!parms->dim2d){ + /* Set base file offset for all I/O patterns and POSIX access */ + posix_file_offset = dset_offset + bytes_begin[0]; + + /* Set base file offset for all I/O patterns and MPI access */ + mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]); + } /* end if */ + else { + /* Set base file offset for all I/O patterns and POSIX access */ + posix_file_offset=dset_offset + bytes_begin[0]*snbytes+ + bytes_begin[1]; + + /* Set base file offset for all I/O patterns and MPI access */ + mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+ + bytes_begin[1]); + } /* end else */ + + /* Start "raw data" read timer */ + set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, START); + + while (nbytes_xfer < bytes_count){ + /* Read */ + /* Calculate offset of read within a dataset/file */ + switch (parms->io_type) { + case POSIXIO: + /* 1D dataspace */ + if (!parms->dim2d){ + /* Contiguous pattern */ + if (!parms->interleaved) { + /* Compute file offset */ + file_offset = posix_file_offset + (off_t)nbytes_xfer; + + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + + /* check if all bytes are read */ + rc = ((ssize_t)buf_size == + POSIXREAD(fd->posixfd, buffer, buf_size)); + VRFY((rc != 0), "POSIXREAD"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Set the base of user's buffer */ + buf_p=(unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size; + + /* Loop over the buffers to read */ + while(nbytes_toxfer>0) { + /* Skip offset over blocks of other processes */ + file_offset = posix_file_offset + + (off_t)(nbytes_xfer*pio_mpi_nprocs_g); + + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + + /* check if all bytes are read */ + rc = ((ssize_t)blk_size == + POSIXREAD(fd->posixfd, buf_p, blk_size)); + VRFY((rc != 0), "POSIXREAD"); + + /* Advance location in buffer */ + buf_p+=blk_size; + + /* Advance global offset in dataset */ + nbytes_xfer+=blk_size; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=blk_size; + } /* end while */ + } /* end else */ + } /* end if */ + /* 2D dataspace */ + else { + /* Contiguous storage */ + if (!parms->h5_use_chunks) { + /* Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute file offset */ + file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size) + /snbytes)*(blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes)); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = buf_size; + + /* Global offset advance after each I/O operation */ + file_offset_advance = (off_t)snbytes; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Compute file offset */ + file_offset=posix_file_offset+(off_t)((((nbytes_xfer/buf_size) + *pio_mpi_nprocs_g)/snbytes)*(buf_size*snbytes) + +((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size; + + /* Global offset advance after each I/O operation */ + file_offset_advance = (off_t)snbytes; + } /* end else */ + } /* end if */ + /* Chunked storage */ + else { + /*Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute file offset */ + file_offset=posix_file_offset+(off_t)nbytes_xfer; + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * buf_size; + + /* Global offset advance after each I/O operation */ + file_offset_advance = 0; + } /* end if */ + /*Interleaved access pattern */ + else { + /* Compute file offset */ + /* Before simplification */ + /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size + *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size)) + *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */ + + file_offset=posix_file_offset+(off_t)(((nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)+((nbytes_xfer/(buf_size/blk_size)) + *pio_mpi_nprocs_g)%(snbytes*blk_size)); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * blk_size; + + /* Global offset advance after each I/O operation */ + /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */ + file_offset_advance = (off_t)(snbytes*blk_size); + } /* end else */ + } /* end else */ + + /* Common code for file access */ + + /* Set the base of user's buffer */ + buf_p = (unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size*blk_size; + + /* Loop over portions of the buffer to read */ + while(nbytes_toxfer>0){ + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + + /* check if all bytes are read */ + rc = ((ssize_t)nbytes_xfer_advance == + POSIXREAD(fd->posixfd, buf_p, nbytes_xfer_advance)); + VRFY((rc != 0), "POSIXREAD"); + + /* Advance location in buffer */ + buf_p+=nbytes_xfer_advance; + + /* Advance global offset in dataset */ + nbytes_xfer+=nbytes_xfer_advance; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=nbytes_xfer_advance; + + /* Partially advance file offset */ + file_offset+=file_offset_advance; + } /* end while */ + + } /* end else */ + break; + + case MPIO: + /* 1D dataspace */ + if (!parms->dim2d){ + /* Independent file access */ + if(!parms->collective) { + /* Contiguous pattern */ + if (!parms->interleaved){ + /* Compute offset in file */ + mpi_offset = mpi_file_offset + + nbytes_xfer; + + /* Perform independent read */ + mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buffer, + (int)(buf_size/blk_size), mpi_blk_type, + &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Set the base of user's buffer */ + buf_p=(unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size; + + /* Loop over the buffers to read */ + while(nbytes_toxfer>0) { + /* Skip offset over blocks of other processes */ + mpi_offset = mpi_file_offset + + (nbytes_xfer*pio_mpi_nprocs_g); + + /* Perform independent read */ + mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p, + (int)1, mpi_blk_type, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); + + /* Advance location in buffer */ + buf_p+=blk_size; + + /* Advance global offset in dataset */ + nbytes_xfer+=blk_size; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=blk_size; + } /* end while */ + } /* end else */ + } /* end if */ + /* Collective file access */ + else { + /* Contiguous access pattern */ + if (!parms->interleaved){ + /* Compute offset in file */ + mpi_offset = mpi_file_offset + + nbytes_xfer; + + /* Perform collective read */ + mrc = MPI_File_read_at_all(fd->mpifd, mpi_offset, buffer, + (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Compute offset in file */ + mpi_offset = mpi_file_offset + + (nbytes_xfer*pio_mpi_nprocs_g); + + /* Set the file view */ + mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type, + mpi_file_type, (char*)"native", h5_io_info_g); + VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); + + /* Perform collective read */ + mrc = MPI_File_read_at_all(fd->mpifd, 0, buffer, + (int)(buf_size/blk_size), mpi_blk_type, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size; + } /* end else */ + } /* end else */ + } /* end if */ + /* 2D dataspace */ + else { + /* Contiguous storage */ + if (!parms->h5_use_chunks) { + /* Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute offset in file */ + mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/snbytes)* + (blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = buf_size; + + /* Global offset advance after each I/O operation */ + mpi_offset_advance = snbytes; + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_cont_type; + } /* end if */ + /* Interleaved access pattern */ + else { + /* Compute offset in file */ + mpi_offset=mpi_file_offset+(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/snbytes)* + (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes; + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size; + + /* Global offset advance after each I/O operation */ + mpi_offset_advance = snbytes; + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_inter_type; + } /* end else */ + } /* end if */ + /* Chunked storage */ + else { + /*Contiguous access pattern */ + if (!parms->interleaved) { + /* Compute offset in file */ + mpi_offset=mpi_file_offset+nbytes_xfer; + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * buf_size; + + /* Global offset advance after each I/O operation */ + mpi_offset_advance = 0; + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_full_buffer; + } /* end if */ + /*Interleaved access pattern */ + else { + /* Compute offset in file */ + /* Before simplification */ + /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))* + (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+ + ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes + /blk_size*(blk_size*blk_size)); */ + mpi_offset=mpi_file_offset+((nbytes_xfer/(buf_size/blk_size) + *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes) + +((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes*blk_size); + + /* Number of bytes to be transferred per I/O operation */ + nbytes_xfer_advance = blk_size * blk_size; + + /* Global offset advance after each I/O operation */ + /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */ + mpi_offset_advance = (MPI_Offset)(snbytes*blk_size); + + /* MPI type to be used for collective access */ + mpi_collective_type = mpi_chunk_inter_type; + } /* end else */ + } /* end else */ + + /* Common code for independent file access */ + if (!parms->collective) { + /* Set the base of user's buffer */ + buf_p = (unsigned char *)buffer; + + /* Set the number of bytes to transfer this time */ + nbytes_toxfer = buf_size * blk_size; + + /* Loop over portions of the buffer to read */ + while(nbytes_toxfer>0){ + /* Perform independent read */ + mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p, + (int)nbytes_xfer_advance, MPI_BYTE, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); + + /* Advance location in buffer */ + buf_p+=nbytes_xfer_advance; + + /* Advance global offset in dataset */ + nbytes_xfer+=nbytes_xfer_advance; + + /* Decrement number of bytes left this time */ + nbytes_toxfer-=nbytes_xfer_advance; + + /* Partially advance global offset in dataset */ + mpi_offset+=mpi_offset_advance; + } /* end while */ + } /* end if */ + + /* Common code for collective file access */ + else { + /* Set the file view */ + mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, + mpi_collective_type, (char *)"native", h5_io_info_g); + VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW"); + + /* Perform read */ + MPI_File_read_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size), + MPI_BYTE, &mpi_status); + VRFY((mrc==MPI_SUCCESS), "MPIO_READ"); + + /* Advance global offset in dataset */ + nbytes_xfer+=buf_size*blk_size; + } /* end else */ + + } /* end else */ + break; + + case PHDF5: + /* 1D dataspace */ + if (!parms->dim2d){ + /* Set up the file dset space id to move the selection to process */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5offset[0] = nbytes_xfer; + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g); + } /* end else */ + hrc = H5Soffset_simple(h5dset_space_id, h5offset); + VRFY((hrc >= 0), "H5Soffset_simple"); + + /* Read the buffer in */ + hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, + h5dset_space_id, h5dxpl, buffer); + VRFY((hrc >= 0), "H5Dread"); + + /* Increment number of bytes transferred */ + nbytes_xfer += buf_size; + } /* end if */ + /* 2D dataspace */ + else { + /* Set up the file dset space id to move the selection to process */ + if (!parms->interleaved){ + /* Contiguous pattern */ + h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size; + h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size; + } /* end if */ + else { + /* Interleaved access pattern */ + /* Skip offset over blocks of other processes */ + h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size; + h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size; + + } /* end else */ + hrc = H5Soffset_simple(h5dset_space_id, h5offset); + VRFY((hrc >= 0), "H5Soffset_simple"); + + /* Write the buffer out */ + hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, + h5dset_space_id, h5dxpl, buffer); + VRFY((hrc >= 0), "H5Dread"); + + /* Increment number of bytes transferred */ + nbytes_xfer += buf_size*blk_size; + + } /* end else */ + break; + } /* switch (parms->io_type) */ + + /* Verify raw data, if asked */ + if (parms->verify) { + /* Verify data read */ + unsigned char *ucharptr = (unsigned char *)buffer; + size_t i; + int nerror=0; + + for (i = 0; i < bsize; ++i){ + if (*ucharptr++ != pio_mpi_rank_g+1) { + if (++nerror < 20){ + /* report at most 20 errors */ + HDprint_rank(output); + HDfprintf(output, "read data error, expected (%Hd), " + "got (%Hd)\n", + (long_long)pio_mpi_rank_g+1, + (long_long)*(ucharptr-1)); + } /* end if */ + } /* end if */ + } /* end for */ + if (nerror >= 20) { + HDprint_rank(output); + HDfprintf(output, "..."); + HDfprintf(output, "total read data errors=%d\n", + nerror); + } /* end if */ + } /* if (parms->verify) */ + + } /* end while */ + + /* Stop "raw data" read timer */ + set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, STOP); + + /* Calculate read time */ + + /* Close dataset. Only HDF5 needs to do an explicit close. */ + if (parms->io_type == PHDF5) { + hrc = H5Dclose(h5ds_id); + + if (hrc < 0) { + fprintf(stderr, "HDF5 Dataset Close failed\n"); + GOTOERROR(FAIL); + } + + h5ds_id = -1; + } /* end if */ } /* end for */ done: /* release MPI-I/O objects */ if (parms->io_type == MPIO) { - /* 1D dataspace */ - if (parms->dim2d==0){ - /* Free file type */ - mrc = MPI_Type_free( &mpi_file_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free buffer type */ - mrc = MPI_Type_free( &mpi_blk_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - } /* end if */ - /* 2D dataspace */ - else { - /* Free file type */ - mrc = MPI_Type_free( &mpi_cont_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free partial buffer type */ - mrc = MPI_Type_free( &contig_cont ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free file type */ - mrc = MPI_Type_free( &mpi_inter_type ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - - /* Free partial buffer type */ - mrc = MPI_Type_free( &contig_inter ); - VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); - } /* end else */ + /* 1D dataspace */ + if (!parms->dim2d){ + /* Free file type */ + mrc = MPI_Type_free( &mpi_file_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free buffer type */ + mrc = MPI_Type_free( &mpi_blk_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + } /* end if */ + /* 2D dataspace */ + else { + /* Free partial buffer type for contiguous access */ + mrc = MPI_Type_free( &mpi_partial_buffer_cont ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free contiguous file type */ + mrc = MPI_Type_free( &mpi_cont_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free partial buffer type for interleaved access */ + mrc = MPI_Type_free( &mpi_partial_buffer_inter ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free interleaved file type */ + mrc = MPI_Type_free( &mpi_inter_type ); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free full buffer type */ + mrc = MPI_Type_free(&mpi_full_buffer); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free full chunk type */ + mrc = MPI_Type_free(&mpi_full_chunk); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + + /* Free chunk interleaved file type */ + mrc = MPI_Type_free(&mpi_chunk_inter_type); + VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE"); + } /* end else */ } /* end if */ /* release HDF5 objects */ if (h5dset_space_id != -1) { - hrc = H5Sclose(h5dset_space_id); - if (hrc < 0){ - fprintf(stderr, "HDF5 Dataset Space Close failed\n"); - ret_code = FAIL; - } else { - h5dset_space_id = -1; - } + hrc = H5Sclose(h5dset_space_id); + if (hrc < 0){ + fprintf(stderr, "HDF5 Dataset Space Close failed\n"); + ret_code = FAIL; + } else { + h5dset_space_id = -1; + } } if (h5mem_space_id != -1) { - hrc = H5Sclose(h5mem_space_id); - if (hrc < 0) { - fprintf(stderr, "HDF5 Memory Space Close failed\n"); - ret_code = FAIL; - } else { - h5mem_space_id = -1; - } + hrc = H5Sclose(h5mem_space_id); + if (hrc < 0) { + fprintf(stderr, "HDF5 Memory Space Close failed\n"); + ret_code = FAIL; + } else { + h5mem_space_id = -1; + } } if (h5dxpl != -1) { - hrc = H5Pclose(h5dxpl); - if (hrc < 0) { - fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n"); - ret_code = FAIL; - } else { - h5dxpl = -1; - } + hrc = H5Pclose(h5dxpl); + if (hrc < 0) { + fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n"); + ret_code = FAIL; + } else { + h5dxpl = -1; + } } return ret_code; @@ -2230,115 +2443,115 @@ do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags) hbool_t use_gpfs = FALSE; /* use GPFS hints */ switch (param->io_type) { - case POSIXIO: - if (flags & (PIO_CREATE | PIO_WRITE)) - fd->posixfd = POSIXCREATE(fname); - else - fd->posixfd = POSIXOPEN(fname, O_RDONLY); - - if (fd->posixfd < 0 ) { - fprintf(stderr, "POSIX File Open failed(%s)\n", fname); - GOTOERROR(FAIL); - } - - - /* The perils of POSIX I/O in a parallel environment. The problem is: - * - * - Process n opens a file with truncation and then starts - * writing to the file. - * - Process m also opens the file with truncation, but after - * process n has already started to write to the file. Thus, - * all of the stuff process n wrote is now lost. - */ - MPI_Barrier(pio_comm_g); - - break; - - case MPIO: - if (flags & (PIO_CREATE | PIO_WRITE)) { - MPI_File_delete(fname, h5_io_info_g); - mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_CREATE | MPI_MODE_RDWR, - h5_io_info_g, &fd->mpifd); - - if (mrc != MPI_SUCCESS) { - fprintf(stderr, "MPI File Open failed(%s)\n", fname); - GOTOERROR(FAIL); - } - - /*since MPI_File_open with MPI_MODE_CREATE does not truncate */ - /*filesize , set size to 0 explicitedly. */ - mrc = MPI_File_set_size(fd->mpifd, (MPI_Offset)0); - - if (mrc != MPI_SUCCESS) { - fprintf(stderr, "MPI_File_set_size failed\n"); - GOTOERROR(FAIL); - } - } else { - mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_RDONLY, - h5_io_info_g, &fd->mpifd); - - if (mrc != MPI_SUCCESS) { - fprintf(stderr, "MPI File Open failed(%s)\n", fname); - GOTOERROR(FAIL); - } - } - - break; - - case PHDF5: - acc_tpl = H5Pcreate(H5P_FILE_ACCESS); - if (acc_tpl < 0) { - fprintf(stderr, "HDF5 Property List Create failed\n"); - GOTOERROR(FAIL); - } - - /* Use the appropriate VFL driver */ - if(param->h5_use_mpi_posix) { - /* Set the file driver to the MPI-posix driver */ - hrc = H5Pset_fapl_mpiposix(acc_tpl, pio_comm_g, use_gpfs); - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Set failed\n"); - GOTOERROR(FAIL); - } - } /* end if */ - else { - /* Set the file driver to the MPI-I/O driver */ - hrc = H5Pset_fapl_mpio(acc_tpl, pio_comm_g, h5_io_info_g); - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Set failed\n"); - GOTOERROR(FAIL); - } - } /* end else */ - - /* Set the alignment of objects in HDF5 file */ - hrc = H5Pset_alignment(acc_tpl, param->h5_thresh, param->h5_align); - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Set failed\n"); - GOTOERROR(FAIL); - } - - /* create the parallel file */ - if (flags & (PIO_CREATE | PIO_WRITE)) { - fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl); - } else { - fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, acc_tpl); - } - - hrc = H5Pclose(acc_tpl); - - if (fd->h5fd < 0) { - fprintf(stderr, "HDF5 File Create failed(%s)\n", fname); - GOTOERROR(FAIL); - } - - /* verifying the close of the acc_tpl */ - if (hrc < 0) { - fprintf(stderr, "HDF5 Property List Close failed\n"); - GOTOERROR(FAIL); - } - - break; - } + case POSIXIO: + if (flags & (PIO_CREATE | PIO_WRITE)) + fd->posixfd = POSIXCREATE(fname); + else + fd->posixfd = POSIXOPEN(fname, O_RDONLY); + + if (fd->posixfd < 0 ) { + fprintf(stderr, "POSIX File Open failed(%s)\n", fname); + GOTOERROR(FAIL); + } + + + /* The perils of POSIX I/O in a parallel environment. The problem is: + * + * - Process n opens a file with truncation and then starts + * writing to the file. + * - Process m also opens the file with truncation, but after + * process n has already started to write to the file. Thus, + * all of the stuff process n wrote is now lost. + */ + MPI_Barrier(pio_comm_g); + + break; + + case MPIO: + if (flags & (PIO_CREATE | PIO_WRITE)) { + MPI_File_delete(fname, h5_io_info_g); + mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_CREATE | MPI_MODE_RDWR, + h5_io_info_g, &fd->mpifd); + + if (mrc != MPI_SUCCESS) { + fprintf(stderr, "MPI File Open failed(%s)\n", fname); + GOTOERROR(FAIL); + } + + /*since MPI_File_open with MPI_MODE_CREATE does not truncate */ + /*filesize , set size to 0 explicitedly. */ + mrc = MPI_File_set_size(fd->mpifd, (MPI_Offset)0); + + if (mrc != MPI_SUCCESS) { + fprintf(stderr, "MPI_File_set_size failed\n"); + GOTOERROR(FAIL); + } + } else { + mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_RDONLY, + h5_io_info_g, &fd->mpifd); + + if (mrc != MPI_SUCCESS) { + fprintf(stderr, "MPI File Open failed(%s)\n", fname); + GOTOERROR(FAIL); + } + } + + break; + + case PHDF5: + acc_tpl = H5Pcreate(H5P_FILE_ACCESS); + if (acc_tpl < 0) { + fprintf(stderr, "HDF5 Property List Create failed\n"); + GOTOERROR(FAIL); + } + + /* Use the appropriate VFL driver */ + if(param->h5_use_mpi_posix) { + /* Set the file driver to the MPI-posix driver */ + hrc = H5Pset_fapl_mpiposix(acc_tpl, pio_comm_g, use_gpfs); + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Set failed\n"); + GOTOERROR(FAIL); + } + } /* end if */ + else { + /* Set the file driver to the MPI-I/O driver */ + hrc = H5Pset_fapl_mpio(acc_tpl, pio_comm_g, h5_io_info_g); + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Set failed\n"); + GOTOERROR(FAIL); + } + } /* end else */ + + /* Set the alignment of objects in HDF5 file */ + hrc = H5Pset_alignment(acc_tpl, param->h5_thresh, param->h5_align); + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Set failed\n"); + GOTOERROR(FAIL); + } + + /* create the parallel file */ + if (flags & (PIO_CREATE | PIO_WRITE)) { + fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl); + } else { + fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, acc_tpl); + } + + hrc = H5Pclose(acc_tpl); + + if (fd->h5fd < 0) { + fprintf(stderr, "HDF5 File Create failed(%s)\n", fname); + GOTOERROR(FAIL); + } + + /* verifying the close of the acc_tpl */ + if (hrc < 0) { + fprintf(stderr, "HDF5 Property List Close failed\n"); + GOTOERROR(FAIL); + } + + break; + } done: return ret_code; @@ -2358,38 +2571,38 @@ do_fclose(iotype iot, file_descr *fd /*out*/) int mrc = 0, rc = 0; switch (iot) { - case POSIXIO: - rc = POSIXCLOSE(fd->posixfd); + case POSIXIO: + rc = POSIXCLOSE(fd->posixfd); - if (rc != 0){ - fprintf(stderr, "POSIX File Close failed\n"); - GOTOERROR(FAIL); - } + if (rc != 0){ + fprintf(stderr, "POSIX File Close failed\n"); + GOTOERROR(FAIL); + } - fd->posixfd = -1; - break; + fd->posixfd = -1; + break; - case MPIO: - mrc = MPI_File_close(&fd->mpifd); + case MPIO: + mrc = MPI_File_close(&fd->mpifd); - if (mrc != MPI_SUCCESS){ - fprintf(stderr, "MPI File close failed\n"); - GOTOERROR(FAIL); - } + if (mrc != MPI_SUCCESS){ + fprintf(stderr, "MPI File close failed\n"); + GOTOERROR(FAIL); + } - fd->mpifd = MPI_FILE_NULL; - break; + fd->mpifd = MPI_FILE_NULL; + break; - case PHDF5: - hrc = H5Fclose(fd->h5fd); + case PHDF5: + hrc = H5Fclose(fd->h5fd); - if (hrc < 0) { - fprintf(stderr, "HDF5 File Close failed\n"); - GOTOERROR(FAIL); - } + if (hrc < 0) { + fprintf(stderr, "HDF5 File Close failed\n"); + GOTOERROR(FAIL); + } - fd->h5fd = -1; - break; + fd->h5fd = -1; + break; } done: @@ -2400,8 +2613,8 @@ done: /* * Function: do_fclose * Purpose: Cleanup temporary file unless HDF5_NOCLEANUP is set. - * Only Proc 0 of the PIO communicator will do the cleanup. - * Other processes just return. + * Only Proc 0 of the PIO communicator will do the cleanup. + * Other processes just return. * Return: void * Programmer: Albert Cheng 2001/12/12 * Modifications: @@ -2410,21 +2623,21 @@ done: do_cleanupfile(iotype iot, char *fname) { if (pio_mpi_rank_g != 0) - return; + return; if (clean_file_g == -1) - clean_file_g = (getenv("HDF5_NOCLEANUP")==NULL) ? 1 : 0; + clean_file_g = (getenv("HDF5_NOCLEANUP")==NULL) ? 1 : 0; if (clean_file_g){ - switch (iot){ - case POSIXIO: - remove(fname); - break; - case MPIO: - case PHDF5: - MPI_File_delete(fname, h5_io_info_g); - break; - } + switch (iot){ + case POSIXIO: + remove(fname); + break; + case MPIO: + case PHDF5: + MPI_File_delete(fname, h5_io_info_g); + break; + } } } @@ -2465,8 +2678,8 @@ do_cleanupfile(iotype iot, char *fname) gpfs_access_range(int handle, off_t start, off_t length, int is_write) { struct { - gpfsFcntlHeader_t hdr; - gpfsAccessRange_t access; + gpfsFcntlHeader_t hdr; + gpfsAccessRange_t access; } access_range; access_range.hdr.totalLength = sizeof(access_range); @@ -2479,10 +2692,10 @@ gpfs_access_range(int handle, off_t start, off_t length, int is_write) access_range.access.isWrite = is_write; if (gpfs_fcntl(handle, &access_range) != 0) { - fprintf(stderr, - "gpfs_fcntl DS start directive failed. errno=%d errorOffset=%d\n", - errno, access_range.hdr.errorOffset); - exit(EXIT_FAILURE); + fprintf(stderr, + "gpfs_fcntl DS start directive failed. errno=%d errorOffset=%d\n", + errno, access_range.hdr.errorOffset); + exit(EXIT_FAILURE); } } @@ -2514,8 +2727,8 @@ gpfs_access_range(int handle, off_t start, off_t length, int is_write) gpfs_free_range(int handle, off_t start, off_t length) { struct { - gpfsFcntlHeader_t hdr; - gpfsFreeRange_t range; + gpfsFcntlHeader_t hdr; + gpfsFreeRange_t range; } free_range; /* Issue the invalidate hint */ @@ -2528,10 +2741,10 @@ gpfs_free_range(int handle, off_t start, off_t length) free_range.range.length = length; if (gpfs_fcntl(handle, &free_range) != 0) { - fprintf(stderr, - "gpfs_fcntl free range failed for range %d:%d. errno=%d errorOffset=%d\n", - start, length, errno, free_range.hdr.errorOffset); - exit(EXIT_FAILURE); + fprintf(stderr, + "gpfs_fcntl free range failed for range %d:%d. errno=%d errorOffset=%d\n", + start, length, errno, free_range.hdr.errorOffset); + exit(EXIT_FAILURE); } } @@ -2558,8 +2771,8 @@ gpfs_free_range(int handle, off_t start, off_t length) gpfs_clear_file_cache(int handle) { struct { - gpfsFcntlHeader_t hdr; - gpfsClearFileCache_t clear; + gpfsFcntlHeader_t hdr; + gpfsClearFileCache_t clear; } clear_cache; clear_cache.hdr.totalLength = sizeof(clear_cache); @@ -2569,10 +2782,10 @@ gpfs_clear_file_cache(int handle) clear_cache.clear.structType = GPFS_CLEAR_FILE_CACHE; if (gpfs_fcntl(handle, &clear_cache) != 0) { - fprintf(stderr, - "gpfs_fcntl clear file cache directive failed. errno=%d errorOffset=%d\n", - errno, clear_cache.hdr.errorOffset); - exit(EXIT_FAILURE); + fprintf(stderr, + "gpfs_fcntl clear file cache directive failed. errno=%d errorOffset=%d\n", + errno, clear_cache.hdr.errorOffset); + exit(EXIT_FAILURE); } } @@ -2604,8 +2817,8 @@ gpfs_clear_file_cache(int handle) gpfs_cancel_hints(int handle) { struct { - gpfsFcntlHeader_t hdr; - gpfsCancelHints_t cancel; + gpfsFcntlHeader_t hdr; + gpfsCancelHints_t cancel; } cancel_hints; cancel_hints.hdr.totalLength = sizeof(cancel_hints); @@ -2615,10 +2828,10 @@ gpfs_cancel_hints(int handle) cancel_hints.cancel.structType = GPFS_CANCEL_HINTS; if (gpfs_fcntl(handle, &cancel_hints) != 0) { - fprintf(stderr, - "gpfs_fcntl cancel hints directive failed. errno=%d errorOffset=%d\n", - errno, cancel_hints.hdr.errorOffset); - exit(EXIT_FAILURE); + fprintf(stderr, + "gpfs_fcntl cancel hints directive failed. errno=%d errorOffset=%d\n", + errno, cancel_hints.hdr.errorOffset); + exit(EXIT_FAILURE); } } @@ -2650,8 +2863,8 @@ gpfs_cancel_hints(int handle) gpfs_start_data_shipping(int handle, int num_insts) { struct { - gpfsFcntlHeader_t hdr; - gpfsDataShipStart_t start; + gpfsFcntlHeader_t hdr; + gpfsDataShipStart_t start; } ds_start; ds_start.hdr.totalLength = sizeof(ds_start); @@ -2663,10 +2876,10 @@ gpfs_start_data_shipping(int handle, int num_insts) ds_start.start.reserved = 0; if (gpfs_fcntl(handle, &ds_start) != 0) { - fprintf(stderr, - "gpfs_fcntl DS start directive failed. errno=%d errorOffset=%d\n", - errno, ds_start.hdr.errorOffset); - exit(EXIT_FAILURE); + fprintf(stderr, + "gpfs_fcntl DS start directive failed. errno=%d errorOffset=%d\n", + errno, ds_start.hdr.errorOffset); + exit(EXIT_FAILURE); } } @@ -2691,12 +2904,12 @@ gpfs_start_data_shipping(int handle, int num_insts) */ static void gpfs_start_data_ship_map(int handle, int partition_size, int agent_count, - int *agent_node_num) + int *agent_node_num) { int i; struct { - gpfsFcntlHeader_t hdr; - gpfsDataShipMap_t map; + gpfsFcntlHeader_t hdr; + gpfsDataShipMap_t map; } ds_map; ds_map.hdr.totalLength = sizeof(ds_map); @@ -2708,13 +2921,13 @@ gpfs_start_data_ship_map(int handle, int partition_size, int agent_count, ds_map.map.agentCount = agent_count; for (i = 0; i < agent_count; ++i) - ds_map.map.agentNodeNumber[i] = agent_node_num[i]; + ds_map.map.agentNodeNumber[i] = agent_node_num[i]; if (gpfs_fcntl(handle, &ds_map) != 0) { - fprintf(stderr, - "gpfs_fcntl DS map directive failed. errno=%d errorOffset=%d\n", - errno, ds_map.hdr.errorOffset); - exit(EXIT_FAILURE); + fprintf(stderr, + "gpfs_fcntl DS map directive failed. errno=%d errorOffset=%d\n", + errno, ds_map.hdr.errorOffset); + exit(EXIT_FAILURE); } } @@ -2746,8 +2959,8 @@ gpfs_start_data_ship_map(int handle, int partition_size, int agent_count, gpfs_stop_data_shipping(int handle) { struct { - gpfsFcntlHeader_t hdr; - gpfsDataShipStop_t stop; + gpfsFcntlHeader_t hdr; + gpfsDataShipStop_t stop; } ds_stop; ds_stop.hdr.totalLength = sizeof(ds_stop); @@ -2757,9 +2970,9 @@ gpfs_stop_data_shipping(int handle) ds_stop.stop.structType = GPFS_DATA_SHIP_STOP; if (gpfs_fcntl(handle, &ds_stop) != 0) - fprintf(stderr, - "gpfs_fcntl DS stop directive failed. errno=%d errorOffset=%d\n", - errno, ds_stop.hdr.errorOffset); + fprintf(stderr, + "gpfs_fcntl DS stop directive failed. errno=%d errorOffset=%d\n", + errno, ds_stop.hdr.errorOffset); } /* @@ -2775,15 +2988,15 @@ gpfs_invalidate_file_cache(const char *filename) { int handle; struct { - gpfsFcntlHeader_t hdr; - gpfsClearFileCache_t inv; + gpfsFcntlHeader_t hdr; + gpfsClearFileCache_t inv; } inv_cache_hint; /* Open the file. If the open fails, the file cannot be cached. */ handle = open(filename, O_RDONLY, 0); if (handle == -1) - return; + return; /* Issue the invalidate hint */ inv_cache_hint.hdr.totalLength = sizeof(inv_cache_hint); @@ -2793,21 +3006,21 @@ gpfs_invalidate_file_cache(const char *filename) inv_cache_hint.inv.structType = GPFS_CLEAR_FILE_CACHE; if (gpfs_fcntl(handle, &inv_cache_hint) != 0) { - fprintf(stderr, - "gpfs_fcntl clear cache hint failed for file '%s'.", - filename); - fprintf(stderr, " errno=%d errorOffset=%d\n", - errno, inv_cache_hint.hdr.errorOffset); - exit(1); + fprintf(stderr, + "gpfs_fcntl clear cache hint failed for file '%s'.", + filename); + fprintf(stderr, " errno=%d errorOffset=%d\n", + errno, inv_cache_hint.hdr.errorOffset); + exit(1); } /* Close the file */ if (close(handle) == -1) { - fprintf(stderr, - "could not close file '%s' after flushing file cache, ", - filename); - fprintf(stderr, "errno=%d\n", errno); - exit(1); + fprintf(stderr, + "could not close file '%s' after flushing file cache, ", + filename); + fprintf(stderr, "errno=%d\n", errno); + exit(1); } } @@ -2819,7 +3032,7 @@ gpfs_invalidate_file_cache(const char *filename) static void gpfs_access_range(int UNUSED handle, off_t UNUSED start, off_t UNUSED length, - int UNUSED is_write) + int UNUSED is_write) { return; } @@ -2856,7 +3069,7 @@ gpfs_stop_data_shipping(int UNUSED handle) static void gpfs_start_data_ship_map(int UNUSED handle, int UNUSED partition_size, - int UNUSED agent_count, int UNUSED *agent_node_num) + int UNUSED agent_count, int UNUSED *agent_node_num) { return; } @@ -2876,7 +3089,7 @@ gpfs_invalidate_file_cache(const char UNUSED *filename) * pure time spent in MPI_File code. */ int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, - int count, MPI_Datatype datatype, MPI_Status *status) + int count, MPI_Datatype datatype, MPI_Status *status) { int err; set_time(timer_g, HDF5_MPI_READ, START); @@ -2887,7 +3100,7 @@ int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, - int count, MPI_Datatype datatype, MPI_Status *status) + int count, MPI_Datatype datatype, MPI_Status *status) { int err; set_time(timer_g, HDF5_MPI_READ, START); @@ -2897,7 +3110,7 @@ int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, } int MPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, - int count, MPI_Datatype datatype, MPI_Status *status) + int count, MPI_Datatype datatype, MPI_Status *status) { int err; set_time(timer_g, HDF5_MPI_WRITE, START); @@ -2907,7 +3120,7 @@ int MPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, } int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, - int count, MPI_Datatype datatype, MPI_Status *status) + int count, MPI_Datatype datatype, MPI_Status *status) { int err; set_time(timer_g, HDF5_MPI_WRITE, START); @@ -2916,5 +3129,10 @@ int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, return err; } -#endif /* TIME_MPI */ +#endif /* TIME_MPI */ #endif /* H5_HAVE_PARALLEL */ + + + + + diff --git a/perform/pio_perf.c b/perform/pio_perf.c index b9ce309..bb1880a 100644 --- a/perform/pio_perf.c +++ b/perform/pio_perf.c @@ -287,7 +287,7 @@ struct options { size_t blk_size; /* Block size */ unsigned interleaved; /* Interleaved vs. contiguous blocks */ unsigned collective; /* Collective vs. independent I/O */ - unsigned dim2d; /* 1D vs. 2D */ + unsigned dim2d; /* 1D vs. 2D geometry */ int print_times; /* print times as well as throughputs */ int print_raw; /* print raw data throughput info */ off_t h5_alignment; /* alignment in HDF5 file */ @@ -453,8 +453,8 @@ run_test_loop(struct options *opts) /* do something harsh */ } - /* only processes doing PIO will run the tests */ - if (doing_pio){ + /* only processes doing PIO will run the tests */ + if (doing_pio){ output_report("Number of processors = %ld\n", parms.num_procs); /* multiply the xfer buffer size by 2 for each loop iteration */ @@ -462,33 +462,33 @@ run_test_loop(struct options *opts) buf_size <= opts->max_xfer_size; buf_size <<= 1) { parms.buf_size = buf_size; - if (parms.dim2d){ - parms.num_bytes = (off_t)pow((double)(opts->num_bpp*parms.num_procs),2); - if (parms.interleaved) - output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MBs\n", - buf_size, opts->blk_size, - ((double)parms.num_dsets * (double)parms.num_bytes) - / ONE_MB); - else - output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MBs\n", - opts->blk_size, buf_size, - ((double)parms.num_dsets * (double)parms.num_bytes) - / ONE_MB); - - print_indent(1); - output_report(" # of files: %ld, # of datasets: %ld, dataset size: %.2fx%.2f KBs\n", - parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_KB, - (double)(opts->num_bpp*parms.num_procs)/ONE_KB); - } - else{ - parms.num_bytes = (off_t)opts->num_bpp*parms.num_procs; - output_report("Transfer Buffer Size: %ld bytes, File size: %.2f MBs\n", - buf_size,((double)parms.num_dsets * (double)parms.num_bytes) / ONE_MB); - - print_indent(1); - output_report(" # of files: %ld, # of datasets: %ld, dataset size: %.2f MBs\n", - parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_MB); - } + if (parms.dim2d){ + parms.num_bytes = (off_t)pow((double)(opts->num_bpp*parms.num_procs),2); + if (parms.interleaved) + output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MBs\n", + buf_size, opts->blk_size, + ((double)parms.num_dsets * (double)parms.num_bytes) + / ONE_MB); + else + output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MBs\n", + opts->blk_size, buf_size, + ((double)parms.num_dsets * (double)parms.num_bytes) + / ONE_MB); + + print_indent(1); + output_report(" # of files: %ld, # of datasets: %ld, dataset size: %.2fx%.2f KBs\n", + parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_KB, + (double)(opts->num_bpp*parms.num_procs)/ONE_KB); + } + else{ + parms.num_bytes = (off_t)opts->num_bpp*parms.num_procs; + output_report("Transfer Buffer Size: %ld bytes, File size: %.2f MBs\n", + buf_size,((double)parms.num_dsets * (double)parms.num_bytes) / ONE_MB); + + print_indent(1); + output_report(" # of files: %ld, # of datasets: %ld, dataset size: %.2f MBs\n", + parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_MB); + } if (opts->io_types & PIO_POSIX) run_test(POSIXIO, parms, opts); @@ -507,7 +507,7 @@ run_test_loop(struct options *opts) if (destroy_comm_world() != SUCCESS) { /* do something harsh */ } - } + } } } @@ -533,10 +533,10 @@ run_test(iotype iot, parameters parms, struct options *opts) minmax *read_mm_table=NULL; minmax *read_gross_mm_table=NULL; minmax *read_raw_mm_table=NULL; - minmax *read_open_mm_table=NULL; - minmax *read_close_mm_table=NULL; - minmax *write_open_mm_table=NULL; - minmax *write_close_mm_table=NULL; + minmax *read_open_mm_table=NULL; + minmax *read_close_mm_table=NULL; + minmax *write_open_mm_table=NULL; + minmax *write_close_mm_table=NULL; minmax write_mpi_mm = {0.0, 0.0, 0.0, 0}; minmax write_mm = {0.0, 0.0, 0.0, 0}; minmax write_gross_mm = {0.0, 0.0, 0.0, 0}; @@ -545,10 +545,10 @@ run_test(iotype iot, parameters parms, struct options *opts) minmax read_mm = {0.0, 0.0, 0.0, 0}; minmax read_gross_mm = {0.0, 0.0, 0.0, 0}; minmax read_raw_mm = {0.0, 0.0, 0.0, 0}; - minmax read_open_mm = {0.0, 0.0, 0.0, 0}; - minmax read_close_mm = {0.0, 0.0, 0.0, 0}; - minmax write_open_mm = {0.0, 0.0, 0.0, 0}; - minmax write_close_mm = {0.0, 0.0, 0.0, 0}; + minmax read_open_mm = {0.0, 0.0, 0.0, 0}; + minmax read_close_mm = {0.0, 0.0, 0.0, 0}; + minmax write_open_mm = {0.0, 0.0, 0.0, 0}; + minmax write_close_mm = {0.0, 0.0, 0.0, 0}; raw_size = (off_t)parms.num_dsets * (off_t)parms.num_bytes; parms.io_type = iot; @@ -582,14 +582,13 @@ run_test(iotype iot, parameters parms, struct options *opts) write_close_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); if (!parms.h5_write_only) { - read_mpi_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); - read_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); - read_gross_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); - read_raw_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); - read_open_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); - read_close_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); - - } + read_mpi_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); + read_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); + read_gross_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); + read_raw_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); + read_open_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); + read_close_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax)); + } /* Do IO iteration times, collecting statistics each time */ for (i = 0; i < parms.num_iters; ++i) { @@ -600,37 +599,37 @@ run_test(iotype iot, parameters parms, struct options *opts) /* gather all of the "mpi write" times */ t = get_time(res.timers, HDF5_MPI_WRITE); - get_minmax(&write_mpi_mm, t); + get_minmax(&write_mpi_mm, t); write_mpi_mm_table[i] = write_mpi_mm; /* gather all of the "write" times */ t = get_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS); - get_minmax(&write_mm, t); + get_minmax(&write_mm, t); write_mm_table[i] = write_mm; /* gather all of the "write" times from open to close */ t = get_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS); - get_minmax(&write_gross_mm, t); + get_minmax(&write_gross_mm, t); write_gross_mm_table[i] = write_gross_mm; /* gather all of the raw "write" times */ - t = get_time(res.timers, HDF5_RAW_WRITE_FIXED_DIMS); - get_minmax(&write_raw_mm, t); + t = get_time(res.timers, HDF5_RAW_WRITE_FIXED_DIMS); + get_minmax(&write_raw_mm, t); - write_raw_mm_table[i] = write_raw_mm; + write_raw_mm_table[i] = write_raw_mm; - /* gather all of the file open times (time from open to first write) */ - t = get_time(res.timers, HDF5_FILE_WRITE_OPEN); - get_minmax(&write_open_mm, t); + /* gather all of the file open times (time from open to first write) */ + t = get_time(res.timers, HDF5_FILE_WRITE_OPEN); + get_minmax(&write_open_mm, t); - write_open_mm_table[i] = write_open_mm; + write_open_mm_table[i] = write_open_mm; - /* gather all of the file close times (time from last write to close) */ - t = get_time(res.timers, HDF5_FILE_WRITE_CLOSE); - get_minmax(&write_close_mm, t); + /* gather all of the file close times (time from last write to close) */ + t = get_time(res.timers, HDF5_FILE_WRITE_CLOSE); + get_minmax(&write_close_mm, t); write_close_mm_table[i] = write_close_mm; @@ -659,21 +658,21 @@ run_test(iotype iot, parameters parms, struct options *opts) read_raw_mm_table[i] = read_raw_mm; - /* gather all of the file open times (time from open to first read) */ - t = get_time(res.timers, HDF5_FILE_READ_OPEN); - get_minmax(&read_open_mm, t); + /* gather all of the file open times (time from open to first read) */ + t = get_time(res.timers, HDF5_FILE_READ_OPEN); + get_minmax(&read_open_mm, t); - read_open_mm_table[i] = read_open_mm; + read_open_mm_table[i] = read_open_mm; - /* gather all of the file close times (time from last read to close) */ - t = get_time(res.timers, HDF5_FILE_READ_CLOSE); - get_minmax(&read_close_mm, t); + /* gather all of the file close times (time from last read to close) */ + t = get_time(res.timers, HDF5_FILE_READ_CLOSE); + get_minmax(&read_close_mm, t); - read_close_mm_table[i] = read_close_mm; + read_close_mm_table[i] = read_close_mm; - } + } - pio_time_destroy(res.timers); + pio_time_destroy(res.timers); } /* @@ -722,25 +721,22 @@ run_test(iotype iot, parameters parms, struct options *opts) } output_results(opts,"Write Open-Close",write_gross_mm_table,parms.num_iters,raw_size); - /* Print out time from open to first write */ if (pio_debug_level >= 3) { - /* output all of the times for all iterations */ - print_indent(3); - output_report("Write file open details:\n"); - output_all_info(write_open_mm_table, parms.num_iters, 4); + /* output all of the times for all iterations */ + print_indent(3); + output_report("Write file open details:\n"); + output_all_info(write_open_mm_table, parms.num_iters, 4); } /* Print out time from last write to close */ if (pio_debug_level >= 3) { - /* output all of the times for all iterations */ - print_indent(3); - output_report("Write file close details:\n"); - output_all_info(write_close_mm_table, parms.num_iters, 4); + /* output all of the times for all iterations */ + print_indent(3); + output_report("Write file close details:\n"); + output_all_info(write_close_mm_table, parms.num_iters, 4); } - - if (!parms.h5_write_only) { /* Read statistics */ /* Print the raw data throughput if desired */ @@ -785,25 +781,24 @@ run_test(iotype iot, parameters parms, struct options *opts) output_all_info(read_gross_mm_table, parms.num_iters, 4); } - output_results(opts, "Read Open-Close", read_gross_mm_table, - parms.num_iters, raw_size); - + output_results(opts, "Read Open-Close", read_gross_mm_table, + parms.num_iters, raw_size); - /* Print out time from open to first read */ - if (pio_debug_level >= 3) { - /* output all of the times for all iterations */ - print_indent(3); - output_report("Read file open details:\n"); - output_all_info(read_open_mm_table, parms.num_iters, 4); - } + /* Print out time from open to first read */ + if (pio_debug_level >= 3) { + /* output all of the times for all iterations */ + print_indent(3); + output_report("Read file open details:\n"); + output_all_info(read_open_mm_table, parms.num_iters, 4); + } - /* Print out time from last read to close */ - if (pio_debug_level >= 3) { - /* output all of the times for all iterations */ - print_indent(3); - output_report("Read file close details:\n"); - output_all_info(read_close_mm_table, parms.num_iters, 4); - } + /* Print out time from last read to close */ + if (pio_debug_level >= 3) { + /* output all of the times for all iterations */ + print_indent(3); + output_report("Read file close details:\n"); + output_all_info(read_close_mm_table, parms.num_iters, 4); + } } @@ -820,8 +815,8 @@ run_test(iotype iot, parameters parms, struct options *opts) free(read_mm_table); free(read_gross_mm_table); free(read_raw_mm_table); - free(read_open_mm_table); - free(read_close_mm_table); + free(read_open_mm_table); + free(read_close_mm_table); } return ret_value; @@ -1126,58 +1121,58 @@ report_parameters(struct options *opts) opts->min_num_procs, opts->max_num_procs); if (opts->dim2d){ - HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank); - recover_size_and_print((long_long)(opts->num_bpp * opts->num_bpp * opts->min_num_procs), ":"); - recover_size_and_print((long_long)(opts->num_bpp * opts->num_bpp * opts->max_num_procs), "\n"); - - HDfprintf(output, "rank %d: Size of dataset(s)=", rank); - recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs), "x"); - recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs), ":"); - recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs), "x"); - recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs), "\n"); - - HDfprintf(output, "rank %d: File size=", rank); - recover_size_and_print((long_long)(pow(opts->num_bpp * opts->min_num_procs,2) - * opts->num_dsets), ":"); - recover_size_and_print((long_long)(pow(opts->num_bpp * opts->max_num_procs,2) - * opts->num_dsets), "\n"); - - HDfprintf(output, "rank %d: Transfer buffer size=", rank); - if(opts->interleaved){ - recover_size_and_print((long_long)opts->min_xfer_size, "x"); - recover_size_and_print((long_long)opts->blk_size, ":"); - recover_size_and_print((long_long)opts->max_xfer_size, "x"); - recover_size_and_print((long_long)opts->blk_size, "\n"); - } - else{ - recover_size_and_print((long_long)opts->blk_size, "x"); - recover_size_and_print((long_long)opts->min_xfer_size, ":"); - recover_size_and_print((long_long)opts->blk_size, "x"); - recover_size_and_print((long_long)opts->max_xfer_size, "\n"); - } - HDfprintf(output, "rank %d: Block size=", rank); - recover_size_and_print((long_long)opts->blk_size, "x"); - recover_size_and_print((long_long)opts->blk_size, "\n"); + HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank); + recover_size_and_print((long_long)(opts->num_bpp * opts->num_bpp * opts->min_num_procs), ":"); + recover_size_and_print((long_long)(opts->num_bpp * opts->num_bpp * opts->max_num_procs), "\n"); + + HDfprintf(output, "rank %d: Size of dataset(s)=", rank); + recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs), "x"); + recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs), ":"); + recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs), "x"); + recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs), "\n"); + + HDfprintf(output, "rank %d: File size=", rank); + recover_size_and_print((long_long)(pow(opts->num_bpp * opts->min_num_procs,2) + * opts->num_dsets), ":"); + recover_size_and_print((long_long)(pow(opts->num_bpp * opts->max_num_procs,2) + * opts->num_dsets), "\n"); + + HDfprintf(output, "rank %d: Transfer buffer size=", rank); + if(opts->interleaved){ + recover_size_and_print((long_long)opts->min_xfer_size, "x"); + recover_size_and_print((long_long)opts->blk_size, ":"); + recover_size_and_print((long_long)opts->max_xfer_size, "x"); + recover_size_and_print((long_long)opts->blk_size, "\n"); + } + else{ + recover_size_and_print((long_long)opts->blk_size, "x"); + recover_size_and_print((long_long)opts->min_xfer_size, ":"); + recover_size_and_print((long_long)opts->blk_size, "x"); + recover_size_and_print((long_long)opts->max_xfer_size, "\n"); + } + HDfprintf(output, "rank %d: Block size=", rank); + recover_size_and_print((long_long)opts->blk_size, "x"); + recover_size_and_print((long_long)opts->blk_size, "\n"); } else{ - HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank); - recover_size_and_print((long_long)opts->num_bpp, "\n"); - - HDfprintf(output, "rank %d: Size of dataset(s)=", rank); - recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs), ":"); - recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs), "\n"); - - HDfprintf(output, "rank %d: File size=", rank); - recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs - * opts->num_dsets), ":"); - recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs - * opts->num_dsets), "\n"); - - HDfprintf(output, "rank %d: Transfer buffer size=", rank); - recover_size_and_print((long_long)opts->min_xfer_size, ":"); - recover_size_and_print((long_long)opts->max_xfer_size, "\n"); - HDfprintf(output, "rank %d: Block size=", rank); - recover_size_and_print((long_long)opts->blk_size, "\n"); + HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank); + recover_size_and_print((long_long)opts->num_bpp, "\n"); + + HDfprintf(output, "rank %d: Size of dataset(s)=", rank); + recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs), ":"); + recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs), "\n"); + + HDfprintf(output, "rank %d: File size=", rank); + recover_size_and_print((long_long)(opts->num_bpp * opts->min_num_procs + * opts->num_dsets), ":"); + recover_size_and_print((long_long)(opts->num_bpp * opts->max_num_procs + * opts->num_dsets), "\n"); + + HDfprintf(output, "rank %d: Transfer buffer size=", rank); + recover_size_and_print((long_long)opts->min_xfer_size, ":"); + recover_size_and_print((long_long)opts->max_xfer_size, "\n"); + HDfprintf(output, "rank %d: Block size=", rank); + recover_size_and_print((long_long)opts->blk_size, "\n"); } HDfprintf(output, "rank %d: Block Pattern in Dataset=", rank); @@ -1245,13 +1240,13 @@ parse_command_line(int argc, char *argv[]) cl_opts->io_types = 0; /* will set default after parsing options */ cl_opts->num_dsets = 1; cl_opts->num_files = 1; - cl_opts->num_bpp = 256 * ONE_KB; + cl_opts->num_bpp = 0; cl_opts->num_iters = 1; cl_opts->max_num_procs = comm_world_nprocs_g; cl_opts->min_num_procs = 1; - cl_opts->max_xfer_size = 1 * ONE_MB; - cl_opts->min_xfer_size = 128 * ONE_KB; - cl_opts->blk_size = 128 * ONE_KB; /* Default to writing 128K per block */ + cl_opts->max_xfer_size = 0; + cl_opts->min_xfer_size = 0; + cl_opts->blk_size = 0; cl_opts->interleaved = 0; /* Default to contiguous blocks in dataset */ cl_opts->collective = 0; /* Default to independent I/O access */ cl_opts->dim2d = 0; /* Default to 1D */ @@ -1361,10 +1356,10 @@ parse_command_line(int argc, char *argv[]) /* Turn on time printing */ cl_opts->print_times = TRUE; break; - case 'v': + case 'v': /* Turn on verify data correctness*/ - cl_opts->verify = TRUE; - break; + cl_opts->verify = TRUE; + break; default: fprintf(stderr, "pio_perf: invalid --debug option %s\n", buf); exit(EXIT_FAILURE); @@ -1428,28 +1423,50 @@ parse_command_line(int argc, char *argv[]) } } + + if (cl_opts->num_bpp == 0){ + if (cl_opts->dim2d == 0) + cl_opts->num_bpp = 256 * ONE_KB; + else + cl_opts->num_bpp = 8 * ONE_KB; + } + + if (cl_opts->max_xfer_size == 0) + cl_opts->max_xfer_size = cl_opts->num_bpp; + + if (cl_opts->min_xfer_size == 0) + cl_opts->min_xfer_size = (cl_opts->num_bpp)/2; + + if (cl_opts->blk_size == 0) + cl_opts->blk_size = (cl_opts->num_bpp)/2; + + /* set default if none specified yet */ if (!cl_opts->io_types) - cl_opts->io_types = PIO_HDF5 | PIO_MPI | PIO_POSIX; /* run all API */ + cl_opts->io_types = PIO_HDF5 | PIO_MPI | PIO_POSIX; /* run all API */ /* verify parameters sanity. Adjust if needed. */ /* cap xfer_size with bytes per process */ - if (cl_opts->min_xfer_size > cl_opts->num_bpp) - cl_opts->min_xfer_size = cl_opts->num_bpp; - if (cl_opts->max_xfer_size > cl_opts->num_bpp) - cl_opts->max_xfer_size = cl_opts->num_bpp; + if (!cl_opts->dim2d) { + if (cl_opts->min_xfer_size > cl_opts->num_bpp) + cl_opts->min_xfer_size = cl_opts->num_bpp; + if (cl_opts->max_xfer_size > cl_opts->num_bpp) + cl_opts->max_xfer_size = cl_opts->num_bpp; + } if (cl_opts->min_xfer_size > cl_opts->max_xfer_size) - cl_opts->min_xfer_size = cl_opts->max_xfer_size; + cl_opts->min_xfer_size = cl_opts->max_xfer_size; + if (cl_opts->blk_size > cl_opts->num_bpp ) + cl_opts->blk_size = cl_opts->num_bpp; /* check range of number of processes */ if (cl_opts->min_num_procs <= 0) - cl_opts->min_num_procs = 1; + cl_opts->min_num_procs = 1; if (cl_opts->max_num_procs <= 0) - cl_opts->max_num_procs = 1; + cl_opts->max_num_procs = 1; if (cl_opts->min_num_procs > cl_opts->max_num_procs) - cl_opts->min_num_procs = cl_opts->max_num_procs; + cl_opts->min_num_procs = cl_opts->max_num_procs; /* check iteration */ if (cl_opts->num_iters <= 0) - cl_opts->num_iters = 1; + cl_opts->num_iters = 1; return cl_opts; } @@ -1530,7 +1547,7 @@ usage(const char *prog) #endif /* 0 */ printf(" -B S, --block-size=S Block size within transfer buffer\n"); printf(" (see below for description)\n"); - printf(" [default:128K]\n"); + printf(" [default: half the number of bytes per processor per dataset]\n"); printf(" -c, --chunk Create HDF5 datasets chunked [default: off]\n"); printf(" -C, --collective Use collective I/O for MPI and HDF5 APIs\n"); printf(" [default: off (i.e. independent I/O)]\n"); @@ -1538,7 +1555,7 @@ usage(const char *prog) printf(" -D DL, --debug=DL Indicate the debugging level\n"); printf(" [default: no debugging]\n"); printf(" -e S, --num-bytes=S Number of bytes per process per dataset\n"); - printf(" [default: 256K]\n"); + printf(" [default: 256K for 1D, 8K for 2D]\n"); printf(" -F N, --num-files=N Number of files [default: 1]\n"); printf(" -g, --geometry Use 2D geometry [default: 1D]\n"); printf(" -i N, --num-iterations=N Number of iterations to perform [default: 1]\n"); @@ -1553,8 +1570,10 @@ usage(const char *prog) printf(" -T S, --threshold=S Threshold for alignment of objects in HDF5 file\n"); printf(" [default: 1]\n"); printf(" -w, --write-only Perform write tests not the read tests\n"); - printf(" -x S, --min-xfer-size=S Minimum transfer buffer size [default: 128K]\n"); - printf(" -X S, --max-xfer-size=S Maximum transfer buffer size [default: 1M]\n"); + printf(" -x S, --min-xfer-size=S Minimum transfer buffer size\n"); + printf(" [default: half the number of bytes per processor per dataset]\n"); + printf(" -X S, --max-xfer-size=S Maximum transfer buffer size\n"); + printf(" [default: the number of bytes per processor per dataset]\n"); printf("\n"); printf(" F - is a filename.\n"); printf(" N - is an integer >=0.\n"); diff --git a/perform/pio_standalone.h b/perform/pio_standalone.h index ec18fea..af67a35 100644 --- a/perform/pio_standalone.h +++ b/perform/pio_standalone.h @@ -48,31 +48,32 @@ * define these in terms of macros. */ #ifdef _WIN32 -#define HDstrdup(S) _strdup(S) +#define HDstrdup(S) _strdup(S) #else /* _WIN32 */ #if !defined strdup && !defined H5_HAVE_STRDUP extern char *strdup(const char *s); #endif -#define HDstrdup(S) strdup(S) +#define HDstrdup(S) strdup(S) #endif /* _WIN32 */ -#define HDstrcmp(S,T) strcmp(S,T) -#define HDstrlen(S) strlen(S) -#define HDstrncmp(S,T,L) strncmp(S,T,L) -#define HDstrncpy(X,Y,Z) strncpy(X,Y,Z) -#define HDstrchr(S,C) strchr(S,C) -#define HDfree(M) free(M) +H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...); +#define HDstrcmp(S,T) strcmp(S,T) +#define HDstrlen(S) strlen(S) +#define HDstrncmp(S,T,L) strncmp(S,T,L) +#define HDstrncpy(X,Y,Z) strncpy(X,Y,Z) +#define HDstrchr(S,C) strchr(S,C) +#define HDfree(M) free(M) #ifdef _O_BINARY -#define HDopen(S,F,M) open(S,F|_O_BINARY,M) +#define HDopen(S,F,M) open(S,F|_O_BINARY,M) #else -#define HDopen(S,F,M) open(S,F,M) +#define HDopen(S,F,M) open(S,F,M) #endif -#define HDclose(F) close(F) +#define HDclose(F) close(F) #ifdef _WIN32 #ifdef __MWERKS__ @@ -81,7 +82,7 @@ extern char *strdup(const char *s); #define HDlseek(F,O,W) _lseeki64(F,O,W) #endif #else -#define HDlseek(F,O,W) lseek(F,O,W) +#define HDlseek(F,O,W) lseek(F,O,W) #endif #if defined (__MWERKS__) @@ -97,9 +98,9 @@ extern char *strdup(const char *s); #ifdef _WIN32 #ifdef __MWERKS__ - #define HDstat(S,B) stat(S,B) + #define HDstat(S,B) stat(S,B) #else /*MSVC*/ - #define HDstat(S,B) _stati64(S,B) + #define HDstat(S,B) _stati64(S,B) #endif #else #define HDstat(S,B) stat(S,B) @@ -108,16 +109,16 @@ extern char *strdup(const char *s); #ifdef _WIN32 #ifdef __MWERKS__ #define HDfstat(F,B) fstat(F,B) - typedef struct stat h5_stat_t; + typedef struct stat h5_stat_t; typedef off_t h5_stat_size_t; #else /*MSVC*/ - #define HDfstat(F,B) _fstati64(F,B) + #define HDfstat(F,B) _fstati64(F,B) typedef struct _stati64 h5_stat_t; typedef __int64 h5_stat_size_t; #endif #else #define HDfstat(F,B) fstat(F,B) -typedef struct stat h5_stat_t; +typedef struct stat h5_stat_t; typedef off_t h5_stat_size_t; #endif @@ -187,4 +188,10 @@ typedef struct long_options { extern int get_option(int argc, const char **argv, const char *opt, const struct long_options *l_opt); + +extern int nCols; /*max number of columns for outputting */ + +/* Definitions of useful routines */ +extern void print_version(const char *progname); + #endif diff --git a/release_docs/INSTALL_Windows.txt b/release_docs/INSTALL_Windows.txt index 76b0c09..6c4a71f 100644 --- a/release_docs/INSTALL_Windows.txt +++ b/release_docs/INSTALL_Windows.txt @@ -23,8 +23,9 @@ Contents: Section VIII : How to build HDF5 with Thread-Safe Feature Section IX : How to build HDF5 for 64-bit Windows Section X : How to build HDF5 on Windows Vista - Section XI : Backwards Compatibility with HDF5 1.6 - Section XII : Misc. + Section XI : How to build HDF5 using Visual Studio 2008 + Section XII : Backwards Compatibility with HDF5 1.6 + Section XIII : Misc. ======================================================================== @@ -34,13 +35,13 @@ Contents: Preconditions: 1. Installed Microsoft Visual Studio. This document is written for Visual - Studio 2005, although we also support Visual Studio .NET 2003. Most of - the instructions are the same, although some features are unsupported in - Visual Studio .NET. For simple Visual Studio .NET instructions, see the - document INSTALL_Windows_NET.TXT. + Studio 2005, although we also support Visual Studio .NET 2003 and Visual + Studio 2008 as well. Most of the instructions are the same, although some + features are unsupported in Visual Studio .NET. For simple Visual Studio + .NET instructions, see the document INSTALL_Windows_NET.TXT. - 2. (Optional) Installed Intel Compiler 9.1 if you want to build HDF5 Fortran - libraries. + 2. (Optional) Installed Intel Compiler 9.1 or 10.1 if you want to build HDF5 + Fortran libraries. 3. Install Winzip or 7-zip for extracting source tarball. @@ -151,8 +152,8 @@ Preconditions: 6.3 Find the box "Show directories for", choose "Library files". If you cannot find your Zlib and Szip library path (for example, - c:\zlib123\lib, c:\szip\dll) from the directory list, add the library - path (c:\zlib123\lib, c:\szip\dll) to the library directories. + c:\zlib123\dll, c:\szip\dll) from the directory list, add the library + path (c:\zlib123\dll, c:\szip\dll) to the library directories. 6.4 If building Fortran libraries, you will also need to setup the path for the Intel Fortran compiler. Please see Section VI. @@ -180,13 +181,16 @@ Notes: any more. To obtain HDF4 related tools, please check http://hdfgroup.org/h4toh5/ and ftp://ftp.hdfgroup.org/HDF5/h4toh5 - 6. For Fortran users, Intel fortran Compiler 9.1 is currently supported-- - please see Section VI. Intel Compiler verion 7.x and 8.x are no longer - supported. + 6. For Fortran users, Intel fortran Compiler 9.1 and 10.1 is currently + supported-- please see Section VI. Intel Compiler verion 7.x and 8.x are + no longer supported. 7. For users who would like to build Muti-threaded version of HDF5 library, please read Section VII. + 8. To build HDF5 in Visual Studio 2008, be sure to read the instructions in + Section XI. + ======================================================================== Section I: What do we build and install? @@ -942,7 +946,7 @@ project, you may choose one of the following two methods. HDF5, Zlib, and Szip library files directories. For example: c:\MyHDFstuff\hdf5\hdf5lib\release\lib - c:\zlib123\lib + c:\zlib123\dll c:\szip\dll Note: To link with HDF5 DLLs rathern that static libraries, simply @@ -961,7 +965,7 @@ project, you may choose one of the following two methods. example, c:\MyHDFstuff\hdf5\hdf5lib\release\lib - c:\zlib123\lib + c:\zlib123\dll c:\szip\dll Note: To link with HDF5 DLLs rathern that static libraries, simply @@ -1112,13 +1116,15 @@ Warning: When you modify the H5pubconf.h file as described below, DO NOT just Section VI: How to build HDF5 with Fortran Support ======================================================================== -Notes: 1. For Intel Compiler users, Intel fortran Compiler 9.1 is currently - supported-- please see below. Intel Compiler verion 7.x and 8.x are no - longer supported. +Notes: 1. For Intel Compiler users, Intel fortran Compiler 9.1 and 10.1 are + currently supported-- please see below. Intel Compiler verion 7.x and + 8.x are no longer supported. 2. The Compaq Fortran Compiler is no longer supported for HDF5 1.8. 3. Intel Fortran 9.1 works only under Visual Studio 2005 environments. + Building Fortran libraries under Visual Studio .NET is unsupported. + Visual Studio 2008 is supported only with Intel Fortran 10.1. 4. Parallel builds should be disabled. To do so: Go to Tools > Options > Projects and Solutions > Build and Run. Set "Maximum Number @@ -1142,13 +1148,13 @@ Notes: 1. For Intel Compiler users, Intel fortran Compiler 9.1 is currently You have to read this part even if you want to use only Zlib or Szip. You also need to read Section V. - 1) Invoke Microsoft Visual Studio 2005. + 1) Invoke Microsoft Visual Studio 2005 or 2008. 2) From the main menu, Go to Tools > Options > Intel(R) Fortran. In the - right panel, make sure your "Selected Compiler" is Intel Fortran 9.1. + right panel, make sure your "Selected Compiler" is Intel Fortran. 3) Select the right-most box for "Libraries", and add Zlib and Szip - library paths (c:\zlib123\lib, c:\szip\dll for example). + library paths (c:\zlib123\dll, c:\szip\dll for example). 4) Select right-most box for "Includes", and add Zlib and Szip header paths (c:\zlib123\include c:\szip\include, for example). @@ -1156,15 +1162,15 @@ Notes: 1. For Intel Compiler users, Intel fortran Compiler 9.1 is currently 5) Then click "OK". -1. Build with Intel Fortran Compiler 9.1 under Visual Studio 2005 +1. Build with Intel Fortran Compiler 9.1 or 10.1 under Visual Studio 2005 or 2008 Note: This step will build HDF5 Static and DLL C and C++ Library using - Visual Studio 2005 Compiler as well as HDF5 Static and High Level - Fortran Library using Intel Fortran 9.1 Compiler. + Visual Studio compiler as well as HDF5 Static and High Level + Fortran Library using Intel Fortran 9.1 or 10.1 Compiler. 1.1 Open all_fortran.sln - Invoke Microsoft Visual Studio 2005. From the main menu, + Invoke Microsoft Visual Studio. From the main menu, go to "File" and select "Open Solution". Choose "all_fortran.sln" under the directory c:\MyHDFstuff\hdf5\windows\proj\all_fortran. @@ -1254,7 +1260,7 @@ Notes: 1. For Intel Compiler users, Intel fortran Compiler 9.1 is currently 1. Open allf90examples.sln - Invoke Microsoft Visual Studio 2005. From the main menu, + Invoke Microsoft Visual Studio. From the main menu, go to "File" and select "Open Solution". Choose "allf90examples.sln" under the directory c:\MyHDFstuff\hdf5\windows\fortran\examples\allf90examples. @@ -1319,7 +1325,7 @@ Notes: 1. For Intel Compiler users, Intel fortran Compiler 9.1 is currently 1. Open allhlf90examples.sln - Invoke Microsoft Visual Studio 2005. From the main menu, + Invoke Microsoft Visual Studio. From the main menu, go to "File" and select "Open Solution". Choose "allhlf90examples.sln" under the directory c:\MyHDFstuff\hdf5\windows\hl\fortran\examples\allhlf90examples. @@ -1614,10 +1620,10 @@ to the earlier sections of this document for details on building and testing. Section IX: How to build HDF5 for 64-bit Windows ======================================================================== -HDF5 can be built for 64-bit Windows in Visual Studio 2005. Visual Studio .NET -has very primative 64-bit support, but it is very difficult to setup, and -debugging is not supported. Therefore, we recommend all users switch to -Visual Studio 2005 for 64-bit builds. +HDF5 can be built for 64-bit Windows in Visual Studio 2005 or 2008. Visual +Studio .NET has very primative 64-bit support, but it is very difficult to +set up, and debugging is not supported. Therefore, we recommend all users +switch to Visual Studio 2005 or 2008 for 64-bit builds. Notes: @@ -1630,7 +1636,7 @@ Prerequisites: 1. A 64-bit Windows machine. Either AMD64 and Itanium is supported. - 2. Microsoft Visual Studio 2005 installed with x64 Extensions. + 2. Microsoft Visual Studio 2005 or 2008 installed with x64 Extensions. Building: @@ -1673,8 +1679,8 @@ Building on Windows Vista is very similar to building on Windows XP, with some minor changes. Therefore, follow the build instructions above, with the following considerations: - 1. Only Visual Studio 2005 is currently supported on Windows Vista. This - is because Microsoft has ended their support for 6.0 and .NET. + 1. Only Visual Studio 2005 and 2008 is currently supported on Windows Vista. + This is because Microsoft has ended their support for and .NET. 2. Building Fortran libraries has not been tested, and is therefore also unsupported. You may attempt to build Fortran libraries following the @@ -1695,6 +1701,32 @@ following considerations: ======================================================================== + Section XI: How to build HDF5 using Visual Studio 2008 +======================================================================== +Building with Visual Studio 2008 is very similar to building with Visual Studio +2005, with some minor changes. Therefore, follow the build instructions above, +with the following considerations: + + 1. Visual Studio 2008 uses a new format for project files, but Visual Studio + 2005 project files can be easily converted. The HDF5 project files + will need to be converted on first use. To do so: + + 1.1. Open the HDF5 Visual Studio 2005 solution file as in Section II + (either all.sln or all_fortran.sln if building Fortran.) + + 1.2. You will be prompted with an automatic conversion wizard. Click + through, accepting the default values. You may choose to create + backups of the project files, although it isn't necessary. + + 1.3. When it is finished, it should state that all projects were + converted successfully with no errors. Warnings can be ignored. + + 2. Once the project files have been converted, build and test normally. + Note that the converted project files aren't backwards compatible with + previous versions of Visual Studio. + + +======================================================================== Section XII: Backwards Compatibility with HDF5 1.6 ======================================================================== @@ -1725,7 +1757,7 @@ To enable 1.6 API symbols in your application: ======================================================================== - Section XII: Misc. + Section XIII: Misc. ======================================================================== 1. Helpful Pointers diff --git a/release_docs/INSTALL_Windows_From_Command_Line.txt b/release_docs/INSTALL_Windows_From_Command_Line.txt index 79b4eb6..053ae72 100755 --- a/release_docs/INSTALL_Windows_From_Command_Line.txt +++ b/release_docs/INSTALL_Windows_From_Command_Line.txt @@ -6,10 +6,10 @@ Note: This instruction is written for users who would like to build HDF5 libraries and tools from the HDF5 source code package on command line. - Currently, we support + Currently, we support: 1. Building and testing HDF5 C/C++/Fortran libraries on command line with - Microsoft Visual Studio 2005 for 32- or 64-bit Windows. + Microsoft Visual Studio .NET, 2005 or 2008 for 32- or 64-bit Windows. For all other Windows development tools, HDF5 should be built in the development environment. Please refer to INSTALL_Windows.txt @@ -25,12 +25,12 @@ notes in INSTALL_Windows.txt before starting below procedures. ======================================================================== Section I: Building and testing HDF5 on command line with Microsoft - Visual Studio 2005 + Visual Studio ======================================================================== 1. Preconditions: - 1.1 Verify environment for Visual Studio 2005 + 1.1 Verify environment for Visual Studio Building from the command line requires environment variables for Visual Studio. These are generally setup when Visual Studio is installed, but you @@ -41,6 +41,9 @@ notes in INSTALL_Windows.txt before starting below procedures. This should output a path similar to: C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\ + + If you are using Visual Studio .NET, replace "vs80comntools" with + "vs71comntools". For Visual Studio 2008, use "vs90comntools" 1.2 Run batch file copy_hdf.bat. @@ -55,9 +58,9 @@ notes in INSTALL_Windows.txt before starting below procedures. From the command prompt that you will be building HDF5 from, issue the following command: - set HDF5_EXT_ZLIB=zdll.lib + set HDF5_EXT_ZLIB=zlib1.lib - replacing "zdll.lib" with the name of the zlib library on your system. + replacing "zlib1.lib" with the name of the zlib library on your system. Similarly, set HDF5_EXT_SZIP to the name of the szip library on your system. (Optional) If you will be building using the /useenv switch, you must also @@ -78,7 +81,13 @@ notes in INSTALL_Windows.txt before starting below procedures. from command line. hdf5bt file takes the following options: + /vs7 Build HDF5 using Visual Studio .NET 2003 + Note: Default is Visual Studio 2005 + /vs9 Build HDF5 using Visual Studio 2008 + Note: Default is Visual Studio 2005 /fort Build and test HDF5 with Fortran libraries + /ivf101 Build HDF5 Fortran using Intel Visual Fortran 10.1 + Note: Default is Intel Visual Fortran 9.1 /useenv Build HDF5 using compiler settings defined in the environment, rather than the IDE. /? Help information @@ -103,7 +112,13 @@ notes in INSTALL_Windows.txt before starting below procedures. tools from command line. hdf55build takes the following options: + /vs7 Build HDF5 using Visual Studio .NET 2003 + Note: Default is Visual Studio 2005 + /vs9 Build HDF5 using Visual Studio 2008 + Note: Default is Visual Studio 2005 /fort Build HDF5 with Fortran libraries + /ivf101 Build HDF5 Fortran using Intel Visual Fortran 10.1 + Note: Default is Intel Visual Fortran 9.1 /useenv Build HDF5 using compiler settings defined in the environment, rather than the IDE. /? Help information diff --git a/release_docs/INSTALL_Windows_Short_NET.TXT b/release_docs/INSTALL_Windows_Short_NET.TXT index cabd665..1f2aa74 100755 --- a/release_docs/INSTALL_Windows_Short_NET.TXT +++ b/release_docs/INSTALL_Windows_Short_NET.TXT @@ -53,9 +53,9 @@ notes in INSTALL_Windows.txt before starting below procedures. Find the box "Show directories for", choose "Library files", If you cannot find your Zlib and Szip library path - (for example, c:\zlib123\lib, c:\szip\dll) + (for example, c:\zlib123\dll, c:\szip\dll) from the directory list, add the library path - (c:\zlib123\lib, c:\szip\dll) to the library directories. + (c:\zlib123\dll, c:\szip\dll) to the library directories. ======================================================================== Building HDF5 C/C++ Libraries with VS .NET diff --git a/release_docs/INSTALL_Windows_Short_VS2005.TXT b/release_docs/INSTALL_Windows_Short_VS2005.TXT index 86068bf..b668581 100755 --- a/release_docs/INSTALL_Windows_Short_VS2005.TXT +++ b/release_docs/INSTALL_Windows_Short_VS2005.TXT @@ -53,9 +53,9 @@ notes in INSTALL_Windows.txt before starting below procedures. c:\szip\include) to the included directories. Find the box "Show directories for", choose "Library files", If you cannot - find your Zlib and Szip library path (for example, c:\zlib123\lib, + find your Zlib and Szip library path (for example, c:\zlib123\dll, c:\szip\dll) from the directory list, add the library path - (c:\zlib123\lib, c:\szip\dll) to the library directories. + (c:\zlib123\dll, c:\szip\dll) to the library directories. ======================================================================== Building HDF5 C/C++ Libraries with Visual Studio 2005 diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index e859425..d9054a5 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -50,6 +50,7 @@ New Features Library: -------- + - Added 'mounted' field to H5G_info_t struct. (QAK - 2008/07/15) Parallel Library: ----------------- @@ -58,7 +59,23 @@ New Features ---------------- C++ Library: - ---------------- + ------------ + - These member functions were added as wrapper for H5Rdereference to + replace the incorrect IdComponent::dereference(). + void H5Object::dereference(H5File& h5file, void* ref) + void H5Object::dereference(H5Object& obj, void* ref) + In addition, these constructors were added to create the associated + objects by way of dereference: + Attribute(H5Object& obj, void* ref); + Attribute(H5File& file, void* ref); + DataSet(H5Object& obj, void* ref); + DataSet(H5File& file, void* ref); + DataType(H5Object& obj, void* ref); + DataType(H5File& file, void* ref); + Group(H5Object& obj, void* ref); + Group(H5File& obj, void* ref); + (BMR - 2008/08/10) + Tools: @@ -87,10 +104,23 @@ Bug Fixes since HDF5-1.8.0 release Library ------- - - Fixed the problem with the searching of target file for H5Lcreate_external(). - The searching pattern will depend on whether the target file's - pathname is an absolute or a relative path. Please see the description - in the RM for H5Lcreate_external(). (VC - 4/8/08) + - Fixed an issue where mount point traversal would fail when using + multiple handles for the child. (NAF - 2008/08/07) + - Fixed an issue where mount points were inaccessible when using multiple + file handles for the parent. The mount table is now in the shared + file structure (the parent pointer is still in the top structure). + (NAF - 2008/08/07) + - when an attribute was opened twice and data was written with one of the handles, + the file didn't have the data. It happened because each handle had its own + object structure, and the empty one overwrote the data with fill value. This is + fixed by making some attribute information like the data be shared in the + attribute structure. SLU - 2008/07/22 + - Fixed issue where a group could have a file mounted on it twice. + (QAK - 2008/07/15) + - Fixed the problem with the searching of target file for H5Lcreate_external(). + The searching pattern will depend on whether the target file's + pathname is an absolute or a relative path. Please see the description + in the RM for H5Lcreate_external(). (VC - 2008/04/08) - Fixed possible file corruption bug when encoding datatype descriptions for compound datatypes whose size was between 256 & 511 bytes and the file was opened with the "use the @@ -141,6 +171,18 @@ Bug Fixes since HDF5-1.8.0 release - Fixed bug that caused segfaults in Attribute::read. (BMR - 2008/04/20) - Fixed bug in PropList::getClassName to use portable HDfree instead of free. (BMR - 2008/04/20) + - Fixed a design bug which allowed an Attribute object to create/modify + attributes (bugzilla #1068). The API class hierarchy was revised + to address the problem. Classes AbstractDS and Attribute are moved + out of H5Object. Class Attribute now multiply inherits from + IdComponent and AbstractDs and class DataSet from H5Object and + AbstractDs. In addition, the data member IdComponent::id was + moved into subclasses: Attribute, DataSet, DataSpace, DataType, + H5File, Group, and PropList. (BMR - 2008/08/10) + - IdComponent::dereference was incorrect and replaced as described + in "New Features" section. + (BMR - 2008/08/10) + Platforms Tested diff --git a/src/H5A.c b/src/H5A.c index e4501dd..f7e571c 100644 --- a/src/H5A.c +++ b/src/H5A.c @@ -86,9 +86,12 @@ static herr_t H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_ /* Local Variables */ /*******************/ -/* Declare the free lists for H5A_t's */ +/* Declare the free lists of H5A_t */ H5FL_DEFINE(H5A_t); +/* Declare the free lists for H5A_shared_t's */ +H5FL_DEFINE(H5A_shared_t); + /* Declare a free list to manage blocks of type conversion data */ H5FL_BLK_DEFINE(attr_buf); @@ -393,9 +396,12 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type, if((attr = H5FL_CALLOC(H5A_t)) == NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for attribute info") + if(NULL == (attr->shared = H5FL_CALLOC(H5A_shared_t))) + HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, FAIL, "can't allocate shared attr structure") + /* If the creation property list is H5P_DEFAULT, use the default character encoding */ if(acpl_id == H5P_DEFAULT) - attr->encoding = H5F_DEFAULT_CSET; + attr->shared->encoding = H5F_DEFAULT_CSET; else { H5P_genplist_t *ac_plist; /* ACPL Property list */ @@ -403,59 +409,59 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type, if(NULL == (ac_plist = (H5P_genplist_t *)H5I_object(acpl_id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list") - if(H5P_get(ac_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->encoding)) < 0) + if(H5P_get(ac_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->shared->encoding)) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get character encoding flag") } /* end else */ /* Copy the attribute name */ - attr->name = H5MM_xstrdup(name); + attr->shared->name = H5MM_xstrdup(name); /* Copy the attribute's datatype */ - attr->dt = H5T_copy(type, H5T_COPY_ALL); + attr->shared->dt = H5T_copy(type, H5T_COPY_ALL); /* Mark any datatypes as being on disk now */ - if(H5T_set_loc(attr->dt, loc->oloc->file, H5T_LOC_DISK) < 0) + if(H5T_set_loc(attr->shared->dt, loc->oloc->file, H5T_LOC_DISK) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location") /* Set the latest format for datatype, if requested */ if(H5F_USE_LATEST_FORMAT(loc->oloc->file)) - if(H5T_set_latest_version(attr->dt) < 0) + if(H5T_set_latest_version(attr->shared->dt) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set latest version of datatype") /* Copy the dataspace for the attribute */ - attr->ds = H5S_copy(space, FALSE, TRUE); + attr->shared->ds = H5S_copy(space, FALSE, TRUE); /* Set the latest format for dataspace, if requested */ if(H5F_USE_LATEST_FORMAT(loc->oloc->file)) - if(H5S_set_latest_version(attr->ds) < 0) + if(H5S_set_latest_version(attr->shared->ds) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set latest version of dataspace") /* Mark it initially set to initialized */ - attr->initialized = TRUE; /*for now, set to false later*/ + attr->shared->initialized = TRUE; /*for now, set to false later*/ /* Copy the object header information */ - if(H5O_loc_copy(&(attr->oloc), loc->oloc, H5_COPY_DEEP) < 0) + if(H5O_loc_copy(&(attr->shared->oloc), loc->oloc, H5_COPY_DEEP) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry") /* Deep copy of the group hierarchy path */ if(H5G_name_copy(&(attr->path), loc->path, H5_COPY_DEEP) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy path") + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "unable to copy path") /* Check if any of the pieces should be (or are already) shared in the * SOHM table */ - if(H5SM_try_share(attr->oloc.file, dxpl_id, NULL, H5O_DTYPE_ID, attr->dt, NULL) < 0) + if(H5SM_try_share(attr->shared->oloc.file, dxpl_id, NULL, H5O_DTYPE_ID, attr->shared->dt, NULL) < 0) HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share datatype failed") - if(H5SM_try_share(attr->oloc.file, dxpl_id, NULL, H5O_SDSPACE_ID, attr->ds, NULL) < 0) + if(H5SM_try_share(attr->shared->oloc.file, dxpl_id, NULL, H5O_SDSPACE_ID, attr->shared->ds, NULL) < 0) HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share dataspace failed") /* Check whether datatype is committed & increment ref count * (to maintain ref. count incr/decr similarity with "shared message" * type of datatype sharing) */ - if(H5T_committed(attr->dt)) { + if(H5T_committed(attr->shared->dt)) { /* Increment the reference count on the shared datatype */ - if(H5T_link(attr->dt, 1, dxpl_id) < 0) + if(H5T_link(attr->shared->dt, 1, dxpl_id) < 0) HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared datatype link count") } /* end if */ @@ -463,29 +469,29 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type, * datatype and dataspace messages themselves, or the size of the "shared" * messages if either or both of them are shared. */ - attr->dt_size = H5O_msg_raw_size(attr->oloc.file, H5O_DTYPE_ID, FALSE, attr->dt); - attr->ds_size = H5O_msg_raw_size(attr->oloc.file, H5O_SDSPACE_ID, FALSE, attr->ds); + attr->shared->dt_size = H5O_msg_raw_size(attr->shared->oloc.file, H5O_DTYPE_ID, FALSE, attr->shared->dt); + attr->shared->ds_size = H5O_msg_raw_size(attr->shared->oloc.file, H5O_SDSPACE_ID, FALSE, attr->shared->ds); /* Get # of elements for attribute's dataspace */ - if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->ds)) < 0) + if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid") H5_ASSIGN_OVERFLOW(nelmts, snelmts, hssize_t, size_t); - HDassert(attr->dt_size > 0); - HDassert(attr->ds_size > 0); - attr->data_size = nelmts * H5T_get_size(attr->dt); + HDassert(attr->shared->dt_size > 0); + HDassert(attr->shared->ds_size > 0); + attr->shared->data_size = nelmts * H5T_get_size(attr->shared->dt); /* Hold the symbol table entry (and file) open */ - if(H5O_open(&(attr->oloc)) < 0) + if(H5O_open(&(attr->shared->oloc)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open") attr->obj_opened = TRUE; /* Set the version to encode the attribute with */ - if(H5A_set_version(attr->oloc.file, attr) < 0) + if(H5A_set_version(attr->shared->oloc.file, attr) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "unable to update attribute version") /* Insert the attribute into the object header */ - if(H5O_attr_create(&(attr->oloc), dxpl_id, attr) < 0) + if(H5O_attr_create(&(attr->shared->oloc), dxpl_id, attr) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to create attribute in object header") /* Register the new attribute and get an ID for it */ @@ -493,12 +499,11 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type, HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID") /* Now it's safe to say it's uninitialized */ - attr->initialized = FALSE; + attr->shared->initialized = FALSE; done: /* Cleanup on failure */ - if(ret_value < 0) - if(attr && H5A_close(attr) < 0) + if(ret_value < 0 && attr && H5A_close(attr) < 0) HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute") FUNC_LEAVE_NOAPI(ret_value) @@ -545,7 +550,7 @@ H5Aopen(hid_t loc_id, const char *attr_name, hid_t UNUSED aapl_id) /* Read in attribute from object header */ if(NULL == (attr = H5O_attr_open_by_name(loc.oloc, attr_name, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to load attribute info from object header") - attr->initialized = TRUE; + attr->shared->initialized = TRUE; /* Finish initializing attribute */ if(H5A_open_common(&loc, attr) < 0) @@ -732,7 +737,7 @@ H5A_open_common(const H5G_loc_t *loc, H5A_t *attr) #if defined(H5_USING_MEMCHECKER) || !defined(NDEBUG) /* Clear object location */ - if(H5O_loc_reset(&(attr->oloc)) < 0) + if(H5O_loc_reset(&(attr->shared->oloc)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to reset location") #endif /* H5_USING_MEMCHECKER */ @@ -741,15 +746,15 @@ H5A_open_common(const H5G_loc_t *loc, H5A_t *attr) HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release group hier. path") /* Deep copy of the symbol table entry */ - if(H5O_loc_copy(&(attr->oloc), loc->oloc, H5_COPY_DEEP) < 0) + if(H5O_loc_copy(&(attr->shared->oloc), loc->oloc, H5_COPY_DEEP) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry") /* Deep copy of the group hier. path */ if(H5G_name_copy(&(attr->path), loc->path, H5_COPY_DEEP) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry") + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "unable to copy entry") /* Hold the symbol table entry (and file) open */ - if(H5O_open(&(attr->oloc)) < 0) + if(H5O_open(&(attr->shared->oloc)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open") attr->obj_opened = TRUE; @@ -800,7 +805,7 @@ H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, /* Read in attribute from object header */ if(NULL == (attr = H5O_attr_open_by_idx(obj_loc.oloc, idx_type, order, n, dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to load attribute info from object header") - attr->initialized = TRUE; + attr->shared->initialized = TRUE; /* Finish initializing attribute */ if(H5A_open_common(&obj_loc, attr) < 0) @@ -866,7 +871,7 @@ H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name, const char *attr_na /* Read in attribute from object header */ if(NULL == (attr = H5O_attr_open_by_name(obj_loc.oloc, attr_name, dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to load attribute info from object header") - attr->initialized = TRUE; + attr->shared->initialized = TRUE; /* Finish initializing attribute */ if(H5A_open_common(loc, attr) < 0) @@ -970,7 +975,7 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) HDassert(buf); /* Get # of elements for attribute's dataspace */ - if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->ds)) < 0) + if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid") H5_ASSIGN_OVERFLOW(nelmts, snelmts, hssize_t, size_t); @@ -978,17 +983,17 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) if(nelmts > 0) { /* Get the memory and file datatype sizes */ src_type_size = H5T_get_size(mem_type); - dst_type_size = H5T_get_size(attr->dt); + dst_type_size = H5T_get_size(attr->shared->dt); /* Convert memory buffer into disk buffer */ /* Set up type conversion function */ - if(NULL == (tpath = H5T_path_find(mem_type, attr->dt, NULL, NULL, dxpl_id, FALSE))) + if(NULL == (tpath = H5T_path_find(mem_type, attr->shared->dt, NULL, NULL, dxpl_id, FALSE))) HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes") /* Check for type conversion required */ if(!H5T_path_noop(tpath)) { if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL))) < 0 || - (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->dt, H5T_COPY_ALL))) < 0) + (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->shared->dt, H5T_COPY_ALL))) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion") /* Get the maximum buffer size needed and allocate it */ @@ -1004,11 +1009,11 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "datatype conversion failed") /* Free the previous attribute data buffer, if there is one */ - if(attr->data) - attr->data = H5FL_BLK_FREE(attr_buf, attr->data); + if(attr->shared->data) + attr->shared->data = H5FL_BLK_FREE(attr_buf, attr->shared->data); /* Set the pointer to the attribute data to the converted information */ - attr->data = tconv_buf; + attr->shared->data = tconv_buf; tconv_owned = TRUE; } /* end if */ /* No type conversion necessary */ @@ -1016,21 +1021,21 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) HDassert(dst_type_size == src_type_size); /* Allocate the attribute buffer, if there isn't one */ - if(attr->data == NULL) - if(NULL == (attr->data = H5FL_BLK_MALLOC(attr_buf, dst_type_size * nelmts))) + if(attr->shared->data == NULL) + if(NULL == (attr->shared->data = H5FL_BLK_MALLOC(attr_buf, dst_type_size * nelmts))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") /* Copy the attribute data into the user's buffer */ - HDmemcpy(attr->data, buf, (dst_type_size * nelmts)); + HDmemcpy(attr->shared->data, buf, (dst_type_size * nelmts)); } /* end else */ /* Modify the attribute in the object header */ - if(H5O_attr_write(&(attr->oloc), dxpl_id, attr) < 0) + if(H5O_attr_write(&(attr->shared->oloc), dxpl_id, attr) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to modify attribute") } /* end if */ /* Indicate the the attribute doesn't need fill-values */ - attr->initialized = TRUE; + attr->shared->initialized = TRUE; done: /* Release resources */ @@ -1127,27 +1132,27 @@ H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id) HDassert(buf); /* Create buffer for data to store on disk */ - if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->ds)) < 0) + if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid") H5_ASSIGN_OVERFLOW(nelmts, snelmts, hssize_t, size_t); if(nelmts > 0) { /* Get the memory and file datatype sizes */ - src_type_size = H5T_get_size(attr->dt); + src_type_size = H5T_get_size(attr->shared->dt); dst_type_size = H5T_get_size(mem_type); /* Check if the attribute has any data yet, if not, fill with zeroes */ - if(attr->obj_opened && !attr->initialized) + if(attr->obj_opened && !attr->shared->initialized) HDmemset(buf, 0, (dst_type_size * nelmts)); else { /* Attribute exists and has a value */ /* Convert memory buffer into disk buffer */ /* Set up type conversion function */ - if(NULL == (tpath = H5T_path_find(attr->dt, mem_type, NULL, NULL, dxpl_id, FALSE))) + if(NULL == (tpath = H5T_path_find(attr->shared->dt, mem_type, NULL, NULL, dxpl_id, FALSE))) HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes") /* Check for type conversion required */ if(!H5T_path_noop(tpath)) { - if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->dt, H5T_COPY_ALL))) < 0 || + if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->shared->dt, H5T_COPY_ALL))) < 0 || (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL))) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion") @@ -1157,7 +1162,7 @@ H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") /* Copy the attribute data into the buffer for conversion */ - HDmemcpy(tconv_buf, attr->data, (src_type_size * nelmts)); + HDmemcpy(tconv_buf, attr->shared->data, (src_type_size * nelmts)); /* Perform datatype conversion. */ if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, tconv_buf, bkg_buf, dxpl_id) < 0) @@ -1171,7 +1176,7 @@ H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id) HDassert(dst_type_size == src_type_size); /* Copy the attribute data into the user's buffer */ - HDmemcpy(buf, attr->data, (dst_type_size * nelmts)); + HDmemcpy(buf, attr->shared->data, (dst_type_size * nelmts)); } /* end else */ } /* end else */ } /* end if */ @@ -1222,7 +1227,7 @@ H5Aget_space(hid_t attr_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute") /* Copy the attribute's dataspace */ - if(NULL == (ds = H5S_copy(attr->ds, FALSE, TRUE))) + if(NULL == (ds = H5S_copy(attr->shared->ds, FALSE, TRUE))) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to copy dataspace") /* Atomize */ @@ -1272,7 +1277,7 @@ H5Aget_type(hid_t attr_id) * reopen the type before returning it to the user. Make the type * read-only. */ - if(NULL == (dt = H5T_copy(attr->dt, H5T_COPY_REOPEN))) + if(NULL == (dt = H5T_copy(attr->shared->dt, H5T_COPY_REOPEN))) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to copy datatype") /* Mark any datatypes as being in memory now */ @@ -1341,7 +1346,7 @@ H5Aget_create_plist(hid_t attr_id) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list") /* Set the character encoding on the new property list */ - if(H5P_set(new_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->encoding)) < 0) + if(H5P_set(new_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->shared->encoding)) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set character encoding") ret_value = new_plist_id; @@ -1375,21 +1380,53 @@ done: ssize_t H5Aget_name(hid_t attr_id, size_t buf_size, char *buf) { - H5A_t *attr; /* Attribute object for ID */ - size_t copy_len, nbytes; + H5A_t *my_attr; /* Attribute object for ID */ ssize_t ret_value; FUNC_ENTER_API(H5Aget_name, FAIL) H5TRACE3("Zs", "iz*s", attr_id, buf_size, buf); /* check arguments */ - if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR))) + if(NULL == (my_attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute") if(!buf && buf_size) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid buffer") + /* Call private function in turn */ + if(0 > (ret_value = H5A_get_name(my_attr, buf_size, buf))) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get attribute name") + +done: + FUNC_LEAVE_API(ret_value) +} /* H5Aget_name() */ + + +/*-------------------------------------------------------------------------- + NAME + H5A_get_name + PURPOSE + Private function for H5Aget_name. Gets a copy of the name for an + attribute + RETURNS + This function returns the length of the attribute's name (which may be + longer than 'buf_size') on success or negative for failure. + DESCRIPTION + This function retrieves the name of an attribute for an attribute ID. + Up to 'buf_size' characters are stored in 'buf' followed by a '\0' string + terminator. If the name of the attribute is longer than 'buf_size'-1, + the string terminator is stored in the last position of the buffer to + properly terminate the string. +--------------------------------------------------------------------------*/ +ssize_t +H5A_get_name(H5A_t *attr, size_t buf_size, char *buf) +{ + size_t copy_len, nbytes; + ssize_t ret_value; + + FUNC_ENTER_NOAPI(H5A_get_name, FAIL) + /* get the real attribute length */ - nbytes = HDstrlen(attr->name); + nbytes = HDstrlen(attr->shared->name); HDassert((ssize_t)nbytes >= 0); /*overflow, pretty unlikely --rpm*/ /* compute the string length which will fit into the user's buffer */ @@ -1397,7 +1434,7 @@ H5Aget_name(hid_t attr_id, size_t buf_size, char *buf) /* Copy all/some of the name */ if(buf && copy_len > 0) { - HDmemcpy(buf, attr->name, copy_len); + HDmemcpy(buf, attr->shared->name, copy_len); /* Terminate the string */ buf[copy_len]='\0'; @@ -1407,8 +1444,8 @@ H5Aget_name(hid_t attr_id, size_t buf_size, char *buf) ret_value = (ssize_t)nbytes; done: - FUNC_LEAVE_API(ret_value) -} /* H5Aget_name() */ + FUNC_LEAVE_NOAPI(ret_value) +} /* H5A_get_name() */ /*------------------------------------------------------------------------- @@ -1463,11 +1500,11 @@ H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute") /* Get the length of the name */ - ret_value = (ssize_t)HDstrlen(attr->name); + ret_value = (ssize_t)HDstrlen(attr->shared->name); /* Copy the name into the user's buffer, if given */ if(name) { - HDstrncpy(name, attr->name, MIN((size_t)(ret_value + 1), size)); + HDstrncpy(name, attr->shared->name, MIN((size_t)(ret_value + 1), size)); if((size_t)ret_value >= size) name[size - 1]='\0'; } /* end if */ @@ -1512,7 +1549,7 @@ H5Aget_storage_size(hid_t attr_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an attribute") /* Set return value */ - ret_value = attr->data_size; + ret_value = attr->shared->data_size; done: FUNC_LEAVE_API(ret_value) @@ -1699,15 +1736,15 @@ H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo) HDassert(ainfo); /* Set info for attribute */ - ainfo->cset = attr->encoding; - ainfo->data_size = attr->data_size; - if(attr->crt_idx == H5O_MAX_CRT_ORDER_IDX) { + ainfo->cset = attr->shared->encoding; + ainfo->data_size = attr->shared->data_size; + if(attr->shared->crt_idx == H5O_MAX_CRT_ORDER_IDX) { ainfo->corder_valid = FALSE; ainfo->corder = 0; } /* end if */ else { ainfo->corder_valid = TRUE; - ainfo->corder = attr->crt_idx; + ainfo->corder = attr->shared->crt_idx; } /* end else */ done: @@ -2260,6 +2297,10 @@ done: * Programmer: Robb Matzke * Thursday, December 4, 1997 * + * Modification:Raymond Lu + * 4 June 2008 + * Changed some attribute information to be shared. + * *------------------------------------------------------------------------- */ H5A_t * @@ -2276,7 +2317,7 @@ H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr) /* Allocate attribute structure */ if(_new_attr == NULL) { - if(NULL == (new_attr = H5FL_MALLOC(H5A_t))) + if(NULL == (new_attr = H5FL_CALLOC(H5A_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") allocated_attr = TRUE; } /* end if */ @@ -2284,44 +2325,20 @@ H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr) new_attr = _new_attr; /* Copy the top level of the attribute */ - *new_attr = *old_attr; + new_attr->sh_loc = old_attr->sh_loc; - /* Don't open the object header for a copy */ - new_attr->obj_opened = FALSE; - - /* Copy the guts of the attribute */ - if(NULL == (new_attr->name = H5MM_xstrdup(old_attr->name))) - HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy attribute name") - if(NULL == (new_attr->dt = H5T_copy(old_attr->dt, H5T_COPY_ALL))) - HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy attribute datatype") - if(NULL == (new_attr->ds = H5S_copy(old_attr->ds, FALSE, TRUE))) - HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy attribute dataspace") - -#if defined(H5_USING_MEMCHECKER) || !defined(NDEBUG) - /* Clear object location */ - if(H5O_loc_reset(&(new_attr->oloc)) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to reset location") - - /* Clear path name */ - if(H5G_name_reset(&(new_attr->path)) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to reset path") -#endif /* H5_USING_MEMCHECKER */ - - /* Copy the object location and group path */ - if(H5O_loc_copy(&(new_attr->oloc), &(old_attr->oloc), H5_COPY_DEEP) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy object location") + /* Deep copy of the group hierarchy path */ if(H5G_name_copy(&(new_attr->path), &(old_attr->path), H5_COPY_DEEP) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy path") + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy path") - /* Copy the attribute data, if there is any */ - if(old_attr->data) { - /* Allocate data buffer for new attribute */ - if(NULL == (new_attr->data = H5FL_BLK_MALLOC(attr_buf, old_attr->data_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + /* Share some attribute information */ + new_attr->shared = old_attr->shared; - /* Copy the attribute data */ - HDmemcpy(new_attr->data, old_attr->data, old_attr->data_size); - } /* end if */ + /* Increment reference count for shared object */ + new_attr->shared->nrefs++; + + /* Don't open the object header for a copy */ + new_attr->obj_opened = FALSE; /* Set the return value */ ret_value = new_attr; @@ -2360,18 +2377,22 @@ H5A_free(H5A_t *attr) HDassert(attr); /* Free dynamicly allocated items */ - if(attr->name) - H5MM_xfree(attr->name); - if(attr->dt) - if(H5T_close(attr->dt) < 0) + if(attr->shared->name) { + H5MM_xfree(attr->shared->name); + attr->shared->name = NULL; + } + if(attr->shared->dt) { + if(H5T_close(attr->shared->dt) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release datatype info") - if(attr->ds) - if(H5S_close(attr->ds) < 0) + attr->shared->dt = NULL; + } + if(attr->shared->ds) { + if(H5S_close(attr->shared->ds) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release dataspace info") - if(attr->data) - attr->data = H5FL_BLK_FREE(attr_buf, attr->data); - if(H5G_name_free(&(attr->path)) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release group hier. path") + attr->shared->ds = NULL; + } + if(attr->shared->data) + attr->shared->data = H5FL_BLK_FREE(attr_buf, attr->shared->data); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2389,7 +2410,9 @@ done: * Monday, December 8, 1997 * * Modifications: - * + * Raymond Lu + * 4 June 2008 + * Changed some attribute object information to be shared. *------------------------------------------------------------------------- */ herr_t @@ -2400,30 +2423,31 @@ H5A_close(H5A_t *attr) FUNC_ENTER_NOAPI(H5A_close, FAIL) HDassert(attr); - - /* Check if the attribute has any data yet, if not, fill with zeroes */ - if(attr->obj_opened && !attr->initialized && attr->data_size) { - uint8_t *tmp_buf = H5FL_BLK_CALLOC(attr_buf, attr->data_size); - if(NULL == tmp_buf) - HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed for attribute fill-value") - - /* Go write the fill data to the attribute */ - if(H5A_write(attr, attr->dt, tmp_buf, H5AC_dxpl_id) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute") - - /* Free temporary buffer */ - H5FL_BLK_FREE(attr_buf, tmp_buf); - } /* end if */ - - /* Free dynamicly allocated items */ - if(H5A_free(attr) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info") + HDassert(attr->shared); /* Close the object's symbol-table entry */ - if(attr->obj_opened) - if(H5O_close(&(attr->oloc)) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release object header info") + if(attr->obj_opened && (H5O_close(&(attr->shared->oloc)) < 0)) + HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release object header info") + + /* Reference count can be 0. It only happens when H5A_create fails. */ + if(1 >= attr->shared->nrefs) { + /* Free dynamicly allocated items */ + if(H5A_free(attr) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info") + + /* Destroy shared attribute struct */ + attr->shared = H5FL_FREE(H5A_shared_t, attr->shared); + } else if(attr->shared->nrefs > 1) { + /* There are other references to the shared part of the attribute. + * Only decrement the reference count. */ + --attr->shared->nrefs; + } + + /* Free group hierarchy path */ + if(H5G_name_free(&(attr->path)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release group hier. path") + attr->shared = NULL; H5FL_FREE(H5A_t, attr); done: @@ -2456,7 +2480,7 @@ H5A_oloc(H5A_t *attr) HDassert(attr); /* Set return value */ - ret_value = &(attr->oloc); + ret_value = &(attr->shared->oloc); done: FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5Abtree2.c b/src/H5Abtree2.c index b685af7..07550da 100644 --- a/src/H5Abtree2.c +++ b/src/H5Abtree2.c @@ -172,7 +172,7 @@ H5A_dense_fh_name_cmp(const void *obj, size_t UNUSED obj_len, void *_udata) HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, FAIL, "can't decode attribute") /* Compare the string values */ - udata->cmp = HDstrcmp(udata->name, attr->name); + udata->cmp = HDstrcmp(udata->name, attr->shared->name); /* Check for correct attribute & callback to make */ if(udata->cmp == 0 && udata->found_op) { @@ -181,7 +181,7 @@ H5A_dense_fh_name_cmp(const void *obj, size_t UNUSED obj_len, void *_udata) H5SM_reconstitute(&(attr->sh_loc), udata->f, H5O_ATTR_ID, udata->record->id); /* Set the creation order index for the attribute */ - attr->crt_idx = udata->record->corder; + attr->shared->crt_idx = udata->record->corder; /* Make callback */ if((udata->found_op)(attr, &took_ownership, udata->found_op_data) < 0) diff --git a/src/H5Adense.c b/src/H5Adense.c index 45537be..79cd6fe 100644 --- a/src/H5Adense.c +++ b/src/H5Adense.c @@ -502,10 +502,10 @@ H5A_dense_insert(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, H5A_t *attr) udata.common.dxpl_id = dxpl_id; udata.common.fheap = fheap; udata.common.shared_fheap = shared_fheap; - udata.common.name = attr->name; - udata.common.name_hash = H5_checksum_lookup3(attr->name, HDstrlen(attr->name), 0); + udata.common.name = attr->shared->name; + udata.common.name_hash = H5_checksum_lookup3(attr->shared->name, HDstrlen(attr->shared->name), 0); H5_ASSIGN_OVERFLOW(udata.common.flags, mesg_flags, unsigned, uint8_t); - udata.common.corder = attr->crt_idx; + udata.common.corder = attr->shared->crt_idx; udata.common.found_op = NULL; udata.common.found_op_data = NULL; /* udata.id already set */ @@ -624,7 +624,7 @@ H5A_dense_write_bt2_cb(void *_record, void *_op_data, hbool_t *changed) udata.name = NULL; udata.name_hash = 0; udata.flags = 0; - udata.corder = op_data->attr->crt_idx; + udata.corder = op_data->attr->shared->crt_idx; udata.found_op = NULL; udata.found_op_data = NULL; @@ -744,8 +744,8 @@ H5A_dense_write(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, H5A_t *attr) udata.dxpl_id = dxpl_id; udata.fheap = fheap; udata.shared_fheap = shared_fheap; - udata.name = attr->name; - udata.name_hash = H5_checksum_lookup3(attr->name, HDstrlen(attr->name), 0); + udata.name = attr->shared->name; + udata.name_hash = H5_checksum_lookup3(attr->shared->name, HDstrlen(attr->shared->name), 0); udata.flags = 0; udata.corder = 0; udata.found_op = NULL; @@ -807,7 +807,7 @@ H5A_dense_copy_fh_cb(const void *obj, size_t UNUSED obj_len, void *_udata) HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, FAIL, "can't decode attribute") /* Set the creation order index for the attribute */ - udata->attr->crt_idx = udata->record->corder; + udata->attr->shared->crt_idx = udata->record->corder; /* Check whether we should "reconstitute" the shared message info */ if(udata->record->flags & H5O_MSG_FLAG_SHARED) @@ -904,8 +904,8 @@ H5A_dense_rename(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char * } /* end if */ /* Change name of attribute */ - H5MM_xfree(attr_copy->name); - attr_copy->name = H5MM_xstrdup(new_name); + H5MM_xfree(attr_copy->shared->name); + attr_copy->shared->name = H5MM_xstrdup(new_name); /* Recompute the version to encode the attribute with */ if(H5A_set_version(f, attr_copy) < 0) @@ -1020,14 +1020,14 @@ H5A_dense_iterate_bt2_cb(const void *_record, void *_bt2_udata) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5_ITER_ERROR, "unable to get attribute info") /* Make the application callback */ - ret_value = (bt2_udata->attr_op->u.app_op2)(bt2_udata->loc_id, fh_udata.attr->name, &ainfo, bt2_udata->op_data); + ret_value = (bt2_udata->attr_op->u.app_op2)(bt2_udata->loc_id, fh_udata.attr->shared->name, &ainfo, bt2_udata->op_data); break; } #ifndef H5_NO_DEPRECATED_SYMBOLS case H5A_ATTR_OP_APP: /* Make the application callback */ - ret_value = (bt2_udata->attr_op->u.app_op)(bt2_udata->loc_id, fh_udata.attr->name, bt2_udata->op_data); + ret_value = (bt2_udata->attr_op->u.app_op)(bt2_udata->loc_id, fh_udata.attr->shared->name, bt2_udata->op_data); break; #endif /* H5_NO_DEPRECATED_SYMBOLS */ @@ -1220,7 +1220,7 @@ H5A_dense_remove_bt2_cb(const void *_record, void *_udata) /* Check for removing the link from the creation order index */ if(H5F_addr_defined(udata->corder_bt2_addr)) { /* Set up the user data for the v2 B-tree 'record remove' callback */ - udata->common.corder = attr->crt_idx; + udata->common.corder = attr->shared->crt_idx; /* Remove the record from the creation order index v2 B-tree */ if(H5B2_remove(udata->common.f, udata->common.dxpl_id, H5A_BT2_CORDER, udata->corder_bt2_addr, udata, NULL, NULL) < 0) @@ -1400,7 +1400,7 @@ H5A_dense_remove_by_idx_bt2_cb(const void *_record, void *_bt2_udata) other_bt2_class = H5A_BT2_CORDER; /* Set up the user data for the v2 B-tree 'record remove' callback */ - other_bt2_udata.corder = fh_udata.attr->crt_idx; + other_bt2_udata.corder = fh_udata.attr->shared->crt_idx; } /* end if */ else { HDassert(bt2_udata->idx_type == H5_INDEX_CRT_ORDER); @@ -1413,8 +1413,8 @@ H5A_dense_remove_by_idx_bt2_cb(const void *_record, void *_bt2_udata) other_bt2_udata.dxpl_id = bt2_udata->dxpl_id; other_bt2_udata.fheap = bt2_udata->fheap; other_bt2_udata.shared_fheap = bt2_udata->shared_fheap; - other_bt2_udata.name = fh_udata.attr->name; - other_bt2_udata.name_hash = H5_checksum_lookup3(fh_udata.attr->name, HDstrlen(fh_udata.attr->name), 0); + other_bt2_udata.name = fh_udata.attr->shared->name; + other_bt2_udata.name_hash = H5_checksum_lookup3(fh_udata.attr->shared->name, HDstrlen(fh_udata.attr->shared->name), 0); other_bt2_udata.found_op = NULL; other_bt2_udata.found_op_data = NULL; } /* end else */ @@ -1570,7 +1570,7 @@ H5A_dense_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified") /* Delete appropriate attribute from dense storage */ - if(H5A_dense_remove(f, dxpl_id, ainfo, atable.attrs[n].name) < 0) + if(H5A_dense_remove(f, dxpl_id, ainfo, ((atable.attrs[n])->shared)->name) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute in dense storage") } /* end else */ diff --git a/src/H5Aint.c b/src/H5Aint.c index 71b6689..23a4e15 100644 --- a/src/H5Aint.c +++ b/src/H5Aint.c @@ -100,6 +100,8 @@ static herr_t H5A_attr_sort_table(H5A_attr_table_t *atable, H5_index_t idx_type, /* Local Variables */ /*******************/ +typedef H5A_t* H5A_t_ptr; +H5FL_SEQ_DEFINE(H5A_t_ptr); /*------------------------------------------------------------------------- @@ -114,6 +116,10 @@ static herr_t H5A_attr_sort_table(H5A_attr_table_t *atable, H5_index_t idx_type, * koziol@hdfgroup.org * Dec 18 2006 * + * Modification:Raymond Lu + * 24 June 2008 + * Changed the table of attribute objects to be the table of + * pointers to attribute objects for the ease of operation. *------------------------------------------------------------------------- */ static herr_t @@ -128,11 +134,23 @@ H5A_compact_build_table_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/, /* check args */ HDassert(mesg); - /* Check for re-allocating table */ + /* Re-allocate the table if necessary */ if(udata->curr_attr == udata->atable->nattrs) { + size_t i; size_t n = MAX(1, 2 * udata->atable->nattrs); - H5A_t *table = (H5A_t *)H5MM_realloc(udata->atable->attrs, - n * sizeof(H5A_t)); + H5A_t **table = (H5A_t **)H5FL_SEQ_CALLOC(H5A_t_ptr, n); + + /* Use attribute functions for operation */ + for(i=0; iatable->nattrs; i++) { + table[i] = (H5A_t *)H5FL_CALLOC(H5A_t); + if(NULL == H5A_copy(table[i], udata->atable->attrs[i])) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute") + if(H5A_close(udata->atable->attrs[i]) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, H5_ITER_ERROR, "can't close attribute") + } + + if(udata->atable->nattrs) + udata->atable->attrs = (H5A_t **)H5FL_SEQ_FREE(H5A_t_ptr, udata->atable->attrs); if(!table) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5_ITER_ERROR, "unable to extend attribute table") @@ -141,12 +159,14 @@ H5A_compact_build_table_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/, } /* end if */ /* Copy attribute into table */ - if(NULL == H5A_copy(&udata->atable->attrs[udata->curr_attr], (const H5A_t *)mesg->native)) + udata->atable->attrs[udata->curr_attr] = (H5A_t *)H5FL_CALLOC(H5A_t); + + if(NULL == H5A_copy(udata->atable->attrs[udata->curr_attr], (const H5A_t *)mesg->native)) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute") /* Assign [somewhat arbitrary] creation order value, if requested */ if(udata->bogus_crt_idx) - udata->atable->attrs[udata->curr_attr].crt_idx = sequence; + ((udata->atable->attrs[udata->curr_attr])->shared)->crt_idx = sequence; /* Increment current attribute */ udata->curr_attr++; @@ -246,8 +266,8 @@ H5A_dense_build_table_cb(const H5A_t *attr, void *_udata) HDassert(udata); HDassert(udata->curr_attr < udata->atable->nattrs); - /* Copy attribute information */ - if(NULL == H5A_copy(&udata->atable->attrs[udata->curr_attr], attr)) + /* Copy attribute information. Share the attribute object in copying. */ + if(NULL == H5A_copy(udata->atable->attrs[udata->curr_attr], attr)) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute") /* Increment number of attributes stored */ @@ -305,11 +325,17 @@ H5A_dense_build_table(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, if(atable->nattrs > 0) { H5A_dense_bt_ud_t udata; /* User data for iteration callback */ H5A_attr_iter_op_t attr_op; /* Attribute operator */ + unsigned i; /* Allocate the table to store the attributes */ - if((atable->attrs = (H5A_t *)H5MM_malloc(sizeof(H5A_t) * atable->nattrs)) == NULL) + if((atable->attrs = (H5A_t **)H5FL_SEQ_MALLOC(H5A_t_ptr, atable->nattrs)) == NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + /* Allocate pointers for each entry in the table */ + for(i=0; inattrs; i++) + if((atable->attrs[i] = (H5A_t *)H5FL_CALLOC(H5A_t)) == NULL) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + /* Set up user data for iteration */ udata.atable = atable; udata.curr_attr = 0; @@ -358,7 +384,8 @@ H5A_attr_cmp_name_inc(const void *attr1, const void *attr2) { FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_attr_cmp_name_inc) - FUNC_LEAVE_NOAPI(HDstrcmp(((const H5A_t *)attr1)->name, ((const H5A_t *)attr2)->name)) + FUNC_LEAVE_NOAPI(HDstrcmp((*(const H5A_t **)attr1)->shared->name, + (*(const H5A_t **)attr2)->shared->name)) } /* end H5A_attr_cmp_name_inc() */ @@ -385,7 +412,8 @@ H5A_attr_cmp_name_dec(const void *attr1, const void *attr2) { FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_attr_cmp_name_dec) - FUNC_LEAVE_NOAPI(HDstrcmp(((const H5A_t *)attr2)->name, ((const H5A_t *)attr1)->name)) + FUNC_LEAVE_NOAPI(HDstrcmp((*(const H5A_t **)attr2)->shared->name, + (*(const H5A_t **)attr1)->shared->name)) } /* end H5A_attr_cmp_name_dec() */ @@ -413,9 +441,9 @@ H5A_attr_cmp_corder_inc(const void *attr1, const void *attr2) FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_attr_cmp_corder_inc) - if(((const H5A_t *)attr1)->crt_idx < ((const H5A_t *)attr2)->crt_idx) + if((*(const H5A_t **)attr1)->shared->crt_idx < (*(const H5A_t **)attr2)->shared->crt_idx) ret_value = -1; - else if(((const H5A_t *)attr1)->crt_idx > ((const H5A_t *)attr2)->crt_idx) + else if((*(const H5A_t **)attr1)->shared->crt_idx > (*(const H5A_t **)attr2)->shared->crt_idx) ret_value = 1; else ret_value = 0; @@ -448,9 +476,9 @@ H5A_attr_cmp_corder_dec(const void *attr1, const void *attr2) FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_attr_cmp_corder_dec) - if(((const H5A_t *)attr1)->crt_idx < ((const H5A_t *)attr2)->crt_idx) + if((*(const H5A_t **)attr1)->shared->crt_idx < (*(const H5A_t **)attr2)->shared->crt_idx) ret_value = 1; - else if(((const H5A_t *)attr1)->crt_idx > ((const H5A_t *)attr2)->crt_idx) + else if((*(const H5A_t **)attr1)->shared->crt_idx > (*(const H5A_t **)attr2)->shared->crt_idx) ret_value = -1; else ret_value = 0; @@ -484,18 +512,18 @@ H5A_attr_sort_table(H5A_attr_table_t *atable, H5_index_t idx_type, /* Pick appropriate comparison routine */ if(idx_type == H5_INDEX_NAME) { if(order == H5_ITER_INC) - HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t), H5A_attr_cmp_name_inc); + HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A_attr_cmp_name_inc); else if(order == H5_ITER_DEC) - HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t), H5A_attr_cmp_name_dec); + HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A_attr_cmp_name_dec); else HDassert(order == H5_ITER_NATIVE); } /* end if */ else { HDassert(idx_type == H5_INDEX_CRT_ORDER); if(order == H5_ITER_INC) - HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t), H5A_attr_cmp_corder_inc); + HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A_attr_cmp_corder_inc); else if(order == H5_ITER_DEC) - HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t), H5A_attr_cmp_corder_dec); + HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A_attr_cmp_corder_dec); else HDassert(order == H5_ITER_NATIVE); } /* end else */ @@ -546,24 +574,24 @@ H5A_attr_iterate_table(const H5A_attr_table_t *atable, hsize_t skip, H5A_info_t ainfo; /* Info for attribute */ /* Get the attribute information */ - if(H5A_get_info(&atable->attrs[u], &ainfo) < 0) + if(H5A_get_info(atable->attrs[u], &ainfo) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5_ITER_ERROR, "unable to get attribute info") /* Make the application callback */ - ret_value = (attr_op->u.app_op2)(loc_id, atable->attrs[u].name, &ainfo, op_data); + ret_value = (attr_op->u.app_op2)(loc_id, ((atable->attrs[u])->shared)->name, &ainfo, op_data); break; } #ifndef H5_NO_DEPRECATED_SYMBOLS case H5A_ATTR_OP_APP: /* Make the application callback */ - ret_value = (attr_op->u.app_op)(loc_id, atable->attrs[u].name, op_data); + ret_value = (attr_op->u.app_op)(loc_id, ((atable->attrs[u])->shared)->name, op_data); break; #endif /* H5_NO_DEPRECATED_SYMBOLS */ case H5A_ATTR_OP_LIB: /* Call the library's callback */ - ret_value = (attr_op->u.lib_op)(&(atable->attrs[u]), op_data); + ret_value = (attr_op->u.lib_op)((atable->attrs[u]), op_data); break; default: @@ -588,22 +616,25 @@ done: /*------------------------------------------------------------------------- - * Function: H5A_attr_release_table + * Function: H5A_attr_release_table * - * Purpose: Release table containing a list of attributes for an object + * Purpose: Release table containing a list of attributes for an object * - * Return: Success: Non-negative - * Failure: Negative + * Return: Success: Non-negative + * Failure: Negative * - * Programmer: Quincey Koziol - * Dec 11, 2006 + * Programmer: Quincey Koziol + * Dec 11, 2006 * + * Modification: Raymond Lu + * 4 June 2008 + * Changed from H5A_free to H5A_close to release attributes. *------------------------------------------------------------------------- */ herr_t H5A_attr_release_table(H5A_attr_table_t *atable) { - size_t u; /* Local index variable */ + size_t u; /* Local index variable */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5A_attr_release_table) @@ -611,19 +642,19 @@ H5A_attr_release_table(H5A_attr_table_t *atable) /* Sanity check */ HDassert(atable); - /* Release attribute info, if any */ + /* Release attribute info, if any. */ if(atable->nattrs > 0) { /* Free attribute message information */ - for(u = 0; u < atable->nattrs; u++) - if(H5A_free(&(atable->attrs[u])) < 0) + for(u = 0; u < atable->nattrs; u++) { + if(H5A_close((atable->attrs[u])) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute") - - /* Free table of attributes */ - H5MM_xfree(atable->attrs); + } } /* end if */ else HDassert(atable->attrs == NULL); + atable->attrs = (H5A_t **)H5FL_SEQ_FREE(H5A_t_ptr, atable->attrs); + done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5A_attr_release_table() */ @@ -711,25 +742,25 @@ H5A_set_version(const H5F_t *f, H5A_t *attr) use_latest_format = H5F_USE_LATEST_FORMAT(f); /* Check whether datatype and dataspace are shared */ - if(H5O_msg_is_shared(H5O_DTYPE_ID, attr->dt) > 0) + if(H5O_msg_is_shared(H5O_DTYPE_ID, attr->shared->dt) > 0) type_shared = TRUE; else type_shared = FALSE; - if(H5O_msg_is_shared(H5O_SDSPACE_ID, attr->ds) > 0) + if(H5O_msg_is_shared(H5O_SDSPACE_ID, attr->shared->ds) > 0) space_shared = TRUE; else space_shared = FALSE; /* Check which version to encode attribute with */ if(use_latest_format) - attr->version = H5O_ATTR_VERSION_LATEST; /* Write out latest version of format */ - else if(attr->encoding != H5T_CSET_ASCII) - attr->version = H5O_ATTR_VERSION_3; /* Write version which includes the character encoding */ + attr->shared->version = H5O_ATTR_VERSION_LATEST; /* Write out latest version of format */ + else if(attr->shared->encoding != H5T_CSET_ASCII) + attr->shared->version = H5O_ATTR_VERSION_3; /* Write version which includes the character encoding */ else if(type_shared || space_shared) - attr->version = H5O_ATTR_VERSION_2; /* Write out version with flag for indicating shared datatype or dataspace */ + attr->shared->version = H5O_ATTR_VERSION_2; /* Write out version with flag for indicating shared datatype or dataspace */ else - attr->version = H5O_ATTR_VERSION_1; /* Write out basic version */ + attr->shared->version = H5O_ATTR_VERSION_1; /* Write out basic version */ FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5A_set_version() */ diff --git a/src/H5Apkg.h b/src/H5Apkg.h index 049877e..a1b5e62 100644 --- a/src/H5Apkg.h +++ b/src/H5Apkg.h @@ -72,16 +72,11 @@ /****************************/ /* Package Private Typedefs */ /****************************/ - -/* Define the main attribute structure */ -struct H5A_t { - H5O_shared_t sh_loc; /* Shared message info (must be first) */ - +/* Define the shared attribute structure */ +typedef struct H5A_shared_t { unsigned version; /* Version to encode attribute with */ hbool_t initialized;/* Indicate whether the attribute has been modified */ - hbool_t obj_opened; /* Object header entry opened? */ H5O_loc_t oloc; /* Object location for object attribute is on */ - H5G_name_t path; /* Group hierarchy path */ char *name; /* Attribute's name */ H5T_cset_t encoding; /* Character encoding of attribute name */ @@ -95,6 +90,15 @@ struct H5A_t { void *data; /* Attribute data (on a temporary basis) */ size_t data_size; /* Size of data on disk */ H5O_msg_crt_idx_t crt_idx; /* Attribute's creation index in the object header */ + unsigned nrefs; /* Ref count for times this object is refered */ +} H5A_shared_t; + +/* Define the main attribute structure */ +struct H5A_t { + H5O_shared_t sh_loc; /* Shared message info (must be first) */ + hbool_t obj_opened; /* Object header entry opened? */ + H5G_name_t path; /* Group hierarchy path */ + H5A_shared_t *shared; /* Shared attribute information */ }; /* Typedefs for "dense" attribute storage */ @@ -152,7 +156,7 @@ typedef struct H5A_bt2_ud_ins_t { /* Data structure to hold table of attributes for an object */ typedef struct { size_t nattrs; /* # of attributes in table */ - H5A_t *attrs; /* Pointer to array of attributes */ + H5A_t **attrs; /* Pointer to array of attribute pointers */ } H5A_attr_table_t; /* Attribute iteration operator for internal library callbacks */ @@ -184,6 +188,9 @@ struct H5A_attr_iter_op_t { /* Declare extern the free list for H5A_t's */ H5FL_EXTERN(H5A_t); +/* Declare the external free lists for H5A_shared_t's */ +H5FL_EXTERN(H5A_shared_t); + /* Declare extern a free list to manage blocks of type conversion data */ H5FL_BLK_EXTERN(attr_buf); @@ -206,6 +213,7 @@ H5_DLL H5A_t * H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name, const char *attr_name, hid_t lapl_id, hid_t dxpl_id); H5_DLL H5A_t *H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id, hid_t dxpl_id); +H5_DLL ssize_t H5A_get_name(H5A_t *attr, size_t buf_size, char *buf); H5_DLL H5A_t *H5A_copy(H5A_t *new_attr, const H5A_t *old_attr); H5_DLL herr_t H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo); H5_DLL herr_t H5A_free(H5A_t *attr); diff --git a/src/H5Atest.c b/src/H5Atest.c index 845c6c8..1fbaa42 100644 --- a/src/H5Atest.c +++ b/src/H5Atest.c @@ -140,7 +140,7 @@ H5A_get_shared_rc_test(hid_t attr_id, hsize_t *ref_count) HDassert(H5O_msg_is_shared(H5O_ATTR_ID, attr)); /* Retrieve ref count for shared or shareable attribute */ - if(H5SM_get_refcount(attr->oloc.file, H5AC_ind_dxpl_id, H5O_ATTR_ID, + if(H5SM_get_refcount(attr->shared->oloc.file, H5AC_ind_dxpl_id, H5O_ATTR_ID, &attr->sh_loc, ref_count) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve shared message ref count") diff --git a/src/H5F.c b/src/H5F.c index f301009..c11f41c 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -1083,6 +1083,10 @@ H5F_dest(H5F_t *f, hid_t dxpl_id) /* Push error, but keep going*/ HDONE_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "problems closing file") + /* Free mount table */ + f->shared->mtab.child = H5MM_xfree(f->shared->mtab.child); + f->shared->mtab.nalloc = 0; + /* Destroy shared file struct */ f->shared = H5FL_FREE(H5F_file_t,f->shared); @@ -1097,8 +1101,6 @@ H5F_dest(H5F_t *f, hid_t dxpl_id) /* Free the non-shared part of the file */ f->name = H5MM_xfree(f->name); f->extpath = H5MM_xfree(f->extpath); - f->mtab.child = H5MM_xfree(f->mtab.child); - f->mtab.nalloc = 0; if(H5FO_top_dest(f) < 0) HDONE_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "problems closing file") f->shared = NULL; @@ -1760,14 +1762,14 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags) /* Flush other files, depending on scope */ if(H5F_SCOPE_GLOBAL == scope) { - while(f->mtab.parent) - f = f->mtab.parent; + while(f->parent) + f = f->parent; scope = H5F_SCOPE_DOWN; } /* end while */ if(H5F_SCOPE_DOWN == scope) - for(i = 0; i < f->mtab.nmounts; i++) - if(H5F_flush(f->mtab.child[i].file, dxpl_id, scope, flags) < 0) + for(i = 0; i < f->shared->mtab.nmounts; i++) + if(H5F_flush(f->shared->mtab.child[i].file, dxpl_id, scope, flags) < 0) nerrors++; /* Flush any cached dataset storage raw data */ @@ -2002,8 +2004,8 @@ H5F_try_close(H5F_t *f) /* Check if this is a child file in a mounting hierarchy & proceed up the * hierarchy if so. */ - if(f->mtab.parent) - if(H5F_try_close(f->mtab.parent) < 0) + if(f->parent) + if(H5F_try_close(f->parent) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close parent file") /* Unmount and close each child before closing the current file. */ diff --git a/src/H5Fmount.c b/src/H5Fmount.c index 0181c6f..a86bc01 100644 --- a/src/H5Fmount.c +++ b/src/H5Fmount.c @@ -81,19 +81,23 @@ H5F_close_mounts(H5F_t *f) HDassert(f); /* Unmount all child files */ - for (u = 0; u < f->mtab.nmounts; u++) { - /* Detach the child file from the parent file */ - f->mtab.child[u].file->mtab.parent = NULL; - - /* Close the internal group maintaining the mount point */ - if(H5G_close(f->mtab.child[u].group) < 0) + for (u = 0; u < f->shared->mtab.nmounts; u++) { + /* Only unmount children mounted to this top level file structure */ + if(f->shared->mtab.child[u].file->parent == f) { + /* Detach the child file from the parent file */ + f->shared->mtab.child[u].file->parent = NULL; + + /* Close the internal group maintaining the mount point */ + if(H5G_close(f->shared->mtab.child[u].group) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close child group") - /* Close the child file */ - if(H5F_try_close(f->mtab.child[u].file) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close child file") + /* Close the child file */ + if(H5F_try_close(f->shared->mtab.child[u].file) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close child file") + } } /* end if */ - f->mtab.nmounts = 0; + f->shared->mtab.nmounts -= f->nmounts; + f->nmounts = 0; done: FUNC_LEAVE_NOAPI(ret_value) @@ -136,7 +140,7 @@ H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child, HDassert(child); HDassert(TRUE == H5P_isa_class(plist_id, H5P_FILE_MOUNT)); - /* Set up dataset location to fill in */ + /* Set up group location to fill in */ mp_loc.oloc = &mp_oloc; mp_loc.path = &mp_path; H5G_loc_reset(&mp_loc); @@ -147,7 +151,7 @@ H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child, * the parent & child files have the same file close degree, and * that the mount wouldn't introduce a cycle in the mount tree. */ - if(child->mtab.parent) + if(child->parent) HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "file is already mounted") if(H5G_loc_find(loc, name, &mp_loc/*out*/, H5P_DEFAULT, dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") @@ -162,6 +166,10 @@ H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child, if(NULL == (mount_point = H5G_open(&mp_loc, dxpl_id))) HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point not found") + /* Check if the proposed mount point group is already a mount point */ + if(H5G_MOUNTED(mount_point)) + HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point is already in use") + /* Retrieve information from the mount point group */ /* (Some of which we had before but was reset in mp_loc when the group * "took over" the group location - QAK) @@ -172,8 +180,8 @@ H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child, HDassert(mp_loc.oloc); mp_loc.path = H5G_nameof(mount_point); HDassert(mp_loc.path); - for(ancestor = parent; ancestor; ancestor = ancestor->mtab.parent) { - if(ancestor == child) + for(ancestor = parent; ancestor; ancestor = ancestor->parent) { + if(ancestor->shared == child->shared) HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount would introduce a cycle") } /* end for */ @@ -187,13 +195,13 @@ H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child, * `md' will be the index where the child should be inserted. */ lt = md = 0; - rt = parent->mtab.nmounts; + rt = parent->shared->mtab.nmounts; cmp = -1; while(lt < rt && cmp) { H5O_loc_t *oloc; /*temporary symbol table entry */ md = (lt + rt) / 2; - oloc = H5G_oloc(parent->mtab.child[md].group); + oloc = H5G_oloc(parent->shared->mtab.child[md].group); cmp = H5F_addr_cmp(mp_loc.oloc->addr, oloc->addr); if(cmp < 0) rt = md; @@ -206,26 +214,27 @@ H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child, HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point is already in use") /* Make room in the table */ - if(parent->mtab.nmounts >= parent->mtab.nalloc) { - unsigned n = MAX(16, 2 * parent->mtab.nalloc); - H5F_mount_t *x = H5MM_realloc(parent->mtab.child, - n * sizeof(parent->mtab.child[0])); + if(parent->shared->mtab.nmounts >= parent->shared->mtab.nalloc) { + unsigned n = MAX(16, 2 * parent->shared->mtab.nalloc); + H5F_mount_t *x = H5MM_realloc(parent->shared->mtab.child, + n * sizeof(parent->shared->mtab.child[0])); if(!x) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for mount table") - parent->mtab.child = x; - parent->mtab.nalloc = n; + parent->shared->mtab.child = x; + parent->shared->mtab.nalloc = n; } /* end if */ /* Insert into table */ - HDmemmove(parent->mtab.child + md + 1, parent->mtab.child + md, - (parent->mtab.nmounts-md) * sizeof(parent->mtab.child[0])); - parent->mtab.nmounts++; - parent->mtab.child[md].group = mount_point; - parent->mtab.child[md].file = child; - child->mtab.parent = parent; + HDmemmove(parent->shared->mtab.child + md + 1, parent->shared->mtab.child + md, + (parent->shared->mtab.nmounts-md) * sizeof(parent->shared->mtab.child[0])); + parent->shared->mtab.nmounts++; + parent->nmounts++; + parent->shared->mtab.child[md].group = mount_point; + parent->shared->mtab.child[md].file = child; + child->parent = parent; /* Set the group's mountpoint flag */ - if(H5G_mount(parent->mtab.child[md].group) < 0) + if(H5G_mount(parent->shared->mtab.child[md].group) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to set group mounted flag") /* Get the group location for the root group in the file to unmount */ @@ -312,16 +321,16 @@ H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id) mnt_oloc = H5G_oloc(child->shared->root_grp); child_idx = -1; - if(child->mtab.parent && H5F_addr_eq(mp_oloc.addr, mnt_oloc->addr)) { + if(child->parent && H5F_addr_eq(mp_oloc.addr, mnt_oloc->addr)) { unsigned u; /*counters */ /* * We've been given the root group of the child. We do a reverse * lookup in the parent's mount table to find the correct entry. */ - parent = child->mtab.parent; - for(u = 0; u < parent->mtab.nmounts; u++) { - if(parent->mtab.child[u].file == child) { + parent = child->parent; + for(u = 0; u < parent->shared->mtab.nmounts; u++) { + if(parent->shared->mtab.child[u].file->shared == child->shared) { /* Found the correct index */ child_idx = u; break; @@ -337,11 +346,11 @@ H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id) */ parent = child; /*we guessed wrong*/ lt = 0; - rt = parent->mtab.nmounts; + rt = parent->shared->mtab.nmounts; cmp = -1; while(lt < rt && cmp) { md = (lt + rt) / 2; - mnt_oloc = H5G_oloc(parent->mtab.child[md].group); + mnt_oloc = H5G_oloc(parent->shared->mtab.child[md].group); cmp = H5F_addr_cmp(mp_oloc.addr, mnt_oloc->addr); if (cmp<0) rt = md; @@ -356,13 +365,17 @@ H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id) H5G_loc_free(&mp_loc); mp_loc_setup = FALSE; mp_loc.oloc = mnt_oloc; - mp_loc.path = H5G_nameof(parent->mtab.child[md].group); - child = parent->mtab.child[child_idx].file; + mp_loc.path = H5G_nameof(parent->shared->mtab.child[md].group); + child = parent->shared->mtab.child[child_idx].file; + + /* Set the parent to be the actual parent of the discovered child. + * Could be different due to the shared mount table. */ + parent = child->parent; } /* end else */ HDassert(child_idx >= 0); /* Save the information about the child from the mount table */ - child_group = parent->mtab.child[child_idx].group; + child_group = parent->shared->mtab.child[child_idx].group; /* Get the group location for the root group in the file to unmount */ if(NULL == (root_loc.oloc = H5G_oloc(child->shared->root_grp))) @@ -377,9 +390,10 @@ H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to replace name") /* Eliminate the mount point from the table */ - HDmemmove(parent->mtab.child + child_idx, parent->mtab.child + child_idx + 1, - (parent->mtab.nmounts-child_idx) * sizeof(parent->mtab.child[0])); - parent->mtab.nmounts -= 1; + HDmemmove(parent->shared->mtab.child + child_idx, parent->shared->mtab.child + child_idx + 1, + (parent->shared->mtab.nmounts-child_idx) * sizeof(parent->shared->mtab.child[0])); + parent->shared->mtab.nmounts -= 1; + parent->nmounts -= 1; /* Unmount the child file from the parent file */ if(H5G_unmount(child_group) < 0) @@ -388,7 +402,7 @@ H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id) HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close unmounted group") /* Detach child file from parent & see if it should close */ - child->mtab.parent = NULL; + child->parent = NULL; if(H5F_try_close(child) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close unmounted file") @@ -402,37 +416,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_has_mount - * - * Purpose: Check if a file has mounted files within it. - * - * Return: Success: TRUE/FALSE - * Failure: (can't happen) - * - * Programmer: Quincey Koziol - * Thursday, January 2, 2002 - * - *------------------------------------------------------------------------- - */ -hbool_t -H5F_has_mount(const H5F_t *file) -{ - hbool_t ret_value; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_has_mount) - - HDassert(file); - - if(file->mtab.nmounts > 0) - ret_value = TRUE; - else - ret_value = FALSE; - - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_has_mount() */ - - -/*------------------------------------------------------------------------- * Function: H5F_is_mount * * Purpose: Check if a file is mounted within another file. @@ -454,7 +437,7 @@ H5F_is_mount(const H5F_t *file) HDassert(file); - if(file->mtab.parent != NULL) + if(file->parent != NULL) ret_value = TRUE; else ret_value = FALSE; @@ -594,15 +577,18 @@ H5F_mount_count_ids_recurse(H5F_t *f, unsigned *nopen_files, unsigned *nopen_obj * (Reduced by number of mounted files, we'll add back in the mount point's * groups later, if they are open) */ - *nopen_objs += (f->nopen_objs - f->mtab.nmounts); + *nopen_objs += (f->nopen_objs - f->nmounts); /* Iterate over files mounted in this file and add in their open ID counts also */ - for(u = 0; u < f->mtab.nmounts; u++) { - /* Increment the open object count if the mount point group has an open ID */ - if(H5G_get_shared_count(f->mtab.child[u].group) > 1) - *nopen_objs += 1; - - H5F_mount_count_ids_recurse(f->mtab.child[u].file, nopen_files, nopen_objs); + for(u = 0; u < f->shared->mtab.nmounts; u++) { + /* Only recurse on children mounted to this top level file structure */ + if(f->shared->mtab.child[u].file->parent == f) { + /* Increment the open object count if the mount point group has an open ID */ + if(H5G_get_shared_count(f->shared->mtab.child[u].group) > 1) + *nopen_objs += 1; + + H5F_mount_count_ids_recurse(f->shared->mtab.child[u].file, nopen_files, nopen_objs); + } } /* end for */ FUNC_LEAVE_NOAPI_VOID @@ -634,8 +620,8 @@ H5F_mount_count_ids(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs) HDassert(nopen_objs); /* Find the top file in the mounting hierarchy */ - while(f->mtab.parent) - f = f->mtab.parent; + while(f->parent) + f = f->parent; /* Count open IDs in the hierarchy */ H5F_mount_count_ids_recurse(f, nopen_files, nopen_objs); diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index 64da334..08a53a5 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -64,6 +64,22 @@ /* Mask for removing private file access flags */ #define H5F_ACC_PUBLIC_FLAGS 0x00ffu +/* A record of the mount table */ +typedef struct H5F_mount_t { + struct H5G_t *group; /* Mount point group held open */ + struct H5F_t *file; /* File mounted at that point */ +} H5F_mount_t; + +/* + * The mount table describes what files are attached to (mounted on) the file + * to which this table belongs. + */ +typedef struct H5F_mtab_t { + unsigned nmounts;/* Number of children which are mounted */ + unsigned nalloc; /* Number of mount slots allocated */ + H5F_mount_t *child; /* An array of mount records */ +} H5F_mtab_t; + /* * Define the structure to store the file information for HDF5 files. One of * these structures is allocated per file, not per H5Fopen(). That is, set of @@ -76,6 +92,7 @@ typedef struct H5F_file_t { unsigned nrefs; /* Ref count for times file is opened */ uint8_t status_flags; /* File status flags */ unsigned flags; /* Access Permissions for file */ + H5F_mtab_t mtab; /* File mount table */ /* Cached values from FCPL/superblock */ unsigned sym_leaf_k; /* Size of leaves in symbol tables */ @@ -126,23 +143,6 @@ typedef struct H5F_file_t { hsize_t mdc_jrnl_block_len; /* Length of mdc journal block */ } H5F_file_t; -/* A record of the mount table */ -typedef struct H5F_mount_t { - struct H5G_t *group; /* Mount point group held open */ - struct H5F_t *file; /* File mounted at that point */ -} H5F_mount_t; - -/* - * The mount table describes what files are attached to (mounted on) the file - * to which this table belongs. - */ -typedef struct H5F_mtab_t { - struct H5F_t *parent;/* Parent file */ - unsigned nmounts;/* Number of children which are mounted */ - unsigned nalloc; /* Number of mount slots allocated */ - H5F_mount_t *child; /* An array of mount records */ -} H5F_mtab_t; - /* * This is the top-level file descriptor. One of these structures is * allocated every time H5Fopen() is called although they may contain pointers @@ -160,7 +160,8 @@ struct H5F_t { H5FO_t *obj_count; /* # of time each object is opened through top file structure */ hid_t file_id; /* ID of this file */ hbool_t closing; /* File is in the process of being closed */ - H5F_mtab_t mtab; /* File mount table */ + struct H5F_t *parent; /* Parent file that this file is mounted to */ + unsigned nmounts; /* Number of children mounted to this file */ }; /*****************************/ diff --git a/src/H5G.c b/src/H5G.c index 51ba4df..6464dcb 100644 --- a/src/H5G.c +++ b/src/H5G.c @@ -1362,8 +1362,8 @@ H5G_rootof(H5F_t *f) { FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_rootof) - while(f->mtab.parent) - f = f->mtab.parent; + while(f->parent) + f = f->parent; FUNC_LEAVE_NOAPI(f->shared->root_grp) } /* end H5G_rootof() */ @@ -1528,6 +1528,30 @@ H5G_mount(H5G_t *grp) /*------------------------------------------------------------------------- + * Function: H5G_mounted + * + * Purpose: Retrieves the 'mounted' flag for a group + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Tuesday, July 15, 2008 + * + *------------------------------------------------------------------------- + */ +hbool_t +H5G_mounted(H5G_t *grp) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_mounted) + + /* Check args */ + HDassert(grp && grp->shared); + + FUNC_LEAVE_NOAPI(grp->shared->mounted) +} /* end H5G_mounted() */ + + +/*------------------------------------------------------------------------- * Function: H5G_unmount * * Purpose: Resets the 'mounted' flag for a group diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c index 051dd23..60093f6 100644 --- a/src/H5Gdeprec.c +++ b/src/H5Gdeprec.c @@ -1105,13 +1105,13 @@ H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx) if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "not a location ID") if(H5O_obj_type(loc.oloc, &obj_type, H5AC2_ind_dxpl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object type") + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5G_UNKNOWN, "can't get object type") if(obj_type != H5O_TYPE_GROUP) - HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "not a group") + HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "not a group") /* Call internal function*/ if((ret_value = H5G_obj_get_type_by_idx(loc.oloc, idx, H5AC2_ind_dxpl_id)) == H5G_UNKNOWN) - HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "can't get object type") + HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "can't get object type") done: FUNC_LEAVE_API(ret_value) diff --git a/src/H5Gname.c b/src/H5Gname.c index 1efb91e..c5fc2c1 100644 --- a/src/H5Gname.c +++ b/src/H5Gname.c @@ -700,19 +700,19 @@ H5G_name_replace_cb(void *obj_ptr, hid_t obj_id, void *key) HGOTO_DONE(SUCCEED) /* No need to look at object, it's path is already invalid */ /* Find the top file in object's mount hier. */ - if(oloc->file->mtab.parent) { + if(oloc->file->parent) { /* Check if object is in child file (for mount & unmount operations) */ if(names->dst_file && oloc->file->shared == names->dst_file->shared) obj_in_child = TRUE; /* Find the "top" file in the chain of mounted files */ - top_obj_file = oloc->file->mtab.parent; - while(top_obj_file->mtab.parent != NULL) { + top_obj_file = oloc->file->parent; + while(top_obj_file->parent != NULL) { /* Check if object is in child mount hier. (for mount & unmount operations) */ if(names->dst_file && top_obj_file->shared == names->dst_file->shared) obj_in_child = TRUE; - top_obj_file = top_obj_file->mtab.parent; + top_obj_file = top_obj_file->parent; } /* end while */ } /* end if */ else @@ -997,8 +997,8 @@ H5G_name_replace(const H5O_link_t *lnk, H5G_names_op_t op, H5F_t *src_file, H5G_names_t names; /* Structure to hold operation information for callback */ /* Find top file in src location's mount hierarchy */ - while(src_file->mtab.parent) - src_file = src_file->mtab.parent; + while(src_file->parent) + src_file = src_file->parent; /* Set up common information for callback */ names.src_file = src_file; @@ -1173,4 +1173,3 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5G_get_name_by_addr() */ - diff --git a/src/H5Gobj.c b/src/H5Gobj.c index 6ac6216..fbadab9 100644 --- a/src/H5Gobj.c +++ b/src/H5Gobj.c @@ -702,6 +702,10 @@ done: herr_t H5G_obj_info(H5O_loc_t *oloc, H5G_info_t *grp_info, hid_t dxpl_id) { + H5G_t *grp = NULL; /* Group to query */ + H5G_loc_t grp_loc; /* Entry of group to be queried */ + H5G_name_t grp_path; /* Group hier. path */ + H5O_loc_t grp_oloc; /* Group object location */ H5O_linfo_t linfo; /* Link info message */ herr_t ret_value = SUCCEED; /* Return value */ @@ -711,6 +715,22 @@ H5G_obj_info(H5O_loc_t *oloc, H5G_info_t *grp_info, hid_t dxpl_id) HDassert(oloc); HDassert(grp_info); + /* Set up group location to fill in */ + grp_loc.oloc = &grp_oloc; + grp_loc.path = &grp_path; + H5G_loc_reset(&grp_loc); + + /* Deep copy (duplicate) of the group location object */ + if(H5O_loc_copy(&grp_oloc, oloc, H5_COPY_DEEP) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, FAIL, "can't copy object location") + + /* Open the group */ + if(NULL == (grp = H5G_open(&grp_loc, dxpl_id))) + HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point not found") + + /* Get information from the group */ + grp_info->mounted = H5G_MOUNTED(grp); + /* Attempt to get the link info for this group */ if(H5G_obj_get_linfo(oloc, &linfo, dxpl_id)) { /* Retrieve the information about the links */ @@ -737,6 +757,10 @@ H5G_obj_info(H5O_loc_t *oloc, H5G_info_t *grp_info, hid_t dxpl_id) } /* end else */ done: + /* Clean up resources */ + if(grp && H5G_close(grp) < 0) + HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "unable to close queried group") + FUNC_LEAVE_NOAPI(ret_value) } /* end H5G_obj_info() */ diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h index c54f11d..ab6abc1 100644 --- a/src/H5Gprivate.h +++ b/src/H5Gprivate.h @@ -101,6 +101,12 @@ H5G_CRT_GINFO_EST_NAME_LEN \ } +/* If the module using this macro is allowed access to the private variables, access them directly */ +#ifdef H5G_PACKAGE +#define H5G_MOUNTED(G) ((G)->shared->mounted) +#else /* H5G_PACKAGE */ +#define H5G_MOUNTED(G) (H5G_mounted(G)) +#endif /* H5G_PACKAGE */ /* Type of operation being performed for call to H5G_name_replace() */ typedef enum { @@ -158,6 +164,7 @@ H5_DLL herr_t H5G_close(H5G_t *grp); H5_DLL herr_t H5G_free_grp_name(H5G_t *grp); H5_DLL herr_t H5G_get_shared_count(H5G_t *grp); H5_DLL herr_t H5G_mount(H5G_t *grp); +H5_DLL hbool_t H5G_mounted(H5G_t *grp); H5_DLL herr_t H5G_unmount(H5G_t *grp); #ifndef H5_NO_DEPRECATED_SYMBOLS H5_DLL H5G_obj_t H5G_map_obj_type(H5O_type_t obj_type); diff --git a/src/H5Gpublic.h b/src/H5Gpublic.h index e818e72..5ba7050 100644 --- a/src/H5Gpublic.h +++ b/src/H5Gpublic.h @@ -61,6 +61,7 @@ typedef struct H5G_info_t { H5G_storage_type_t storage_type; /* Type of storage for links in group */ hsize_t nlinks; /* Number of links in group */ int64_t max_corder; /* Current max. creation order value for group */ + hbool_t mounted; /* Whether group has a file mounted on it */ } H5G_info_t; /********************/ diff --git a/src/H5Gtraverse.c b/src/H5Gtraverse.c index 4fc345c..dcc77c2 100644 --- a/src/H5Gtraverse.c +++ b/src/H5Gtraverse.c @@ -384,7 +384,8 @@ done: static herr_t H5G_traverse_mount(H5G_loc_t *obj_loc/*in,out*/) { - H5F_t *parent = obj_loc->oloc->file; /* File of object */ + H5F_t *parent = obj_loc->oloc->file, /* File of object */ + *child = NULL; /* Child file */ unsigned lt, rt, md = 0; /* Binary search indices */ int cmp; H5O_loc_t *oloc = NULL; /* Object location for mount points */ @@ -405,11 +406,11 @@ H5G_traverse_mount(H5G_loc_t *obj_loc/*in,out*/) * table for the parent */ lt = 0; - rt = parent->mtab.nmounts; + rt = parent->shared->mtab.nmounts; cmp = -1; while(lt < rt && cmp) { md = (lt + rt) / 2; - oloc = H5G_oloc(parent->mtab.child[md].group); + oloc = H5G_oloc(parent->shared->mtab.child[md].group); cmp = H5F_addr_cmp(obj_loc->oloc->addr, oloc->addr); if(cmp < 0) rt = md; @@ -418,17 +419,28 @@ H5G_traverse_mount(H5G_loc_t *obj_loc/*in,out*/) } /* end while */ /* Copy root info over to ENT */ - if(0 == cmp) { - /* Get the location for the root group in the child's file */ - oloc = H5G_oloc(parent->mtab.child[md].file->shared->root_grp); - - /* Copy the entry for the root group */ - if(H5O_loc_copy(obj_loc->oloc, oloc, H5_COPY_DEEP) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "unable to copy object location") - - /* Switch to child's file */ - parent = oloc->file; - } /* end if */ + if(0 == cmp) { + /* Get the child file */ + child = parent->shared->mtab.child[md].file; + + /* Get the location for the root group in the child's file */ + oloc = H5G_oloc(child->shared->root_grp); + + /* Release the mount point */ + if(H5O_loc_free(obj_loc->oloc) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to free object location") + + /* Copy the entry for the root group */ + if(H5O_loc_copy(obj_loc->oloc, oloc, H5_COPY_DEEP) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "unable to copy object location") + + /* In case the shared root group info points to a different file handle + * than the child, modify obj_loc */ + obj_loc->oloc->file = child; + + /* Switch to child's file */ + parent = child; + } /* end if */ } while(!cmp); done: diff --git a/src/H5O.c b/src/H5O.c index 53ff4d7..f16ed1c 100644 --- a/src/H5O.c +++ b/src/H5O.c @@ -1391,7 +1391,7 @@ H5O_close(H5O_loc_t *loc) * If the file open object count has reached the number of open mount points * (each of which has a group open in the file) attempt to close the file. */ - if(loc->file->nopen_objs == loc->file->mtab.nmounts) + if(loc->file->nopen_objs == loc->file->nmounts) /* Attempt to close down the file hierarchy */ if(H5F_try_close(loc->file) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTCLOSEFILE, FAIL, "problem attempting file close") diff --git a/src/H5Oattr.c b/src/H5Oattr.c index adca14c..4bfeb3d 100644 --- a/src/H5Oattr.c +++ b/src/H5Oattr.c @@ -77,7 +77,7 @@ const H5O_msg_class_t H5O_MSG_ATTR[1] = {{ H5O_attr_shared_encode, /* encode message */ H5O_attr_copy, /* copy the native value */ H5O_attr_shared_size, /* size of raw message */ - H5O_attr_reset, /* reset method */ + H5O_attr_reset, /* reset method */ H5O_attr_free, /* free method */ H5O_attr_shared_delete, /* file delete method */ H5O_attr_shared_link, /* link method */ @@ -141,13 +141,16 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, unsigned UNUSED mesg_flags, if(NULL == (attr = H5FL_CALLOC(H5A_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + if(NULL == (attr->shared = H5FL_CALLOC(H5A_shared_t))) + HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared attr structure") + /* Version number */ - attr->version = *p++; - if(attr->version < H5O_ATTR_VERSION_1 || attr->version > H5O_ATTR_VERSION_LATEST) + attr->shared->version = *p++; + if(attr->shared->version < H5O_ATTR_VERSION_1 || attr->shared->version > H5O_ATTR_VERSION_LATEST) HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, NULL, "bad version number for attribute message") /* Get the flags byte if we have a later version of the attribute */ - if(attr->version >= H5O_ATTR_VERSION_2) { + if(attr->shared->version >= H5O_ATTR_VERSION_2) { flags = *p++; /* Check for unknown flag */ @@ -162,36 +165,36 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, unsigned UNUSED mesg_flags, * the file are exact but the parts are aligned on 8-byte boundaries. */ UINT16DECODE(p, name_len); /*including null*/ - UINT16DECODE(p, attr->dt_size); - UINT16DECODE(p, attr->ds_size); + UINT16DECODE(p, attr->shared->dt_size); + UINT16DECODE(p, attr->shared->ds_size); /* * Decode the character encoding for the name for versions 3 or later, * as well as some reserved bytes. */ - if(attr->version >= H5O_ATTR_VERSION_3) - attr->encoding = *p++; + if(attr->shared->version >= H5O_ATTR_VERSION_3) + attr->shared->encoding = *p++; /* Decode and store the name */ - if(NULL == (attr->name = H5MM_strdup((const char *)p))) + if(NULL == (attr->shared->name = H5MM_strdup((const char *)p))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - if(attr->version < H5O_ATTR_VERSION_2) + if(attr->shared->version < H5O_ATTR_VERSION_2) p += H5O_ALIGN_OLD(name_len); /* advance the memory pointer */ else p += name_len; /* advance the memory pointer */ /* Decode the attribute's datatype */ - if((attr->dt = (H5T_t *)(H5O_MSG_DTYPE->decode)(f, dxpl_id, ((flags & H5O_ATTR_FLAG_TYPE_SHARED) ? H5O_MSG_FLAG_SHARED : 0), p)) == NULL) + if((attr->shared->dt = (H5T_t *)(H5O_MSG_DTYPE->decode)(f, dxpl_id, ((flags & H5O_ATTR_FLAG_TYPE_SHARED) ? H5O_MSG_FLAG_SHARED : 0), p)) == NULL) HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, NULL, "can't decode attribute datatype") - if(attr->version < H5O_ATTR_VERSION_2) - p += H5O_ALIGN_OLD(attr->dt_size); + if(attr->shared->version < H5O_ATTR_VERSION_2) + p += H5O_ALIGN_OLD(attr->shared->dt_size); else - p += attr->dt_size; + p += attr->shared->dt_size; /* decode the attribute dataspace. It can be shared in versions >= 3 * What's actually shared, though, is only the extent. */ - if(NULL == (attr->ds = H5FL_CALLOC(H5S_t))) + if(NULL == (attr->shared->ds = H5FL_CALLOC(H5S_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") /* Decode attribute's dataspace extent */ @@ -199,32 +202,36 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, unsigned UNUSED mesg_flags, HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, NULL, "can't decode attribute dataspace") /* Copy the extent information to the dataspace */ - HDmemcpy(&(attr->ds->extent), extent, sizeof(H5S_extent_t)); + HDmemcpy(&(attr->shared->ds->extent), extent, sizeof(H5S_extent_t)); /* Release temporary extent information */ H5FL_FREE(H5S_extent_t, extent); /* Default to entire dataspace being selected */ - if(H5S_select_all(attr->ds, FALSE) < 0) + if(H5S_select_all(attr->shared->ds, FALSE) < 0) HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection") - if(attr->version < H5O_ATTR_VERSION_2) - p += H5O_ALIGN_OLD(attr->ds_size); + if(attr->shared->version < H5O_ATTR_VERSION_2) + p += H5O_ALIGN_OLD(attr->shared->ds_size); else - p += attr->ds_size; + p += attr->shared->ds_size; /* Compute the size of the data */ - H5_ASSIGN_OVERFLOW(attr->data_size, H5S_GET_EXTENT_NPOINTS(attr->ds) * H5T_get_size(attr->dt), hsize_t, size_t); + H5_ASSIGN_OVERFLOW(attr->shared->data_size, H5S_GET_EXTENT_NPOINTS(attr->shared->ds) * H5T_get_size(attr->shared->dt), hsize_t, size_t); /* Go get the data */ - if(attr->data_size) { - if(NULL == (attr->data = H5FL_BLK_MALLOC(attr_buf, attr->data_size))) + if(attr->shared->data_size) { + if(NULL == (attr->shared->data = H5FL_BLK_MALLOC(attr_buf, attr->shared->data_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemcpy(attr->data, p, attr->data_size); + HDmemcpy(attr->shared->data, p, attr->shared->data_size); } /* end if */ /* Indicate that the fill values aren't to be written out */ - attr->initialized = 1; + attr->shared->initialized = 1; + + /* Increment the reference count for this object header message in cache(compact + storage) or for the object from dense storage. */ + attr->shared->nrefs++; /* Set return value */ ret_value = attr; @@ -268,17 +275,17 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg) HDassert(attr); /* Check whether datatype and dataspace are shared */ - if((is_type_shared = H5O_msg_is_shared(H5O_DTYPE_ID, attr->dt)) < 0) + if((is_type_shared = H5O_msg_is_shared(H5O_DTYPE_ID, attr->shared->dt)) < 0) HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't determine if datatype is shared") - if((is_space_shared = H5O_msg_is_shared(H5O_SDSPACE_ID, attr->ds)) < 0) + if((is_space_shared = H5O_msg_is_shared(H5O_SDSPACE_ID, attr->shared->ds)) < 0) HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't determine if dataspace is shared") /* Encode Version */ - *p++ = attr->version; + *p++ = attr->shared->version; /* Set attribute flags if version >1 */ - if(attr->version >= H5O_ATTR_VERSION_2) { + if(attr->shared->version >= H5O_ATTR_VERSION_2) { flags = (is_type_shared ? H5O_ATTR_FLAG_TYPE_SHARED : 0 ); flags |= (is_space_shared ? H5O_ATTR_FLAG_SPACE_SHARED : 0); *p++ = flags; /* Set flags for attribute */ @@ -291,18 +298,18 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg) * encoded lengths are exact but we pad each part except the data to be a * multiple of eight bytes (in the first version). */ - name_len = HDstrlen(attr->name) + 1; + name_len = HDstrlen(attr->shared->name) + 1; UINT16ENCODE(p, name_len); - UINT16ENCODE(p, attr->dt_size); - UINT16ENCODE(p, attr->ds_size); + UINT16ENCODE(p, attr->shared->dt_size); + UINT16ENCODE(p, attr->shared->ds_size); /* The character encoding for the attribute's name, in later versions */ - if(attr->version >= H5O_ATTR_VERSION_3) - *p++ = attr->encoding; + if(attr->shared->version >= H5O_ATTR_VERSION_3) + *p++ = attr->shared->encoding; /* Write the name including null terminator */ - HDmemcpy(p, attr->name, name_len); - if(attr->version < H5O_ATTR_VERSION_2) { + HDmemcpy(p, attr->shared->name, name_len); + if(attr->shared->version < H5O_ATTR_VERSION_2) { /* Pad to the correct number of bytes */ HDmemset(p + name_len, 0, H5O_ALIGN_OLD(name_len) - name_len); p += H5O_ALIGN_OLD(name_len); @@ -311,32 +318,32 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg) p += name_len; /* encode the attribute datatype */ - if((H5O_MSG_DTYPE->encode)(f, FALSE, p, attr->dt) < 0) + if((H5O_MSG_DTYPE->encode)(f, FALSE, p, attr->shared->dt) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute datatype") - if(attr->version < H5O_ATTR_VERSION_2) { - HDmemset(p + attr->dt_size, 0, H5O_ALIGN_OLD(attr->dt_size) - attr->dt_size); - p += H5O_ALIGN_OLD(attr->dt_size); + if(attr->shared->version < H5O_ATTR_VERSION_2) { + HDmemset(p + attr->shared->dt_size, 0, H5O_ALIGN_OLD(attr->shared->dt_size) - attr->shared->dt_size); + p += H5O_ALIGN_OLD(attr->shared->dt_size); } /* end if */ else - p += attr->dt_size; + p += attr->shared->dt_size; /* encode the attribute dataspace */ - if((H5O_MSG_SDSPACE->encode)(f, FALSE, p, &(attr->ds->extent)) < 0) + if((H5O_MSG_SDSPACE->encode)(f, FALSE, p, &(attr->shared->ds->extent)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute dataspace") - if(attr->version < H5O_ATTR_VERSION_2) { - HDmemset(p + attr->ds_size, 0, H5O_ALIGN_OLD(attr->ds_size) - attr->ds_size); - p += H5O_ALIGN_OLD(attr->ds_size); + if(attr->shared->version < H5O_ATTR_VERSION_2) { + HDmemset(p + attr->shared->ds_size, 0, H5O_ALIGN_OLD(attr->shared->ds_size) - attr->shared->ds_size); + p += H5O_ALIGN_OLD(attr->shared->ds_size); } /* end if */ else - p += attr->ds_size; + p += attr->shared->ds_size; - /* Store attribute data */ - if(attr->data) - HDmemcpy(p, attr->data, attr->data_size); + /* Store attribute data. If there's no data, store 0 as fill value. */ + if(attr->shared->data) + HDmemcpy(p, attr->shared->data, attr->shared->data_size); else - HDmemset(p, 0, attr->data_size); + HDmemset(p, 0, attr->shared->data_size); done: FUNC_LEAVE_NOAPI(ret_value); @@ -412,25 +419,25 @@ H5O_attr_size(const H5F_t UNUSED *f, const void *_mesg) 2; /*space size */ /* Length of attribute name */ - name_len = HDstrlen(attr->name) + 1; + name_len = HDstrlen(attr->shared->name) + 1; /* Version-specific size information */ - if(attr->version == H5O_ATTR_VERSION_1) + if(attr->shared->version == H5O_ATTR_VERSION_1) ret_value += H5O_ALIGN_OLD(name_len) + /*attribute name */ - H5O_ALIGN_OLD(attr->dt_size) + /*datatype */ - H5O_ALIGN_OLD(attr->ds_size) + /*dataspace */ - attr->data_size; /*the data itself */ - else if(attr->version == H5O_ATTR_VERSION_2) + H5O_ALIGN_OLD(attr->shared->dt_size) + /*datatype */ + H5O_ALIGN_OLD(attr->shared->ds_size) + /*dataspace */ + attr->shared->data_size; /*the data itself */ + else if(attr->shared->version == H5O_ATTR_VERSION_2) ret_value += name_len + /*attribute name */ - attr->dt_size + /*datatype */ - attr->ds_size + /*dataspace */ - attr->data_size; /*the data itself */ - else if(attr->version == H5O_ATTR_VERSION_3) + attr->shared->dt_size + /*datatype */ + attr->shared->ds_size + /*dataspace */ + attr->shared->data_size; /*the data itself */ + else if(attr->shared->version == H5O_ATTR_VERSION_3) ret_value += 1 + /*character encoding */ name_len + /*attribute name */ - attr->dt_size + /*datatype */ - attr->ds_size + /*dataspace */ - attr->data_size; /*the data itself */ + attr->shared->dt_size + /*datatype */ + attr->shared->ds_size + /*dataspace */ + attr->shared->data_size; /*the data itself */ else HDassert(0 && "Bad attribute version"); @@ -449,18 +456,20 @@ H5O_attr_size(const H5F_t UNUSED *f, const void *_mesg) * Programmer: Robb Matzke * Tuesday, December 9, 1997 * + * Modification:Raymond Lu + * 25 June 2008 + * Made this function empty. The freeing action is actually + * done in H5O_attr_free (see H5O_msg_free_real). But this + * empty reset function needs to be here. Otherwise, the + * caller function H5O_msg_reset_real will zero-set the whole + * message. *------------------------------------------------------------------------- */ herr_t H5O_attr_reset(void *_mesg) { - H5A_t *attr = (H5A_t *)_mesg; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_attr_reset) - if(attr) - H5A_free(attr); - FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5O_attr_reset() */ @@ -475,18 +484,27 @@ H5O_attr_reset(void *_mesg) * Programmer: Quincey Koziol * Thursday, November 18, 2004 * + * Modification:Raymond Lu + * 4 June 2008 + * Let this function call H5A_close in turn. + * *------------------------------------------------------------------------- */ static herr_t H5O_attr_free(void *mesg) { - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_attr_free) + H5A_t *attr = (H5A_t *)mesg; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_attr_free) HDassert(mesg); - H5FL_FREE(H5A_t, mesg); + if(H5A_close(attr) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, FAIL, "unable to close attribute object") - FUNC_LEAVE_NOAPI(SUCCEED) +done: + FUNC_LEAVE_NOAPI(ret_value) } /* end H5O_attr_free() */ @@ -515,11 +533,11 @@ H5O_attr_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *_mesg) HDassert(attr); /* Decrement reference count on datatype in file */ - if((H5O_MSG_DTYPE->del)(f, dxpl_id, oh, attr->dt) < 0) + if((H5O_MSG_DTYPE->del)(f, dxpl_id, oh, attr->shared->dt) < 0) HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust datatype link count") /* Decrement reference count on dataspace in file */ - if((H5O_MSG_SDSPACE->del)(f, dxpl_id, oh, attr->ds) < 0) + if((H5O_MSG_SDSPACE->del)(f, dxpl_id, oh, attr->shared->ds) < 0) HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust dataspace link count") done: @@ -558,9 +576,9 @@ H5O_attr_link(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *_mesg) * message is deleted. */ /* Increment reference count on datatype & dataspace in file */ - if((H5O_MSG_DTYPE->link)(f, dxpl_id, oh, attr->dt) < 0) + if((H5O_MSG_DTYPE->link)(f, dxpl_id, oh, attr->shared->dt) < 0) HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust datatype link count") - if((H5O_MSG_SDSPACE->link)(f, dxpl_id, oh, attr->ds) < 0) + if((H5O_MSG_SDSPACE->link)(f, dxpl_id, oh, attr->shared->ds) < 0) HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust dataspace link count") done: @@ -650,33 +668,39 @@ H5O_attr_copy_file(H5F_t UNUSED *file_src, const H5O_msg_class_t UNUSED *mesg_ty /* Copy the top level of the attribute */ *attr_dst = *attr_src; + if(NULL == (attr_dst->shared = H5FL_CALLOC(H5A_shared_t))) + HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared attr structure") + /* Don't have an opened group location for copy */ - H5O_loc_reset(&(attr_dst->oloc)); + H5O_loc_reset(&(attr_dst->shared->oloc)); H5G_name_reset(&(attr_dst->path)); attr_dst->obj_opened = FALSE; - + + /* Reference count for the header message in the cache */ + attr_dst->shared->nrefs = 1; + /* Copy attribute's name */ - attr_dst->name = H5MM_strdup(attr_src->name); - HDassert(attr_dst->name); + attr_dst->shared->name = H5MM_strdup(attr_src->shared->name); + HDassert(attr_dst->shared->name); /* Copy attribute's datatype */ /* (Start destination datatype as transient, even if source is named) */ - attr_dst->dt = H5T_copy(attr_src->dt, H5T_COPY_ALL); - HDassert(attr_dst->dt); + attr_dst->shared->dt = H5T_copy(attr_src->shared->dt, H5T_COPY_ALL); + HDassert(attr_dst->shared->dt); /* Set the location of the destination datatype */ - if(H5T_set_loc(attr_dst->dt, file_dst, H5T_LOC_DISK) < 0) + if(H5T_set_loc(attr_dst->shared->dt, file_dst, H5T_LOC_DISK) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "cannot mark datatype on disk") /* Check for named datatype being copied */ - if(H5T_committed(attr_src->dt)) { + if(H5T_committed(attr_src->shared->dt)) { H5O_loc_t *src_oloc; /* Pointer to source datatype's object location */ H5O_loc_t *dst_oloc; /* Pointer to dest. datatype's object location */ /* Get group entries for source & destination */ - src_oloc = H5T_oloc(attr_src->dt); + src_oloc = H5T_oloc(attr_src->shared->dt); HDassert(src_oloc); - dst_oloc = H5T_oloc(attr_dst->dt); + dst_oloc = H5T_oloc(attr_dst->shared->dt); HDassert(dst_oloc); /* Reset object location for new object */ @@ -688,59 +712,59 @@ H5O_attr_copy_file(H5F_t UNUSED *file_src, const H5O_msg_class_t UNUSED *mesg_ty HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy object") /* Update shared message info from named datatype info */ - H5T_update_shared(attr_dst->dt); + H5T_update_shared(attr_dst->shared->dt); } /* end if */ else { /* If the datatype is not named, it may have been shared in the * source file's heap. Un-share it for now. We'll try to shared * it in the destination file below. */ - if(H5O_msg_reset_share(H5O_DTYPE_ID, attr_dst->dt) < 0) + if(H5O_msg_reset_share(H5O_DTYPE_ID, attr_dst->shared->dt) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset datatype sharing") } /* end else */ /* Copy the dataspace for the attribute */ - attr_dst->ds = H5S_copy(attr_src->ds, FALSE, FALSE); - HDassert(attr_dst->ds); + attr_dst->shared->ds = H5S_copy(attr_src->shared->ds, FALSE, FALSE); + HDassert(attr_dst->shared->ds); /* Reset the dataspace's sharing in the source file before trying to share * it in the destination. */ - if(H5O_msg_reset_share(H5O_SDSPACE_ID, attr_dst->ds) < 0) + if(H5O_msg_reset_share(H5O_SDSPACE_ID, attr_dst->shared->ds) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset dataspace sharing") /* Try to share both the datatype and dataset. This does nothing if the * datatype is committed or sharing is disabled. */ - if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_DTYPE_ID, attr_dst->dt, NULL) < 0) + if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_DTYPE_ID, attr_dst->shared->dt, NULL) < 0) HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute datatype") - if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_SDSPACE_ID, attr_dst->ds, NULL) < 0) + if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_SDSPACE_ID, attr_dst->shared->ds, NULL) < 0) HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute dataspace") /* Compute the sizes of the datatype and dataspace. This is their raw * size unless they're shared. */ - attr_dst->dt_size = H5O_msg_raw_size(file_dst, H5O_DTYPE_ID, FALSE, attr_dst->dt); - HDassert(attr_dst->dt_size > 0); - attr_dst->ds_size = H5O_msg_raw_size(file_dst, H5O_SDSPACE_ID, FALSE, attr_dst->ds); - HDassert(attr_dst->ds_size > 0); + attr_dst->shared->dt_size = H5O_msg_raw_size(file_dst, H5O_DTYPE_ID, FALSE, attr_dst->shared->dt); + HDassert(attr_dst->shared->dt_size > 0); + attr_dst->shared->ds_size = H5O_msg_raw_size(file_dst, H5O_SDSPACE_ID, FALSE, attr_dst->shared->ds); + HDassert(attr_dst->shared->ds_size > 0); /* Check whether to recompute the size of the attribute */ /* (happens when the datatype or dataspace changes sharing status) */ - if(attr_dst->dt_size != attr_src->dt_size || attr_dst->ds_size != attr_src->ds_size) + if(attr_dst->shared->dt_size != attr_src->shared->dt_size || attr_dst->shared->ds_size != attr_src->shared->ds_size) *recompute_size = TRUE; /* Compute the size of the data */ - H5_ASSIGN_OVERFLOW(attr_dst->data_size, H5S_GET_EXTENT_NPOINTS(attr_dst->ds) * H5T_get_size(attr_dst->dt), hsize_t, size_t); + H5_ASSIGN_OVERFLOW(attr_dst->shared->data_size, H5S_GET_EXTENT_NPOINTS(attr_dst->shared->ds) * H5T_get_size(attr_dst->shared->dt), hsize_t, size_t); /* Copy (& convert) the data, if necessary */ - if(attr_src->data) { - if(NULL == (attr_dst->data = H5FL_BLK_MALLOC(attr_buf, attr_dst->data_size))) + if(attr_src->shared->data) { + if(NULL == (attr_dst->shared->data = H5FL_BLK_MALLOC(attr_buf, attr_dst->shared->data_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") /* Check if we need to convert data */ - if(H5T_detect_class(attr_src->dt, H5T_VLEN) > 0) { + if(H5T_detect_class(attr_src->shared->dt, H5T_VLEN) > 0) { H5T_path_t *tpath_src_mem, *tpath_mem_dst; /* Datatype conversion paths */ H5T_t *dt_mem; /* Memory datatype */ size_t src_dt_size; /* Source datatype size */ @@ -752,37 +776,37 @@ H5O_attr_copy_file(H5F_t UNUSED *file_src, const H5O_msg_class_t UNUSED *mesg_ty size_t buf_size; /* Size of copy buffer */ /* Create datatype ID for src datatype */ - if((tid_src = H5I_register(H5I_DATATYPE, attr_src->dt)) < 0) + if((tid_src = H5I_register(H5I_DATATYPE, attr_src->shared->dt)) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register source file datatype") /* create a memory copy of the variable-length datatype */ - if(NULL == (dt_mem = H5T_copy(attr_src->dt, H5T_COPY_TRANSIENT))) + if(NULL == (dt_mem = H5T_copy(attr_src->shared->dt, H5T_COPY_TRANSIENT))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy") if((tid_mem = H5I_register(H5I_DATATYPE, dt_mem)) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register memory datatype") /* create variable-length datatype at the destinaton file */ - if((tid_dst = H5I_register(H5I_DATATYPE, attr_dst->dt)) < 0) + if((tid_dst = H5I_register(H5I_DATATYPE, attr_dst->shared->dt)) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register destination file datatype") /* Set up the conversion functions */ - if(NULL == (tpath_src_mem = H5T_path_find(attr_src->dt, dt_mem, NULL, NULL, dxpl_id, FALSE))) + if(NULL == (tpath_src_mem = H5T_path_find(attr_src->shared->dt, dt_mem, NULL, NULL, dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between src and mem datatypes") - if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, attr_dst->dt, NULL, NULL, dxpl_id, FALSE))) + if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, attr_dst->shared->dt, NULL, NULL, dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between mem and dst datatypes") /* Determine largest datatype size */ - if(0 == (src_dt_size = H5T_get_size(attr_src->dt))) + if(0 == (src_dt_size = H5T_get_size(attr_src->shared->dt))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") if(0 == (tmp_dt_size = H5T_get_size(dt_mem))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") max_dt_size = MAX(src_dt_size, tmp_dt_size); - if(0 == (tmp_dt_size = H5T_get_size(attr_dst->dt))) + if(0 == (tmp_dt_size = H5T_get_size(attr_dst->shared->dt))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") max_dt_size = MAX(max_dt_size, tmp_dt_size); /* Set number of whole elements that fit in buffer */ - if(0 == (nelmts = attr_src->data_size / src_dt_size)) + if(0 == (nelmts = attr_src->shared->data_size / src_dt_size)) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "element size too large") /* Set up number of bytes to copy, and initial buffer size */ @@ -809,7 +833,7 @@ H5O_attr_copy_file(H5F_t UNUSED *file_src, const H5O_msg_class_t UNUSED *mesg_ty if(NULL == (buf = H5FL_BLK_MALLOC(attr_buf, buf_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation NULLed for raw data chunk") - HDmemcpy(buf, attr_src->data, attr_src->data_size); + HDmemcpy(buf, attr_src->shared->data, attr_src->shared->data_size); /* Convert from source file to memory */ if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0) @@ -821,23 +845,23 @@ H5O_attr_copy_file(H5F_t UNUSED *file_src, const H5O_msg_class_t UNUSED *mesg_ty if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed") - HDmemcpy(attr_dst->data, buf, attr_dst->data_size); + HDmemcpy(attr_dst->shared->data, buf, attr_dst->shared->data_size); if(H5D_vlen_reclaim(tid_mem, buf_space, H5P_DATASET_XFER_DEFAULT, reclaim_buf) < 0) HGOTO_ERROR(H5E_DATASET, H5E_BADITER, NULL, "unable to reclaim variable-length data") } /* end if */ else { - HDassert(attr_dst->data_size == attr_src->data_size); - HDmemcpy(attr_dst->data, attr_src->data, attr_src->data_size); + HDassert(attr_dst->shared->data_size == attr_src->shared->data_size); + HDmemcpy(attr_dst->shared->data, attr_src->shared->data, attr_src->shared->data_size); } /* end else */ - } /* end if(attr_src->data) */ + } /* end if(attr_src->shared->data) */ /* Recompute the version to encode the destination attribute */ if(H5A_set_version(file_dst, attr_dst) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, NULL, "unable to update attribute version") /* Indicate that the fill values aren't to be written out */ - attr_dst->initialized = TRUE; + attr_dst->shared->initialized = TRUE; /* Set return value */ ret_value = attr_dst; @@ -864,9 +888,8 @@ done: reclaim_buf = H5FL_BLK_FREE(attr_buf, reclaim_buf); /* Release destination attribute information on failure */ - if(!ret_value) - if(attr_dst) - (void)H5A_free(attr_dst); + if(!ret_value && attr_dst && H5A_close(attr_dst) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute") FUNC_LEAVE_NOAPI(ret_value) } /* H5O_attr_copy_file() */ @@ -911,8 +934,8 @@ H5O_attr_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, /* Only need to fix reference attribute with real data being copied to * another file. */ - if((NULL != attr_src->data) && - (H5T_get_class(attr_src->dt, FALSE) == H5T_REFERENCE) && + if((NULL != attr_src->shared->data) && + (H5T_get_class(attr_src->shared->dt, FALSE) == H5T_REFERENCE) && (file_src != file_dst)) { /* copy object pointed by reference. The current implementation does not @@ -924,16 +947,16 @@ H5O_attr_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, size_t ref_count; /* Determine # of reference elements to copy */ - ref_count = attr_dst->data_size / H5T_get_size(attr_dst->dt); + ref_count = attr_dst->shared->data_size / H5T_get_size(attr_dst->shared->dt); /* Copy objects referenced in source buffer to destination file and set destination elements */ - if(H5O_copy_expand_ref(file_src, attr_src->data, dxpl_id, - file_dst, attr_dst->data, ref_count, H5T_get_ref_type(attr_src->dt), cpy_info) < 0) + if(H5O_copy_expand_ref(file_src, attr_src->shared->data, dxpl_id, + file_dst, attr_dst->shared->data, ref_count, H5T_get_ref_type(attr_src->shared->dt), cpy_info) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "unable to copy reference attribute") } /* end if */ else /* Reset value to zero */ - HDmemset(attr_dst->data, 0, attr_dst->data_size); + HDmemset(attr_dst->shared->data, 0, attr_dst->shared->data_size); } /* end if */ done: @@ -965,7 +988,7 @@ H5O_attr_get_crt_index(const void *_mesg, H5O_msg_crt_idx_t *crt_idx /*out*/) HDassert(crt_idx); /* Get the attribute's creation index */ - *crt_idx = attr->crt_idx; + *crt_idx = attr->shared->crt_idx; FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5O_attr_get_crt_index() */ @@ -994,7 +1017,7 @@ H5O_attr_set_crt_index(void *_mesg, H5O_msg_crt_idx_t crt_idx) HDassert(attr); /* Set the creation index */ - attr->crt_idx = crt_idx; + attr->shared->crt_idx = crt_idx; FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5O_attr_set_crt_index() */ @@ -1037,8 +1060,8 @@ H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream, int in fprintf(stream, "%*s%-*s \"%s\"\n", indent, "", fwidth, "Name:", - mesg->name); - switch(mesg->encoding) { + mesg->shared->name); + switch(mesg->shared->encoding) { case H5T_CSET_ASCII: s = "ASCII"; break; @@ -1046,7 +1069,7 @@ H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream, int in s = "UTF-8"; break; default: - sprintf(buf, "H5T_CSET_RESERVED_%d", (int)(mesg->encoding)); + sprintf(buf, "H5T_CSET_RESERVED_%d", (int)(mesg->shared->encoding)); s = buf; break; } /* end switch */ @@ -1055,32 +1078,32 @@ H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream, int in s); HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth, "Initialized:", - mesg->initialized); + mesg->shared->initialized); HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth, "Object opened:", mesg->obj_opened); HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, "Object:", - mesg->oloc.addr); + mesg->shared->oloc.addr); /* Check for attribute creation order index on the attribute */ - if(mesg->crt_idx != H5O_MAX_CRT_ORDER_IDX) + if(mesg->shared->crt_idx != H5O_MAX_CRT_ORDER_IDX) HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, "Creation Index:", - (unsigned)mesg->crt_idx); + (unsigned)mesg->shared->crt_idx); fprintf(stream, "%*sDatatype...\n", indent, ""); fprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX(0,fwidth-3), "Encoded Size:", - (unsigned long)(mesg->dt_size)); - if((H5O_MSG_DTYPE->debug)(f, dxpl_id, mesg->dt, stream, indent + 3, MAX(0, fwidth - 3)) < 0) + (unsigned long)(mesg->shared->dt_size)); + if((H5O_MSG_DTYPE->debug)(f, dxpl_id, mesg->shared->dt, stream, indent + 3, MAX(0, fwidth - 3)) < 0) HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to display datatype message info") fprintf(stream, "%*sDataspace...\n", indent, ""); fprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX(0, fwidth - 3), "Encoded Size:", - (unsigned long)(mesg->ds_size)); - if(H5S_debug(f, dxpl_id, mesg->ds, stream, indent+3, MAX(0, fwidth - 3)) < 0) + (unsigned long)(mesg->shared->ds_size)); + if(H5S_debug(f, dxpl_id, mesg->shared->ds, stream, indent+3, MAX(0, fwidth - 3)) < 0) HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to display dataspace message info") done: diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c index ee90387..eb2e5a9 100644 --- a/src/H5Oattribute.c +++ b/src/H5Oattribute.c @@ -40,6 +40,8 @@ #include "H5MMprivate.h" /* Memory management */ #include "H5Opkg.h" /* Object headers */ #include "H5SMprivate.h" /* Shared Object Header Messages */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Fprivate.h" /* File */ /****************/ @@ -136,7 +138,8 @@ typedef struct { static herr_t H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id, H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_attr, const H5A_attr_iter_op_t *attr_op, void *op_data); - +static htri_t H5O_attr_find_opened_attr(const H5O_loc_t *loc, H5A_t **attr, + const char* name_to_open); /*********************/ /* Package Variables */ @@ -313,11 +316,11 @@ H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr) HGOTO_ERROR(H5E_ATTR, H5E_CANTINC, FAIL, "attribute creation index can't be incremented") /* Set the creation order index on the attribute & incr. creation order index */ - attr->crt_idx = ainfo.max_crt_idx++; + attr->shared->crt_idx = ainfo.max_crt_idx++; } /* end if */ else /* Set "bogus" creation index for attribute */ - attr->crt_idx = H5O_MAX_CRT_ORDER_IDX; + attr->shared->crt_idx = H5O_MAX_CRT_ORDER_IDX; /* Add the attribute information message, if one is needed */ if(new_ainfo) { @@ -332,7 +335,7 @@ H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr) } /* end if */ else { /* Set "bogus" creation index for attribute */ - attr->crt_idx = H5O_MAX_CRT_ORDER_IDX; + attr->shared->crt_idx = H5O_MAX_CRT_ORDER_IDX; /* Set attribute info value to get attribute into object header */ ainfo.fheap_addr = HADDR_UNDEF; @@ -350,6 +353,12 @@ H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr) HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to create new attribute in header") } /* end else */ + /* Increment reference count for shared attribute object for the + * object handle created by the caller function H5A_create. The count + * for the cached object header has been incremented in the step above + * (in H5O_msg_append_real). The dense storage doesn't need a count. */ + attr->shared->nrefs += 1; + /* Was new attribute shared? */ if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, attr)) > 0) { hsize_t attr_rc; /* Attribute's ref count in shared message storage */ @@ -430,14 +439,14 @@ H5O_attr_open_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence, HDassert(!udata->attr); /* Check for correct attribute message to modify */ - if(HDstrcmp(((H5A_t *)mesg->native)->name, udata->name) == 0) { + if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->name) == 0) { /* Make a copy of the attribute to return */ if(NULL == (udata->attr = H5A_copy(NULL, (H5A_t *)mesg->native))) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "unable to copy attribute") /* Assign [somewhat arbitrary] creation order value, for older versions of the format */ if(oh->version == H5O_VERSION_1) - udata->attr->crt_idx = sequence; + udata->attr->shared->crt_idx = sequence; /* Stop iterating */ ret_value = H5_ITER_STOP; @@ -458,6 +467,11 @@ done: * Programmer: Quincey Koziol * Monday, December 11, 2006 * + * Modification:Raymond Lu + * 23 June 2008 + * If the attribute is in dense storage and has already been + * opened, make a copy of already opened object to share some + * object information. *------------------------------------------------------------------------- */ H5A_t * @@ -466,6 +480,8 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) H5O_t *oh = NULL; /* Pointer to actual object header */ H5O_ainfo_t ainfo; /* Attribute information for object */ H5A_t *ret_value; /* Return value */ + H5A_t *exist_attr = NULL; /* Opened attribute object */ + htri_t found_open_attr = FALSE; /* Whether opened object is found */ FUNC_ENTER_NOAPI_NOINIT(H5O_attr_open_by_name) @@ -483,34 +499,40 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) /* Clear error stack from not finding attribute info */ H5E_clear_stack(NULL); - /* Check for opening attribute with dense storage */ - if(H5F_addr_defined(ainfo.fheap_addr)) { - /* Open attribute in dense storage */ - if(NULL == (ret_value = H5A_dense_open(loc->file, dxpl_id, &ainfo, name))) - HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "can't open attribute") - } /* end if */ - else { - H5O_iter_opn_t udata; /* User data for callback */ - H5O_mesg_operator_t op; /* Wrapper for operator */ - - /* Set up user data for callback */ - udata.name = name; - udata.attr = NULL; - - /* Iterate over attributes, to locate correct one to open */ - op.op_type = H5O_MESG_OP_LIB; - op.u.lib_op = H5O_attr_open_cb; - if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "error updating attribute") - - /* Check that we found the attribute */ - if(!udata.attr) - HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "can't locate attribute") - - /* Get attribute opened from object header */ - HDassert(udata.attr); - ret_value = udata.attr; - } /* end else */ + /* If found the attribute is already opened, make a copy of it to share the + object information. If not, open attribute as a new object */ + if((found_open_attr = H5O_attr_find_opened_attr(loc, &exist_attr, name)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "failed in finding opened attribute") + else if(found_open_attr == TRUE) { + if(NULL == (ret_value = H5A_copy(NULL, exist_attr))) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy existing attribute") + } else { + if(H5F_addr_defined(ainfo.fheap_addr)) { /* open attribute with dense storage */ + if(NULL == (ret_value = H5A_dense_open(loc->file, dxpl_id, &ainfo, name))) + HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "can't open attribute") + } else { + H5O_iter_opn_t udata; /* User data for callback */ + H5O_mesg_operator_t op; /* Wrapper for operator */ + + /* Set up user data for callback */ + udata.name = name; + udata.attr = NULL; + + /* Iterate over attributes, to locate correct one to open */ + op.op_type = H5O_MESG_OP_LIB; + op.u.lib_op = H5O_attr_open_cb; + if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "error updating attribute") + + /* Check that we found the attribute */ + if(!udata.attr) + HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "can't locate attribute") + + /* Get attribute opened from object header */ + HDassert(udata.attr); + ret_value = udata.attr; + } /* end else */ + } done: if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) @@ -546,7 +568,7 @@ H5O_attr_open_by_idx_cb(const H5A_t *attr, void *_ret_attr) HDassert(attr); HDassert(ret_attr); - /* Copy attribute information */ + /* Copy attribute information. Shared some attribute information. */ if(NULL == (*ret_attr = H5A_copy(NULL, attr))) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute") @@ -566,6 +588,11 @@ done: * Programmer: Quincey Koziol * Monday, December 18, 2006 * + * Modification:Raymond Lu + * 23 June 2008 + * After opening the attribute, check whether it's in dense + * storage and has already been opened. If it has, close the + * opened object and make a copy of already opened object. *------------------------------------------------------------------------- */ H5A_t * @@ -573,7 +600,11 @@ H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t dxpl_id) { H5A_attr_iter_op_t attr_op; /* Attribute operator */ + H5A_t *exist_attr = NULL; /* Opened attribute object */ + htri_t found_open_attr = FALSE; /* Whether opened object is found */ H5A_t *ret_value = NULL; /* Return value */ + H5O_t *oh = NULL; /* Object header */ + H5O_ainfo_t ainfo; /* Attribute information for object */ FUNC_ENTER_NOAPI_NOINIT(H5O_attr_open_by_idx) @@ -588,12 +619,112 @@ H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type, if(H5O_attr_iterate_real((hid_t)-1, loc, dxpl_id, idx_type, order, n, NULL, &attr_op, &ret_value) < 0) HGOTO_ERROR(H5E_ATTR, H5E_BADITER, NULL, "can't locate attribute") + + /* Protect the object header to iterate over */ + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header") + + /* Check for attribute info stored */ + ainfo.fheap_addr = HADDR_UNDEF; + if(oh->version > H5O_VERSION_1 && NULL == H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo)) + /* Clear error stack from not finding attribute info */ + H5E_clear_stack(NULL); + + /* Find out whether it has already been opened. If it has, close the object + * and make a copy of the already opened object to share the object info. */ + if(ret_value) { + if((found_open_attr = H5O_attr_find_opened_attr(loc, &exist_attr, + ret_value->shared->name)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "failed in finding opened attribute") + + /* If found that the attribute is already opened, make a copy of it + and close the object just opened. */ + if(found_open_attr && exist_attr) { + if(H5A_close(ret_value) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, NULL, "can't close attribute") + + if(NULL == (ret_value = H5A_copy(NULL, exist_attr))) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy existing attribute") + } + } + done: + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, NULL, "unable to release object header") + FUNC_LEAVE_NOAPI(ret_value) } /* end H5O_attr_open_by_idx() */ /*------------------------------------------------------------------------- + * Function: H5O_attr_find_opened_attr + * + * Purpose: Find out whether an attribute has been opened by giving + * the name. Return the pointer to the object if found. + * + * Return: TRUE: found the already opened object + * FALSE: didn't find the opened object + * FAIL: function failed. + * + * Programmer: Raymond Lu + * 23 June 2008 + * + *------------------------------------------------------------------------- + */ +static +htri_t H5O_attr_find_opened_attr(const H5O_loc_t *loc, H5A_t **attr, const char* name_to_open) +{ + htri_t ret_value = FALSE; + int num_open_attr = 0; + hid_t *attr_id_list = NULL; + unsigned long loc_fnum, attr_fnum; + int i; + + FUNC_ENTER_NOAPI_NOINIT(H5O_attr_find_opened_attr) + + /* Get file serial number for the location of attribute */ + if(H5F_get_fileno(loc->file, &loc_fnum) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "can't get file serial number") + + /* Count all opened attributes */ + if((num_open_attr = H5F_get_obj_count(loc->file, H5F_OBJ_ATTR | H5F_OBJ_LOCAL)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "can't get number of opened attributes") + + /* Find out whether the attribute has been opened */ + if(num_open_attr) { + attr_id_list = (hid_t*)H5MM_malloc(num_open_attr*sizeof(hid_t)); + + /* Retrieve the IDs of all opened attributes */ + if(H5F_get_obj_ids(loc->file, H5F_OBJ_ATTR | H5F_OBJ_LOCAL, num_open_attr, attr_id_list) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't IDs of opened attributes") + + for(i=0; ishared->oloc.file, &attr_fnum) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "can't get file serial number") + + /* Verify whether it's the right object. The attribute name, object address + * to which the attribute is attached, and file serial number should all + * match. */ + if(!strcmp(name_to_open, (*attr)->shared->name) && + loc->addr == (*attr)->shared->oloc.addr && + loc_fnum == attr_fnum) { + ret_value = TRUE; + break; + } + } + H5MM_free(attr_id_list); + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_attr_find_opened_attr */ + + +/*------------------------------------------------------------------------- * Function: H5O_attr_update_shared * * Purpose: Update a shared attribute. @@ -681,6 +812,10 @@ done: * koziol@hdfgroup.org * Dec 4 2006 * + * Modification:Raymond Lu + * 4 June 2008 + * Took out the data copying part because the attribute data + * is shared between attribute handle and object header. *------------------------------------------------------------------------- */ static herr_t @@ -700,21 +835,21 @@ H5O_attr_write_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, HDassert(!udata->found); /* Check for correct attribute message to modify */ - if(HDstrcmp(((H5A_t *)mesg->native)->name, udata->attr->name) == 0) { + if(0 == HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->attr->shared->name)) { /* Protect chunk */ if(NULL == (chk_proxy = H5O_chunk_protect(udata->f, udata->dxpl_id, oh, mesg->chunkno))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load object header chunk") /* Allocate storage for the message's data, if necessary */ - if(((H5A_t *)mesg->native)->data == NULL) - if(NULL == (((H5A_t *)mesg->native)->data = H5FL_BLK_MALLOC(attr_buf, udata->attr->data_size))) + if(NULL == ((H5A_t *)mesg->native)->shared->data) + if(NULL == (((H5A_t *)mesg->native)->shared->data = H5FL_BLK_MALLOC(attr_buf, udata->attr->shared->data_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5_ITER_ERROR, "memory allocation failed") /* Copy the data into the header message */ /* (Needs to occur before updating the shared message, or the hash * value on the old & new messages will be the same) */ - HDmemcpy(((H5A_t *)mesg->native)->data, udata->attr->data, udata->attr->data_size); + HDmemcpy(((H5A_t *)mesg->native)->shared->data, udata->attr->shared->data, udata->attr->shared->data_size); /* Mark the message as modified */ mesg->dirty = TRUE; @@ -860,7 +995,7 @@ H5O_attr_rename_chk_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/, HDassert(!udata->found); /* Check for existing attribute with new name */ - if(HDstrcmp(((H5A_t *)mesg->native)->name, udata->new_name) == 0) { + if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->new_name) == 0) { /* Indicate that we found an existing attribute with the new name*/ udata->found = TRUE; @@ -908,16 +1043,16 @@ H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, HDassert(!udata->found); /* Find correct attribute message to rename */ - if(HDstrcmp(((H5A_t *)mesg->native)->name, udata->old_name) == 0) { - unsigned old_version = ((H5A_t *)mesg->native)->version; /* Old version of the attribute */ + if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->old_name) == 0) { + unsigned old_version = ((H5A_t *)mesg->native)->shared->version; /* Old version of the attribute */ /* Protect chunk */ if(NULL == (chk_proxy = H5O_chunk_protect(udata->f, udata->dxpl_id, oh, mesg->chunkno))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load object header chunk") /* Change the name for the attribute */ - H5MM_xfree(((H5A_t *)mesg->native)->name); - ((H5A_t *)mesg->native)->name = H5MM_xstrdup(udata->new_name); + H5MM_xfree(((H5A_t *)mesg->native)->shared->name); + ((H5A_t *)mesg->native)->shared->name = H5MM_xstrdup(udata->new_name); /* Recompute the version to encode the attribute with */ if(H5A_set_version(udata->f, ((H5A_t *)mesg->native)) < 0) @@ -944,7 +1079,7 @@ H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, /* Check for attribute message changing size */ if(HDstrlen(udata->new_name) != HDstrlen(udata->old_name) || - old_version != ((H5A_t *)mesg->native)->version) { + old_version != ((H5A_t *)mesg->native)->shared->version) { H5A_t *attr; /* Attribute to re-add */ /* Take ownership of the message's native info (the attribute) @@ -975,8 +1110,8 @@ H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, /* Sanity check */ HDassert(H5O_msg_is_shared(H5O_ATTR_ID, attr) == FALSE); - /* Release the local copy of the attribute */ - H5O_msg_free_real(H5O_MSG_ATTR, attr); + /* Close the local copy of the attribute */ + H5A_close(attr); } /* end if */ } /* end else */ @@ -1228,6 +1363,14 @@ done: * Programmer: Quincey Koziol * Wednesday, February 14, 2007 * + * Modification:Raymond Lu + * 24 June 2008 + * When converting storage from dense to compact, if found + * the attribute is already opened, use the opened message + * to insert. If not, still use the message in the attribute + * table. This will guarantee that the attribute message is + * shared between the object in metadata cache and the opened + * object. *------------------------------------------------------------------------- */ static herr_t @@ -1261,35 +1404,50 @@ H5O_attr_remove_update(const H5O_loc_t *loc, H5O_t *oh, H5O_ainfo_t *ainfo, * can't fit into an object header message) */ for(u = 0; u < ainfo->nattrs; u++) - if(H5O_msg_size_oh(loc->file, oh, H5O_ATTR_ID, &(atable.attrs[u]), (size_t)0) >= H5O_MESG_MAX_SIZE) { + if(H5O_msg_size_oh(loc->file, oh, H5O_ATTR_ID, (atable.attrs[u]), (size_t)0) >= H5O_MESG_MAX_SIZE) { can_convert = FALSE; break; } /* end if */ /* If ok, insert attributes as object header messages */ if(can_convert) { + H5A_t *exist_attr = NULL; + htri_t found_open_attr = FALSE; + /* Iterate over attributes, to put them into header */ for(u = 0; u < ainfo->nattrs; u++) { htri_t shared_mesg; /* Should this message be stored in the Shared Message table? */ /* Check if attribute is shared */ - if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, &(atable.attrs[u]))) < 0) + if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, (atable.attrs[u]))) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "error determining if message is shared") else if(shared_mesg == 0) { /* Increment reference count on attribute components */ /* (so that they aren't deleted when the dense attribute storage is deleted) */ - if(H5O_attr_link(loc->file, dxpl_id, oh, &(atable.attrs[u])) < 0) + if(H5O_attr_link(loc->file, dxpl_id, oh, (atable.attrs[u])) < 0) HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust attribute link count") } /* end if */ else { /* Reset 'shared' status, so attribute will be shared again */ - atable.attrs[u].sh_loc.type = H5O_SHARE_TYPE_UNSHARED; + (atable.attrs[u])->sh_loc.type = H5O_SHARE_TYPE_UNSHARED; } /* end else */ - /* Insert attribute message into object header */ - /* (Will increment reference count on shared attributes) */ - if(H5O_msg_append_real(loc->file, dxpl_id, oh, H5O_MSG_ATTR, 0, 0, &(atable.attrs[u])) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "can't create message") + /* Insert attribute message into object header (Will increment + reference count on shared attributes) */ + /* Find out whether the attribute has been opened */ + if((found_open_attr = H5O_attr_find_opened_attr(loc, &exist_attr, (atable.attrs[u])->shared->name)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "failed in finding opened attribute") + + /* If found the attribute is already opened, use the opened message to insert. + If not, still use the message in the attribute table. */ + if(found_open_attr && exist_attr) { + if(H5O_msg_append_real(loc->file, dxpl_id, oh, H5O_MSG_ATTR, 0, 0, exist_attr) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "can't create message") + + } else { + if(H5O_msg_append_real(loc->file, dxpl_id, oh, H5O_MSG_ATTR, 0, 0, (atable.attrs[u])) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "can't create message") + } } /* end for */ /* Remove the dense storage */ @@ -1348,7 +1506,7 @@ H5O_attr_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, HDassert(!udata->found); /* Check for correct attribute message to modify */ - if(HDstrcmp(((H5A_t *)mesg->native)->name, udata->name) == 0) { + if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->name) == 0) { /* Convert message into a null message (i.e. delete it) */ if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, TRUE) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to convert into null message") @@ -1523,7 +1681,7 @@ H5O_attr_remove_by_idx(const H5O_loc_t *loc, H5_index_t idx_type, /* Set up user data for callback, to remove the attribute by name */ udata.f = loc->file; udata.dxpl_id = dxpl_id; - udata.name = atable.attrs[n].name; + udata.name = ((atable.attrs[n])->shared)->name; udata.found = FALSE; /* Iterate over attributes, to locate correct one to delete */ @@ -1634,7 +1792,7 @@ H5O_attr_exists_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/, HDassert(!udata->found); /* Check for correct attribute message */ - if(HDstrcmp(((H5A_t *)mesg->native)->name, udata->name) == 0) { + if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->name) == 0) { /* Indicate that this message is the attribute sought */ udata->found = TRUE; diff --git a/src/H5Pdcpl.c b/src/H5Pdcpl.c index 5b2e7a5..74c5ae1 100644 --- a/src/H5Pdcpl.c +++ b/src/H5Pdcpl.c @@ -2035,7 +2035,7 @@ H5Pset_fletcher32(hid_t plist_id) if(H5P_get(plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline") if(H5Z_append(&pline, H5Z_FILTER_FLETCHER32, H5Z_FLAG_MANDATORY, (size_t)0, NULL) < 0) - HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add deflate filter to pipeline") + HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add fletcher32 filter to pipeline") if(H5P_set(plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0) HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline") diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c index 9942ea1..dc7ae23 100644 --- a/src/H5Tcompound.c +++ b/src/H5Tcompound.c @@ -555,10 +555,14 @@ H5T_pack(const H5T_t *dt) } /* end if */ else if(dt->shared->type==H5T_COMPOUND) { /* Recursively pack the members */ - for (i=0; ishared->u.compnd.nmembs; i++) + for (i=0; ishared->u.compnd.nmembs; i++) { if (H5T_pack(dt->shared->u.compnd.memb[i].type) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to pack part of a compound datatype") + /* Update the member size */ + dt->shared->u.compnd.memb[i].size = (dt->shared->u.compnd.memb[i].type)->shared->size; + } + /* Remove padding between members */ if(H5T_sort_value(dt, NULL)<0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOMPARE, FAIL, "value sort failed") diff --git a/src/Makefile.in b/src/Makefile.in index c8b8fb5..7f7b60c 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -404,8 +404,8 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog # Add libtool shared library version numbers to the HDF5 library # See libtool versioning documentation online. -LT_VERS_INTERFACE = 5 -LT_VERS_REVISION = 9 +LT_VERS_INTERFACE = 6 +LT_VERS_REVISION = 4 LT_VERS_AGE = 0 H5detect_CFLAGS = -g diff --git a/test/dtypes.c b/test/dtypes.c index 3dc5338..f7802ed 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -30,7 +30,7 @@ /* Number of elements in each test */ #define NTESTELEM 100000 -/* For test_compound_10 */ +/* For test_compound_8 and test_compound_10 */ #define ARRAY_DIM 4 /* Epsilon for floating-point comparisons */ @@ -1354,7 +1354,10 @@ test_compound_7(void) * Wednesday, January 7, 1998 * * Modifications: - * + * Raymond Lu + * 27 June 2008 + * Added verification of compound type size for H5Tpack and + * test for array of nested compound type. *------------------------------------------------------------------------- */ static int @@ -1369,12 +1372,16 @@ test_compound_8(void) char c; s1 d; } s2; - - hid_t tid1, tid2, tid3; + hid_t tid1, tid1_copy, tid2, tid2_copy, tid3, arr_tid; + size_t tsize; + hsize_t dims[1] = {ARRAY_DIM}; herr_t ret; TESTING("packing compound datatypes"); + /*------------------------------------------------------------ + * Test H5Tpack for compound type + */ /* Create first compound datatype */ if((tid1 = H5Tcreate( H5T_COMPOUND, sizeof(struct s1))) < 0) { H5_FAILED(); AT(); @@ -1394,6 +1401,13 @@ test_compound_8(void) goto error; } /* end if */ + /* Make a copy of the type for later use */ + if((tid1_copy = H5Tcopy(tid1)) < 0) { + H5_FAILED(); AT(); + printf("Can't copy type #1\n"); + goto error; + } /* end if */ + /* Test H5Tpack for the first compound type */ if(H5Tpack(tid1) < 0) { H5_FAILED(); AT(); @@ -1414,7 +1428,22 @@ test_compound_8(void) goto error; } /* end if */ + /* Verify the size of packed compound type */ + if((tsize = H5Tget_size(tid1)) == 0) { + H5_FAILED(); AT(); + printf("Can't get size of the compound datatype\n"); + goto error; + } /* end if */ + + if(tsize != (sizeof(char) + sizeof(int))) { + H5_FAILED(); AT(); + printf("The size of the packed compound datatype is incorrect\n"); + goto error; + } /* end if */ + /*------------------------------------------------------------ + * Test H5Tpack for nested compound type + */ /* Create second compound datatype */ if((tid2 = H5Tcreate( H5T_COMPOUND, sizeof(struct s2))) < 0) { H5_FAILED(); AT(); @@ -1428,7 +1457,8 @@ test_compound_8(void) goto error; } /* end if */ - if(H5Tinsert(tid2,"d",HOFFSET(struct s2,d),tid1) < 0) { + /* Insert the member of unpacked compound type */ + if(H5Tinsert(tid2,"d",HOFFSET(struct s2,d),tid1_copy) < 0) { H5_FAILED(); AT(); printf("Can't insert field 'd'\n"); goto error; @@ -1441,6 +1471,13 @@ test_compound_8(void) goto error; } /* end if */ + /* Make a copy of the type for later */ + if((tid2_copy = H5Tcopy(tid2)) < 0) { + H5_FAILED(); AT(); + printf("Can't copy type #2\n"); + goto error; + } /* end if */ + /* Test H5Tpack for the second compound type */ if(H5Tpack(tid2) < 0) { H5_FAILED(); AT(); @@ -1478,6 +1515,68 @@ test_compound_8(void) goto error; } /* end if */ + /* Verify the size of packed compound type */ + if((tsize = H5Tget_size(tid2)) == 0) { + H5_FAILED(); AT(); + printf("Can't get size of the compound datatype\n"); + goto error; + } /* end if */ + + if(tsize != (sizeof(char) + sizeof(char) + sizeof(int))) { + H5_FAILED(); AT(); + printf("The size of the packed compound datatype is incorrect\n"); + goto error; + } /* end if */ + + /*------------------------------------------------------------ + * Test H5Tpack for array type of nested compound type + */ + /* Create an array type of compound type */ + if((arr_tid = H5Tarray_create2(tid2_copy, 1, dims)) < 0) { + H5_FAILED(); AT(); + printf("Can't create an array datatype\n"); + goto error; + } /* end if */ + + /* Test H5Tpack for the array type */ + if(H5Tpack(arr_tid) < 0) { + H5_FAILED(); AT(); + printf("Can't pack the array datatype\n"); + goto error; + } /* end if */ + + /* Verify the size of packed compound type */ + if((tsize = H5Tget_size(arr_tid)) == 0) { + H5_FAILED(); AT(); + printf("Can't get size of the array datatype\n"); + goto error; + } /* end if */ + + if(tsize != ARRAY_DIM * (sizeof(char) + sizeof(char) + sizeof(int))) { + H5_FAILED(); AT(); + printf("The size of the packed array datatype is incorrect\n"); + goto error; + } /* end if */ + + + if(H5Tclose(tid1_copy) < 0) { + H5_FAILED(); AT(); + printf("Can't close the compound datatype\n"); + goto error; + } /* end if */ + + if(H5Tclose(tid2_copy) < 0) { + H5_FAILED(); AT(); + printf("Can't close the compound datatype\n"); + goto error; + } /* end if */ + + if(H5Tclose(arr_tid) < 0) { + H5_FAILED(); AT(); + printf("Can't close the array datatype\n"); + goto error; + } /* end if */ + /* Can't release resources - they are locked */ PASSED(); @@ -4942,6 +5041,7 @@ main(void) nerrors += test_detect(); nerrors += test_compound_1(); nerrors += test_query(); + nerrors += test_transient(fapl); nerrors += test_named(fapl); nerrors += test_encode(); diff --git a/test/mount.c b/test/mount.c index e6aa881..c86c56b 100644 --- a/test/mount.c +++ b/test/mount.c @@ -168,9 +168,9 @@ test_basic(hid_t fapl) static int test_illegal(hid_t fapl) { - hid_t file1 = -1, file2 = -1, file3 = -1, mnt = -1; - herr_t status; + hid_t file1 = -1, file1b = -1, file2 = -1, file3 = -1, file3b = -1, mnt = -1; char filename1[1024], filename2[1024], filename3[1024]; + herr_t status; TESTING("illegal mount operations"); h5_fixname(FILENAME[0], fapl, filename1, sizeof filename1); @@ -183,6 +183,10 @@ test_illegal(hid_t fapl) (file2 = H5Fopen(filename2, H5F_ACC_RDONLY, fapl)) < 0 || (file3 = H5Fopen(filename3, H5F_ACC_RDONLY, fapl)) < 0) FAIL_STACK_ERROR + if((file1b = H5Fopen(filename1, H5F_ACC_RDONLY, fapl)) < 0) + FAIL_STACK_ERROR + if((file3b = H5Fopen(filename3, H5F_ACC_RDONLY, fapl)) < 0) + FAIL_STACK_ERROR /* Try mounting a file on itself */ H5E_BEGIN_TRY { @@ -212,11 +216,43 @@ test_illegal(hid_t fapl) if(H5Funmount(mnt, ".") < 0) FAIL_STACK_ERROR if(H5Gclose(mnt) < 0) FAIL_STACK_ERROR + /* + * Try mounting the same file opened twice at the same place. + * + * We have to open the mount point before we mount the first file or we'll + * end up mounting file3b at the root of file3 and the mount will succeed. + */ + if((mnt = H5Gopen2(file1, "/mnt1", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR + if(H5Fmount(mnt, ".", file3, H5P_DEFAULT) < 0) FAIL_STACK_ERROR + H5E_BEGIN_TRY { + status = H5Fmount(mnt, ".", file3b, H5P_DEFAULT); + } H5E_END_TRY; + if(status >= 0) { + H5_FAILED(); + puts(" Mounting same file opened twice at one mount point should have failed."); + TEST_ERROR + } /* end if */ + if(H5Funmount(mnt, ".") < 0) FAIL_STACK_ERROR + if(H5Gclose(mnt) < 0) FAIL_STACK_ERROR + + /* Try to create a "weak" cycle */ + if(H5Fmount(file1, "/mnt1", file2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR + H5E_BEGIN_TRY { + status = H5Fmount(file2, "/mnt1/file2", file1b, H5P_DEFAULT); + } H5E_END_TRY; + if(status >= 0) { + H5_FAILED(); + puts(" Creating a cycle with mount points should have failed."); + TEST_ERROR + } /* end if */ + if(H5Funmount(file1, "/mnt1") < 0) FAIL_STACK_ERROR /* Close everything and return */ if(H5Fclose(file1) < 0) FAIL_STACK_ERROR + if(H5Fclose(file1b) < 0) FAIL_STACK_ERROR if(H5Fclose(file2) < 0) FAIL_STACK_ERROR if(H5Fclose(file3) < 0) FAIL_STACK_ERROR + if(H5Fclose(file3b) < 0) FAIL_STACK_ERROR PASSED(); return 0; @@ -225,14 +261,126 @@ error: H5E_BEGIN_TRY { H5Gclose(mnt); H5Fclose(file1); + H5Fclose(file1b); H5Fclose(file2); H5Fclose(file3); + H5Fclose(file3b); } H5E_END_TRY; return 1; } /* end test_illegal() */ /*------------------------------------------------------------------------- + * Function: test_samefile + * + * Purpose: Test opening the same file twice and then mounting another + * file on each. + * + * Return: Success: 0 + * Failure: number of errors + * + * Programmer: Quincey Koziol + * Tuesday, July 15, 2008 + * + *------------------------------------------------------------------------- + */ +static int +test_samefile(hid_t fapl) +{ + hid_t file1a = -1, file1b = -1, file2 = -1, file3 = -1; + hid_t mnt1a = -1, mnt1b = -1; + char filename1[1024], filename2[1024], filename3[1024]; + H5G_info_t grp_info; + herr_t status; + + TESTING("same file mount operations"); + h5_fixname(FILENAME[0], fapl, filename1, sizeof filename1); + h5_fixname(FILENAME[1], fapl, filename2, sizeof filename2); + h5_fixname(FILENAME[2], fapl, filename3, sizeof filename3); + + + /* Open the files */ + if((file1a = H5Fopen(filename1, H5F_ACC_RDONLY, fapl)) < 0) + FAIL_STACK_ERROR + if((file1b = H5Fopen(filename1, H5F_ACC_RDONLY, fapl)) < 0) + FAIL_STACK_ERROR + if((file2 = H5Fopen(filename2, H5F_ACC_RDONLY, fapl)) < 0) + FAIL_STACK_ERROR + if((file3 = H5Fopen(filename3, H5F_ACC_RDONLY, fapl)) < 0) + FAIL_STACK_ERROR + + /* + * Try mounting different files at the same place in each of the "top" + * files. + * + * We have to open the mount point before we mount the first file or we'll + * end up mounting file4 at the root of file3 and the mount will succeed. + */ + if((mnt1a = H5Gopen2(file1a, "/mnt1", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR + if(H5Gget_info(mnt1a, &grp_info) < 0) FAIL_STACK_ERROR + if(grp_info.mounted) FAIL_PUTS_ERROR(" Group shouldn't have 'mounted' flag set.") + if((mnt1b = H5Gopen2(file1b, "/mnt1", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR + if(H5Gget_info(mnt1b, &grp_info) < 0) FAIL_STACK_ERROR + if(grp_info.mounted) FAIL_PUTS_ERROR(" Group shouldn't have 'mounted' flag set.") + if(H5Fmount(mnt1a, ".", file2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR + if(H5Gget_info(mnt1a, &grp_info) < 0) FAIL_STACK_ERROR + if(!grp_info.mounted) FAIL_PUTS_ERROR(" Group should have 'mounted' flag set.") + H5E_BEGIN_TRY { + status = H5Fmount(mnt1b, ".", file3, H5P_DEFAULT); + } H5E_END_TRY; + if(status >= 0) FAIL_PUTS_ERROR(" Mounting different files at one mount point should have failed.") + if(H5Funmount(mnt1a, ".") < 0) FAIL_STACK_ERROR + if(H5Gclose(mnt1a) < 0) FAIL_STACK_ERROR + if(H5Gclose(mnt1b) < 0) FAIL_STACK_ERROR + + /* + * Try mounting same files at the same place in each of the "top" + * files. + * + * We have to open the mount point before we mount the first file or we'll + * end up mounting file4 at the root of file3 and the mount will succeed. + */ + if((mnt1a = H5Gopen2(file1a, "/mnt1", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR + if(H5Gget_info(mnt1a, &grp_info) < 0) FAIL_STACK_ERROR + if(grp_info.mounted) FAIL_PUTS_ERROR(" Group shouldn't have 'mounted' flag set.") + if((mnt1b = H5Gopen2(file1b, "/mnt1", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR + if(H5Gget_info(mnt1b, &grp_info) < 0) FAIL_STACK_ERROR + if(grp_info.mounted) FAIL_PUTS_ERROR(" Group shouldn't have 'mounted' flag set.") + if(H5Fmount(mnt1a, ".", file2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR + if(H5Gget_info(mnt1a, &grp_info) < 0) FAIL_STACK_ERROR + if(!grp_info.mounted) FAIL_PUTS_ERROR(" Group should have 'mounted' flag set.") + H5E_BEGIN_TRY { + status = H5Fmount(mnt1b, ".", file2, H5P_DEFAULT); + } H5E_END_TRY; + if(status >= 0) FAIL_PUTS_ERROR(" Mounting same files at one mount point should have failed.") + if(H5Funmount(mnt1a, ".") < 0) FAIL_STACK_ERROR + if(H5Gclose(mnt1a) < 0) FAIL_STACK_ERROR + if(H5Gclose(mnt1b) < 0) FAIL_STACK_ERROR + + + /* Close everything and return */ + if(H5Fclose(file1a) < 0) FAIL_STACK_ERROR + if(H5Fclose(file1b) < 0) FAIL_STACK_ERROR + if(H5Fclose(file2) < 0) FAIL_STACK_ERROR + if(H5Fclose(file3) < 0) FAIL_STACK_ERROR + + PASSED(); + return 0; + +error: + H5E_BEGIN_TRY { + H5Gclose(mnt1a); + H5Gclose(mnt1b); + H5Fclose(file1a); + H5Fclose(file1b); + H5Fclose(file2); + H5Fclose(file3); + } H5E_END_TRY; + return 1; +} /* end test_samefile() */ + + +/*------------------------------------------------------------------------- * Function: test_hide * * Purpose: The previous contents of the mount point is temporarily @@ -3785,6 +3933,275 @@ error: /*------------------------------------------------------------------------- + * Function: test_sharedacc + * + * Purpose: Test shared access to a file's mount table. + * + * Return: Success: 0 + * + * Failure: number of errors + * + * Programmer: Neil Fortner + * Friday, August 1, 2008 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + static int +test_sharedacc(hid_t fapl) +{ + hid_t fid1[2] = {-1, -1}, fid2[2] = {-1, -1}; /* File IDs */ + hid_t gid = -1; + char filename1[NAME_BUF_SIZE], + filename2[NAME_BUF_SIZE], + filename3[NAME_BUF_SIZE]; /* Name of files to mount */ + int i, j, k; /* Counters */ + + TESTING("shared mount access"); + + h5_fixname(FILENAME[0], fapl, filename1, sizeof filename1); + h5_fixname(FILENAME[1], fapl, filename2, sizeof filename2); + h5_fixname(FILENAME[2], fapl, filename3, sizeof filename3); + + /* Create file #1 & its group */ + if((fid1[0] = H5Fcreate(filename1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + if((gid = H5Gcreate2(fid1[0], "A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + if(H5Gclose(gid) < 0) + TEST_ERROR + + /* Create file #2 & its group */ + if((fid2[0] = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + if((gid = H5Gcreate2(fid2[0], "B", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + if(H5Gclose(gid) < 0) + TEST_ERROR + + /* Test mount before reopen, then using reopened handle for access */ + if(H5Fmount(fid1[0], "/A", fid2[0], H5P_DEFAULT) < 0) + TEST_ERROR + if((fid1[1] = H5Freopen(fid1[0])) < 0) + TEST_ERROR + if((fid2[1] = H5Freopen(fid2[0])) < 0) + TEST_ERROR + if((gid = H5Gopen2(fid1[1], "/A/B", H5P_DEFAULT)) < 0) + TEST_ERROR + if(H5Gclose(gid) < 0) + TEST_ERROR + if(H5Funmount(fid1[1], "/A") < 0) + TEST_ERROR + + /* "Brute force" test of all possible ways of mounting, accessing, and + * unmounting files with multiple handles (mount after reopen) */ + for(i=0; i<2; i++) + for(j=0; j<2; j++) + for(k=0; k<2; k++) { + if(H5Fmount(fid1[i], "/A", fid2[j], H5P_DEFAULT) < 0) + TEST_ERROR + if((gid = H5Gopen2(fid1[k], "/A/B", H5P_DEFAULT)) < 0) + TEST_ERROR + if(H5Gclose(gid) < 0) + TEST_ERROR + if(H5Funmount(fid1[k], "/A") < 0) + TEST_ERROR + } + + /* Close file IDs */ + for(i=0; i<2; i++) { + if(H5Fclose(fid1[i]) < 0) + TEST_ERROR + if(H5Fclose(fid2[i]) < 0) + TEST_ERROR + } + + /* Check that all file IDs have been closed */ + if(H5I_nmembers(H5I_FILE) != 0) + TEST_ERROR + if(H5F_sfile_assert_num(0) != 0) + TEST_ERROR + + PASSED(); + return 0; + +error: + H5E_BEGIN_TRY { + H5Gclose(gid); + for(i=0; i<2; i++) { + H5Fclose(fid1[i]); + H5Fclose(fid2[i]); + } + } H5E_END_TRY; + return 1; +} /* end test_sharedacc() */ + + +/*------------------------------------------------------------------------- + * Function: test_sharedclose + * + * Purpose: Test that files within a shared mount structure are properly + * closed. + * + * Return: Success: 0 + * + * Failure: number of errors + * + * Programmer: Neil Fortner + * Friday, August 6, 2008 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + static int +test_sharedclose(hid_t fapl) +{ + hid_t fid1a = -1, fid1b = -1, fid2 = -1, fid3 = -2; /* File IDs */ + hid_t gid1 = -1, gid2 = -1, gid3 = -1; + char filename1[NAME_BUF_SIZE], + filename2[NAME_BUF_SIZE], + filename3[NAME_BUF_SIZE]; /* Name of files to mount */ + + TESTING("closing shared mounts"); + + h5_fixname(FILENAME[0], fapl, filename1, sizeof filename1); + h5_fixname(FILENAME[1], fapl, filename2, sizeof filename2); + h5_fixname(FILENAME[2], fapl, filename3, sizeof filename3); + + /* Create file #1a & its group */ + if((fid1a = H5Fcreate(filename1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + if((gid1 = H5Gcreate2(fid1a, "A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + + /* Create file #1b & its groups */ + if((fid1b = H5Freopen(fid1a)) < 0) + TEST_ERROR + if((gid2 = H5Gcreate2(fid1b, "B", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + if((gid3 = H5Gcreate2(fid1b, "B/C", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + + /* Create file #2 */ + if((fid2 = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + + /* Create file #3 */ + if((fid3 = H5Fcreate(filename3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + + /* Mount file #2 to file #1a */ + if(H5Fmount(gid1, ".", fid2, H5P_DEFAULT) < 0) + TEST_ERROR + + /* Mount file #3 to file #1b */ + if(H5Fmount(gid2, ".", fid3, H5P_DEFAULT) < 0) + TEST_ERROR + + /* Close file #1b. It should be held open by the groups in it. */ + if(H5Fclose(fid1b) < 0) + TEST_ERROR + + /* Close file #3. It should be held open by the groups in its parent. */ + if(H5Fclose(fid3) < 0) + TEST_ERROR + + /* Close group B in file #1b. This should not close file #1b and #3. */ + if(H5Gclose(gid2) < 0) + TEST_ERROR + + /* Check that file #3 is still open */ + if(H5F_sfile_assert_num(3) != 0) + TEST_ERROR + + /* Close group B/C in file #1b. This should close file #1b and #3. */ + if(H5Gclose(gid3) < 0) + TEST_ERROR + + /* Check that file #3 has been closed */ + if(H5F_sfile_assert_num(2) != 0) + TEST_ERROR + + /* Unmount file 2 and close the rest of the handles */ + if(H5Funmount(fid1a, "A") < 0) + TEST_ERROR + if(H5Gclose(gid1) < 0) + TEST_ERROR + if(H5Fclose(fid2) < 0) + TEST_ERROR + if(H5Fclose(fid1a) < 0) + TEST_ERROR + + /* Check that all file IDs have been closed */ + if(H5I_nmembers(H5I_FILE) != 0) + TEST_ERROR + if(H5F_sfile_assert_num(0) != 0) + TEST_ERROR + + /* Create file #1 & its group */ + if((fid1a = H5Fcreate(filename1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + if((gid1 = H5Gcreate2(fid1a, "A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + + /* Create file #1b & its group */ + if((fid1b = H5Freopen(fid1a)) < 0) + TEST_ERROR + if((gid2 = H5Gcreate2(fid1b, "B", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + + /* Create file #2 */ + if((fid2 = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + TEST_ERROR + + /* Mount file #2 to file #1 */ + if(H5Fmount(fid1a, "A", fid2, H5P_DEFAULT) < 0) + TEST_ERROR + + /* Close file #1b. It should be held open by the group in it. */ + if(H5Fclose(fid1b) < 0) + TEST_ERROR + + /* Close the group in file #1b. This should close file # 1b. */ + if(H5Gclose(gid2) < 0) + TEST_ERROR + + /* Unmount file 2 and close the rest of the handles */ + if(H5Funmount(fid1a, "A") < 0) + TEST_ERROR + if(H5Gclose(gid1) < 0) + TEST_ERROR + if(H5Fclose(fid2) < 0) + TEST_ERROR + if(H5Fclose(fid1a) < 0) + TEST_ERROR + + /* Check that all file IDs have been closed */ + if(H5I_nmembers(H5I_FILE) != 0) + TEST_ERROR + if(H5F_sfile_assert_num(0) != 0) + TEST_ERROR + + PASSED(); + return 0; + +error: + H5E_BEGIN_TRY { + H5Gclose(gid1); + H5Gclose(gid2); + H5Gclose(gid3); + H5Fclose(fid1a); + H5Fclose(fid1b); + H5Fclose(fid2); + H5Fclose(fid3); + } H5E_END_TRY; + return 1; +} /* end test_sharedclose() */ + + +/*------------------------------------------------------------------------- * Function: main * * Purpose: Test file mounting @@ -3817,6 +4234,7 @@ main(void) nerrors += test_basic(fapl); nerrors += test_illegal(fapl); + nerrors += test_samefile(fapl); nerrors += test_hide(fapl); nerrors += test_assoc(fapl); nerrors += test_mntlnk(fapl); @@ -3842,6 +4260,8 @@ main(void) nerrors += test_close_parent(fapl); nerrors += test_cut_graph(fapl); nerrors += test_symlink(fapl); + nerrors += test_sharedacc(fapl); + nerrors += test_sharedclose(fapl); if (nerrors) goto error; puts("All mount tests passed."); diff --git a/test/objcopy.c b/test/objcopy.c index 2196794..6459519 100755 --- a/test/objcopy.c +++ b/test/objcopy.c @@ -7226,6 +7226,7 @@ main(void) nerrors += test_copy_dataset_simple_empty(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_compound(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_chunked(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_chunked_empty(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_chunked_sparse(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_compressed(fcpl_src, fcpl_dst, my_fapl); @@ -7236,6 +7237,7 @@ main(void) nerrors += test_copy_dataset_named_dtype_hier_outside(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_multi_ohdr_chunks(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_attr_named_dtype(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_contig_vl(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_chunked_vl(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_compact_vl(fcpl_src, fcpl_dst, my_fapl); diff --git a/test/tattr.c b/test/tattr.c index 12350c3..edaebf0 100644 --- a/test/tattr.c +++ b/test/tattr.c @@ -191,7 +191,6 @@ test_attr_basic_write(hid_t fapl) sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); CHECK(sid2, FAIL, "H5Screate_simple"); - /* Try to create an attribute on the file (should create an attribute on root group) */ attr = H5Acreate2(fid1, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); @@ -216,7 +215,6 @@ test_attr_basic_write(hid_t fapl) ret = H5Gclose(group); CHECK(ret, FAIL, "H5Gclose"); - /* Create an attribute for the dataset */ attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); @@ -1779,6 +1777,251 @@ test_attr_dtype_shared(hid_t fapl) /**************************************************************** ** +** test_attr_duplicate_ids(): Test operations with more than +** one ID handles. +** +****************************************************************/ +static int +test_attr_duplicate_ids(hid_t fapl) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t gid1, gid2; /* Group ID */ + hid_t sid1,sid2; /* Dataspace ID */ + hid_t attr, attr2; /* Attribute ID */ + hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; + hsize_t dims2[] = {ATTR1_DIM1}; + int read_data1[ATTR1_DIM1]={0}; /* Buffer for reading 1st attribute */ + int rewrite_data[ATTR1_DIM1]={1234, -423, 9907256}; /* Test data for rewrite */ + int i; + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing operations with two ID handles\n")); + + /*----------------------------------------------------------------------------------- + * Create an attribute in a new file and fill it with fill value. + */ + /* Create file */ + fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); + CHECK(fid1, FAIL, "H5Fcreate"); + + /* Create dataspace for dataset */ + sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); + CHECK(sid1, FAIL, "H5Screate_simple"); + + /* Create a dataset */ + dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dcreate2"); + + /* Create dataspace for attribute */ + sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Try to create an attribute on the dataset */ + attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); + + /* Open the attribute just created and get a second ID */ + attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); + CHECK(attr2, FAIL, "H5Aopen"); + + /* Close attribute */ + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); + + /*----------------------------------------------------------------------------------- + * Reopen the file and verify the fill value for attribute. Also write + * some real data. + */ + + /* Open file */ + fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dopen2"); + + /* Open first attribute for the dataset */ + attr = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Read attribute with fill value */ + ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(0 != read_data1[i]) + TestErrPrintf("%d: attribute data different: read_data1[%d]=%d\n", __LINE__, i, read_data1[i]); + + /* Open attribute for the second time */ + attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Write attribute information */ + ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); + + /*----------------------------------------------------------------------------------- + * Reopen the file and verify the data. Also rewrite the data and verify it. + */ + + /* Open file */ + fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dopen2"); + + /* Open first attribute for the dataset */ + attr = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Read attribute information */ + ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(attr_data1[i] != read_data1[i]) + TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, attr_data1[i], i, read_data1[i]); + + /* Open attribute for the second time */ + attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Write attribute information */ + ret = H5Awrite(attr2, H5T_NATIVE_INT, rewrite_data); + CHECK(ret, FAIL, "H5Awrite"); + + /* Read attribute information */ + ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(read_data1[i] != rewrite_data[i]) + TestErrPrintf("%d: attribute data different: read_data1[%d]=%d, rewrite_data[%d]=%d\n", __LINE__, i, read_data1[i], i, rewrite_data[i]); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); + + /*----------------------------------------------------------------------------------- + * Verify that the attribute being pointed to by different paths shares + * the same data. + */ + /* Open file */ + fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Create a group */ + gid1 = H5Gcreate2(fid1, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + CHECK(gid1, FAIL, "H5Gcreate2"); + + /* Create hard link to the first group */ + ret = H5Lcreate_hard(gid1, GROUP1_NAME, H5L_SAME_LOC, GROUP2_NAME, H5P_DEFAULT, + H5P_DEFAULT); + CHECK(ret, FAIL, "H5Lcreate_hard"); + + /* Try to create an attribute on the group */ + attr = H5Acreate2(gid1, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); + + /* Open the hard link just created */ + gid2 = H5Gopen2(fid1, GROUP2_NAME, H5P_DEFAULT); + CHECK(gid2, FAIL, "H5Gopen2"); + + /* Open the attribute of the group for the second time */ + attr2 = H5Aopen(gid2, ATTR2_NAME, H5P_DEFAULT); + CHECK(attr2, FAIL, "H5Aopen"); + + /* Write attribute information with the first attribute handle */ + ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); + CHECK(ret, FAIL, "H5Awrite"); + + /* Read attribute information with the second attribute handle */ + ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(attr_data1[i] != read_data1[i]) + TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, attr_data1[i], i, read_data1[i]); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close group */ + ret = H5Gclose(gid1); + CHECK(ret, FAIL, "H5Gclose"); + + ret = H5Gclose(gid2); + CHECK(ret, FAIL, "H5Gclose"); + + /* Close Attribute dataspace */ + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close Dataset dataspace */ + ret = H5Sclose(sid1); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_duplicate_ids() */ + + +/**************************************************************** +** ** test_attr_dense_verify(): Test basic H5A (attribute) code. ** Verify attributes on object ** @@ -2538,19 +2781,498 @@ test_attr_dense_unlink(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check # of attributes */ - ret = H5Oget_info(dataset, &oinfo); - CHECK(ret, FAIL, "H5Oget_info"); - VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info"); - } /* end for */ + /* Check # of attributes */ + ret = H5Oget_info(dataset, &oinfo); + CHECK(ret, FAIL, "H5Oget_info"); + VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info"); + } /* end for */ + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + + /* Close dataspace */ + ret = H5Sclose(sid); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + + /* Re-open file */ + fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid, FAIL, "H5Fopen"); + + /* Unlink dataset */ + ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Ldelete"); + + /* Check on dataset's attribute storage status */ + ret = H5F_get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); + CHECK(ret, FAIL, "H5F_get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F_get_sohm_mesg_count_test"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + /* Check size of file */ + filesize = h5_get_file_size(FILENAME); + VERIFY(filesize, empty_filesize, "h5_get_file_size"); +} /* test_attr_dense_unlink() */ + + +/**************************************************************** +** +** test_attr_dense_limits(): Test basic H5A (attribute) code. +** Tests attribute in "dense" storage limits +** +****************************************************************/ +static void +test_attr_dense_limits(hid_t fcpl, hid_t fapl) +{ + hid_t fid; /* HDF5 File ID */ + hid_t dataset; /* Dataset ID */ + hid_t sid; /* Dataspace ID */ + hid_t attr; /* Attribute ID */ + hid_t dcpl; /* Dataset creation property list ID */ + char attrname[NAME_BUF_SIZE]; /* Name of attribute */ + unsigned max_compact, rmax_compact; /* Maximum # of attributes to store compactly */ + unsigned min_dense, rmin_dense; /* Minimum # of attributes to store "densely" */ + htri_t is_dense; /* Are attributes stored densely? */ + unsigned u; /* Local index variable */ + h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t filesize; /* Size of file after modifications */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Phase Change Limits For Attributes in Dense Storage\n")); + + /* Create file */ + fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); + CHECK(fid, FAIL, "H5Fcreate"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME); + if(empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + + /* Re-open file */ + fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid, FAIL, "H5Fopen"); + + /* Create dataspace for dataset */ + sid = H5Screate(H5S_SCALAR); + CHECK(sid, FAIL, "H5Screate"); + + /* Query the group creation properties */ + dcpl = H5Pcreate(H5P_DATASET_CREATE); + CHECK(dcpl, FAIL, "H5Pcreate"); + + /* Change limits on compact/dense attribute storage */ + max_compact = 0; + min_dense = 0; + ret = H5Pset_attr_phase_change(dcpl, max_compact, min_dense); + CHECK(ret, FAIL, "H5Pget_attr_phase_change"); + + /* Create a dataset */ + dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dcreate2"); + + /* Retrieve limits for compact/dense attribute storage */ + ret = H5Pget_attr_phase_change(dcpl, &rmax_compact, &rmin_dense); + CHECK(ret, FAIL, "H5Pget_attr_phase_change"); + VERIFY(rmax_compact, max_compact, "H5Pget_attr_phase_change"); + VERIFY(rmin_dense, min_dense, "H5Pget_attr_phase_change"); + + /* Close property list */ + ret = H5Pclose(dcpl); + CHECK(ret, FAIL, "H5Pclose"); + + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); + + + /* Add first attribute, which should be immediately in dense storage */ + + /* Create attribute */ + u = 0; + sprintf(attrname, "attr %02u", u); + attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); + + /* Write data into the attribute */ + ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + + + /* Add second attribute, to allow deletions to be checked easily */ + + /* Create attribute */ + u = 1; + sprintf(attrname, "attr %02u", u); + attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); + + /* Write data into the attribute */ + ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + + + /* Delete second attribute, attributes should still be stored densely */ + + /* Delete attribute */ + ret = H5Adelete(dataset, attrname); + CHECK(ret, FAIL, "H5Adelete"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + + + /* Delete first attribute, attributes should not be stored densely */ + + /* Delete attribute */ + u = 0; + sprintf(attrname, "attr %02u", u); + ret = H5Adelete(dataset, attrname); + CHECK(ret, FAIL, "H5Adelete"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); + + + /* Close dataspace */ + ret = H5Sclose(sid); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Unlink dataset */ + ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Ldelete"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + /* Check size of file */ + filesize = h5_get_file_size(FILENAME); + VERIFY(filesize, empty_filesize, "h5_get_file_size"); +} /* test_attr_dense_limits() */ + + +/**************************************************************** +** +** test_attr_dense_dup_ids(): Test operations with multiple ID +** handles with "dense" attribute storage creation +** +****************************************************************/ +static void +test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) +{ + hid_t fid; /* HDF5 File ID */ + hid_t dataset; /* Dataset ID */ + hid_t gid1, gid2; /* Group ID */ + hid_t sid, sid2; /* Dataspace ID */ + hid_t attr, attr2, add_attr; /* Attribute ID */ + hid_t dcpl; /* Dataset creation property list ID */ + char attrname[NAME_BUF_SIZE]; /* Name of attribute */ + hsize_t dims[] = {ATTR1_DIM1}; + int read_data1[ATTR1_DIM1]={0}; /* Buffer for reading attribute */ + int rewrite_data[ATTR1_DIM1]={1234, -423, 9907256}; /* Test data for rewrite */ + unsigned scalar_data = 1317; /* scalar data for attribute */ + unsigned read_scalar; /* variable for reading attribute*/ + unsigned max_compact; /* Maximum # of attributes to store compactly */ + unsigned min_dense; /* Minimum # of attributes to store "densely" */ + htri_t is_dense; /* Are attributes stored densely? */ + unsigned u, i; /* Local index variable */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing operations with two IDs for Dense Storage\n")); + + /*----------------------------------------------------------------------------------- + * Create an attribute in dense storage and fill it with fill value. + */ + /* Create file */ + fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); + CHECK(fid, FAIL, "H5Fcreate"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + /* Re-open file */ + fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid, FAIL, "H5Fopen"); + + /* Create dataspace for dataset */ + sid = H5Screate(H5S_SCALAR); + CHECK(sid, FAIL, "H5Screate"); + + /* Query the group creation properties */ + dcpl = H5Pcreate(H5P_DATASET_CREATE); + CHECK(dcpl, FAIL, "H5Pcreate"); + + /* Create a dataset */ + dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dcreate2"); + + /* Retrieve limits for compact/dense attribute storage */ + ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); + CHECK(ret, FAIL, "H5Pget_attr_phase_change"); + + /* Close property list */ + ret = H5Pclose(dcpl); + CHECK(ret, FAIL, "H5Pclose"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); + + /* Add attributes, until just before converting to dense storage */ + for(u = 0; u < max_compact; u++) { + /* Create attribute */ + sprintf(attrname, "attr %02u", u); + attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); + + /* Write data into the attribute */ + ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + } /* end for */ + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); + + /* Add one more attribute, to push into "dense" storage */ + /* Create dataspace for attribute */ + sid2 = H5Screate_simple(ATTR1_RANK, dims, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Create attribute */ + sprintf(attrname, "attr %02u", u); + attr = H5Acreate2(dataset, attrname, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + + /* Open the attribute just created and get a second ID */ + attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); + CHECK(attr2, FAIL, "H5Aopen"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + /*----------------------------------------------------------------------------------- + * Reopen the file and verify the fill value for attribute. Also write + * some real data. + */ + /* Open file */ + fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dopen2"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + + /* Open first attribute for the dataset */ + attr = H5Aopen(dataset, attrname, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Read attribute with fill value */ + ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(0 != read_data1[i]) + TestErrPrintf("%d: attribute data different: read_data1[%d]=%d\n", __LINE__, + i, read_data1[i]); + + /* Open attribute for the second time */ + attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Write attribute information */ + ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + /*----------------------------------------------------------------------------------- + * Reopen the file and verify the data. Also rewrite the data and verify it. + */ + /* Open file */ + fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dopen2"); + + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + + /* Open first attribute for the dataset */ + attr = H5Aopen(dataset, attrname, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Read attribute information */ + ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(attr_data1[i] != read_data1[i]) + TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, attr_data1[i], i, read_data1[i]); + + /* Open attribute for the second time */ + attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Write attribute information with the second ID */ + ret = H5Awrite(attr2, H5T_NATIVE_INT, rewrite_data); + CHECK(ret, FAIL, "H5Awrite"); + + /* Read attribute information with the first ID */ + ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(read_data1[i] != rewrite_data[i]) + TestErrPrintf("%d: attribute data different: read_data1[%d]=%d, rewrite_data[%d]=%d\n", __LINE__, i, read_data1[i], i, rewrite_data[i]); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); + + /*----------------------------------------------------------------------------------- + * Open the attribute by index. Verify the data is shared when the attribute + * is opened twice. + */ + /* Open file */ + fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dopen2"); /* Check on dataset's attribute storage status */ is_dense = H5O_is_attr_dense_test(dataset); VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); + /* Open first attribute for the dataset */ + attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, + H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Open attribute for the second time */ + attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, + H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); + + /* Write attribute information with the second ID */ + ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); + CHECK(ret, FAIL, "H5Awrite"); + + /* Read attribute information with the first ID */ + ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + if(read_scalar != scalar_data) + TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", + __LINE__, read_scalar, scalar_data); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); /* Close Dataset */ ret = H5Dclose(dataset); @@ -2560,193 +3282,237 @@ test_attr_dense_unlink(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ + /*----------------------------------------------------------------------------------- + * Open one attribute. As it remains open, delete some attributes. The + * attribute storage should switch from dense to compact. Then open the + * same attribute for the second time and verify that the attribute data + * is shared. + */ + /* Open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); CHECK(fid, FAIL, "H5Fopen"); - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); + /* Open the dataset */ + dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dopen2"); /* Check on dataset's attribute storage status */ - ret = H5F_get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F_get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F_get_sohm_mesg_count_test"); + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); + /* Open attribute of the dataset for the first time */ + attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, + H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); - /* Check size of file */ - filesize = h5_get_file_size(FILENAME); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); -} /* test_attr_dense_unlink() */ + /* Delete a few attributes until the storage switches to compact */ + for(u = max_compact; u >= min_dense - 1; u--) { + ret = H5Adelete_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)u, + H5P_DEFAULT); + CHECK(ret, FAIL, "H5Adelete_by_idx"); + } - -/**************************************************************** -** -** test_attr_dense_limits(): Test basic H5A (attribute) code. -** Tests attribute in "dense" storage limits -** -****************************************************************/ -static void -test_attr_dense_limits(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact, rmax_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense, rmin_dense; /* Minimum # of attributes to store "densely" */ - htri_t is_dense; /* Are attributes stored densely? */ - unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); - /* Output message about test being performed */ - MESSAGE(5, ("Testing Phase Change Limits For Attributes in Dense Storage\n")); + /* Open attribute for the second time */ + attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, + H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); + /* Write attribute information with the second ID */ + ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); + CHECK(ret, FAIL, "H5Awrite"); + + /* Read attribute information with the first ID */ + ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + if(read_scalar != scalar_data) + TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", + __LINE__, read_scalar, scalar_data); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME); - if(empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); - - /* Re-open file */ + /*----------------------------------------------------------------------------------- + * Open one attribute. As it remains open, create some attributes. The + * attribute storage should switch from compact to dense. Then open the + * same attribute for the second time and verify that the attribute data + * is shared. + */ + /* Open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); CHECK(fid, FAIL, "H5Fopen"); - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Query the group creation properties */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); + /* Open the dataset */ + dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dopen2"); - /* Change limits on compact/dense attribute storage */ - max_compact = 0; - min_dense = 0; - ret = H5Pset_attr_phase_change(dcpl, max_compact, min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); + /* Check on dataset's attribute storage status */ + is_dense = H5O_is_attr_dense_test(dataset); + VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); + /* Open attribute of the dataset for the first time */ + attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, + H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &rmax_compact, &rmin_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(rmax_compact, max_compact, "H5Pget_attr_phase_change"); - VERIFY(rmin_dense, min_dense, "H5Pget_attr_phase_change"); + /* Delete a few attributes until the storage switches to compact */ + for(u = min_dense-1; u <= max_compact; u++) { + /* Create attribute */ + sprintf(attrname, "attr %02u", u); + add_attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); + CHECK(add_attr, FAIL, "H5Acreate2"); - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); + /* Write data into the attribute */ + ret = H5Awrite(add_attr, H5T_NATIVE_UINT, &u); + CHECK(ret, FAIL, "H5Awrite"); + /* Close attribute */ + ret = H5Aclose(add_attr); + CHECK(ret, FAIL, "H5Aclose"); + } /* Check on dataset's attribute storage status */ is_dense = H5O_is_attr_dense_test(dataset); - VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); + VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + /* Open attribute for the second time */ + attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, + H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Aopen"); - /* Add first attribute, which should be immediately in dense storage */ + /* Write attribute information with the second ID */ + ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); + CHECK(ret, FAIL, "H5Awrite"); - /* Create attribute */ - u = 0; - sprintf(attrname, "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); + /* Read attribute information with the first ID */ + ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); + CHECK(ret, FAIL, "H5Aread"); - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); + /* Verify values read in */ + if(read_scalar != scalar_data) + TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", + __LINE__, read_scalar, scalar_data); /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O_is_attr_dense_test(dataset); - VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); - /* Add second attribute, to allow deletions to be checked easily */ + /* Close file */ + ret = H5Fclose(fid); + CHECK(ret, FAIL, "H5Fclose"); - /* Create attribute */ - u = 1; - sprintf(attrname, "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); + /*----------------------------------------------------------------------------------- + * Verify that the attribute being pointed to by different paths shares + * the same data. + */ + /* Open file */ + fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); + CHECK(fid, FAIL, "H5Fopen"); - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); + /* Create a group */ + gid1 = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + CHECK(gid1, FAIL, "H5Gcreate2"); - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); + /* Create hard link to the first group */ + ret = H5Lcreate_hard(gid1, GROUP1_NAME, H5L_SAME_LOC, GROUP2_NAME, H5P_DEFAULT, + H5P_DEFAULT); + CHECK(ret, FAIL, "H5Lcreate_hard"); - /* Check on dataset's attribute storage status */ - is_dense = H5O_is_attr_dense_test(dataset); - VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + /* Add attributes, until just before converting to dense storage */ + for(u = 0; u < max_compact; u++) { + /* Create attribute */ + sprintf(attrname, "attr %02u", u); + attr = H5Acreate2(gid1, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); + /* Write data into the attribute */ + ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); + CHECK(ret, FAIL, "H5Awrite"); - /* Delete second attribute, attributes should still be stored densely */ + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + } /* end for */ - /* Delete attribute */ - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); + /* Try to create another attribute to make dense storage */ + attr = H5Acreate2(gid1, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O_is_attr_dense_test(dataset); + /* Check on group's attribute storage status */ + is_dense = H5O_is_attr_dense_test(gid1); VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test"); + /* Open the hard link just created */ + gid2 = H5Gopen2(fid, GROUP2_NAME, H5P_DEFAULT); + CHECK(gid2, FAIL, "H5Gopen2"); - /* Delete first attribute, attributes should not be stored densely */ + /* Open the attribute of the group for the second time */ + attr2 = H5Aopen(gid2, ATTR2_NAME, H5P_DEFAULT); + CHECK(attr2, FAIL, "H5Aopen"); - /* Delete attribute */ - u = 0; - sprintf(attrname, "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); + /* Write attribute information with the first attribute handle */ + ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); + CHECK(ret, FAIL, "H5Awrite"); - /* Check on dataset's attribute storage status */ - is_dense = H5O_is_attr_dense_test(dataset); - VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); + /* Read attribute information with the second attribute handle */ + ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i = 0; i < ATTR1_DIM1; i++) + if(attr_data1[i] != read_data1[i]) + TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, attr_data1[i], i, read_data1[i]); + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); - /* Close dataspace */ + ret = H5Aclose(attr2); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close group */ + ret = H5Gclose(gid1); + CHECK(ret, FAIL, "H5Gclose"); + + ret = H5Gclose(gid2); + CHECK(ret, FAIL, "H5Gclose"); + + /* Close Attribute dataspace */ ret = H5Sclose(sid); CHECK(ret, FAIL, "H5Sclose"); - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); + /* Close Dataset dataspace */ + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - - /* Check size of file */ - filesize = h5_get_file_size(FILENAME); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); -} /* test_attr_dense_limits() */ +} /* test_attr_dense_dup_ids() */ /**************************************************************** @@ -6077,7 +6843,7 @@ test_attr_iterate2(hbool_t new_format, hid_t fcpl, hid_t fapl) /* Allocate the "visited link" array */ iter_info.max_visit = max_compact * 2; - visited = HDmalloc(sizeof(hbool_t) * iter_info.max_visit); + visited = (hbool_t*)HDmalloc(sizeof(hbool_t) * iter_info.max_visit); CHECK(visited, NULL, "HDmalloc"); iter_info.visited = visited; @@ -8925,6 +9691,9 @@ test_attr(void) /* This next test uses its own file information */ test_attr_dtype_shared(my_fapl); /* Test using shared dataypes in attributes */ + /* This next test uses its own file information */ + test_attr_duplicate_ids(my_fapl); + /* Tests on "new format" attribute storage */ if(new_format == TRUE) { /* Loop over using shared attributes */ @@ -8948,6 +9717,8 @@ test_attr(void) test_attr_dense_rename(my_fcpl, my_fapl); /* Test renaming attributes in dense storage */ test_attr_dense_unlink(my_fcpl, my_fapl); /* Test unlinking object with attributes in dense storage */ test_attr_dense_limits(my_fcpl, my_fapl); /* Test dense attribute storage limits */ + test_attr_dense_dup_ids(my_fcpl, my_fapl); /* Test duplicated IDs for dense attribute storage */ + test_attr_big(my_fcpl, my_fapl); /* Test storing big attribute */ test_attr_null_space(my_fcpl, my_fapl); /* Test storing attribute with NULL dataspace */ test_attr_deprec(fcpl, my_fapl); /* Test deprecated API routines */ diff --git a/test/testhdf5.c b/test/testhdf5.c index 866be42..668498a 100644 --- a/test/testhdf5.c +++ b/test/testhdf5.c @@ -88,4 +88,4 @@ main(int argc, char *argv[]) TestCleanup(); return (GetTestNumErrs()); -} /* end main() */ +} /* end main() */ diff --git a/test/tsohm.c b/test/tsohm.c index 0fc94f2..e213d25 100644 --- a/test/tsohm.c +++ b/test/tsohm.c @@ -974,13 +974,16 @@ static void sohm_attr_helper(hid_t fcpl_id) hid_t type_id; hid_t space_id; hid_t group_id; - hid_t attr_id; + hid_t attr_id, attr_id2; hsize_t dims = 2; int wdata[2] = {7, 42}; int rdata[2]; herr_t ret; size_t x; + /*---------------------------------------------------------------------------- + * Test attribute with transient datatype + */ /* Create a file using the fcpl */ file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); CHECK_I(file_id, "H5Fcreate"); @@ -1021,6 +1024,9 @@ static void sohm_attr_helper(hid_t fcpl_id) ret = H5Aclose(attr_id); CHECK_I(ret, "H5Aclose"); + /*---------------------------------------------------------------------------- + * Test attribute with committed datatype + */ /* Repeat with a committed datatype */ type_id = H5Tcopy(H5T_NATIVE_INT); CHECK_I(type_id, "H5Tcopy"); @@ -1056,6 +1062,47 @@ static void sohm_attr_helper(hid_t fcpl_id) /* Cleanup */ ret = H5Aclose(attr_id); CHECK_I(ret, "H5Aclose"); + + /*---------------------------------------------------------------------------- + * Test attribute operation with two ID handles + */ + /* Create and verify an attribute */ + group_id = H5Gcreate2(file_id, "yet_another_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + CHECK_I(group_id, "H5Gcreate2"); + + attr_id = H5Acreate2(group_id, "attribute", H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT); + CHECK_I(attr_id, "H5Acreate2"); + + /* Open the attribute to get another handle */ + attr_id2 = H5Aopen(group_id, "attribute", H5P_DEFAULT); + CHECK_I(attr_id2, "H5Aopen"); + + ret = H5Awrite(attr_id, H5T_NATIVE_INT, wdata); + CHECK_I(ret, "H5Awrite"); + + /* Close the group */ + ret = H5Gclose(group_id); + CHECK_I(ret, "H5Gclose"); + + /* Flush the file to force data to be written */ + ret = H5Fflush(file_id, H5F_SCOPE_GLOBAL); + CHECK_I(ret, "H5Fflush"); + + /* Verify the data with another ID handle */ + memset(rdata, 0, sizeof(rdata)); + ret = H5Aread(attr_id2, H5T_NATIVE_INT, rdata); + CHECK_I(ret, "H5Aread"); + + for(x=0; x<(size_t)dims; ++x) { + VERIFY(rdata[x], wdata[x], "H5Aread"); + } + + /* Cleanup */ + ret = H5Aclose(attr_id); + CHECK_I(ret, "H5Aclose"); + ret = H5Aclose(attr_id2); + CHECK_I(ret, "H5Aclose"); + ret = H5Sclose(space_id); CHECK_I(ret, "H5Sclose"); ret = H5Fclose(file_id); diff --git a/tools/h52jpeg/Makefile.am b/tools/h52jpeg/Makefile.am deleted file mode 100644 index 05ea153..0000000 --- a/tools/h52jpeg/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# -# Copyright by The HDF Group. -# Copyright by the Board of Trustees of the University of Illinois. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the files COPYING and Copyright.html. COPYING can be found at the root -# of the source code distribution tree; Copyright.html can be found at the -# root level of an installed copy of the electronic HDF5 document set and -# is linked from the top-level documents page. It can also be found at -# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have -# access to either file, you may request a copy from help@hdfgroup.org. -## -## Makefile.am -## Run automake to generate a Makefile.in from this file. -# -# HDF5 Library Makefile(.in) -# - -include $(top_srcdir)/config/commence.am - -# Include src and tools/lib directories -INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src - -# These are our main targets -TEST_PROG=h52jpegtst -TEST_SCRIPT=$(srcdir)/h52jpeg.sh - -check_SCRIPTS=$(TEST_SCRIPT) -check_PROGRAMS=$(TEST_PROG) - -bin_PROGRAMS=h52jpeg -noinst_PROGRAMS=h52jpegtst - -h52jpeg_SOURCES=h52jpeg.c -h52jpegtst_SOURCES=h52jpegtst.c - -# Programs all depend on the hdf5 library, the tools library, and the HL -# library. -LDADD=$(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -ljpeg - -CHECK_CLEANFILES+=*.h5 -CHECK_CLEANFILES+=*.jpeg - -include $(top_srcdir)/config/conclude.am diff --git a/tools/h52jpeg/Makefile.in b/tools/h52jpeg/Makefile.in deleted file mode 100644 index 606ee95..0000000 --- a/tools/h52jpeg/Makefile.in +++ /dev/null @@ -1,882 +0,0 @@ -# Makefile.in generated by automake 1.10.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in 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. - -@SET_MAKE@ - -# -# Copyright by The HDF Group. -# Copyright by the Board of Trustees of the University of Illinois. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the files COPYING and Copyright.html. COPYING can be found at the root -# of the source code distribution tree; Copyright.html can be found at the -# root level of an installed copy of the electronic HDF5 document set and -# is linked from the top-level documents page. It can also be found at -# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have -# access to either file, you may request a copy from help@hdfgroup.org. -# -# HDF5 Library Makefile(.in) -# - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/config/commence.am \ - $(top_srcdir)/config/conclude.am -check_PROGRAMS = $(am__EXEEXT_1) -bin_PROGRAMS = h52jpeg$(EXEEXT) -noinst_PROGRAMS = h52jpegtst$(EXEEXT) -TESTS = $(check_PROGRAMS) $(check_SCRIPTS) -subdir = tools/h52jpeg -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/src/H5config.h -CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -am__EXEEXT_1 = h52jpegtst$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) -am_h52jpeg_OBJECTS = h52jpeg.$(OBJEXT) -h52jpeg_OBJECTS = $(am_h52jpeg_OBJECTS) -h52jpeg_LDADD = $(LDADD) -h52jpeg_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -am_h52jpegtst_OBJECTS = h52jpegtst.$(OBJEXT) -h52jpegtst_OBJECTS = $(am_h52jpegtst_OBJECTS) -h52jpegtst_LDADD = $(LDADD) -h52jpegtst_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src -depcomp = $(SHELL) $(top_srcdir)/bin/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(h52jpeg_SOURCES) $(h52jpegtst_SOURCES) -DIST_SOURCES = $(h52jpeg_SOURCES) $(h52jpegtst_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal -ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@ -AMTAR = @AMTAR@ -AM_MAKEFLAGS = @AM_MAKEFLAGS@ -AR = @AR@ - -# Set the paths for AFS installs of autotools for Linux machines -# Ideally, these tools should never be needed during the build. -AUTOCONF = /home1/packages/autoconf/autoconf-2.60/bin/autoconf -AUTOHEADER = /home1/packages/autoconf/autoconf-2.60/bin/autoheader -AUTOMAKE = /home1/packages/automake/automake-1.9.6/bin/automake-1.9 -AWK = @AWK@ -BYTESEX = @BYTESEX@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CC_VERSION = @CC_VERSION@ - -# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5, -# but which shouldn't be exported to h5cc for building other programs. -CFLAGS = @CFLAGS@ @H5_CFLAGS@ -CLEARFILEBUF = @CLEARFILEBUF@ -CODESTACK = @CODESTACK@ -CONFIG_DATE = @CONFIG_DATE@ -CONFIG_MODE = @CONFIG_MODE@ -CONFIG_USER = @CONFIG_USER@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEBUG_PKG = @DEBUG_PKG@ -DEFAULT_API_VERSION = @DEFAULT_API_VERSION@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@ -DIRECT_VFD = @DIRECT_VFD@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -DYNAMIC_DIRS = @DYNAMIC_DIRS@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -EXTERNAL_FILTERS = @EXTERNAL_FILTERS@ - -# Make sure that these variables are exported to the Makefiles -F9XMODEXT = @F9XMODEXT@ -F9XMODFLAG = @F9XMODFLAG@ -F9XSUFFIXFLAG = @F9XSUFFIXFLAG@ -FC = @FC@ -FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@ -FCFLAGS_f90 = @FCFLAGS_f90@ -FCLIBS = @FCLIBS@ -FGREP = @FGREP@ -FILTERS = @FILTERS@ -FSEARCH_DIRS = @FSEARCH_DIRS@ -GPFS = @GPFS@ -GREP = @GREP@ -H5_CFLAGS = @H5_CFLAGS@ -H5_CPPFLAGS = @H5_CPPFLAGS@ -H5_CXXFLAGS = @H5_CXXFLAGS@ -H5_FCFLAGS = @H5_FCFLAGS@ -H5_LONE_COLON = @H5_LONE_COLON@ -H5_VERSION = @H5_VERSION@ -HADDR_T = @HADDR_T@ -HAVE_DMALLOC = @HAVE_DMALLOC@ -HDF5_HL = @HDF5_HL@ -HDF5_INTERFACES = @HDF5_INTERFACES@ -HDF_CXX = @HDF_CXX@ -HDF_FORTRAN = @HDF_FORTRAN@ -HID_T = @HID_T@ -HL = @HL@ -HL_FOR = @HL_FOR@ -HSIZE_T = @HSIZE_T@ -HSSIZE_T = @HSSIZE_T@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -INSTRUMENT = @INSTRUMENT@ -INSTRUMENT_LIBRARY = @INSTRUMENT_LIBRARY@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LINUX_LFS = @LINUX_LFS@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -LT_STATIC_EXEC = @LT_STATIC_EXEC@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -MPE = @MPE@ -MPI_GET_SIZE = @MPI_GET_SIZE@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PARALLEL = @PARALLEL@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -PTHREAD = @PTHREAD@ -RANLIB = @RANLIB@ -ROOT = @ROOT@ -RUNPARALLEL = @RUNPARALLEL@ -RUNSERIAL = @RUNSERIAL@ -R_INTEGER = @R_INTEGER@ -R_LARGE = @R_LARGE@ -SEARCH = @SEARCH@ -SED = @SED@ -SETX = @SETX@ -SET_MAKE = @SET_MAKE@ - -# Hardcode SHELL to be /bin/sh. Most machines have this shell, and -# on at least one machine configure fails to detect its existence (janus). -# Also, when HDF5 is configured on one machine but run on another, -# configure's automatic SHELL detection may not work on the build machine. -SHELL = /bin/sh -SIZE_T = @SIZE_T@ -STATIC_EXEC = @STATIC_EXEC@ -STATIC_SHARED = @STATIC_SHARED@ -STRICT_FORMAT_CHECKS = @STRICT_FORMAT_CHECKS@ -STRIP = @STRIP@ -TESTPARALLEL = @TESTPARALLEL@ -THREADSAFE = @THREADSAFE@ -TIME = @TIME@ -TR = @TR@ -TRACE_API = @TRACE_API@ -UNAME_INFO = @UNAME_INFO@ -USE_FILTER_DEFLATE = @USE_FILTER_DEFLATE@ -USE_FILTER_FLETCHER32 = @USE_FILTER_FLETCHER32@ -USE_FILTER_NBIT = @USE_FILTER_NBIT@ -USE_FILTER_SCALEOFFSET = @USE_FILTER_SCALEOFFSET@ -USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@ -USE_FILTER_SZIP = @USE_FILTER_SZIP@ -USINGMEMCHECKER = @USINGMEMCHECKER@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_FC = @ac_ct_FC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = $(exec_prefix)/doc -dvidir = @dvidir@ -enable_shared = @enable_shared@ -enable_static = @enable_static@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ - -# Install directories that automake doesn't know about -includedir = $(exec_prefix)/include -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ - -# Shell commands used in Makefiles -RM = rm -f -CP = cp - -# Some machines need a command to run executables; this is that command -# so that our tests will run. -# We use RUNTESTS instead of RUNSERIAL directly because it may be that -# some tests need to be run with a different command. Older versions -# of the makefiles used the command -# $(LIBTOOL) --mode=execute -# in some directories, for instance. -RUNTESTS = $(RUNSERIAL) - -# Libraries to link to while building -LIBHDF5 = $(top_builddir)/src/libhdf5.la -LIBH5TEST = $(top_builddir)/test/libh5test.la -LIBH5F = $(top_builddir)/fortran/src/libhdf5_fortran.la -LIBH5FTEST = $(top_builddir)/fortran/test/libh5test_fortran.la -LIBH5CPP = $(top_builddir)/c++/src/libhdf5_cpp.la -LIBH5TOOLS = $(top_builddir)/tools/lib/libh5tools.la -LIBH5_HL = $(top_builddir)/hl/src/libhdf5_hl.la -LIBH5F_HL = $(top_builddir)/hl/fortran/src/libhdf5hl_fortran.la -LIBH5CPP_HL = $(top_builddir)/hl/c++/src/libhdf5_hl_cpp.la - -# Scripts used to build examples -# If only shared libraries have been installed, have h5cc build examples with -# shared libraries instead of static libraries -H5CC = $(bindir)/h5cc -H5CC_PP = $(bindir)/h5pcc -H5FC = $(bindir)/h5fc -H5FC_PP = $(bindir)/h5pfc -H5CPP = $(bindir)/h5c++ - -# The trace script; this is used on source files from the C library to -# insert tracing macros. -TRACE = perl $(top_srcdir)/bin/trace - -# .chkexe files are used to mark tests that have run successfully. -# .chklog files are output from those tests. -# *.clog are from the MPE option. -CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.h5 *.jpeg - -# Include src and tools/lib directories -INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src - -# These are our main targets -TEST_PROG = h52jpegtst -TEST_SCRIPT = $(srcdir)/h52jpeg.sh -check_SCRIPTS = $(TEST_SCRIPT) -h52jpeg_SOURCES = h52jpeg.c -h52jpegtst_SOURCES = h52jpegtst.c - -# Programs all depend on the hdf5 library, the tools library, and the HL -# library. -LDADD = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -ljpeg - -# Automake needs to be taught how to build lib, progs, and tests targets. -# These will be filled in automatically for the most part (e.g., -# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and -# EXTRA_TEST variables are supplied to allow the user to force targets to -# be built at certain times. -LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES) \ - $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB) - -PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS) \ - $(EXTRA_PROG) - -TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_) -TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_) -TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_) -TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_) -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h52jpeg/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign tools/h52jpeg/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done - -clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -h52jpeg$(EXEEXT): $(h52jpeg_OBJECTS) $(h52jpeg_DEPENDENCIES) - @rm -f h52jpeg$(EXEEXT) - $(LINK) $(h52jpeg_OBJECTS) $(h52jpeg_LDADD) $(LIBS) -h52jpegtst$(EXEEXT): $(h52jpegtst_OBJECTS) $(h52jpegtst_DEPENDENCIES) - @rm -f h52jpegtst$(EXEEXT) - $(LINK) $(h52jpegtst_OBJECTS) $(h52jpegtst_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h52jpeg.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h52jpegtst.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS) - $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-am -all-am: Makefile $(PROGRAMS) all-local -installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ - clean-libtool clean-noinstPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: install-binPROGRAMS - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool mostlyclean-local - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - clean clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-binPROGRAMS install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \ - pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS - - -# List all build rules defined by HDF5 Makefiles as "PHONY" targets here. -# This tells the Makefiles that these targets are not files to be built but -# commands that should be executed even if a file with the same name already -# exists. -.PHONY: build-check-clean build-check-p build-check-s build-lib build-progs \ - build-tests check-clean check-install check-p check-s check-vfd \ - install-doc lib progs tests uninstall-doc _exec_check-s _test help - -help: - @$(top_srcdir)/bin/makehelp - -# lib/progs/tests targets recurse into subdirectories. build-* targets -# build files in this directory. -build-lib: $(LIB) -build-progs: $(LIB) $(PROGS) -build-tests: $(LIB) $(PROGS) $(TESTS) - -# General rule for recursive building targets. -# BUILT_SOURCES contain targets that need to be built before anything else -# in the directory (e.g., for Fortran type detection) -lib progs tests check-s check-p :: $(BUILT_SOURCES) - @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1; - @for d in X $(SUBDIRS); do \ - if test $$d != X && test $$d != .; then \ - (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ - fi; \ - done - -# General rule for recursive cleaning targets. Like the rule above, -# but doesn't require building BUILT_SOURCES. -check-clean :: - @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1; - @for d in X $(SUBDIRS); do \ - if test $$d != X && test $$d != .; then \ - (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ - fi; \ - done - -# Tell Automake to build tests when the user types `make all' (this is -# not its default behavior). Also build EXTRA_LIB and EXTRA_PROG since -# Automake won't build them automatically, either. -all-local: $(EXTRA_LIB) $(EXTRA_PROG) $(TESTS) - -# make install-doc doesn't do anything outside of doc directory, but -# Makefiles should recognize it. -# UPDATE: docs no longer reside in this build tree, so this target -# is depreciated. -install-doc uninstall-doc: - @echo "Nothing to be done." - -# clean up files generated by tests so they can be re-run. -build-check-clean: - $(RM) -rf $(CHECK_CLEANFILES) - -# run check-clean whenever mostlyclean is run -mostlyclean-local: build-check-clean - -# check-install is just a synonym for installcheck -check-install: installcheck - -# Run each test in order, passing $(TEST_FLAGS) to the program. -# Since tests are done in a shell loop, "make -i" does apply inside it. -# Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop. -# The timestamps give a rough idea how much time the tests use. -# -# Note that targets in TESTS (defined above) will be built when the user -# types 'make tests' or 'make check', but only programs in TEST_PROG, -# TEST_PROG_PARA, or TEST_SCRIPT will actually be executed. -check-TESTS: test - -test _test: - @$(MAKE) build-check-s - @$(MAKE) build-check-p - -# Actual execution of check-s. -build-check-s: $(LIB) $(PROGS) $(TESTS) - @if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then \ - echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \ - fi - @$(MAKE) $(AM_MAKEFLAGS) _exec_check-s - @if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then \ - echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\ - fi - -_exec_check-s: $(TEST_PROG_CHKEXE) $(TEST_SCRIPT_CHKSH) - -# The dummy.chkexe here prevents the target from being -# empty if there are no tests in the current directory. -# $${log} is the log file. -# $${tname} is the name of test. -$(TEST_PROG_CHKEXE) $(TEST_PROG_PARA_CHKEXE) dummy.chkexe_: - @if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummy.chkexe_"; then \ - tname=$(@:.chkexe_=)$(EXEEXT);\ - log=$(@:.chkexe_=.chklog); \ - echo "============================"; \ - if $(top_srcdir)/bin/newer $(@:.chkexe_=.chkexe) $${tname}; then \ - echo "No need to test $${tname} again."; \ - else \ - echo "============================" > $${log}; \ - if test "X$(FORTRAN_API)" = "Xyes"; then \ - echo "Fortran API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \ - echo "Fortran API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ - elif test "X$(CXX_API)" = "Xyes"; then \ - echo "C++ API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \ - echo "C++ API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log};\ - else \ - echo "Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \ - echo "$(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ - fi; \ - echo "============================" >> $${log}; \ - srcdir="$(srcdir)" \ - $(TIME) $(RUNTESTS) ./$${tname} $(TEST_FLAGS) >> $${log} 2>&1 \ - && touch $(@:.chkexe_=.chkexe) || \ - (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \ - (cat $${log} && false) || exit 1; \ - echo "" >> $${log}; \ - echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \ - echo "============================" >> $${log}; \ - echo "Finished testing $${tname} $(TEST_FLAGS)"; \ - cat $${log}; \ - fi; \ - fi - -# The dummysh.chkexe here prevents the target from being -# empty if there are no tests in the current directory. -# $${log} is the log file. -# $${tname} is the name of test. -$(TEST_SCRIPT_CHKSH) $(TEST_SCRIPT_PARA_CHKSH) dummysh.chkexe_: - @if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummysh.chkexe_"; then \ - cmd=$(@:.chkexe_=);\ - tname=`basename $$cmd`;\ - chkname=`basename $(@:.chkexe_=.chkexe)`;\ - log=`basename $(@:.chkexe_=.chklog)`; \ - echo "============================"; \ - if $(top_srcdir)/bin/newer $${chkname} $$cmd $(SCRIPT_DEPEND); then \ - echo "No need to test $${tname} again."; \ - else \ - echo "============================" > $${log}; \ - if test "X$(FORTRAN_API)" = "Xyes"; then \ - echo "Fortran API: Testing $${tname} $(TEST_FLAGS)"; \ - echo "Fortran API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ - elif test "X$(CXX_API)" = "Xyes"; then \ - echo "C++ API: Testing $${tname} $(TEST_FLAGS)"; \ - echo "C++ API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ - else \ - echo "Testing $${tname} $(TEST_FLAGS)"; \ - echo "$${tname} $(TEST_FLAGS) Test Log" >> $${log}; \ - fi; \ - echo "============================" >> $${log}; \ - RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)" \ - srcdir="$(srcdir)" \ - $(TIME) $(SHELL) $$cmd $(TEST_FLAGS) >> $${log} 2>&1 \ - && touch $${chkname} || \ - (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \ - (cat $${log} && false) || exit 1; \ - echo "" >> $${log}; \ - echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \ - echo "============================" >> $${log}; \ - echo "Finished testing $${tname} $(TEST_FLAGS)"; \ - cat $${log}; \ - fi; \ - echo "============================"; \ - fi - -# Actual execution of check-p. -build-check-p: $(LIB) $(PROGS) $(TESTS) - @if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then \ - echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \ - fi - @if test -n "$(TEST_PROG_PARA)"; then \ - echo "**** Hint ****"; \ - echo "Parallel test files reside in the current directory" \ - "by default."; \ - echo "Set HDF5_PARAPREFIX to use another directory. E.g.,"; \ - echo " HDF5_PARAPREFIX=/PFS/user/me"; \ - echo " export HDF5_PARAPREFIX"; \ - echo " make check"; \ - echo "**** end of Hint ****"; \ - fi - @for test in $(TEST_PROG_PARA) dummy; do \ - if test $$test != dummy; then \ - $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ \ - RUNTESTS="$(RUNPARALLEL)" || exit 1; \ - fi; \ - done - @for test in $(TEST_SCRIPT_PARA) dummy; do \ - if test $$test != dummy; then \ - $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ || exit 1; \ - fi; \ - done - @if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then \ - echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\ - fi - -# Run test with different Virtual File Driver -check-vfd: $(LIB) $(PROGS) $(TESTS) - @for vfd in $(VFD_LIST) dummy; do \ - if test $$vfd != dummy; then \ - echo "============================"; \ - echo "Testing Virtual File Driver $$vfd"; \ - echo "============================"; \ - $(MAKE) $(AM_MAKEFLAGS) check-clean || exit 1; \ - HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \ - fi; \ - done -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/tools/h52jpeg/h52jpeg.c b/tools/h52jpeg/h52jpeg.c deleted file mode 100644 index 84fa145..0000000 --- a/tools/h52jpeg/h52jpeg.c +++ /dev/null @@ -1,641 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* From jpeg documentation - * - * Include file for users of JPEG library. - * You will need to have included system headers that define at least - * the typedefs FILE and size_t before you can include jpeglib.h. - * (stdio.h is sufficient on ANSI-conforming systems.) - * You may also wish to include "jerror.h". - */ - -#include -#include -#include - -#include "jpeglib.h" -#include "jerror.h" - -#include "H5private.h" -#include "h5tools.h" -#include "h5tools_utils.h" -#include "h5trav.h" -#include "H5IMpublic.h" - - -const char *progname = "h52jpeg"; -int d_status = EXIT_SUCCESS; - -/* command-line options: The user can specify short or long-named parameters */ -static const char *s_opts = "hVvi:t:"; -static struct long_options l_opts[] = { - { "help", no_arg, 'h' }, - { "version", no_arg, 'V' }, - { "verbose", no_arg, 'v' }, - { "image", require_arg, 'i' }, - { "type", require_arg, 't' }, - { NULL, 0, '\0' } -}; - - -/* a structure that contains h52jpeg options */ -typedef struct -{ - const char *file_name; - const char *template_name; - const char *image_name; - int image_type; - int verbose; -} h52jpeg_opt_t; - - -/* prototypes */ -static void usage(const char *prog); -static int h52jpeg(h52jpeg_opt_t opt); -static void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name); -static int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name); -static void write_JPEG_file(char *filename, JSAMPLE *image_buffer, int image_height, int image_width, int planes); - - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: h52jpeg main program - * - * Programmer: Pedro Vicente, pvn@hdfgroup.org - * - * Date: May 30, 2008 - * - *------------------------------------------------------------------------- - */ -int main(int argc, const char *argv[]) -{ - h52jpeg_opt_t opt; - const char *image_type = NULL; - int op; - - /* initialze options to 0 */ - memset(&opt,0,sizeof(h52jpeg_opt_t)); - - /* parse command line options */ - while ((op = get_option(argc, argv, s_opts, l_opts)) != EOF) - { - switch ((char)op) - { - case 'h': - usage(progname); - exit(EXIT_SUCCESS); - case 'V': - print_version(progname); - exit(EXIT_SUCCESS); - case 'v': - opt.verbose = 1; - break; - case 'i': - opt.image_name = opt_arg; - break; - case 't': - image_type = opt_arg; - - - if ( HDstrcmp( image_type, "gray" ) == 0 ) - { - opt.image_type = 0; - } - else if ( HDstrcmp( image_type, "true" ) == 0 ) - { - opt.image_type = 1; - } - else - { - printf("<%s> is an invalid image type\n", image_type); - exit(EXIT_FAILURE); - } - - break; - - } /* switch */ - - - } /* while */ - - /* check for file names to be processed */ - if ( argv[ opt_ind ] != NULL && argv[ opt_ind + 1 ] != NULL ) - { - opt.file_name = argv[ opt_ind ]; - opt.template_name = argv[ opt_ind + 1 ]; - } - - else - { - usage(progname); - exit(EXIT_FAILURE); - } - - if ( h52jpeg(opt) < 0 ) - return 1; - - - return 0; -} - - - -/*------------------------------------------------------------------------- - * Function: usage - * - * Purpose: print usage - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void usage(const char *prog) -{ - printf("usage: %s [OPTIONS] file template\n", prog); - printf(" file HDF5 file name\n"); - printf(" template Name template for jpeg images\n"); - printf(" OPTIONS\n"); - printf(" -h, --help Print a usage message and exit\n"); - printf(" -v, --verbose Verbose mode, print object information\n"); - printf(" -V, --version Print HDF5 version number and exit\n"); - printf(" -i, --image Image name (full path in HDF5 file)\n"); - printf(" -t T, --type=T Type of image (graycolor or truecolor)\n"); - - printf("\n"); - - printf(" T - is a string, either or \n"); - -} - -/*------------------------------------------------------------------------- - * Function: h52jpeg - * - * Parameters: OPT, options at command line - * - * Purpose: traverse the HDF5 file, save HDF5 images to jpeg files, translate - * 2D datasets of classes H5T_INTEGER and H5T_FLOAT to image data and save them - * to jpeg files - * - * Return: 0, all is fine, -1 not all is fine - * - *------------------------------------------------------------------------- - */ -static int h52jpeg(h52jpeg_opt_t opt) -{ - hid_t fid; - trav_table_t *travt = NULL; - size_t i; - - - /* open the HDF5 file */ - if (( fid = h5tools_fopen(opt.file_name, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) - { - error_msg(progname, "cannot open file <%s>\n", opt.file_name ); - return -1; - } - - /*------------------------------------------------------------------------- - * image/dataset name was specified at command line - *------------------------------------------------------------------------- - */ - - if ( opt.image_name ) - { - - /* read HDF5 image/dataset, save jpeg image */ - do_image(fid, opt, opt.image_name); - - } - - /*------------------------------------------------------------------------- - * image name was not specified; traverse the file - *------------------------------------------------------------------------- - */ - - else - - { - - /* initialize traversal table */ - trav_table_init(&travt); - - /* get the list of objects in the file */ - if ( h5trav_gettable(fid, travt) < 0 ) - goto out; - - /* search for images/datasets in file */ - for ( i = 0; i < travt->nobjs; i++) - { - - switch ( travt->objs[i].type ) - { - default: - goto out; - - case H5TRAV_TYPE_GROUP: - case H5TRAV_TYPE_NAMED_DATATYPE: - case H5TRAV_TYPE_LINK: - case H5TRAV_TYPE_UDLINK: - - break; - - case H5TRAV_TYPE_DATASET: - - /* read HDF5 image/dataset, save jpeg image */ - do_image(fid, opt, travt->objs[i].name); - - break; /* H5TRAV_TYPE_DATASET */ - - } /* switch */ - - } /* i */ - - - /* free table */ - trav_table_free(travt); - - } /* image_name */ - - - /* close */ - if ( H5Fclose(fid) < 0 ) - return -1; - - return 0; - -out: - H5E_BEGIN_TRY - { - H5Fclose(fid); - - } H5E_END_TRY; - - - return -1; -} - - - -/*------------------------------------------------------------------------- - * Function: do_image - * - * Parameters: HDF5 file id, command line options, an image name - * - * Purpose: read HDF5 image/dataset, save jpeg image - * - * Return: int - * - *------------------------------------------------------------------------- - */ -static -int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) -{ - hsize_t width; - hsize_t height; - hsize_t planes; - char interlace[20]; - hssize_t npals; - void *buf=NULL; - H5T_class_t tclass; - hid_t sid; - hid_t did; - hid_t tid; - int rank; - hsize_t dims[H5S_MAX_RANK]; - hsize_t maxdim[H5S_MAX_RANK]; - size_t size; - hsize_t nelmts; - const char* name; - int j; - int done; - char jpeg_name[1024]; - - name = image_name; - - /* build the jpeg file name */ - make_jpeg_name( opt.template_name, image_name, jpeg_name); - - done = 0; - - if ( opt.verbose) - { - printf("%s ...", name ); - } - - /*------------------------------------------------------------------------- - * HDF5 Image - *------------------------------------------------------------------------- - */ - - if ( H5IMis_image( fid, name ) ) - { - - if ( H5IMget_image_info( fid, name, &width, &height, &planes, interlace, &npals ) < 0 ) - goto out; - - if (NULL == (buf = HDmalloc( (size_t)width * (size_t)height * (size_t)planes ))) - goto out; - - if ( H5IMread_image( fid, name, buf ) < 0 ) - goto out; - - /* write the jpeg file */ - /* write the jpeg file */ - write_JPEG_file (jpeg_name, - buf, - (int) height, - (int) width, - (int) planes); - - - free( buf ); - buf = NULL; - - done = 1; - - - - } - - /*------------------------------------------------------------------------- - * regular dataset - *------------------------------------------------------------------------- - */ - - else - { - - if (( did = H5Dopen2( fid, name, H5P_DEFAULT )) < 0) - goto out; - if (( sid = H5Dget_space( did )) < 0 ) - goto out; - if (( rank = H5Sget_simple_extent_ndims(sid)) < 0 ) - goto out; - if (( tid = H5Dget_type( did )) < 0 ) - goto out; - if (( tclass = H5Tget_class(tid)) < 0) - goto out; - - if ( ( H5T_FLOAT == tclass || H5T_INTEGER == tclass) && - ( rank == 2 ) ) - { - - if ( H5Sget_simple_extent_dims( sid, dims, maxdim ) < 0 ) - goto out; - - size = H5Tget_size( tid ); - - nelmts = 1; - for ( j = 0; j < rank; j++) - { - nelmts *= dims[j]; - } - - if ( NULL == (buf = HDmalloc( (size_t)nelmts * size ))) - goto out; - if ( H5Dread(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf) < 0 ) - goto out; - - height = dims[0]; - width = dims[1]; - - if ( opt.image_type == 0 ) - planes = 1; - else if ( opt.image_type == 1 ) - planes = 3; - - - - free( buf ); - buf = NULL; - - } - - - - H5Sclose(sid); - H5Tclose(tid); - H5Dclose(did); - - - - - } /* else */ - - - if ( opt.verbose) - { - if ( done ) - { - printf("saved to %s\n", jpeg_name ); - } - else - { - printf("\n"); - } - - } - - return 0; - -out: - H5E_BEGIN_TRY - { - - H5Sclose(sid); - H5Tclose(tid); - H5Dclose(did); - - } H5E_END_TRY; - - if ( buf != NULL ) - free( buf ); - - - return -1; - -} - -/*------------------------------------------------------------------------- - * Function: make_jpeg_name - * - * Parameters: template name (IN), image name (IN), jpeg name (IN/OUT) - * - * Purpose: build a name for the jpeg image file upon a template name - * and the HDF5 image name - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static -void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name) -{ - int j; - int len; - - HDstrcpy( jpeg_name, template_name ); - HDstrcat( jpeg_name, image_name ); - HDstrcat( jpeg_name, ".jpeg" ); - len = HDstrlen( jpeg_name); - - /* HDF5 path names might contain '/', replace with '_' */ - for (j = 0; j < len; j++) - { - if (jpeg_name[j] == '/') - { - jpeg_name[j] = '_'; - } - } - -} - -/* - * Sample routine for JPEG compression. - * - * IMAGE DATA FORMATS: - * - * The standard input image format is a rectangular array of pixels, with - * each pixel having the same number of "component" values (color channels). - * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). - * If you are working with color data, then the color values for each pixel - * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit - * RGB color. - * - * For this example, we'll assume that this data structure matches the way - * our application has stored the image in memory, so we can just pass a - * pointer to our image buffer. - */ - -static -void write_JPEG_file(char *filename, - JSAMPLE *image_buffer, /* Points to large array of R,G,B-order data */ - int image_height, /* Number of rows in image */ - int image_width, /* Number of columns in image */ - int planes) /* # of color components per pixel */ -{ - /* This struct contains the JPEG compression parameters and pointers to - * working space (which is allocated as needed by the JPEG library). - * It is possible to have several such structures, representing multiple - * compression/decompression processes, in existence at once. We refer - * to any one struct (and its associated working data) as a "JPEG object". - */ - struct jpeg_compress_struct cinfo; - /* This struct represents a JPEG error handler. It is declared separately - * because applications often want to supply a specialized error handler - * (see the second half of this file for an example). But here we just - * take the easy way out and use the standard error handler, which will - * print a message on stderr and call exit() if compression fails. - * Note that this struct must live as long as the main JPEG parameter - * struct, to avoid dangling-pointer problems. - */ - struct jpeg_error_mgr jerr; - /* More stuff */ - FILE * outfile; /* target file */ - JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ - int row_stride; /* physical row width in image buffer */ - - /* Step 1: allocate and initialize JPEG compression object */ - - /* We have to set up the error handler first, in case the initialization - * step fails. (Unlikely, but it could happen if you are out of memory.) - * This routine fills in the contents of struct jerr, and returns jerr's - * address which we place into the link field in cinfo. - */ - cinfo.err = jpeg_std_error(&jerr); - /* Now we can initialize the JPEG compression object. */ - jpeg_create_compress(&cinfo); - - /* Step 2: specify data destination (eg, a file) */ - /* Note: steps 2 and 3 can be done in either order. */ - - /* Here we use the library-supplied code to send compressed data to a - * stdio stream. You can also write your own code to do something else. - * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that - * requires it in order to write binary files. - */ - if ((outfile = fopen(filename, "wb")) == NULL) { - fprintf(stderr, "can't open %s\n", filename); - exit(1); - } - jpeg_stdio_dest(&cinfo, outfile); - - /* Step 3: set parameters for compression */ - - /* First we supply a description of the input image. - * Four fields of the cinfo struct must be filled in: - */ - cinfo.image_width = image_width; /* image width and height, in pixels */ - cinfo.image_height = image_height; - cinfo.input_components = planes; /* # of color components per pixel */ - - /* colorspace of input image */ - if (planes == 3) - cinfo.in_color_space = JCS_RGB; - else if (planes == 1) - cinfo.in_color_space = JCS_GRAYSCALE; - - /* Now use the library's routine to set default compression parameters. - * (You must set at least cinfo.in_color_space before calling this, - * since the defaults depend on the source color space.) - */ - jpeg_set_defaults(&cinfo); - /* Now you can set any non-default parameters you wish to. - * Here we just illustrate the use of quality (quantization table) scaling: - */ - jpeg_set_quality(&cinfo, 100, TRUE /* limit to baseline-JPEG values */); - - /* Step 4: Start compressor */ - - /* TRUE ensures that we will write a complete interchange-JPEG file. - * Pass TRUE unless you are very sure of what you're doing. - */ - jpeg_start_compress(&cinfo, TRUE); - - /* Step 5: while (scan lines remain to be written) */ - /* jpeg_write_scanlines(...); */ - - /* Here we use the library's state variable cinfo.next_scanline as the - * loop counter, so that we don't have to keep track ourselves. - * To keep things simple, we pass one scanline per call; you can pass - * more if you wish, though. - */ - row_stride = image_width * planes; /* JSAMPLEs per row in image_buffer */ - - while (cinfo.next_scanline < cinfo.image_height) { - /* jpeg_write_scanlines expects an array of pointers to scanlines. - * Here the array is only one element long, but you could pass - * more than one scanline at a time if that's more convenient. - */ - row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; - (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); - } - - /* Step 6: Finish compression */ - - jpeg_finish_compress(&cinfo); - /* After finish_compress, we can close the output file. */ - fclose(outfile); - - /* Step 7: release JPEG compression object */ - - /* This is an important step since it will release a good deal of memory. */ - jpeg_destroy_compress(&cinfo); - - /* And we're done! */ -} - diff --git a/tools/h52jpeg/h52jpeg.sh b/tools/h52jpeg/h52jpeg.sh deleted file mode 100644 index b1e1109..0000000 --- a/tools/h52jpeg/h52jpeg.sh +++ /dev/null @@ -1,87 +0,0 @@ -#! /bin/sh -# -# Copyright by The HDF Group. -# Copyright by the Board of Trustees of the University of Illinois. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the files COPYING and Copyright.html. COPYING can be found at the root -# of the source code distribution tree; Copyright.html can be found at the -# root level of an installed copy of the electronic HDF5 document set and -# is linked from the top-level documents page. It can also be found at -# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have -# access to either file, you may request a copy from help@hdfgroup.org. -# -# Tests for the h52jpeg tool -# Pedro Vicente Nunes (THG), 6/16/2008 - -TOOL=h52jpeg # The tool name -TOOL_BIN=`pwd`/$TOOL # The path of the tool binary - -SRCFILE=h52jpegtst.h5 -INDIR=$srcdir/testfiles -TESTFILE="$INDIR/$SRCFILE" - -nerrors=0 - - -# Print a line-line message left justified in a field of 70 characters -# beginning with the word "Testing". -# -TESTING() { - SPACES=" " - echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012' -} - -# Just call the tool binary with the command line parameters -# and use the return value of main to print FAILED or PASSED -# -TOOLTEST() -{ - # Run test. - # Tflops interprets "$@" as "" when no parameter is given (e.g., the - # case of missing file name). Changed it to use $@ till Tflops fixes it. - - if [ "`uname -s`" = "TFLOPS O/S" ]; then - $RUNSERIAL $TOOL_BIN $@ - else - $RUNSERIAL $TOOL_BIN "$@" - fi - - RET=$? - if [ $RET != 0 ] ; then - echo "*FAILED*" - nerrors="`expr $nerrors + 1`" - else - echo " PASSED" - fi -} - - - -############################################################################## -# The tests -# To avoid the printing of the complete full path of the test file, that hides -# all the other parameters for long paths, the printing of the command line -# is done first in -# TESTING with the name only of the test file $TOOL, not its full path $TESTFILE -############################################################################## - - -# Test for traversing the file and export all images/datasets to jpeg -TESTING $TOOL $SRCFILE myjpeg1 -TOOLTEST $TESTFILE myjpeg1 - -# Test for reading an image path -TESTING $TOOL -i image8bit $SRCFILE myjpeg2 -TOOLTEST -i image8bit $TESTFILE myjpeg2 - - - -if test $nerrors -eq 0 ; then - echo "All $TOOL tests passed." -fi - -exit $nerrors - diff --git a/tools/h52jpeg/h52jpegtst.c b/tools/h52jpeg/h52jpegtst.c deleted file mode 100644 index 3a4b277..0000000 --- a/tools/h52jpeg/h52jpegtst.c +++ /dev/null @@ -1,181 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "hdf5.h" -#include "hdf5_hl.h" -#include -#include - -#define DATA_FILE1 "image8.txt" -#define DATA_FILE2 "image24pixel.txt" -#define IMAGE1_NAME "image8bit" -#define IMAGE2_NAME "image24bitpixel" -#define PAL_NAME "palette" -#define PAL_ENTRIES 256 - -static int read_data(const char* file_name, hsize_t *width, hsize_t *height ); -unsigned char *gbuf = 0; /* global buffer for image data */ - -int main( void ) -{ - hid_t fid; /* HDF5 file identifier */ - hsize_t width; /* width of image */ - hsize_t height; /* height of image */ - unsigned char pal[ PAL_ENTRIES * 3 ]; /* palette array */ - hsize_t pal_dims[2] = {PAL_ENTRIES,3}; /* palette dimensions */ - int i, n; - - /* create a new HDF5 file using default properties. */ - if (( fid = H5Fcreate( "h52jpegtst.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT )) < 0 ) - return 1; - - /* read first data file */ - if ( read_data( DATA_FILE1, &width, &height ) < 0 ) - goto out; - - /* make the image */ - if ( H5IMmake_image_8bit( fid, IMAGE1_NAME, width, height, gbuf ) < 0 ) - goto out; - - /*------------------------------------------------------------------------- - * define a palette, blue to red tones - *------------------------------------------------------------------------- - */ - for ( i=0, n=0; im_report = 1; break; + case 'c': + options->m_contents = 1; + break; case 'd': options->d=1; @@ -170,7 +174,7 @@ void parse_command_line(int argc, void print_info(diff_opt_t* options) { - if (options->m_quiet || options->err_stat) + if (options->m_quiet || options->err_stat || options->m_contents) return; if (options->cmn_objs==0) @@ -318,8 +322,10 @@ void usage(void) printf(" -V, --version Print version number and exit\n"); printf(" -r, --report Report mode. Print differences\n"); printf(" -v, --verbose Verbose mode. Print differences, list of objects\n"); - printf(" -q, --quiet Quiet mode. Do not do output\n"); + printf(" -c, --contents Contents mode. Objects in both files must match\n"); + + printf(" -n C, --count=C Print differences up to C number\n"); printf(" -d D, --delta=D Print difference when greater than limit D\n"); printf(" -p R, --relative=R Print difference when greater than relative limit R\n"); @@ -339,6 +345,22 @@ void usage(void) printf(" -r Report mode: print the above plus the differences\n"); printf(" -v Verbose mode: print the above plus a list of objects and warnings\n"); printf(" -q Quiet mode: do not print output\n"); + printf(" -c Contents mode: objects in both files must match\n"); + + printf("\n"); + + printf(" Compare criteria\n"); + printf("\n"); + printf(" If no objects [obj1[obj2]] are specified, h5diff only compares objects\n"); + printf(" with the same absolute path in both files. However,\n"); + printf(" when the -c flag is present, (contents mode) the objects in file1\n"); + printf(" must match exactly the objects in file2\n"); + printf("\n"); + + printf(" The compare criteria is:\n"); + printf(" 1) datasets: numerical array differences 2) groups: name string difference\n"); + printf(" 3) datatypes: the return value of H5Tequal 2) links: name string difference\n"); + printf(" of the linked value\n"); printf("\n"); @@ -368,11 +390,7 @@ void usage(void) printf("\n"); printf(" to compare '/g1/dset1' and '/g1/dset2' in the same file\n"); printf("\n"); - printf(" If no objects [obj1[obj2]] are specified, h5diff only compares objects\n"); - printf(" with the same absolute path in both files. The compare criteria is:\n"); - printf(" 1) datasets: numerical array differences 2) groups: name string difference\n"); - printf(" 3) datatypes: the return value of H5Tequal 2) links: name string difference\n"); - printf(" of the linked value\n"); + } diff --git a/tools/h5diff/h5diff_main.c b/tools/h5diff/h5diff_main.c index 54a075f..6d1a508 100644 --- a/tools/h5diff/h5diff_main.c +++ b/tools/h5diff/h5diff_main.c @@ -62,6 +62,12 @@ * November 19, 2007 * adopted the syntax h5diff [OPTIONS] file1 file2 [obj1[obj2]] * + * Aug 2008 + * Added a "contents" mode check. + * If this mode is present, objects in both files must match (must be exactly the same) + * If this does not happen, the tool returns an error code of 1 + * (instead of the success code of 0) + * *------------------------------------------------------------------------- */ @@ -89,6 +95,10 @@ int main(int argc, const char *argv[]) */ ret = (nfound == 0 ? 0 : 1 ); + + if ( options.m_contents && options.contents == 0 ) + ret = 1; + if(options.err_stat) ret = -1; return ret; diff --git a/tools/h5diff/testfiles/h5diff_10.txt b/tools/h5diff/testfiles/h5diff_10.txt index 887ee9e..8877a75 100644 --- a/tools/h5diff/testfiles/h5diff_10.txt +++ b/tools/h5diff/testfiles/h5diff_10.txt @@ -9,6 +9,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -23,6 +24,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -48,8 +62,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_19.txt b/tools/h5diff/testfiles/h5diff_19.txt new file mode 100644 index 0000000..cda2f73 --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_19.txt @@ -0,0 +1,24 @@ + +file1 file2 +--------------------------------------- + x x / + x /g1 + x /g1/d1 + x /g1/d2 + x /g1/dset1 + x /g1/dset10 + x /g1/dset3 + x /g1/dset5 + x /g1/dset6 + x /g1/dset7 + x /g1/dset8 + x /g1/dset9 + x /g1/fp1 + x /g1/fp15 + x /g1/fp16 + x /g1/fp17 + x /g1/fp18 + x /g1/fp2 + +group : and +0 differences found diff --git a/tools/h5diff/testfiles/h5diff_600.txt b/tools/h5diff/testfiles/h5diff_600.txt index 82b69d9..3697279 100644 --- a/tools/h5diff/testfiles/h5diff_600.txt +++ b/tools/h5diff/testfiles/h5diff_600.txt @@ -9,6 +9,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -23,6 +24,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -48,9 +62,4 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value h5diff error: missing file names diff --git a/tools/h5diff/testfiles/h5diff_603.txt b/tools/h5diff/testfiles/h5diff_603.txt index 9ddf674..a2f07f2 100644 --- a/tools/h5diff/testfiles/h5diff_603.txt +++ b/tools/h5diff/testfiles/h5diff_603.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_604.txt b/tools/h5diff/testfiles/h5diff_604.txt index 763999d..90d9bdb 100644 --- a/tools/h5diff/testfiles/h5diff_604.txt +++ b/tools/h5diff/testfiles/h5diff_604.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_605.txt b/tools/h5diff/testfiles/h5diff_605.txt index e00bf5b..9e45341 100644 --- a/tools/h5diff/testfiles/h5diff_605.txt +++ b/tools/h5diff/testfiles/h5diff_605.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_606.txt b/tools/h5diff/testfiles/h5diff_606.txt index 3d77495..31053d5 100644 --- a/tools/h5diff/testfiles/h5diff_606.txt +++ b/tools/h5diff/testfiles/h5diff_606.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_612.txt b/tools/h5diff/testfiles/h5diff_612.txt index 8f665b8..0a05b7f 100644 --- a/tools/h5diff/testfiles/h5diff_612.txt +++ b/tools/h5diff/testfiles/h5diff_612.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_613.txt b/tools/h5diff/testfiles/h5diff_613.txt index f3f16fd..155d7f6 100644 --- a/tools/h5diff/testfiles/h5diff_613.txt +++ b/tools/h5diff/testfiles/h5diff_613.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_614.txt b/tools/h5diff/testfiles/h5diff_614.txt index c78fc8c..fac1c6a 100644 --- a/tools/h5diff/testfiles/h5diff_614.txt +++ b/tools/h5diff/testfiles/h5diff_614.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_615.txt b/tools/h5diff/testfiles/h5diff_615.txt index d25b847..f40ac2a 100644 --- a/tools/h5diff/testfiles/h5diff_615.txt +++ b/tools/h5diff/testfiles/h5diff_615.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_621.txt b/tools/h5diff/testfiles/h5diff_621.txt index 21dac0b..93f1714 100644 --- a/tools/h5diff/testfiles/h5diff_621.txt +++ b/tools/h5diff/testfiles/h5diff_621.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_622.txt b/tools/h5diff/testfiles/h5diff_622.txt index c46356a..0cdc67c 100644 --- a/tools/h5diff/testfiles/h5diff_622.txt +++ b/tools/h5diff/testfiles/h5diff_622.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_623.txt b/tools/h5diff/testfiles/h5diff_623.txt index 7ae15e8..b821511 100644 --- a/tools/h5diff/testfiles/h5diff_623.txt +++ b/tools/h5diff/testfiles/h5diff_623.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_624.txt b/tools/h5diff/testfiles/h5diff_624.txt index caf4e62..d9ce5e6 100644 --- a/tools/h5diff/testfiles/h5diff_624.txt +++ b/tools/h5diff/testfiles/h5diff_624.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh index a2a9ecc..d2fd6f8 100755 --- a/tools/h5diff/testh5diff.sh +++ b/tools/h5diff/testh5diff.sh @@ -41,6 +41,7 @@ SRCFILE7=h5diff_dset1.h5 SRCFILE8=h5diff_dset2.h5 SRCFILE9=h5diff_hyper1.h5 SRCFILE10=h5diff_hyper2.h5 +SRCFILE11=h5diff_empty.h5 FILE1="$INDIR/$SRCFILE1" FILE2="$INDIR/$SRCFILE2" @@ -52,6 +53,7 @@ FILE7="$INDIR/$SRCFILE7" FILE8="$INDIR/$SRCFILE8" FILE9="$INDIR/$SRCFILE9" FILE10="$INDIR/$SRCFILE10" +FILE11="$INDIR/$SRCFILE11" H5DIFF=h5diff # The tool name @@ -327,6 +329,10 @@ TOOLTEST h5diff_17.txt -v $FILE1 $FILE2 TESTING $H5DIFF -q $SRCFILE1 $SRCFILE2 TOOLTEST h5diff_18.txt -q $FILE1 $FILE2 +# 1.9 contents mode +TESTING $H5DIFF -v -c $SRCFILE1 $SRCFILE11 +TOOLTEST h5diff_19.txt -v -c $FILE1 $FILE11 + # ############################################################################## # # not comparable types # ############################################################################## diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index aa44cc1..2e03a25 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -2216,6 +2216,20 @@ dump_data(hid_t obj_id, int obj_data, struct subset_t *sset, int display_index) outputformat->do_escape=display_escape; /* print the matrix indices */ outputformat->pindex=display_index; + + /* do not print indices for regions */ + if(obj_data == DATASET_DATA) + { + hid_t f_type = H5Dget_type(obj_id); + + if (H5Tequal(f_type, H5T_STD_REF_DSETREG)) + { + outputformat->pindex = 0; + } + H5Tclose(f_type); + } + + if (outputformat->pindex) { outputformat->idx_fmt = "(%s): "; outputformat->idx_n_fmt = HSIZE_T_FORMAT; @@ -2280,7 +2294,6 @@ dump_data(hid_t obj_id, int obj_data, struct subset_t *sset, int display_index) outputformat = &string_dataformat; } - status = h5tools_dump_dset(stdout, outputformat, obj_id, -1, sset, depth); H5Tclose(f_type); diff --git a/tools/h5jam/testfiles/tall.h5 b/tools/h5jam/testfiles/tall.h5 new file mode 100644 index 0000000..918aeee Binary files /dev/null and b/tools/h5jam/testfiles/tall.h5 differ diff --git a/tools/h5jam/testfiles/twithub.h5 b/tools/h5jam/testfiles/twithub.h5 new file mode 100644 index 0000000..4bc1833 Binary files /dev/null and b/tools/h5jam/testfiles/twithub.h5 differ diff --git a/tools/h5jam/testfiles/twithub513.h5 b/tools/h5jam/testfiles/twithub513.h5 new file mode 100644 index 0000000..0eac208 Binary files /dev/null and b/tools/h5jam/testfiles/twithub513.h5 differ diff --git a/tools/h5jam/testfiles/u10.txt b/tools/h5jam/testfiles/u10.txt new file mode 100755 index 0000000..c76a964 --- /dev/null +++ b/tools/h5jam/testfiles/u10.txt @@ -0,0 +1 @@ +abcdefghij \ No newline at end of file diff --git a/tools/h5jam/testfiles/u511.txt b/tools/h5jam/testfiles/u511.txt new file mode 100755 index 0000000..bff1736 --- /dev/null +++ b/tools/h5jam/testfiles/u511.txt @@ -0,0 +1 @@ +abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghija \ No newline at end of file diff --git a/tools/h5jam/testfiles/u512.txt b/tools/h5jam/testfiles/u512.txt new file mode 100755 index 0000000..33a36c9 --- /dev/null +++ b/tools/h5jam/testfiles/u512.txt @@ -0,0 +1 @@ +abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijab \ No newline at end of file diff --git a/tools/h5jam/testfiles/u513.txt b/tools/h5jam/testfiles/u513.txt new file mode 100755 index 0000000..6b46ebf --- /dev/null +++ b/tools/h5jam/testfiles/u513.txt @@ -0,0 +1 @@ +abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabc \ No newline at end of file diff --git a/tools/h5jam/testh5jam.sh.in b/tools/h5jam/testh5jam.sh.in index c1c55ca..e17c860 100644 --- a/tools/h5jam/testh5jam.sh.in +++ b/tools/h5jam/testh5jam.sh.in @@ -13,7 +13,7 @@ # http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have # access to either file, you may request a copy from help@hdfgroup.org. # -# Tests for the h5dump tool +# Tests for the h5jam/h5unjam tools # Determine which filters are available USE_FILTER_SZIP="@USE_FILTER_SZIP@" @@ -39,9 +39,8 @@ verbose=yes if test -z "$srcdir"; then srcdir=. fi -TESTFILES="$srcdir/../testfiles" +TESTFILES="$srcdir/testfiles" -#test -d ../testfiles || mkdir ../testfiles # Print a line-line message left justified in a field of 70 characters # beginning with the word "Testing". diff --git a/tools/h5ls/h5ls.c b/tools/h5ls/h5ls.c index 6545368..357dacf 100644 --- a/tools/h5ls/h5ls.c +++ b/tools/h5ls/h5ls.c @@ -1868,7 +1868,7 @@ get_width(void) { /* Win32 C */ CONSOLE_SCREEN_BUFFER_INFO scr; - GetConsoleScreenBufferInfo(con_out, &scr); + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &scr); width = scr.srWindow.Right - scr.srWindow.Left + 1; } #elif defined(H5_HAVE__SCRSIZE) diff --git a/tools/h5repack/h5repack.sh.in b/tools/h5repack/h5repack.sh.in index 334b384..0d3c7d4 100755 --- a/tools/h5repack/h5repack.sh.in +++ b/tools/h5repack/h5repack.sh.in @@ -93,9 +93,9 @@ DIFFTEST() { VERIFY $@ if [ "`uname -s`" = "TFLOPS O/S" ]; then - $RUNSERIAL $H5DIFF_BIN -q $@ + $RUNSERIAL $H5DIFF_BIN -q -c $@ else - $RUNSERIAL $H5DIFF_BIN -q "$@" + $RUNSERIAL $H5DIFF_BIN -q -c "$@" fi RET=$? if [ $RET != 0 ] ; then diff --git a/tools/h5repack/h5repack_copy.c b/tools/h5repack/h5repack_copy.c index ac2f770..73b201e 100644 --- a/tools/h5repack/h5repack_copy.c +++ b/tools/h5repack/h5repack_copy.c @@ -35,7 +35,7 @@ extern char *progname; * local functions *------------------------------------------------------------------------- */ -static void print_dataset_info(hid_t dcpl_id,char *objname,double per); +static void print_dataset_info(hid_t dcpl_id,char *objname,double per, int pr); static int do_copy_objects(hid_t fidin,hid_t fidout,trav_table_t *travt,pack_opt_t *options); static int copy_attr(hid_t loc_in,hid_t loc_out,pack_opt_t *options); static int copy_user_block(const char *infile, const char *outfile, hsize_t size); @@ -665,7 +665,8 @@ int do_copy_objects(hid_t fidin, { double ratio=0; - if (apply_s && apply_f) + /* only print the compression ration if there was a filter */ + if (apply_s && apply_f && has_filter) { hssize_t a, b; @@ -678,10 +679,10 @@ int do_copy_objects(hid_t fidin, if (b!=0) ratio = (double) a / (double) b; - print_dataset_info(dcpl_out,travt->objs[i].name,ratio); + print_dataset_info(dcpl_out,travt->objs[i].name,ratio,1); } else - print_dataset_info(dcpl_id,travt->objs[i].name,ratio); + print_dataset_info(dcpl_id,travt->objs[i].name,ratio,0); /* print a message that the filter was not applied (in case there was a filter) @@ -1060,7 +1061,8 @@ error: */ static void print_dataset_info(hid_t dcpl_id, char *objname, - double ratio) + double ratio, + int pr) { char strfilter[255]; #if defined (PRINT_DEBUG ) @@ -1141,7 +1143,7 @@ static void print_dataset_info(hid_t dcpl_id, } /* switch */ }/*i*/ - if(*strfilter == '\0') + if(!pr) printf(FORMAT_OBJ,"dset",objname ); else { diff --git a/tools/h5repack/h5repack_main.c b/tools/h5repack/h5repack_main.c index 73b6361..d512923 100644 --- a/tools/h5repack/h5repack_main.c +++ b/tools/h5repack/h5repack_main.c @@ -510,19 +510,19 @@ static void parse_command_line(int argc, const char* argv[], pack_opt_t* options strcpy(msgType, msgPtr+1); msgPtr[0] = '\0'; ssize = atoi( opt_arg ); - if (strcmp(msgType, "dspace") == 0) { + if (strncmp(msgType, "dspace",6) == 0) { options->msg_size[0] = ssize; } - else if (strcmp(msgType, "dtype") == 0) { + else if (strncmp(msgType, "dtype", 5) == 0) { options->msg_size[1] = ssize; } - else if (strcmp(msgType, "fill") == 0) { + else if (strncmp(msgType, "fill", 4) == 0) { options->msg_size[2] = ssize; } - else if (strcmp(msgType, "pline") == 0) { + else if (strncmp(msgType, "pline", 5) == 0) { options->msg_size[3] = ssize; } - else if (strcmp(msgType, "attr") == 0) { + else if (strncmp(msgType, "attr", 4) == 0) { options->msg_size[4] = ssize; } } diff --git a/tools/h5repack/h5repacktst.c b/tools/h5repack/h5repacktst.c index 99448c4..3796179 100644 --- a/tools/h5repack/h5repacktst.c +++ b/tools/h5repack/h5repacktst.c @@ -152,6 +152,9 @@ int main (void) memset(&diff_options, 0, sizeof (diff_opt_t)); memset(&pack_options, 0, sizeof (pack_opt_t)); + /* set h5diff "contents" mode */ + diff_options.m_contents = 1; + /* run tests */ puts("Testing h5repack:"); diff --git a/tools/h5stat/testfiles/h5stat_newgrat.ddl b/tools/h5stat/testfiles/h5stat_newgrat.ddl index d704f00..5ba2e7f 100644 --- a/tools/h5stat/testfiles/h5stat_newgrat.ddl +++ b/tools/h5stat/testfiles/h5stat_newgrat.ddl @@ -16,7 +16,7 @@ Object header size: (total/unused) Storage information: Groups: B-tree/List: 470054 - Heap: 739128 + Heap: 739102 Attributes: B-tree/List: 2598 Heap: 4442 diff --git a/tools/h5stat/testfiles/h5stat_newgrat.h5 b/tools/h5stat/testfiles/h5stat_newgrat.h5 index 8083122..8fa406b 100644 Binary files a/tools/h5stat/testfiles/h5stat_newgrat.h5 and b/tools/h5stat/testfiles/h5stat_newgrat.h5 differ diff --git a/tools/h5stat/testfiles/h5stat_tsohm.ddl b/tools/h5stat/testfiles/h5stat_tsohm.ddl index 15a058e..56524e1 100644 --- a/tools/h5stat/testfiles/h5stat_tsohm.ddl +++ b/tools/h5stat/testfiles/h5stat_tsohm.ddl @@ -4,15 +4,15 @@ Expected output for 'h5stat h5stat_tsohm.h5' Filename: h5stat_tsohm.h5 File information # of unique groups: 1 - # of unique datasets: 2 + # of unique datasets: 3 # of unique named dataypes: 0 # of unique links: 0 # of unique other: 0 Max. # of links to object: 1 - Max. # of objects in group: 2 + Max. # of objects in group: 3 Object header size: (total/unused) Groups: 51/2 - Datasets: 568/358 + Datasets: 852/447 Storage information: Groups: B-tree/List: 872 @@ -28,7 +28,7 @@ Storage information: Heap: 1316 Superblock extension: 40 Small groups: - # of groups of size 2: 1 + # of groups of size 3: 1 Total # of small groups: 1 Group bins: # of groups of size 1 - 9: 1 @@ -36,7 +36,7 @@ Group bins: Dataset dimension information: Max. rank of datasets: 2 Dataset ranks: - # of dataset with rank 2: 2 + # of dataset with rank 2: 3 1-D Dataset information: Max. dimension size of 1-D datasets: 0 Small 1-D datasets: @@ -46,11 +46,11 @@ Dataset storage information: Dataset layout information: Dataset layout counts[COMPACT]: 0 Dataset layout counts[CONTIG]: 0 - Dataset layout counts[CHUNKED]: 2 + Dataset layout counts[CHUNKED]: 3 Number of external files : 0 Dataset filters information: Number of datasets with: - NO filter: 2 + NO filter: 3 GZIP filter: 0 SHUFFLE filter: 0 FLETCHER32 filter: 0 @@ -61,9 +61,9 @@ Dataset filters information: Dataset datatype information: # of unique datatypes used by datasets: 1 Dataset datatype #0: - Count (total/named) = (2/0) + Count (total/named) = (3/0) Size (desc./elmt) = (14/4) - Total dataset datatype count: 2 + Total dataset datatype count: 3 Small # of attributes: Total # of objects with small # of attributes: 0 Attribute bins: diff --git a/tools/h5stat/testfiles/h5stat_tsohm.h5 b/tools/h5stat/testfiles/h5stat_tsohm.h5 index 45ee36c..193c34f 100644 Binary files a/tools/h5stat/testfiles/h5stat_tsohm.h5 and b/tools/h5stat/testfiles/h5stat_tsohm.h5 differ diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c index 9d64e44..25e5f83 100644 --- a/tools/lib/h5diff.c +++ b/tools/lib/h5diff.c @@ -347,9 +347,17 @@ out: * * Date: May 9, 2003 * - * Modifications: Jan 2005 Leon Arber, larber@uiuc.edu + * Modifications: + * + * Jan 2005 Leon Arber, larber@uiuc.edu * Added support for parallel diffing * + * Aug 2008 Pedro Vicente, pvn@hdfgroup.org + * Added a "contents" mode check. + * If this mode is present, objects in both files must match (must be exactly the same) + * If this does not happen, the tool returns an error code of 1 + * (instead of the success code of 0) + * *------------------------------------------------------------------------- */ hsize_t diff_match(hid_t file1_id, @@ -373,7 +381,8 @@ hsize_t diff_match(hid_t file1_id, curr1 = 0; curr2 = 0; - while(curr1 < info1->nused && curr2 < info2->nused) { + while(curr1 < info1->nused && curr2 < info2->nused) + { /* criteria is string compare */ int cmp = HDstrcmp(info1->paths[curr1].path, info2->paths[curr2].path); @@ -385,13 +394,15 @@ hsize_t diff_match(hid_t file1_id, curr1++; curr2++; } /* end if */ - else if(cmp < 0) { + else if(cmp < 0) + { infile[0] = 1; infile[1] = 0; trav_table_addflags(infile, info1->paths[curr1].path, info1->paths[curr1].type, table); curr1++; } /* end else-if */ - else { + else + { infile[0] = 0; infile[1] = 1; trav_table_addflags(infile, info2->paths[curr2].path, info2->paths[curr2].type, table); @@ -402,7 +413,8 @@ hsize_t diff_match(hid_t file1_id, /* list1 did not end */ infile[0] = 1; infile[1] = 0; - while(curr1 < info1->nused) { + while(curr1 < info1->nused) + { trav_table_addflags(infile, info1->paths[curr1].path, info1->paths[curr1].type, table); curr1++; } /* end while */ @@ -410,7 +422,8 @@ hsize_t diff_match(hid_t file1_id, /* list2 did not end */ infile[0] = 0; infile[1] = 1; - while(curr2 < info2->nused) { + while(curr2 < info2->nused) + { trav_table_addflags(infile, info2->paths[curr2].path, info2->paths[curr2].type, table); curr2++; } /* end while */ @@ -435,6 +448,35 @@ hsize_t diff_match(hid_t file1_id, } /* end if */ + + /*------------------------------------------------------------------------- + * contents mode. we do an "absolute" compare criteria, the number of objects + * in file1 must be the same as in file2 + *------------------------------------------------------------------------- + */ + if ( options->m_contents ) + { + /* assume equal contents initially */ + options->contents = 1; + + /* number of different objects */ + if ( info1->nused != info2->nused ) + { + options->contents = 0; + } + + + for( i = 0; i < table->nobjs; i++) + { + if( table->objs[i].flags[0] != table->objs[i].flags[1] ) + { + options->contents = 0; + } + } + + } + + /*------------------------------------------------------------------------- * do the diff for common objects *------------------------------------------------------------------------- @@ -453,17 +495,21 @@ hsize_t diff_match(hid_t file1_id, HDmemset(workerTasks, 1, (g_nTasks - 1)); #endif - for(i = 0; i < table->nobjs; i++) { - if(table->objs[i].flags[0] && table->objs[i].flags[1]) { + for(i = 0; i < table->nobjs; i++) + { + if( table->objs[i].flags[0] && table->objs[i].flags[1]) + { options->cmn_objs = 1; - if(!g_Parallel) { + if(!g_Parallel) + { nfound += diff(file1_id, table->objs[i].name, file2_id, table->objs[i].name, options, table->objs[i].type); } /* end if */ #ifdef H5_HAVE_PARALLEL - else { + else + { int workerFound = 0; h5diffdebug("beginning of big else block\n"); @@ -476,7 +522,8 @@ hsize_t diff_match(hid_t file1_id, */ /*Set up args to pass to worker task. */ - if(HDstrlen(table->objs[i].name) > 255) { + if(HDstrlen(table->objs[i].name) > 255) + { printf("The parallel diff only supports object names up to 255 characters\n"); MPI_Abort(MPI_COMM_WORLD, 0); } /* end if */ @@ -487,14 +534,16 @@ hsize_t diff_match(hid_t file1_id, h5diffdebug2("busyTasks=%d\n", busyTasks); /* if there are any outstanding print requests, let's handle one. */ - if(busyTasks > 0) { + if(busyTasks > 0) + { int incomingMessage; /* check if any tasks freed up, and didn't need to print. */ MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &incomingMessage, &Status); /* first block*/ - if(incomingMessage) { + if(incomingMessage) + { workerTasks[Status.MPI_SOURCE - 1] = 1; MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); nfound += nFoundbyWorker.nfound; @@ -503,7 +552,8 @@ hsize_t diff_match(hid_t file1_id, } /* end if */ /* check to see if the print token was returned. */ - if(!havePrintToken) { + if(!havePrintToken) + { /* If we don't have the token, someone is probably sending us output */ print_incoming_data(); @@ -522,10 +572,12 @@ hsize_t diff_match(hid_t file1_id, } /* end if */ /* check to see if anyone needs the print token. */ - if(havePrintToken) { + if(havePrintToken) + { /* check incoming queue for print token requests */ MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &incomingMessage, &Status); - if(incomingMessage) { + if(incomingMessage) + { MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status); MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); havePrintToken = 0; @@ -536,8 +588,10 @@ hsize_t diff_match(hid_t file1_id, /* check array of tasks to see which ones are free. * Manager task never does work, so freeTasks[0] is really * worker task 0. */ - for(n = 1; (n < g_nTasks) && !workerFound; n++) { - if(workerTasks[n-1]) { + for(n = 1; (n < g_nTasks) && !workerFound; n++) + { + if(workerTasks[n-1]) + { /* send file id's and names to first free worker */ MPI_Send(&args, sizeof(args), MPI_BYTE, n, MPI_TAG_ARGS, MPI_COMM_WORLD); @@ -551,20 +605,24 @@ hsize_t diff_match(hid_t file1_id, } /* end for */ h5diffdebug2("workerfound is %d \n", workerFound); - if(!workerFound) { + if(!workerFound) + { /* if they were all busy, we've got to wait for one free up * before we can move on. If we don't have the token, some * task is currently printing so we'll wait for that task to * return it. */ - if(!havePrintToken) { - while(!havePrintToken) { + if(!havePrintToken) + { + while(!havePrintToken) + { int incomingMessage; print_incoming_data(); MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status); - if(incomingMessage) { + if(incomingMessage) + { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); havePrintToken = 1; nfound += nFoundbyWorker.nfound; @@ -575,23 +633,27 @@ hsize_t diff_match(hid_t file1_id, } /* end while */ } /* end if */ /* if we do have the token, check for task to free up, or wait for a task to request it */ - else { + else + { /* But first print all the data in our incoming queue */ print_incoming_data(); MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - if(Status.MPI_TAG == MPI_TAG_DONE) { + if(Status.MPI_TAG == MPI_TAG_DONE) + { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); nfound += nFoundbyWorker.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; MPI_Send(&args, sizeof(args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD); } /* end if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) { + else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) + { int incomingMessage; MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status); MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); - do { + do + { MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status); print_incoming_data(); @@ -602,7 +664,8 @@ hsize_t diff_match(hid_t file1_id, options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; MPI_Send(&args, sizeof(args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD); } /* end else-if */ - else { + else + { printf("ERROR: Invalid tag (%d) received \n", Status.MPI_TAG); MPI_Abort(MPI_COMM_WORLD, 0); MPI_Finalize(); @@ -616,26 +679,32 @@ hsize_t diff_match(hid_t file1_id, h5diffdebug("done with for loop\n"); #ifdef H5_HAVE_PARALLEL - if(g_Parallel) { + if(g_Parallel) + { /* make sure all tasks are done */ - while(busyTasks > 0) { + while(busyTasks > 0) + { MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - if(Status.MPI_TAG == MPI_TAG_DONE) { + if(Status.MPI_TAG == MPI_TAG_DONE) + { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); nfound += nFoundbyWorker.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; } /* end if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) { + else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) + { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); nfound += nFoundbyWorker.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; havePrintToken = 1; } /* end else-if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) { + else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) + { MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status); - if(havePrintToken) { + if(havePrintToken) + { int incomingMessage; MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); @@ -652,11 +721,13 @@ hsize_t diff_match(hid_t file1_id, busyTasks--; } /* end if */ /* someone else must have it...wait for them to return it, then give it to the task that just asked for it. */ - else { + else + { int source = Status.MPI_SOURCE; int incomingMessage; - do { + do + { MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status); print_incoming_data(); @@ -670,7 +741,8 @@ hsize_t diff_match(hid_t file1_id, MPI_Send(NULL, 0, MPI_BYTE, source, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); } /* end else */ } /* end else-if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) { + else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) + { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); nfound += nFoundbyWorker.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; @@ -686,7 +758,8 @@ hsize_t diff_match(hid_t file1_id, printf("%s", data); } /* end else-if */ - else { + else + { printf("ph5diff-manager: ERROR!! Invalid tag (%d) received \n", Status.MPI_TAG); MPI_Abort(MPI_COMM_WORLD, 0); } /* end else */ diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h index 373eeed..d12031a 100644 --- a/tools/lib/h5diff.h +++ b/tools/lib/h5diff.h @@ -37,6 +37,8 @@ typedef struct { int err_stat; /* an error ocurred (1, error, 0, no error) */ int cmn_objs; /* do we have comparable objects */ int not_cmp; /* are the objects comparable */ + int m_contents;/* contents mode */ + int contents; /* equal contents */ } diff_opt_t; diff --git a/tools/testfiles/tdatareg.ddl b/tools/testfiles/tdatareg.ddl index 32a1601..ea85fb9 100644 --- a/tools/testfiles/tdatareg.ddl +++ b/tools/testfiles/tdatareg.ddl @@ -7,9 +7,8 @@ GROUP "/" { DATATYPE H5T_REFERENCE DATASPACE SIMPLE { ( 4 ) / ( 4 ) } DATA { - (0): DATASET /Dataset2 {(2,2)-(7,7)}, DATASET /Dataset2 {(6,9), (2,2), - (1): (8,4), (1,6), (2,8), (3,2), (0,4), (9,0), (7,1), (3,3)}, NULL, - (3): NULL + DATASET /Dataset2 {(2,2)-(7,7)}, DATASET /Dataset2 {(6,9), (2,2), + (8,4), (1,6), (2,8), (3,2), (0,4), (9,0), (7,1), (3,3)}, NULL, NULL } } DATASET "Dataset2" { diff --git a/tools/testfiles/twithub.h5 b/tools/testfiles/twithub.h5 deleted file mode 100644 index 4bc1833..0000000 Binary files a/tools/testfiles/twithub.h5 and /dev/null differ diff --git a/tools/testfiles/twithub513.h5 b/tools/testfiles/twithub513.h5 deleted file mode 100644 index 0eac208..0000000 Binary files a/tools/testfiles/twithub513.h5 and /dev/null differ diff --git a/tools/testfiles/u10.txt b/tools/testfiles/u10.txt deleted file mode 100755 index c76a964..0000000 --- a/tools/testfiles/u10.txt +++ /dev/null @@ -1 +0,0 @@ -abcdefghij \ No newline at end of file diff --git a/tools/testfiles/u511.txt b/tools/testfiles/u511.txt deleted file mode 100755 index bff1736..0000000 --- a/tools/testfiles/u511.txt +++ /dev/null @@ -1 +0,0 @@ -abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghija \ No newline at end of file diff --git a/tools/testfiles/u512.txt b/tools/testfiles/u512.txt deleted file mode 100755 index 33a36c9..0000000 --- a/tools/testfiles/u512.txt +++ /dev/null @@ -1 +0,0 @@ -abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijab \ No newline at end of file diff --git a/tools/testfiles/u513.txt b/tools/testfiles/u513.txt deleted file mode 100755 index 6b46ebf..0000000 --- a/tools/testfiles/u513.txt +++ /dev/null @@ -1 +0,0 @@ -abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabc \ No newline at end of file diff --git a/windows/hdf5bt.BAT b/windows/hdf5bt.BAT index 683b400..dd48f10 100755 --- a/windows/hdf5bt.BAT +++ b/windows/hdf5bt.BAT @@ -18,16 +18,20 @@ rem This batch file is used to build and test HDF5 Libraries and Tools. rem This batch file takes the following options: rem . /vs7 Build HDF5 using Visual Studio .NET 2003 rem . Note: Default is Visual Studio 2005 +rem . /vs9 Build HDF5 using Visual Studio 2008 +rem . Note: Default is Visual Studio 2005 rem . /fort Build and test HDF5 with Fortran libraries rem . /useenv Build HDF5 using compiler settings defined rem . in the environment, rather than the IDE. +rem . /ivf101 Build HDF5 Fortran using Intel Visual Fortran 10.1 +rem . Note: Default is Intel Visual Fortran 9.1 rem . /log Log the build and test results in files defined by rem . environment variables HDF5BUILD_LOG and rem . HDF5CHECK_LOG rem . /? Help information rem By Xuan Bai rem Created: Aug. 16, 2004 -rem Last Updated: Scott Wegner, 5/27/08 +rem Last Updated: Scott Wegner, 7/2/08 rem This batch file makes the following assumptions: rem - The appropriate version of Visual Studio is installed and setup @@ -61,7 +65,11 @@ rem Print a help message echo. echo. /vs7 Build HDF5 using Visual Studio .NET 2003 echo. Note: Default is Visual Studio 2005 + echo. /vs9 Build HDF5 using Visual Studio 2008 + echo. Note: Default is Visual Studio 2005 echo. /fort Build and test HDF5 with Fortran libraries + echo. /ivf101 Build HDF5 Fortran using Intel Visual Fortran 10.1 + echo. Note: Default is Intel Visual Fortran 9.1 echo. /useenv Build HDF5 using compiler settings defined echo. in the environment, rather than the IDE. echo. /? Help information @@ -77,10 +85,18 @@ rem Parse through the parameters sent to file, and set appropriate variables rem Use Visual Studio .NET to build set hdf5_vnet=true + ) else if "%%a"=="/vs9" ( + rem Use Visual Studio 2008 to build + set hdf5_vs2008=true + ) else if "%%a"=="/fort" ( rem Enable Fortran set hdf5_enablefortran=true + ) else if "%%a"=="/ivf101" ( + rem Enable Fortran + set hdf5_ivf101=true + ) else if "%%a"=="/useenv" ( rem Pass /useenv flag to devenv set hdf5_useenv=true @@ -117,11 +133,19 @@ rem Setup our environment set hdf5build_params=%hdf5build_params% /vs7 ) + if defined hdf5_vs2008 ( + set hdf5build_params=%hdf5build_params% /vs9 + ) + if defined hdf5_enablefortran ( set hdf5build_params=%hdf5build_params% /fort set hdf5check_params=enableall ) + if defined hdf5_ivf101 ( + set hdf5build_params=%hdf5build_params% /ivf101 + ) + if defined hdf5_useenv ( set hdf5build_params=%hdf5build_params% /useenv ) diff --git a/windows/hdf5build.BAT b/windows/hdf5build.BAT index 9efddd6..abb6c90 100755 --- a/windows/hdf5build.BAT +++ b/windows/hdf5build.BAT @@ -18,13 +18,17 @@ rem This batch file is used to build HDF5 Libraries and Tools. rem This batch file takes the following options: rem . /vs7 Build HDF5 using Visual Studio .NET 2003 rem . Note: Default is Visual Studio 2005 -rem . /fort Build HDF5 with Fortran libraries +rem . /vs9 Build HDF5 using Visual Studio 2008 +rem . Note: Default is Visual Studio 2005 +rem . /fort Build HDF5 with Fortran libraries +rem . /ivf101 Build HDF5 Fortran using Intel Visual Fortran 10.1 +rem . Note: Default is Intel Visual Fortran 9.1 rem . /useenv Build HDF5 using compiler settings defined rem . in the environment, rather than the IDE. rem . /? Help information rem By Xuan Bai rem Created: Aug. 16, 2004 -rem Last Updated: May 13, 2008 +rem Last Updated: Scott Wegner, 7/2/08 rem This batch file makes the following assumptions: rem - The appropriate version of Visual Studio is installed and setup @@ -54,12 +58,17 @@ rem Print a help message echo. echo.Usage: %~nx0 [OPTION] echo. - echo. /vs7 Build HDF5 using Visual Studio .NET 2003 - echo. Note: Default is Visual Studio 2005 - echo. /fort Build HDF5 with Fortran libraries - echo. /useenv Build HDF5 using compiler settings defined - echo. in the environment, rather than the IDE. - echo. /? Help information + echo. /vs7 Build HDF5 using Visual Studio .NET 2003 + echo. Note: Default is Visual Studio 2005 + echo. /vs9 Build HDF5 using Visual Studio 2008 + echo. Note: Default is Visual Studio 2005 + echo. /fort Build HDF5 with Fortran libraries using the + echo. Intel Fortran version specified, or 9.1 by default + echo. /ivf101 Build HDF5 Fortran using Intel Visual Fortran 10.1 + echo. Note: Default is Intel Visual Fortran 9.1 + echo. /useenv Build HDF5 using compiler settings defined + echo. in the environment, rather than the IDE. + echo. /? Help information exit /b 0 @@ -71,10 +80,19 @@ rem Parse through the parameters sent to file, and set appropriate variables if "%%a"=="/vs7" ( rem Use Visual Studio .NET 2003 set hdf5_vnet=true + + ) else if "%%a"=="/vs9" ( + rem Use Visual Studio .NET 2003 + set hdf5_vs2008=true + ) else if "%%a"=="/fort" ( rem Enable Fortran set hdf5_enablefortran=true + ) else if "%%a"=="/ivf101" ( + rem Enable Fortran + set hdf5_ivf101=true + ) else if "%%a"=="/useenv" ( rem Pass /useenv flag to devenv set hdf5_useenv=true @@ -113,11 +131,26 @@ rem Setup our environment exit /b 1 ) ) + rem Make sure /vs7 and /vs9 weren't specified together + if "%hdf5_vnet%%hdf5_vs2008%"=="truetrue" ( + echo.Error: /vs7 and /vs9 should not be specified together. + exit /b 1 + ) rem Figure out which solution file to use based on configuration if defined hdf5_vnet ( echo.Using Visual Studio .NET 2003 - set hdf5_sln="%CD%\windows_vnet\proj\all\all.sln" + set hdf5_sln="%CD%\windows_vnet\proj\all\all.sln" + + ) else if defined hdf5_vs2008 ( + echo.Using Visual Studio 2008 + if defined hdf5_enablefortran ( + echo.Building Fortran projects enabled + set hdf5_sln="%CD%\windows\proj\all_fortran\all_fortran.sln" + ) else ( + set hdf5_sln="%CD%\windows\proj\all\all.sln" + ) + ) else ( echo.Using Visual Studio 2005 if defined hdf5_enablefortran ( @@ -154,6 +187,42 @@ rem Setup our environment echo.make sure VS71COMNTOOLS is defined in the environment. exit /b 1 ) + + ) else if defined hdf5_vs2008 ( + if not defined hdf5_enablefortran ( + if defined vs90comntools ( + rem This sets the Visual Studio 2005 path and environment variables + if %hdf5_platform%==Win32 ( + call "%vs90comntools%\..\..\VC\vcvarsall.bat" x86 + ) else ( + call "%vs90comntools%\..\..\VC\vcvarsall.bat" x86_amd64 + ) + + ) else ( + echo.Error: Cannot setup Visual Studio 2008 environment. Please + echo.make sure VS90COMNTOOLS is defined in the environment. + exit /b 1 + ) + + ) else ( + echo.with Intel Visual Fortran 10.1 + + if defined ifort_compiler10 ( + rem This sets the Intel Fortran 10.1 environment, as well as + rem setting the appropriate Visual Studio environment + + if %hdf5_platform%==Win32 ( + call "%ifort_compiler10%\IA32\Bin\ifortvars.bat" + ) else ( + call "%ifort_compiler10%\em64t\Bin\ifortvars.bat" + ) + ) else ( + echo.Error: Cannot setup Intel Fortran 10.1 environment. Please + echo.make sure IFORT_COMPILER10 is defined in the environment. + exit /b 1 + ) + ) + ) else ( rem Assume Visual Studio 2005 if not defined hdf5_enablefortran ( @@ -172,21 +241,41 @@ rem Setup our environment ) ) else ( - echo.with Intel Visual Fortran 9.1 - - if defined ifort_compiler91 ( - rem This sets the Intel Fortran 9.1 environment, as well as - rem setting the appropriate Visual Studio environment + if not defined hdf5_ivf101 ( + echo.with Intel Visual Fortran 9.1 - if %hdf5_platform%==Win32 ( - call "%ifort_compiler91%\IA32\Bin\ifortvars.bat" + if defined ifort_compiler91 ( + rem This sets the Intel Fortran 9.1 environment, as well as + rem setting the appropriate Visual Studio environment + + if %hdf5_platform%==Win32 ( + call "%ifort_compiler91%\IA32\Bin\ifortvars.bat" + ) else ( + call "%ifort_compiler91%\em64t\Bin\ifortvars.bat" + ) ) else ( - call "%ifort_compiler91%\em64t\Bin\ifortvars.bat" + echo.Error: Cannot setup Intel Fortran 9.1 environment. Please + echo.make sure IFORT_COMPILER91 is defined in the environment. + exit /b 1 ) + ) else ( - echo.Error: Cannot setup Intel Fortran 9.1 environment. Please - echo.make sure IFORT_COMPILER91 is defined in the environment. - exit /b 1 + echo.with Intel Visual Fortran 10.1 + + if defined ifort_compiler10 ( + rem This sets the Intel Fortran 10.1 environment, as well as + rem setting the appropriate Visual Studio environment + + if %hdf5_platform%==Win32 ( + call "%ifort_compiler10%\IA32\Bin\ifortvars.bat" + ) else ( + call "%ifort_compiler10%\em64t\Bin\ifortvars.bat" + ) + ) else ( + echo.Error: Cannot setup Intel Fortran 10.1 environment. Please + echo.make sure IFORT_COMPILER10 is defined in the environment. + exit /b 1 + ) ) ) ) @@ -201,6 +290,15 @@ rem Setup our environment exit /b 0 +rem Upgrade the project files to the latest format for Visual Studio +:upgrade + + echo.Upgrading project files + devenv %hdf5_sln% /Upgrade /NoLogo + + exit /b + + rem Build the HDF5 libraries. By default, C and C++ libraries are built. :all @@ -214,8 +312,7 @@ rem Build the HDF5 libraries. By default, C and C++ libraries are built. rem Build both debug and release versions for %%a in (debug release) DO ( echo.Building %hdf5_platform% %%a libraries... - rem Only add hdf5_platform if using Visual Studio 2005, because Visual Studio - rem .NET doesn't like the syntax + rem Only add hdf5_platform if not using Visual Studio .NET, because it doesn't like the syntax if defined hdf5_vnet ( devenv %hdf5_sln% %ccflags% /rebuild %%a ) else ( @@ -261,6 +358,15 @@ rem This is where the magic happens echo.Error setting up build environment. goto error ) + + rem Upgrade the project files if needed + if defined hdf5_vs2008 ( + call :upgrade + if !errorlevel! neq 0 ( + echo.Error upgrading project files! + goto error + ) + ) echo.Building HDF5 Libraries and Tools echo. diff --git a/windows/hl/tools/gif2h5/h52giftest.bat b/windows/hl/tools/gif2h5/h52giftest.bat index 80a5391..742743b 100644 --- a/windows/hl/tools/gif2h5/h52giftest.bat +++ b/windows/hl/tools/gif2h5/h52giftest.bat @@ -31,8 +31,8 @@ set gif2h5=gif2h5%2 rem The path to the gif2h5 binary set gif2h5_bin=%CD%\..\gifconv%2\%gif2h5%\%1\%gif2h5% -set testfile1=%CD%\..\testfiles\h52giftst.h5 -set testfile2=%CD%\..\testfiles\image1.gif +set testfile1=%CD%\testfiles\h52giftst.h5 +set testfile2=%CD%\testfiles\image1.gif rem initialze errors variable set errors=0 diff --git a/windows/src/H5pubconf.h b/windows/src/H5pubconf.h index 2ab12a1..0ca97aa 100755 --- a/windows/src/H5pubconf.h +++ b/windows/src/H5pubconf.h @@ -1,192 +1,642 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* H5pubconf.h is adapted from UNIX platform and manually maintained on the windows platform. */ - -#define H5_SIZEOF___INT64 8 -#define H5_SIZEOF_CHAR 1 -#define H5_SIZEOF_DOUBLE 8 -#define H5_SIZEOF_FLOAT 4 -#define H5_SIZEOF_INT 4 -#define H5_SIZEOF_LONG 4 -#define H5_SIZEOF_LONG_DOUBLE 8 -#define H5_SIZEOF_OFF_T 4 -#define H5_SIZEOF_SHORT 2 -#ifndef _WIN64 -#define H5_SIZEOF_SIZE_T 4 -#else -#define H5_SIZEOF_SIZE_T 8 -#endif +/* windows/src/H5pubconf.h. Adapted from generated Linux src/H5pubconf.h */ +/* src/H5config.h. Generated from H5config.h.in by configure. */ +/* src/H5config.h.in. Generated from configure.in by autoheader. */ -/*#if defined __INTEL_COMPILER -#define H5_SIZEOF_LONG_DOUBLE 12 -#else*/ -/*#endif*/ +/* + * Windows Specific Definitions + */ -/*#define H5_HAVE_TM_ZONE 1 windows do not use this constant.*/ -#define H5_MALLOC_WORKS 1 -#define H5_HAVE_TIMEZONE 1 +/* Define if the Windows virtual file driver should be compiled */ +#define H5_HAVE_WINDOWS 1 -/* code warrior returns 0 in malloc(0) */ -#if defined(__MWERKS__) -#undef H5_MALLOC_WORKS -#endif +/* Define if the Windows virtual file driver should use buffered IO functions */ +/* #undef WINDOWS_USE_STDIO */ -/* -code warrior v.8 does not allow shared writing by default; -the feature can be enabled by defining -_MSL_ALLOW_SHARED_WRITING to 1 -in the file file_io.win32.c and including it on the projects -*/ -#if defined(__MWERKS__) -#define H5_NO_SHARED_WRITING -#endif +/* Define the maximum write size for the Windows file driver. Larger writes + will be split into many writes. Safe values are 1 <= WINDOWS_MAX_BUF <= 2GB-1. */ +#define WINDOWS_MAX_BUF (1024 * 1024 * 1024) +/* + * End of Windows Specific Definitions + */ + +/* Define if your system generates wrong code for log2 routine. */ +/* #undef H5_BAD_LOG2_CODE_GENERATED */ -#define H5_STDC_HEADERS 1 -/* #define H5_HAVE_ATTRIBUTE 1 */ -#undef H5_HAVE_ATTRIBUTE -#define H5_HAVE_LARGE_HSIZET 1 -#ifdef __MWERKS__ -#define H5_PRINTF_LL_WIDTH "ll" -#else -#define H5_PRINTF_LL_WIDTH "I64" -#endif +/* Define if the memory buffers being written to disk should be cleared before + writing. */ +#define H5_CLEAR_MEMORY 1 + +/* Define if your system can handle converting denormalized floating-point + values. */ +#define H5_CONVERT_DENORMAL_FLOAT 1 + +/* Define if C++ compiler recognizes offsetof */ +#define H5_CXX_HAVE_OFFSETOF 1 + +/* Define the default virtual file driver to compile */ +#define H5_DEFAULT_VFD H5FD_WINDOWS + +/* Define if `dev_t' is a scalar */ +#define H5_DEV_T_IS_SCALAR 1 + +/* Define to dummy `main' function (if any) required to link to the Fortran + libraries. */ +/* #undef H5_FC_DUMMY_MAIN */ + +/* Define if F77 and FC dummy `main' functions are identical. */ +/* #undef H5_FC_DUMMY_MAIN_EQ_F77 */ + +/* Define to a macro mangling the given C identifier (in lower and upper + case), which must not contain underscores, for linking with Fortran. */ +#define H5_FC_FUNC(name,NAME) NAME + +/* As FC_FUNC, but for C identifiers containing underscores. */ +#define H5_FC_FUNC_(name,NAME) NAME + +/* Define if your system can handle overflow converting floating-point to + integer values. */ +#define H5_FP_TO_INTEGER_OVERFLOW_WORKS 1 + +/* Define if your system roundup accurately converting floating-point to + unsigned long long values. */ +#define H5_FP_TO_ULLONG_ACCURATE 1 -#define H5_HAVE___int64 +/* Define if your system has right maximum convert floating-point to unsigned + long long values. */ +/* #undef H5_FP_TO_ULLONG_RIGHT_MAXIMUM 1 */ +/* Define if gettimeofday() populates the tz pointer passed in */ +/* #undef H5_GETTIMEOFDAY_GIVES_TZ */ +/* Define to 1 if you have the `alarm' function. */ +/* #undef H5_HAVE_ALARM */ + +/* Define if the __attribute__(()) extension is present */ +/* #undef H5_HAVE_ATTRIBUTE */ + +/* Define to 1 if you have the `BSDgettimeofday' function. */ +/* #undef H5_HAVE_BSDGETTIMEOFDAY */ + +/* Define if the function stack tracing code is to be compiled in */ +/* #undef H5_HAVE_CODESTACK */ + +/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. + */ +#define H5_HAVE_DECL_TZNAME 1 + +/* Define to 1 if you have the `difftime' function. */ #define H5_HAVE_DIFFTIME 1 -#define H5_HAVE_FORK 1 + +/* Define if the direct I/O virtual file driver should be compiled */ +/* #undef H5_HAVE_DIRECT */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_DMALLOC_H */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_FEATURES_H */ + +/* Define if support for deflate (zlib) filter is enabled */ +#define H5_HAVE_FILTER_DEFLATE 1 + +/* Define if support for Fletcher32 checksum is enabled */ +#define H5_HAVE_FILTER_FLETCHER32 1 + +/* Define if support for nbit filter is enabled */ +#define H5_HAVE_FILTER_NBIT 1 + +/* Define if support for scaleoffset filter is enabled */ +#define H5_HAVE_FILTER_SCALEOFFSET 1 + +/* Define if support for shuffle filter is enabled */ +#define H5_HAVE_FILTER_SHUFFLE 1 + +/* Define if support for szip filter is enabled */ +#define H5_HAVE_FILTER_SZIP 1 + +/* Define to 1 if you have the `fork' function. */ +/* #undef H5_HAVE_FORK */ + +/* Define to 1 if you have the `frexpf' function. */ +/* #undef H5_HAVE_FREXPF */ + +/* Define to 1 if you have the `frexpl' function. */ +/* #undef H5_HAVE_FREXPL */ + +/* Define to 1 if you have the `fseek64' function. */ +/* #undef H5_HAVE_FSEEK64 */ + +/* Define to 1 if you have the `fseeko' function. */ +/* #undef H5_HAVE_FSEEKO */ + +/* Define to 1 if you have the `fstat64' function. */ +/* #undef H5_HAVE_FSTAT64 */ + +/* Define to 1 if you have the `ftello' function. */ +/* #undef H5_HAVE_FTELLO */ + +/* Define if the compiler understand the __FUNCTION__ keyword */ +#define H5_HAVE_FUNCTION 1 + +/* Define to 1 if you have the `GetConsoleScreenBufferInfo' function. */ +#define H5_HAVE_GETCONSOLESCREENBUFFERINFO 1 + +/* Define to 1 if you have the `gethostname' function. */ #define H5_HAVE_GETHOSTNAME 1 -#define H5_HAVE_IOCTL 1 + +/* Define to 1 if you have the `getpwuid' function. */ +/* #undef H5_HAVE_GETPWUID */ + +/* Define to 1 if you have the `getrusage' function. */ +/* #define H5_HAVE_GETRUSAGE 1 */ + +/* Define to 1 if you have the `gettextinfo' function. */ +/* #undef H5_HAVE_GETTEXTINFO */ + +/* Define to 1 if you have the `gettimeofday' function. */ +/* #undef H5_HAVE_GETTIMEOFDAY */ + +/* Define to 1 if you have the `get_fpc_csr' function. */ +/* #undef H5_HAVE_GET_FPC_CSR */ + +/* Define if we have GPFS support */ +/* #undef H5_HAVE_GPFS */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_GPFS_H */ + +/* Define if library will contain instrumentation to detect correct + optimization operation */ +/* #undef H5_HAVE_INSTRUMENTED_LIBRARY */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_INTTYPES_H */ + +/* Define to 1 if you have the `ioctl' function. */ +/* #undef H5_HAVE_IOCTL */ + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_IO_H + +/* Define to 1 if you have the `dmalloc' library (-ldmalloc). */ +/* #undef H5_HAVE_LIBDMALLOC */ + +/* Define to 1 if you have the `lmpe' library (-llmpe). */ +/* #undef H5_HAVE_LIBLMPE */ + +/* Define to 1 if you have the `m' library (-lm). */ +/* #undef H5_HAVE_LIBM */ + +/* Define to 1 if you have the `mpe' library (-lmpe). */ +/* #undef H5_HAVE_LIBMPE */ + +/* Define to 1 if you have the `mpi' library (-lmpi). */ +/* #undef H5_HAVE_LIBMPI */ + +/* Define to 1 if you have the `mpich' library (-lmpich). */ +/* #undef H5_HAVE_LIBMPICH */ + +/* Define to 1 if you have the `mpio' library (-lmpio). */ +/* #undef H5_HAVE_LIBMPIO */ + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +/* #undef H5_HAVE_LIBNSL */ + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +/* #undef H5_HAVE_LIBPTHREAD */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef H5_HAVE_LIBSOCKET */ + +/* Define to 1 if you have the `sz' library (-lsz). */ +/* #undef H5_HAVE_LIBSZ */ + +/* Define to 1 if you have the `z' library (-lz). */ +/* #undef H5_HAVE_LIBZ */ + +/* Define to 1 if you have the `longjmp' function. */ #define H5_HAVE_LONGJMP 1 -#define H5_HAVE_SIGACTION 1 + +/* Define to 1 if you have the `lseek64' function. */ +/* #undef H5_HAVE_LSEEK64 */ + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_MEMORY_H 1 + +/* Define if we have MPE support */ +/* #undef H5_HAVE_MPE */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_MPE_H */ + +/* Define if MPI_File_get_size works correctly */ +#define H5_HAVE_MPI_GET_SIZE 1 + +/* Define if `MPI_Comm_c2f' and `MPI_Comm_f2c' exists */ +/* #undef H5_HAVE_MPI_MULTI_LANG_Comm */ + +/* Define if `MPI_Info_c2f' and `MPI_Info_f2c' exists */ +/* #undef H5_HAVE_MPI_MULTI_LANG_Info */ + +/* Define if we have parallel support */ +/* #undef H5_HAVE_PARALLEL */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_PTHREAD_H */ + +/* Define to 1 if you have the `random' function. */ +/* #undef H5_HAVE_RANDOM */ + +/* Define to 1 if you have the `rand_r' function. */ +/* #undef H5_HAVE_RAND_R */ + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_SETJMP_H 1 + +/* Define to 1 if you have the `setsysinfo' function. */ +/* #undef H5_HAVE_SETSYSINFO */ + +/* Define to 1 if you have the `sigaction' function. */ +/* #undef H5_HAVE_SIGACTION */ + +/* Define to 1 if you have the `siglongjmp' function. */ +/* #undef H5_HAVE_SIGLONGJMP */ + +/* Define to 1 if you have the `signal' function. */ #define H5_HAVE_SIGNAL 1 -#define H5_HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `snprintf' function. */ +/* #undef H5_HAVE_SNPRINTF */ + +/* Define to 1 if you have the `srandom' function. */ +/* #undef H5_HAVE_SRANDOM */ + +/* Define to 1 if you have the `stat64' function. */ +/* #undef H5_HAVE_STAT64 */ + +/* Define if `struct stat' has the `st_blocks' field */ +/* #undef H5_HAVE_STAT_ST_BLOCKS */ + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strdup' function. */ #define H5_HAVE_STRDUP 1 + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_STRINGS_H */ + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_STRING_H 1 + +/* Define if `struct text_info' is defined */ +/* #undef H5_HAVE_STRUCT_TEXT_INFO */ + +/* Define if `struct timezone' is defined */ +/* #undef H5_HAVE_STRUCT_TIMEZONE */ + +/* Define to 1 if `tm_zone' is member of `struct tm'. */ +/* #undef H5_HAVE_STRUCT_TM_TM_ZONE */ + +/* Define if `struct videoconfig' is defined */ +/* #undef H5_HAVE_STRUCT_VIDEOCONFIG */ + +/* Define to 1 if you have the `system' function. */ #define H5_HAVE_SYSTEM 1 -#define H5_HAVE_VSNPRINTF 1 -#define H5_HAVE_IO_H 1 -#define H5_HAVE_SETJMP_H 1 -#define H5_HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_SYS_FPU_H */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_SYS_IOCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_SYS_PROC_H */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_SYS_RESOURCE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_SYS_SOCKET_H */ + +/* Define to 1 if you have the header file. */ #define H5_HAVE_SYS_STAT_H 1 -#define H5_HAVE_SYS_TIMEB 1 + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_SYS_SYSINFO_H */ + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_SYS_TIMEB_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_SYS_TIME_H */ + +/* Define to 1 if you have the header file. */ #define H5_HAVE_SYS_TYPES_H 1 -#define H5_HAVE_WINSOCK_H 1 -#define H5_HAVE_STATI64 1 - /* These 64-bit functions are only supported in .NET Framework 2.0 or later */ - #if _MSC_VER >= 1400 - #define H5_HAVE_FSEEKI64 1 - #define H5_HAVE_CHSIZE_S 1 - #define H5_HAVE_FTELLI64 1 - #endif /* _MSC_VER >= 1400 */ +/* Define to 1 if you have the header file. */ +#define H5_HAVE_SZLIB_H 1 -/* comment the following line out if the memory buffers being written to - disk should not be cleared before writing. */ -#define H5_CLEAR_MEMORY 1 +/* Define if we have thread safe support */ +/* #undef H5_HAVE_THREADSAFE */ -/* comment the following line out if you are not using check sum filter*/ -#define H5_HAVE_FILTER_FLETCHER32 1 +/* Define if `timezone' is a global variable */ +#define H5_HAVE_TIMEZONE 1 -/* comment the following line out if you are not using shuffle filter*/ -#define H5_HAVE_FILTER_SHUFFLE 1 +/* Define if the ioctl TIOCGETD is defined */ +/* #undef H5_HAVE_TIOCGETD */ -/* comment the following line out if you are not using N-bit filter*/ -#define H5_HAVE_FILTER_NBIT 1 +/* Define if the ioctl TIOGWINSZ is defined */ +/* #undef H5_HAVE_TIOCGWINSZ */ -/* comment the following line out if you are not using N-bit filter*/ -#define H5_HAVE_FILTER_SCALEOFFSET 1 +/* Define to 1 if you have the `tmpfile' function. */ +#define H5_HAVE_TMPFILE 1 -/* comment the following two lines out if you are not using deflate(gzip) filter*/ -#define H5_HAVE_FILTER_DEFLATE 1 +/* Define if `tm_gmtoff' is a member of `struct tm' */ +/* #undef H5_HAVE_TM_GMTOFF */ + +/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use + `HAVE_STRUCT_TM_TM_ZONE' instead. */ +/* #undef H5_HAVE_TM_ZONE */ + +/* Define to 1 if you don't have `tm_zone' but do have the external array + `tzname'. */ +#define H5_HAVE_TZNAME 1 + +/* Define to 1 if you have the header file. */ +/* #undef H5_HAVE_UNISTD_H */ + +/* Define to 1 if you have the `vasprintf' function. */ +/* #undef H5_HAVE_VASPRINTF */ + +/* Define to 1 if you have the `vsnprintf' function. */ +/* #undef H5_HAVE_VSNPRINTF */ + +/* Define to 1 if you have the `waitpid' function. */ +/* #undef H5_HAVE_WAITPID */ + +/* Define if your system has window style path name. */ +#define H5_HAVE_WINDOW_PATH 1 + +/* Define to 1 if you have the header file. */ +#define H5_HAVE_WINSOCK_H 1 + +/* Define to 1 if you have the header file. */ #define H5_HAVE_ZLIB_H 1 -/* comment the following two lines out if you are not using szip filter*/ -#define H5_HAVE_SZLIB_H 1 -#define H5_HAVE_FILTER_SZIP 1 +/* Define to 1 if you have the `_getvideoconfig' function. */ +/* #undef H5_HAVE__GETVIDEOCONFIG */ -/* change the following line if you would like to change the default file driver */ -#define H5_DEFAULT_VFD H5FD_WINDOWS +/* Define to 1 if you have the `_scrsize' function. */ +/* #undef H5_HAVE__SCRSIZE */ -/* comment the following line out if you don't want to build the windows file - driver */ -#define H5_HAVE_WINDOWS 1 +/* Define if `__tm_gmtoff' is a member of `struct tm' */ +/* #undef H5_HAVE___TM_GMTOFF */ -#ifdef H5_HAVE_WINDOWS +/* Define if your system can't handle converting floating-point values to long + long. */ +/* #undef H5_HW_FP_TO_LLONG_NOT_WORKS */ -/* uncomment the following line if you would like to use the buffered stdio - functions in the Windows file driver. */ -// #define WINDOWS_USE_STDIO 1 +/* Define if HDF5's high-level library headers should be included in hdf5.h */ +#define H5_INCLUDE_HL 1 -/* this value controls the maximum data written in one write call in the - * Windows file driver. Safe values are between 1 <= IO_BUF_SIZE <= 2GB-1. - * The default is 1GB. */ -#define WINDOWS_MAX_BUF 1073741824 +/* Define if your system can accurately convert from integers to long double + values. */ +#define H5_INTEGER_TO_LDOUBLE_ACCURATE 1 -#endif /* H5_HAVE_WINDOWS */ +/* Define if your system can convert long double to integers accurately. */ +#define H5_LDOUBLE_TO_INTEGER_ACCURATE 1 -/* This definition is used for alterative handelling and testing of Windows -paths. This shouldn't need to be commented or removed. */ -#define H5_HAVE_WINDOW_PATH 1 +/* Define if your system can convert from long double to integer values. */ +#define H5_LDOUBLE_TO_INTEGER_WORKS 1 + +/* Define if your system can convert long double to (unsigned) long long + values correctly. */ +#define H5_LDOUBLE_TO_LLONG_ACCURATE 1 + +/* Define if your system can convert long double to unsigned int values + correctly. */ +#define H5_LDOUBLE_TO_UINT_ACCURATE 1 + +/* Define if your system can compile long long to floating-point casts. */ +#define H5_LLONG_TO_FP_CAST_WORKS 1 + +/* Define if your system can convert (unsigned) long long to long double + values correctly. */ +#define H5_LLONG_TO_LDOUBLE_CORRECT 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define H5_LT_OBJDIR ".libs/" + +/* Define if the metadata trace file code is to be compiled in */ +/* #undef H5_METADATA_TRACE_FILE */ + +/* Define if your system can handle complicated MPI derived datatype + correctly. */ +#define H5_MPI_COMPLEX_DERIVED_DATATYPE_WORKS 1 + +/* Define if your system's `MPI_File_set_size' function works for files over + 2GB. */ +#define H5_MPI_FILE_SET_SIZE_BIG 1 + +/* Define if your system can handle special collective IO properly. */ +#define H5_MPI_SPECIAL_COLLECTIVE_IO_WORKS 1 -/* comment the following line out if you are not using N-bit filter*/ -/* #define H5_HAVE_FILTER_NBIT 1*/ +/* Define if deprecated public API symbols are disabled */ +/* #undef H5_NO_DEPRECATED_SYMBOLS */ -#if defined(__MWERKS__) || defined(__cplusplus) -#define H5_inline inline +/* Define if shared writing must be disabled (CodeWarrior only) */ +/* #undef H5_NO_SHARED_WRITING */ + +/* Name of package */ +#define H5_PACKAGE "hdf5" + +/* Define to the address where bug reports for this package should be sent. */ +#define H5_PACKAGE_BUGREPORT "help@hdfgroup.org" + +/* Define to the full name of this package. */ +#define H5_PACKAGE_NAME "HDF5" + +/* Define to the full name and version of this package. */ +#define H5_PACKAGE_STRING "HDF5 1.9.14" + +/* Define to the one symbol short name of this package. */ +#define H5_PACKAGE_TARNAME "hdf5" + +/* Define to the version of this package. */ +#define H5_PACKAGE_VERSION "1.9.14" + +/* Width for printf() for type `long long' or `__int64', use `ll' */ +#define H5_PRINTF_LL_WIDTH "I64" + +/* The size of `char', as computed by sizeof. */ +#define H5_SIZEOF_CHAR 1 + +/* The size of `double', as computed by sizeof. */ +#define H5_SIZEOF_DOUBLE 8 + +/* The size of `float', as computed by sizeof. */ +#define H5_SIZEOF_FLOAT 4 + +/* The size of `int', as computed by sizeof. */ +#define H5_SIZEOF_INT 4 + +/* The size of `int16_t', as computed by sizeof. */ +#define H5_SIZEOF_INT16_T 0 + +/* The size of `int32_t', as computed by sizeof. */ +#define H5_SIZEOF_INT32_T 0 + +/* The size of `int64_t', as computed by sizeof. */ +#define H5_SIZEOF_INT64_T 0 + +/* The size of `int8_t', as computed by sizeof. */ +#define H5_SIZEOF_INT8_T 0 + +/* The size of `int_fast16_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST16_T 0 + +/* The size of `int_fast32_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST32_T 0 + +/* The size of `int_fast64_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST64_T 0 + +/* The size of `int_fast8_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST8_T 0 + +/* The size of `int_least16_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST16_T 0 + +/* The size of `int_least32_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST32_T 0 + +/* The size of `int_least64_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST64_T 0 + +/* The size of `int_least8_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST8_T 0 + +/* The size of `long', as computed by sizeof. */ +#define H5_SIZEOF_LONG 4 + +/* The size of `long double', as computed by sizeof. */ +#define H5_SIZEOF_LONG_DOUBLE 8 + +/* The size of `long long', as computed by sizeof. */ +#define H5_SIZEOF_LONG_LONG 8 + +/* The size of `off64_t', as computed by sizeof. */ +#define H5_SIZEOF_OFF64_T 0 + +/* The size of `off_t', as computed by sizeof. */ +#define H5_SIZEOF_OFF_T 4 + +/* The size of `short', as computed by sizeof. */ +#define H5_SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#ifndef _WIN64 +#define H5_SIZEOF_SIZE_T 4 #else -#define H5_inline __inline -#endif +#define H5_SIZEOF_SIZE_T 8 +#endif /* _WIN64 */ -#if _MSC_VER >= 1300 /* .Net supports FUNCTION */ -#define H5_HAVE_FUNCTION 1 +/* The size of `ssize_t', as computed by sizeof. */ +#define H5_SIZEOF_SSIZE_T 0 + +/* The size of `uint16_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT16_T 0 + +/* The size of `uint32_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT32_T 0 + +/* The size of `uint64_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT64_T 0 + +/* The size of `uint8_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT8_T 0 + +/* The size of `uint_fast16_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST16_T 0 + +/* The size of `uint_fast32_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST32_T 0 + +/* The size of `uint_fast64_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST64_T 0 + +/* The size of `uint_fast8_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST8_T 0 + +/* The size of `uint_least16_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST16_T 0 + +/* The size of `uint_least32_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST32_T 0 + +/* The size of `uint_least64_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST64_T 0 + +/* The size of `uint_least8_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST8_T 0 + +/* The size of `__int64', as computed by sizeof. */ +#define H5_SIZEOF___INT64 8 + +/* Define to 1 if you have the ANSI C header files. */ +#define H5_STDC_HEADERS 1 + +/* Define if strict file format checks are enabled */ +/* #undef H5_STRICT_FORMAT_CHECKS */ + +/* Define if your system supports pthread_attr_setscope(&attribute, + PTHREAD_SCOPE_SYSTEM) call. */ +#define H5_SYSTEM_SCOPE_THREADS 1 + +/* Define to 1 if you can safely include both and . */ +/* #undef H5_TIME_WITH_SYS_TIME */ + +/* Define to 1 if your declares `struct tm'. */ +/* #undef H5_TM_IN_SYS_TIME */ + +/* Define if your system can compile unsigned long long to floating-point + casts. */ #define H5_ULLONG_TO_FP_CAST_WORKS 1 -#define H5_HW_FP_TO_LLONG_NOT_WORKS 1 -#if defined __INTEL_COMPILER -#undef H5_LLONG_TO_FP_CAST_WORKS -#else -/*#define H5_LLONG_TO_FP_CAST_WORKS*/ -#endif -#else -#undef H5_HAVE_FUNCTION -#undef H5_ULLONG_TO_FP_CAST_WORKS -#define H5_LLONG_TO_FP_CAST_WORKS -#endif +/* Define if your system can convert unsigned long long to long double with + correct precision. */ +#define H5_ULLONG_TO_LDOUBLE_PRECISION 1 -#define H5_FC_FUNC_(name, NAME) NAME -#define FC_FUNC_(name, NAME) NAME +/* Define if your system can accurately convert unsigned (long) long values to + floating-point values. */ +/* #undef H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE */ -#define H5_HAVE_TMPFILE 1 +/* Define using v1.6 public API symbols by default */ +/* #undef H5_USE_16_API */ -/*Users want to build and test hdf5 library with thread safe enabled, - Make the following block active -*/ +/* Define if a memory checking tool will be used on the library, to cause + library to be very picky about memory operations and also disable the + internal free list manager code. */ +/* #undef H5_USING_MEMCHECKER */ -/* (Remove the comment signs to enable thread safe on windows) -#if defined _DLL -#define H5_HAVE_THREADSAFE 1 -#define H5_HAVE_SYSTEM_SCOPE_THREADS 1 -#if defined TTSAFE_H -#define sleep Sleep -#endif -#endif -*/ +/* Version number of package */ +#define H5_VERSION "1.9.14" +/* Define if vsnprintf() returns the correct value for formatted strings that + don't fit into size allowed */ +/* #undef H5_VSNPRINTF_WORKS */ /* Data accuracy is prefered to speed during data conversions */ #define H5_WANT_DATA_ACCURACY 1 @@ -194,11 +644,24 @@ paths. This shouldn't need to be commented or removed. */ /* Check exception handling functions during data conversions */ #define H5_WANT_DCONV_EXCEPTION 1 +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef H5_WORDS_BIGENDIAN */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef H5_const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#define H5_inline __inline +#endif + +/* Define to `long int' if does not define. */ +/* #undef H5_off_t */ -/* uncomment the following line if we want parallel HDF5 support */ -/* #define H5_HAVE_PARALLEL */ +/* Define to `unsigned long' if does not define. */ +/* #undef H5_size_t */ -/* uncomment the following line if you need the library to perform "strict" - memory operations, which is useful when debugging with a memory checking - tool like Purify, etc. */ -/* #define H5_USING_MEMCHECKER 1 */ +/* Define to `long' if does not define. */ +#define H5_ssize_t long diff --git a/windows/tools/h5diff/testh5diff.bat b/windows/tools/h5diff/testh5diff.bat index 2ae5b10..cf178b1 100644 --- a/windows/tools/h5diff/testh5diff.bat +++ b/windows/tools/h5diff/testh5diff.bat @@ -38,6 +38,7 @@ set srcfile7=h5diff_dset1.h5 set srcfile8=h5diff_dset2.h5 set srcfile9=h5diff_hyper1.h5 set srcfile10=h5diff_hyper2.h5 +set srcfile11=h5diff_empty.h5 set file1=%indir%\h5diff_basic1.h5 set file2=%indir%\h5diff_basic2.h5 @@ -49,6 +50,7 @@ set file7=%indir%\h5diff_dset1.h5 set file8=%indir%\h5diff_dset2.h5 set file9=%indir%\h5diff_hyper1.h5 set file10=%indir%\h5diff_hyper2.h5 +set file11=%indir%\h5diff_empty.h5 rem The tool name @@ -247,6 +249,10 @@ rem ############################################################################ call :testing %h5diff% -q %srcfile1% %srcfile2% call :tooltest h5diff_18.txt -q %file1% %file2% + rem 1.9 contents mode + call :testing %h5diff% -v -c %srcfile1% %srcfile11% + call :tooltest h5diff_19.txt -v -c %file1% %file11% + rem ############################################################################## rem # not comparable types rem ############################################################################## diff --git a/windows/tools/h5jam/testh5jam.bat b/windows/tools/h5jam/testh5jam.bat index 9a9c5d4..aaefe23 100644 --- a/windows/tools/h5jam/testh5jam.bat +++ b/windows/tools/h5jam/testh5jam.bat @@ -13,13 +13,13 @@ rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from help@hdfgroup.org. rem -rem Tests for the h5jam tool +rem Tests for the h5jam/h5unjam tools rem rem Created: Scott Wegner, 8/27/07 rem Modified: rem -rem We currently don't build DLL version os h5jam / h5unjam, but the test script +rem We currently don't build DLL version of h5jam / h5unjam, but the test script rem is setup to handle it if we ever decide to. --SJW 8/27/07 setlocal enabledelayedexpansion @@ -61,7 +61,7 @@ set getub_bin=%CD%\%getub% set nerrors=0 set verbose=yes -set testfiles=%CD%\..\testfiles +set testfiles=%CD%\testfiles goto main diff --git a/windows/tools/h5repack/h5repack.bat b/windows/tools/h5repack/h5repack.bat index a91dcb9..30ddaab 100644 --- a/windows/tools/h5repack/h5repack.bat +++ b/windows/tools/h5repack/h5repack.bat @@ -114,7 +114,7 @@ rem was unavailable) rem Call the h5diff tool rem :difftest - %h5diff_bin% -q %* + %h5diff_bin% -q -c %* if %errorlevel% neq 0 ( call :verify *FAILED* %* set /a nerrors=!nerrors!+1 -- cgit v0.12