diff --git a/src/Benchmarks/HeatEquation/HeatEquationBenchmarkProblem_impl.h b/src/Benchmarks/HeatEquation/HeatEquationBenchmarkProblem_impl.h index 0866b3c28aba11ed4af906c8aa5ad797d5827f0c..a1eb09a36bd87fcaad350e7a0020a8603944bc1f 100644 --- a/src/Benchmarks/HeatEquation/HeatEquationBenchmarkProblem_impl.h +++ b/src/Benchmarks/HeatEquation/HeatEquationBenchmarkProblem_impl.h @@ -11,7 +11,7 @@ #include "Tuning/SimpleCell.h" #include "Tuning/GridTraverser.h" -//#define WITH_TNL // In the 'tunning' part, this serves for comparison of performance +//#define WITH_TNL // In the 'tunning' part, this serves for comparison of performance // when using common TNL structures compared to the benchmark ones @@ -88,7 +88,7 @@ setup( const Config::ParameterContainer& parameters, } this->explicitUpdater.setDifferentialOperator( this->differentialOperatorPointer ); this->explicitUpdater.setBoundaryConditions( this->boundaryConditionPointer ); - this->explicitUpdater.setRightHandSide( this->rightHandSidePointer ); + this->explicitUpdater.setRightHandSide( this->rightHandSidePointer ); return true; } @@ -133,16 +133,12 @@ setInitialCondition( const Config::ParameterContainer& parameters, const String& initialConditionFile = parameters.getParameter< String >( "initial-condition" ); MeshFunctionViewType u; u.bind( this->getMesh(), *dofsPointer ); - try - { - u.boundLoad( initialConditionFile ); - } - catch(...) + if( ! Functions::readMeshFunction( u, "u", initialConditionFile ) ) { std::cerr << "I am not able to load the initial condition from the file " << initialConditionFile << "." << std::endl; return false; } - return true; + return true; } template< typename Mesh, @@ -189,11 +185,11 @@ makeSnapshot( const RealType& time, FileName fileName; fileName.setFileNameBase( "u-" ); - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); //FileNameBaseNumberEnding( "u-", step, 5, ".tnl", fileName ); - u.save( fileName.getFileName() ); + u.write( "u", fileName.getFileName() ); return true; } @@ -214,7 +210,7 @@ __global__ void boundaryConditionsKernel( Real* u, if( i == gridXSize - 1 && j < gridYSize ) { fu[ j * gridXSize + gridYSize - 1 ] = 0.0; - u[ j * gridXSize + gridYSize - 1 ] = 0.0; //u[ j * gridXSize + gridXSize - 1 ]; + u[ j * gridXSize + gridYSize - 1 ] = 0.0; //u[ j * gridXSize + gridXSize - 1 ]; } if( j == 0 && i > 0 && i < gridXSize - 1 ) { @@ -223,14 +219,14 @@ __global__ void boundaryConditionsKernel( Real* u, } if( j == gridYSize -1 && i > 0 && i < gridXSize - 1 ) { - fu[ j * gridXSize + i ] = 0.0; //u[ j * gridXSize + gridXSize - 1 ]; - u[ j * gridXSize + i ] = 0.0; //u[ j * gridXSize + gridXSize - 1 ]; - } + fu[ j * gridXSize + i ] = 0.0; //u[ j * gridXSize + gridXSize - 1 ]; + u[ j * gridXSize + i ] = 0.0; //u[ j * gridXSize + gridXSize - 1 ]; + } } template< typename Real, typename Index > -__global__ void heatEquationKernel( const Real* u, +__global__ void heatEquationKernel( const Real* u, Real* fu, const Real tau, const Real hx_inv, @@ -253,7 +249,7 @@ template< typename GridType, typename GridEntity, typename BoundaryConditions, typename MeshFunction > -__global__ void +__global__ void boundaryConditionsTemplatedCompact( const GridType* grid, const BoundaryConditions* boundaryConditions, MeshFunction* u, @@ -261,14 +257,14 @@ boundaryConditionsTemplatedCompact( const GridType* grid, const typename GridEntity::CoordinatesType begin, const typename GridEntity::CoordinatesType end, const typename GridEntity::EntityOrientationType entityOrientation, - const typename GridEntity::EntityBasisType entityBasis, + const typename GridEntity::EntityBasisType entityBasis, const typename GridType::IndexType gridXIdx, const typename GridType::IndexType gridYIdx ) { typename GridType::CoordinatesType coordinates; coordinates.x() = begin.x() + ( gridXIdx * Cuda::getMaxGridSize() + blockIdx.x ) * blockDim.x + threadIdx.x; - coordinates.y() = begin.y() + ( gridYIdx * Cuda::getMaxGridSize() + blockIdx.y ) * blockDim.y + threadIdx.y; + coordinates.y() = begin.y() + ( gridYIdx * Cuda::getMaxGridSize() + blockIdx.y ) * blockDim.y + threadIdx.y; if( coordinates.x() < end.x() && coordinates.y() < end.y() ) @@ -287,9 +283,9 @@ struct EntityPointer : public EntityPointer< EntityType, Dimension - 1 > { __device__ EntityPointer( const EntityType* ptr ) : EntityPointer< EntityType, Dimension - 1 >( ptr ), pointer( ptr ) - { + { } - + const EntityType* pointer; }; @@ -298,10 +294,10 @@ struct EntityPointer< EntityType, 0 > { __device__ inline EntityPointer( const EntityType* ptr ) :pointer( ptr ) - { + { } - + const EntityType* pointer; };*/ @@ -309,7 +305,7 @@ struct EntityPointer< EntityType, 0 > struct TestEntity { typedef typename GridType::Cell::CoordinatesType CoordinatesType; - + __device__ inline TestEntity( const GridType& grid, const typename GridType::Cell::CoordinatesType& coordinates, const typename GridType::Cell::EntityOrientationType& orientation, @@ -320,19 +316,19 @@ struct TestEntity basis( basis ), entityIndex( 0 ), ptr( &grid ) - { + { }; - + const GridType& grid; - - EntityPointer< GridType, 2 > ptr; + + EntityPointer< GridType, 2 > ptr; //TestEntity< GridType > *entity1, *entity2, *entity3; - - typename GridType::IndexType entityIndex; - + + typename GridType::IndexType entityIndex; + const typename GridType::Cell::CoordinatesType coordinates; const typename GridType::Cell::EntityOrientationType orientation; - const typename GridType::Cell::EntityBasisType basis; + const typename GridType::Cell::EntityBasisType basis; };*/ template< typename GridType, @@ -340,7 +336,7 @@ template< typename GridType, typename DifferentialOperator, typename RightHandSide, typename MeshFunction > -__global__ void +__global__ void heatEquationTemplatedCompact( const GridType* grid, const DifferentialOperator* differentialOperator, const RightHandSide* rightHandSide, @@ -350,7 +346,7 @@ heatEquationTemplatedCompact( const GridType* grid, const typename GridEntity::CoordinatesType begin, const typename GridEntity::CoordinatesType end, const typename GridEntity::EntityOrientationType entityOrientation, - const typename GridEntity::EntityBasisType entityBasis, + const typename GridEntity::EntityBasisType entityBasis, const typename GridType::IndexType gridXIdx, const typename GridType::IndexType gridYIdx ) { @@ -359,8 +355,8 @@ heatEquationTemplatedCompact( const GridType* grid, typedef typename GridType::RealType RealType; coordinates.x() = begin.x() + ( gridXIdx * Cuda::getMaxGridSize() + blockIdx.x ) * blockDim.x + threadIdx.x; - coordinates.y() = begin.y() + ( gridYIdx * Cuda::getMaxGridSize() + blockIdx.y ) * blockDim.y + threadIdx.y; - + coordinates.y() = begin.y() + ( gridYIdx * Cuda::getMaxGridSize() + blockIdx.y ) * blockDim.y + threadIdx.y; + MeshFunction& u = *_u; MeshFunction& fu = *_fu; @@ -368,11 +364,11 @@ heatEquationTemplatedCompact( const GridType* grid, coordinates.y() < end.y() ) { GridEntity entity( *grid, coordinates, entityOrientation, entityBasis ); - + entity.refresh(); if( ! entity.isBoundaryEntity() ) { - fu( entity ) = + fu( entity ) = ( *differentialOperator )( u, entity, time ); typedef Functions::FunctionAdapter< GridType, RightHandSide > FunctionAdapter; @@ -423,11 +419,11 @@ getExplicitUpdate( const RealType& time, fu[ i ] = 0.0; //u[ gridXSize + i ]; fu[ ( gridYSize - 1 ) * gridXSize + i ] = 0.0; //u[ ( gridYSize - 2 ) * gridXSize + i ]; } - + /*typedef typename MeshType::Cell CellType; typedef typename CellType::CoordinatesType CoordinatesType; CoordinatesType coordinates( 0, 0 ), entityOrientation( 0,0 ), entityBasis( 0, 0 );*/ - + //CellType entity( mesh, coordinates, entityOrientation, entityBasis ); for( IndexType j = 1; j < gridYSize - 1; j++ ) @@ -440,7 +436,7 @@ getExplicitUpdate( const RealType& time, } if( std::is_same< DeviceType, Devices::Cuda >::value ) { - #ifdef HAVE_CUDA + #ifdef HAVE_CUDA if( this->cudaKernelType == "pure-c" ) { const IndexType gridXSize = mesh->getDimensions().x(); @@ -461,14 +457,14 @@ getExplicitUpdate( const RealType& time, std::cerr << "Laplace operator failed." << std::endl; return; } - + boundaryConditionsKernel<<< cudaGridSize, cudaBlockSize >>>( uDofs->getData(), fuDofs->getData(), gridXSize, gridYSize ); if( ( cudaErr = cudaGetLastError() ) != cudaSuccess ) { std::cerr << "Setting of boundary conditions failed. " << cudaErr << std::endl; return; } - + } if( this->cudaKernelType == "templated-compact" ) { @@ -488,7 +484,7 @@ getExplicitUpdate( const RealType& time, cudaBlocks.y = Cuda::getNumberOfBlocks( end.y() - begin.y() + 1, cudaBlockSize.y ); const IndexType cudaXGrids = Cuda::getNumberOfGrids( cudaBlocks.x ); const IndexType cudaYGrids = Cuda::getNumberOfGrids( cudaBlocks.y ); - + //std::cerr << "Setting boundary conditions..." << std::endl; Pointers::synchronizeSmartPointersOnDevice< Devices::Cuda >(); @@ -508,7 +504,7 @@ getExplicitUpdate( const RealType& time, gridYIdx ); cudaDeviceSynchronize(); TNL_CHECK_CUDA_DEVICE; - + //std::cerr << "Computing the heat equation ..." << std::endl; for( IndexType gridYIdx = 0; gridYIdx < cudaYGrids; gridYIdx ++ ) for( IndexType gridXIdx = 0; gridXIdx < cudaXGrids; gridXIdx ++ ) @@ -526,7 +522,7 @@ getExplicitUpdate( const RealType& time, cell.getBasis(), gridXIdx, gridYIdx ); - cudaDeviceSynchronize(); + cudaDeviceSynchronize(); TNL_CHECK_CUDA_DEVICE; } if( this->cudaKernelType == "templated" ) @@ -535,20 +531,20 @@ getExplicitUpdate( const RealType& time, // this->cudaMesh = tnlCuda::passToDevice( &mesh ); this->u->bind( mesh, *uDofs ); this->fu->bind( mesh, *fuDofs ); - //explicitUpdater.setGPUTransferTimer( this->gpuTransferTimer ); + //explicitUpdater.setGPUTransferTimer( this->gpuTransferTimer ); this->explicitUpdater.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, this->u, this->fu ); } if( this->cudaKernelType == "tunning" ) { if( std::is_same< DeviceType, Devices::Cuda >::value ) - { + { this->u->bind( mesh, *uDofs ); this->fu->bind( mesh, *fuDofs ); - - + + /*this->explicitUpdater.template update< typename Mesh::Cell >( time, tau, mesh, this->u, this->fu ); return;*/ - + #ifdef WITH_TNL using ExplicitUpdaterType = TNL::Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionViewType, DifferentialOperator, BoundaryCondition, RightHandSide >; using Cell = typename MeshType::Cell; @@ -558,12 +554,12 @@ getExplicitUpdate( const RealType& time, DifferentialOperator, BoundaryCondition, RightHandSide >; - + #else //using CellConfig = Meshes::GridEntityNoStencilStorage; using CellConfig = Meshes::GridEntityCrossStencilStorage< 1 >; using ExplicitUpdaterType = ExplicitUpdater< Mesh, MeshFunctionViewType, DifferentialOperator, BoundaryCondition, RightHandSide >; - using Cell = typename MeshType::Cell; + using Cell = typename MeshType::Cell; //using Cell = SimpleCell< Mesh, CellConfig >; using MeshTraverserType = Traverser< MeshType, Cell >; using UserData = ExplicitUpdaterTraverserUserData< RealType, @@ -571,11 +567,11 @@ getExplicitUpdate( const RealType& time, DifferentialOperator, BoundaryCondition, RightHandSide >; -#endif +#endif using InteriorEntitiesProcessor = typename ExplicitUpdaterType::TraverserInteriorEntitiesProcessor; using BoundaryEntitiesProcessor = typename ExplicitUpdaterType::TraverserBoundaryEntitiesProcessor; - + UserData userData; userData.time = time; userData.differentialOperator = &this->differentialOperatorPointer.template getData< Devices::Cuda >(); @@ -586,7 +582,7 @@ getExplicitUpdate( const RealType& time, #ifndef WITH_TNL userData.real_u = uDofs->getData(); userData.real_fu = fuDofs->getData(); -#endif +#endif /* const IndexType gridXSize = mesh->getDimensions().x(); const IndexType gridYSize = mesh->getDimensions().y(); @@ -612,7 +608,7 @@ getExplicitUpdate( const RealType& time, std::cerr << "Laplace operator failed." << std::endl; return; } - + meshTraverser.template processBoundaryEntities< BoundaryEntitiesProcessor > ( mesh, userData ); @@ -622,17 +618,17 @@ getExplicitUpdate( const RealType& time, ( &mesh.template getData< Devices::Cuda >(), userData ); //&userDataPtr.template modifyData< Devices::Cuda >() ); - // */ + // */ if( ( cudaErr = cudaGetLastError() ) != cudaSuccess ) { std::cerr << "Setting of boundary conditions failed. " << cudaErr << std::endl; return; } - - + + } - } + } #endif } } @@ -642,7 +638,7 @@ template< typename Mesh, typename RightHandSide, typename DifferentialOperator, typename Communicator > -void +void HeatEquationBenchmarkProblem< Mesh, BoundaryCondition, RightHandSide, DifferentialOperator, Communicator >:: applyBoundaryConditions( const RealType& time, DofVectorPointer& uDofs ) @@ -659,7 +655,7 @@ applyBoundaryConditions( const RealType& time, this->bindDofs( uDofs ); this->explicitUpdater.template applyBoundaryConditions< typename Mesh::Cell >( this->getMesh(), time, this->u ); return;*/ - + #ifdef HAVE_CUDA /* #ifdef WITH_TNL @@ -671,12 +667,12 @@ applyBoundaryConditions( const RealType& time, DifferentialOperator, BoundaryCondition, RightHandSide >; - + #else //using CellConfig = Meshes::GridEntityNoStencilStorage; using CellConfig = Meshes::GridEntityCrossStencilStorage< 1 >; using ExplicitUpdaterType = ExplicitUpdater< Mesh, MeshFunctionType, DifferentialOperator, BoundaryCondition, RightHandSide >; - //using Cell = typename MeshType::Cell; + //using Cell = typename MeshType::Cell; using Cell = SimpleCell< Mesh, CellConfig >; using MeshTraverserType = Traverser< MeshType, Cell >; using UserData = ExplicitUpdaterTraverserUserData< RealType, @@ -684,7 +680,7 @@ applyBoundaryConditions( const RealType& time, DifferentialOperator, BoundaryCondition, RightHandSide >; -#endif +#endif using InteriorEntitiesProcessor = typename ExplicitUpdaterType::TraverserInteriorEntitiesProcessor; using BoundaryEntitiesProcessor = typename ExplicitUpdaterType::TraverserBoundaryEntitiesProcessor; @@ -709,7 +705,7 @@ applyBoundaryConditions( const RealType& time, ( &mesh.template getData< Devices::Cuda >(), userData ); //&userDataPtr.template modifyData< Devices::Cuda >() ); - // */ + // */ int cudaErr; if( ( cudaErr = ::cudaGetLastError() ) != cudaSuccess ) { diff --git a/src/Benchmarks/HeatEquation/run-HeatEquationBenchmark b/src/Benchmarks/HeatEquation/run-HeatEquationBenchmark index 7a8707fb84905147e482e054865071799d57fcb0..29796fa00d2a8d68807447374ed9e7e87371f854 100644 --- a/src/Benchmarks/HeatEquation/run-HeatEquationBenchmark +++ b/src/Benchmarks/HeatEquation/run-HeatEquationBenchmark @@ -9,11 +9,9 @@ tnl-grid-setup --dimensions 2 \ --size-y 100 tnl-init --test-function sin-wave \ - --output-file init.tnl + --output-file init.vti ./HeatEquationBenchmark --time-discretisation explicit \ --boundary-conditions-constant 0 \ --discrete-solver merson \ --snapshot-period 0.01 \ --final-time 1.0 - -tnl-view --mesh mesh.tnl --input-files *tnl diff --git a/src/Benchmarks/HeatEquation/tnl-benchmark-simple-heat-equation.h b/src/Benchmarks/HeatEquation/tnl-benchmark-simple-heat-equation.h index 2d59ff2588138f2da7f4846b4cfe58b236e0bbac..57ddb3ec11deaef3675a24bf5931c10b0d388faa 100644 --- a/src/Benchmarks/HeatEquation/tnl-benchmark-simple-heat-equation.h +++ b/src/Benchmarks/HeatEquation/tnl-benchmark-simple-heat-equation.h @@ -329,7 +329,7 @@ bool solveHeatEquationCuda( const Config::ParameterContainer& parameters, vecU.bind( cuda_u, gridXSize * gridYSize ); Functions::MeshFunctionView< GridType > meshFunction; meshFunction.bind( gridPointer, vecU ); - meshFunction.save( "simple-heat-equation-initial.tnl" ); + meshFunction.write( "u", "simple-heat-equation-initial.vti" ); Containers::VectorView< Real, Devices::Cuda, Index > vecAux; vecAux.bind( cuda_aux, gridXSize * gridYSize ); @@ -416,7 +416,7 @@ bool solveHeatEquationCuda( const Config::ParameterContainer& parameters, if( verbose ) std::cout << "Saving result..." << std::endl; - meshFunction.save( "simple-heat-equation-result.tnl" ); + meshFunction.write( "u", "simple-heat-equation-result.vti" ); /*** * Freeing allocated memory @@ -556,7 +556,7 @@ bool solveHeatEquationHost( const Config::ParameterContainer& parameters, vecU.bind( u, gridXSize * gridYSize ); Functions::MeshFunctionView< GridType > meshFunction; meshFunction.bind( gridPointer, vecU ); - meshFunction.save( "simple-heat-equation-result.tnl" ); + meshFunction.write( "u", "simple-heat-equation-result.vti" ); /*** * Freeing allocated memory diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/HamiltonJacobiProblem_impl.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/HamiltonJacobiProblem_impl.h index 3cc6388497c062865a812cca629c57d45d715d09..e4d74d00df86d44d95498af0fcc8b5baa52c04b7 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/HamiltonJacobiProblem_impl.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/HamiltonJacobiProblem_impl.h @@ -14,7 +14,7 @@ * * ***************************************************************************/ -#pragma once +#pragma once #include <core/mfilename.h> #include <matrices/tnlMatrixSetter.h> @@ -123,7 +123,7 @@ setInitialCondition( const Config::ParameterContainer& parameters, { this->bindDofs( mesh, dofs ); const String& initialConditionFile = parameters.getParameter< String >( "initial-condition" ); - if( ! this->solution.boundLoad( initialConditionFile ) ) + if( ! Functions::readMeshFunction( this->solution, "u", initialConditionFile ) ) { std::cerr << "I am not able to load the initial condition from the file " << initialConditionFile << "." <<std::endl; return false; @@ -135,7 +135,7 @@ template< typename Mesh, typename HamiltonJacobi, typename BoundaryCondition, typename RightHandSide> -bool +bool HamiltonJacobiProblem< Mesh,HamiltonJacobi,BoundaryCondition,RightHandSide >:: makeSnapshot( const RealType& time, const IndexType& step, @@ -147,8 +147,7 @@ makeSnapshot( const RealType& time, String fileName; FileNameBaseNumberEnding( "u-", step, 5, ".tnl", fileName ); - if( ! this->solution.save( fileName ) ) - return false; + this->solution.write( "u", fileName ); return true; } diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnl-direct-eikonal-solver.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnl-direct-eikonal-solver.h index 3b3a21eefdeed8f706dc7a2424fc353538305915..95bbb30fa9f003b66d164825e346e98ff40a153e 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnl-direct-eikonal-solver.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnl-direct-eikonal-solver.h @@ -4,7 +4,7 @@ * and open the template in the editor. */ -/* +/* * File: tnl-direct-eikonal-solver.h * Author: oberhuber * @@ -36,9 +36,6 @@ class DirectEikonalSolverConfig { config.addDelimiter( "Direct eikonal equation solver settings:" ); config.addRequiredEntry< String >( "input-file", "Input file." ); - config.addEntry< String >( "distributed-grid-io-type", "Choose Distributed Grid IO Type", "MpiIO"); - config.addEntryEnum< String >( "LocalCopy" ); - config.addEntryEnum< String >( "MpiIO" ); }; }; diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem.h index 26d96d1218ba22aa8d421111bb25e3f3c6a4e326..4706e1ab5f221773d6ebcde66459e58ce18a3d16 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem.h @@ -4,7 +4,7 @@ * and open the template in the editor. */ -/* +/* * File: tnlFastSweepingMethod.h * Author: oberhuber * @@ -18,7 +18,6 @@ #include <TNL/Pointers/SharedPointer.h> #include "tnlFastSweepingMethod.h" -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO.h> #include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> template< typename Mesh, @@ -34,7 +33,7 @@ class tnlDirectEikonalProblem Index > { public: - + typedef Real RealType; typedef typename Mesh::DeviceType DeviceType; typedef Index IndexType; @@ -48,9 +47,9 @@ class tnlDirectEikonalProblem using typename BaseType::DofVectorType; using MeshPointer = Pointers::SharedPointer< MeshType >; using DofVectorPointer = Pointers::SharedPointer< DofVectorType >; - + typedef Communicator CommunicatorType; - + static constexpr bool isTimeDependent() { return false; }; static String getType(); @@ -59,7 +58,7 @@ class tnlDirectEikonalProblem void writeProlog( Logger& logger, const Config::ParameterContainer& parameters ) const; - + bool writeEpilog( Logger& logger ); @@ -69,28 +68,26 @@ class tnlDirectEikonalProblem IndexType getDofs() const; void bindDofs( DofVectorPointer& dofs ); - + bool setInitialCondition( const Config::ParameterContainer& parameters, DofVectorPointer& dofs ); - + bool makeSnapshot( ); bool solve( DofVectorPointer& dosf ); protected: - + using DistributedMeshSynchronizerType = Meshes::DistributedMeshes::DistributedMeshSynchronizer< Meshes::DistributedMeshes::DistributedMesh< typename MeshFunctionType::MeshType > >; DistributedMeshSynchronizerType synchronizer; MeshFunctionPointer u; - + MeshFunctionPointer initialData; - + AnisotropyPointer anisotropy; - Meshes::DistributedMeshes::DistrGridIOTypes distributedIOType; - }; #include "tnlDirectEikonalProblem_impl.h" diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem_impl.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem_impl.h index 3e1ea757b9dd656de17a5fe224695b99e3791e6d..c21d3deb309d01d842d04288efc6c57316786747 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem_impl.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalProblem_impl.h @@ -79,11 +79,6 @@ tnlDirectEikonalProblem< Mesh, Communicator, Anisotropy, Real, Index >:: setup( const Config::ParameterContainer& parameters, const String& prefix ) { - String param=parameters.getParameter< String >( "distributed-grid-io-type" ); - if(param=="MpiIO") - distributedIOType=Meshes::DistributedMeshes::MpiIO; - if(param=="LocalCopy") - distributedIOType=Meshes::DistributedMeshes::LocalCopy; return true; } @@ -121,26 +116,23 @@ tnlDirectEikonalProblem< Mesh, Communicator, Anisotropy, Real, Index >:: setInitialCondition( const Config::ParameterContainer& parameters, DofVectorPointer& dofs ) { - this->bindDofs( dofs ); - String inputFile = parameters.getParameter< String >( "input-file" ); - this->initialData->setMesh( this->getMesh() ); - if( CommunicatorType::isDistributed() ) - { - std::cout<<"Nodes Distribution: " << initialData->getMesh().getDistributedMesh()->printProcessDistr() << std::endl; - if(distributedIOType==Meshes::DistributedMeshes::MpiIO) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::MpiIO> ::load(inputFile, *initialData ); - if(distributedIOType==Meshes::DistributedMeshes::LocalCopy) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::LocalCopy> ::load(inputFile, *initialData ); - synchronizer.setDistributedGrid( initialData->getMesh().getDistributedMesh() ); - synchronizer.synchronize( *initialData ); - } - else - { - try + this->bindDofs( dofs ); + String inputFile = parameters.getParameter< String >( "input-file" ); + this->initialData->setMesh( this->getMesh() ); + if( CommunicatorType::isDistributed() ) + { + std::cout<<"Nodes Distribution: " << this->distributedMeshPointer->printProcessDistr() << std::endl; + if( ! Functions::readDistributedMeshFunction( *this->distributedMeshPointer, *this->initialData, "u", inputFile ) ) { - this->initialData->boundLoad( inputFile ); + std::cerr << "I am not able to load the initial condition from the file " << inputFile << "." << std::endl; + return false; } - catch(...) + synchronizer.setDistributedGrid( &this->distributedMeshPointer.getData() ); + synchronizer.synchronize( *initialData ); + } + else + { + if( ! Functions::readMeshFunction( *this->initialData, "u", inputFile ) ) { std::cerr << "I am not able to load the initial condition from the file " << inputFile << "." << std::endl; return false; @@ -164,17 +156,16 @@ makeSnapshot( ) FileName fileName; fileName.setFileNameBase( "u-" ); - fileName.setExtension( "tnl" ); if(CommunicatorType::isDistributed()) { - if(distributedIOType==Meshes::DistributedMeshes::MpiIO) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::MpiIO> ::save(fileName.getFileName(), *u ); - if(distributedIOType==Meshes::DistributedMeshes::LocalCopy) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::LocalCopy> ::save(fileName.getFileName(), *u ); + fileName.setExtension( "pvti" ); + Functions::writeDistributedMeshFunction( *this->distributedMeshPointer, *this->initialData, "u", fileName.getFileName() ); + } + else { + fileName.setExtension( "vti" ); + this->u->write( "u", fileName.getFileName() ); } - else - this->u->save( fileName.getFileName() ); return true; } @@ -189,7 +180,7 @@ tnlDirectEikonalProblem< Mesh, Communicator, Anisotropy, Real, Index >:: solve( DofVectorPointer& dofs ) { FastSweepingMethod< MeshType, Communicator,AnisotropyType > fsm; - fsm.solve( this->getMesh(), u, anisotropy, initialData ); + fsm.solve( *this->getDistributedMesh(), this->getMesh(), u, anisotropy, initialData ); makeSnapshot(); return true; diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h index 2f933cbecd67398cd16b5ae65a9c78e5880942fd..2cc5d407313c6d287bcb144b9664cb90ce0e64b8 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h @@ -21,7 +21,7 @@ template< typename Mesh, typename Communicator, typename Anisotropy = Functions::Analytic::Constant< Mesh::getMeshDimension(), typename Mesh::RealType > > class FastSweepingMethod -{ +{ }; template< typename Real, @@ -33,9 +33,9 @@ class FastSweepingMethod< Meshes::Grid< 1, Real, Device, Index >, Communicator, : public tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > { //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); - + public: - + typedef Meshes::Grid< 1, Real, Device, Index > MeshType; typedef Real RealType; typedef Device DeviceType; @@ -44,28 +44,29 @@ class FastSweepingMethod< Meshes::Grid< 1, Real, Device, Index >, Communicator, typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > BaseType; using MeshPointer = Pointers::SharedPointer< MeshType >; using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; - - + + using typename BaseType::InterfaceMapType; using typename BaseType::MeshFunctionType; using typename BaseType::InterfaceMapPointer; using typename BaseType::MeshFunctionPointer; - - + + FastSweepingMethod(); - + const IndexType& getMaxIterations() const; - + void setMaxIterations( const IndexType& maxIterations ); - - void solve( const MeshPointer& mesh, + + void solve( const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh, + const MeshPointer& mesh, MeshFunctionPointer& Aux, const AnisotropyPointer& anisotropy, MeshFunctionPointer& u ); - - + + protected: - + const IndexType maxIterations; }; @@ -78,9 +79,9 @@ class FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Communicator, : public tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > { //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); - + public: - + typedef Meshes::Grid< 2, Real, Device, Index > MeshType; typedef Real RealType; typedef Device DeviceType; @@ -89,43 +90,42 @@ class FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Communicator, typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > BaseType; typedef Communicator CommunicatorType; typedef Containers::StaticVector< 2, Index > StaticVector; - + using MeshPointer = Pointers::SharedPointer< MeshType >; using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; using MPI = Communicators::MpiCommunicator; - + using typename BaseType::InterfaceMapType; using typename BaseType::MeshFunctionType; using typename BaseType::InterfaceMapPointer; using typename BaseType::MeshFunctionPointer; using typename BaseType::ArrayContainer; - + FastSweepingMethod(); - + const IndexType& getMaxIterations() const; - + void setMaxIterations( const IndexType& maxIterations ); - - void solve( const MeshPointer& mesh, + + void solve( const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh, + const MeshPointer& mesh, MeshFunctionPointer& Aux, const AnisotropyPointer& anisotropy, const MeshFunctionPointer& u ); - + protected: - + using DistributedMeshSynchronizerType = Meshes::DistributedMeshes::DistributedMeshSynchronizer< Meshes::DistributedMeshes::DistributedMesh< typename MeshFunctionType::MeshType > >; DistributedMeshSynchronizerType synchronizer; const IndexType maxIterations; - - void setOverlaps( StaticVector& vecLowerOverlaps, StaticVector& vecUpperOverlaps, - const MeshPointer& mesh); - - bool goThroughSweep( const StaticVector boundsFrom, const StaticVector boundsTo, + + bool goThroughSweep( const StaticVector boundsFrom, const StaticVector boundsTo, MeshFunctionType& aux, const InterfaceMapType& interfaceMap, const AnisotropyPointer& anisotropy ); - - void getInfoFromNeighbours( int& calculated, int& calculateAgain, const MeshPointer& mesh ); + + void getInfoFromNeighbours( int& calculated, int& calculateAgain, + const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh ); }; template< typename Real, @@ -137,9 +137,9 @@ class FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Communicator, : public tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > { //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); - + public: - + typedef Meshes::Grid< 3, Real, Device, Index > MeshType; typedef Real RealType; typedef Device DeviceType; @@ -148,45 +148,44 @@ class FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Communicator, typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > BaseType; typedef Communicator CommunicatorType; typedef Containers::StaticVector< 3, Index > StaticVector; - + using MeshPointer = Pointers::SharedPointer< MeshType >; using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; using MPI = Communicators::MpiCommunicator; - + using typename BaseType::InterfaceMapType; using typename BaseType::MeshFunctionType; using typename BaseType::InterfaceMapPointer; - using typename BaseType::MeshFunctionPointer; + using typename BaseType::MeshFunctionPointer; using typename BaseType::ArrayContainer; - - + + FastSweepingMethod(); - + const IndexType& getMaxIterations() const; - + void setMaxIterations( const IndexType& maxIterations ); - - void solve( const MeshPointer& mesh, + + void solve( const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh, + const MeshPointer& mesh, MeshFunctionPointer& Aux, const AnisotropyPointer& anisotropy, MeshFunctionPointer& u ); - - + + protected: - + using DistributedMeshSynchronizerType = Meshes::DistributedMeshes::DistributedMeshSynchronizer< Meshes::DistributedMeshes::DistributedMesh< typename MeshFunctionType::MeshType > >; DistributedMeshSynchronizerType synchronizer; const IndexType maxIterations; - - void setOverlaps( StaticVector& vecLowerOverlaps, StaticVector& vecUpperOverlaps, - const MeshPointer& mesh); - - bool goThroughSweep( const StaticVector boundsFrom, const StaticVector boundsTo, + + bool goThroughSweep( const StaticVector boundsFrom, const StaticVector boundsTo, MeshFunctionType& aux, const InterfaceMapType& interfaceMap, const AnisotropyPointer& anisotropy ); - - void getInfoFromNeighbours( int& calculated, int& calculateAgain, const MeshPointer& mesh ); + + void getInfoFromNeighbours( int& calculated, int& calculateAgain, + const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh ); }; diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod1D_impl.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod1D_impl.h index f41d04ce8e3731037636134e4f4e74f833a6e2f4..e1dbd566abf3912c2b682aea157ff02f8b9fd538 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod1D_impl.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod1D_impl.h @@ -4,7 +4,7 @@ * and open the template in the editor. */ -/* +/* * File: tnlFastSweepingMethod2D_impl.h * Author: oberhuber * @@ -24,7 +24,7 @@ FastSweepingMethod< Meshes::Grid< 1, Real, Device, Index >, Communicator, Anisot FastSweepingMethod() : maxIterations( 1 ) { - + } template< typename Real, @@ -36,7 +36,7 @@ const Index& FastSweepingMethod< Meshes::Grid< 1, Real, Device, Index >, Communicator, Anisotropy >:: getMaxIterations() const { - + } template< typename Real, @@ -48,7 +48,7 @@ void FastSweepingMethod< Meshes::Grid< 1, Real, Device, Index >, Communicator, Anisotropy >:: setMaxIterations( const IndexType& maxIterations ) { - + } template< typename Real, @@ -58,22 +58,23 @@ template< typename Real, typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 1, Real, Device, Index >, Communicator, Anisotropy >:: -solve( const MeshPointer& mesh, - MeshFunctionPointer& Aux, +solve( const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh, + const MeshPointer& mesh, + MeshFunctionPointer& Aux, const AnisotropyPointer& anisotropy, MeshFunctionPointer& u ) -{ +{ MeshFunctionPointer auxPtr; InterfaceMapPointer interfaceMapPtr; auxPtr->setMesh( mesh ); interfaceMapPtr->setMesh( mesh ); std::cout << "Initiating the interface cells ..." << std::endl; BaseType::initInterface( u, auxPtr, interfaceMapPtr ); - - auxPtr->save( "aux-ini.tnl" ); + + auxPtr->write( "aux", "aux-ini.vti" ); typename MeshType::Cell cell( *mesh ); - + IndexType iteration( 0 ); InterfaceMapType interfaceMap = *interfaceMapPtr; MeshFunctionType aux = *auxPtr; @@ -90,13 +91,13 @@ solve( const MeshPointer& mesh, this->updateCell( aux, cell ); } - + for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) + cell.getCoordinates().x()-- ) { cell.refresh(); - if( ! interfaceMap( cell ) ) + if( ! interfaceMap( cell ) ) this->updateCell( aux, cell ); } } @@ -108,46 +109,46 @@ solve( const MeshPointer& mesh, int numBlocksX = Cuda::getNumberOfBlocks( mesh->getDimensions().x(), cudaBlockSize ); dim3 blockSize( cudaBlockSize ); dim3 gridSize( numBlocksX ); - + BaseType ptr; - - - + + + bool* BlockIter = (bool*)malloc( ( numBlocksX ) * sizeof( bool ) ); - + bool *BlockIterDevice; cudaMalloc(&BlockIterDevice, ( numBlocksX ) * sizeof( bool ) ); - + while( BlockIter[ 0 ] ) { for( int i = 0; i < numBlocksX; i++ ) BlockIter[ i ] = false; cudaMemcpy(BlockIterDevice, BlockIter, ( numBlocksX ) * sizeof( bool ), cudaMemcpyHostToDevice); - + CudaUpdateCellCaller<<< gridSize, blockSize >>>( ptr, interfaceMapPtr.template getData< Device >(), auxPtr.template modifyData< Device>(), BlockIterDevice ); cudaMemcpy(BlockIter, BlockIterDevice, ( numBlocksX ) * sizeof( bool ), cudaMemcpyDeviceToHost); - + for( int i = 1; i < numBlocksX; i++ ) BlockIter[ 0 ] = BlockIter[ 0 ] || BlockIter[ i ]; - + } delete[] BlockIter; cudaFree( BlockIterDevice ); cudaDeviceSynchronize(); - + TNL_CHECK_CUDA_DEVICE; - + aux = *auxPtr; interfaceMap = *interfaceMapPtr; #endif } iteration++; } - - aux.save("aux-final.tnl"); + + aux.write( "aux", "aux-final.vti" ); } #ifdef HAVE_CUDA @@ -160,45 +161,45 @@ __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< int thri = threadIdx.x; int blIdx = blockIdx.x; int i = thri + blockDim.x*blIdx; - + __shared__ volatile bool changed[16]; changed[ thri ] = false; - + if( thri == 0 ) changed[ 0 ] = true; - + const Meshes::Grid< 1, Real, Device, Index >& mesh = interfaceMap.template getMesh< Devices::Cuda >(); __shared__ Real h; if( thri == 1 ) { h = mesh.getSpaceSteps().x(); } - + __shared__ volatile Real sArray[ 18 ]; sArray[thri] = std::numeric_limits< Real >::max(); - + //filling sArray edges - int dimX = mesh.getDimensions().x(); + int dimX = mesh.getDimensions().x(); __shared__ volatile int numOfBlockx; __shared__ int xkolik; if( thri == 0 ) { xkolik = blockDim.x + 1; numOfBlockx = dimX/blockDim.x + ((dimX%blockDim.x != 0) ? 1:0); - + if( numOfBlockx - 1 == blIdx ) xkolik = dimX - (blIdx)*blockDim.x+1; } __syncthreads(); - + if( thri == 0 ) - { + { if( dimX > (blIdx+1) * blockDim.x ) sArray[xkolik] = aux[ blIdx*blockDim.x - 1 + xkolik ]; else sArray[xkolik] = std::numeric_limits< Real >::max(); } - + if( thri == 1 ) { if( blIdx != 0 ) @@ -206,20 +207,20 @@ __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< else sArray[0] = std::numeric_limits< Real >::max(); } - - + + if( i < mesh.getDimensions().x() ) - { + { sArray[thri+1] = aux[ i ]; } - __syncthreads(); + __syncthreads(); while( changed[ 0 ] ) { __syncthreads(); - + changed[ thri ] = false; - + //calculation of update cell if( i < mesh.getDimensions().x() ) { @@ -229,9 +230,9 @@ __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< } } __syncthreads(); - - - + + + //pyramid reduction if( thri < 8 ) changed[ thri ] = changed[ thri ] || changed[ thri + 8 ]; if( thri < 4 ) changed[ thri ] = changed[ thri ] || changed[ thri + 4 ]; @@ -243,7 +244,7 @@ __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< BlockIterDevice[ blIdx ] = true; __syncthreads(); } - + if( i < mesh.getDimensions().x() && (!interfaceMap[ i ]) ) aux[ i ] = sArray[ thri + 1 ]; } diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h index 14a52ec40cb5349b741e2880a9474b5ff2b210d9..f4822b6ca72d605665663fc5be1bd29f1059ab5d 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h @@ -58,7 +58,8 @@ template< typename Real, typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Communicator, Anisotropy >:: -solve( const MeshPointer& mesh, +solve( const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh, + const MeshPointer& mesh, MeshFunctionPointer& Aux, const AnisotropyPointer& anisotropy, const MeshFunctionPointer& u ) @@ -69,20 +70,26 @@ solve( const MeshPointer& mesh, interfaceMapPtr->setMesh( mesh ); // Setting overlaps ( WITHOUT MPI SHOULD BE 0 ) - StaticVector vecLowerOverlaps, vecUpperOverlaps; - setOverlaps( vecLowerOverlaps, vecUpperOverlaps, mesh ); + StaticVector vecLowerOverlaps = 0; + StaticVector vecUpperOverlaps = 0; + if( CommunicatorType::isDistributed() ) + { + //Distributed mesh for MPI overlaps (without MPI null pointer) + vecLowerOverlaps = distributedMesh.getLowerOverlap(); + vecUpperOverlaps = distributedMesh.getUpperOverlap(); + } std::cout << "Initiating the interface cells ..." << std::endl; BaseType::initInterface( u, auxPtr, interfaceMapPtr, vecLowerOverlaps, vecUpperOverlaps ); - //auxPtr->save( "aux-ini.tnl" ); + //auxPtr->write( "aux", "aux-ini.vti" ); typename MeshType::Cell cell( *mesh ); IndexType iteration( 0 ); InterfaceMapType interfaceMap = *interfaceMapPtr; MeshFunctionType aux = *auxPtr; - synchronizer.setDistributedGrid( aux.getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( &distributedMesh ); synchronizer.synchronize( aux ); //synchronize initialized overlaps std::cout << "Calculating the values ..." << std::endl; @@ -207,8 +214,8 @@ solve( const MeshPointer& mesh, this->getNeighbours( BlockIterHost, numBlocksX, numBlocksY ); //std::cout<<std::endl; - //String s( "aux-"+ std::to_string(numWhile) + ".tnl"); - //aux.save( s ); + //String s( "aux-"+ std::to_string(numWhile) + ".vti"); + //aux.write( "aux", s ); } if( numWhile == 1 ){ auxPtr = helpFunc; @@ -223,19 +230,19 @@ solve( const MeshPointer& mesh, boundsFrom[1] = vecLowerOverlaps[1]; boundsTo[1] = mesh->getDimensions().y() - vecUpperOverlaps[1]; boundsFrom[0] = vecLowerOverlaps[0]; boundsTo[0] = mesh->getDimensions().x() - vecUpperOverlaps[0]; calculatedBefore = goThroughSweep( boundsFrom, boundsTo, aux, interfaceMap, anisotropy ); - //aux.save("aux-1.tnl"); + //aux.write( "aux", "aux-1.vti" ); // UP and LEFL boundsFrom[1] = vecLowerOverlaps[1]; boundsTo[1] = mesh->getDimensions().y() - vecUpperOverlaps[1]; boundsFrom[0] = mesh->getDimensions().x() - 1 - vecUpperOverlaps[0]; boundsTo[0] = -1 + vecLowerOverlaps[0]; goThroughSweep( boundsFrom, boundsTo, aux, interfaceMap, anisotropy ); - //aux.save( "aux-2.tnl" ); + //aux.write( "aux", "aux-2.vti" ); // DOWN and RIGHT boundsFrom[1] = mesh->getDimensions().y() - 1 - vecUpperOverlaps[1]; boundsTo[1] = - 1 + vecLowerOverlaps[1]; boundsFrom[0] = vecLowerOverlaps[0]; boundsTo[0] = mesh->getDimensions().x() - vecUpperOverlaps[0]; goThroughSweep( boundsFrom, boundsTo, aux, interfaceMap, anisotropy ); - //aux.save( "aux-3.tnl" ); + //aux.write( "aux", "aux-3.vti" ); // DOWN and LEFT boundsFrom[1] = mesh->getDimensions().y() - 1 - vecUpperOverlaps[1]; boundsTo[1] = - 1 + vecLowerOverlaps[1]; @@ -368,7 +375,7 @@ solve( const MeshPointer& mesh, /**----------------------MPI-TO-DO---------------------------------------------**/ #ifdef HAVE_MPI if( CommunicatorType::isDistributed() ){ - getInfoFromNeighbours( calculatedBefore, calculateMPIAgain, mesh ); + getInfoFromNeighbours( calculatedBefore, calculateMPIAgain, distributedMesh ); synchronizer.synchronize( aux ); } @@ -384,28 +391,6 @@ solve( const MeshPointer& mesh, // PROTECTED FUNCTIONS: -template< typename Real, typename Device, typename Index, - typename Communicator, typename Anisotropy > -void -FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Communicator, Anisotropy >:: -setOverlaps( StaticVector& vecLowerOverlaps, StaticVector& vecUpperOverlaps, - const MeshPointer& mesh) -{ - vecLowerOverlaps[0] = 0; vecLowerOverlaps[1] = 0; vecUpperOverlaps[0] = 0; vecUpperOverlaps[1] = 0; -#ifdef HAVE_MPI - if( CommunicatorType::isDistributed() ) //If we started solver with MPI - { - //Distributed mesh for MPI overlaps (without MPI null pointer) - const Meshes::DistributedMeshes::DistributedMesh< MeshType >* meshPom = mesh->getDistributedMesh(); - vecLowerOverlaps = meshPom->getLowerOverlap(); - vecUpperOverlaps = meshPom->getUpperOverlap(); - } -#endif -} - - - - template< typename Real, typename Device, typename Index, typename Communicator, typename Anisotropy > bool @@ -448,14 +433,13 @@ template< typename Real, typename Device, typename Index, typename Communicator, typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Communicator, Anisotropy >:: -getInfoFromNeighbours( int& calculatedBefore, int& calculateMPIAgain, const MeshPointer& mesh ) +getInfoFromNeighbours( int& calculatedBefore, int& calculateMPIAgain, + const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh ) { - Meshes::DistributedMeshes::DistributedMesh< MeshType >* meshDistr = mesh->getDistributedMesh(); - int calculateFromNeighbours[4] = {0,0,0,0}; - const int *neighbours = meshDistr->getNeighbors(); // Getting neighbors of distributed mesh + const int *neighbours = distributedMesh.getNeighbors(); // Getting neighbors of distributed mesh MPI::Request *requestsInformation; - requestsInformation = new MPI::Request[ meshDistr->getNeighborsCount() ]; + requestsInformation = new MPI::Request[ distributedMesh.getNeighborsCount() ]; int neighCount = 0; // should this thread calculate again? diff --git a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h index 9468ff1db32fe86e2546052dfa77f9dc268d1182..e0f6ff58adf12156e1034494753d15ed4b446e52 100644 --- a/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h +++ b/src/Examples/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h @@ -58,10 +58,11 @@ template< typename Real, typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Communicator, Anisotropy >:: -solve( const MeshPointer& mesh, - MeshFunctionPointer& Aux, - const AnisotropyPointer& anisotropy, - MeshFunctionPointer& u ) +solve( const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh, + const MeshPointer& mesh, + MeshFunctionPointer& Aux, + const AnisotropyPointer& anisotropy, + MeshFunctionPointer& u ) { MeshFunctionPointer auxPtr; InterfaceMapPointer interfaceMapPtr; @@ -69,19 +70,25 @@ solve( const MeshPointer& mesh, interfaceMapPtr->setMesh( mesh ); // getting overlaps ( WITHOUT MPI SHOULD BE 0 ) - Containers::StaticVector< 3, IndexType > vecLowerOverlaps, vecUpperOverlaps; - setOverlaps( vecLowerOverlaps, vecUpperOverlaps, mesh ); + StaticVector vecLowerOverlaps = 0; + StaticVector vecUpperOverlaps = 0; + if( CommunicatorType::isDistributed() ) + { + //Distributed mesh for MPI overlaps (without MPI null pointer) + vecLowerOverlaps = distributedMesh.getLowerOverlap(); + vecUpperOverlaps = distributedMesh.getUpperOverlap(); + } std::cout << "Initiating the interface cells ..." << std::endl; BaseType::initInterface( u, auxPtr, interfaceMapPtr, vecLowerOverlaps, vecUpperOverlaps ); - auxPtr->save( "aux-ini.tnl" ); + auxPtr->write( "aux", "aux-ini.vti" ); typename MeshType::Cell cell( *mesh ); IndexType iteration( 0 ); MeshFunctionType aux = *auxPtr; InterfaceMapType interfaceMap = * interfaceMapPtr; - synchronizer.setDistributedGrid( aux.getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( &distributedMesh ); synchronizer.synchronize( aux ); //synchronization of intial conditions while( iteration < this->maxIterations ) @@ -192,8 +199,8 @@ solve( const MeshPointer& mesh, this->getNeighbours( BlockIterHost, numBlocksX, numBlocksY, numBlocksZ ); - //string s( "aux-"+ std::to_string(numWhile) + ".tnl"); - //aux.save( s ); + //string s( "aux-"+ std::to_string(numWhile) + ".vti"); + //aux.write( "aux", s ); } if( numWhile == 1 ){ auxPtr = helpFunc; @@ -357,7 +364,7 @@ solve( const MeshPointer& mesh, #ifdef HAVE_MPI if( CommunicatorType::isDistributed() ) { - getInfoFromNeighbours( calculatedBefore, calculateMPIAgain, mesh ); + getInfoFromNeighbours( calculatedBefore, calculateMPIAgain, distributedMesh ); // synchronizate the overlaps synchronizer.synchronize( aux ); @@ -368,40 +375,17 @@ solve( const MeshPointer& mesh, if( !CommunicatorType::isDistributed() ) // If we start the solver without MPI, we need calculatedBefore 0! calculatedBefore = 0; //otherwise we would go throw the FSM code and CUDA FSM code again uselessly } - //aux.save( "aux-8.tnl" ); + //aux.write( "aux", "aux-8.vti" ); iteration++; } // Saving the results into Aux for MakeSnapshot function. Aux = auxPtr; - aux.save("aux-final.tnl"); + aux.write( "aux", "aux-final.vti" ); } // PROTECTED FUNCTIONS: -template< typename Real, typename Device, typename Index, - typename Communicator, typename Anisotropy > -void -FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Communicator, Anisotropy >:: -setOverlaps( StaticVector& vecLowerOverlaps, StaticVector& vecUpperOverlaps, - const MeshPointer& mesh) -{ - vecLowerOverlaps[0] = 0; vecLowerOverlaps[1] = 0; vecLowerOverlaps[2] = 0; - vecUpperOverlaps[0] = 0; vecUpperOverlaps[1] = 0; vecUpperOverlaps[2] = 0; -#ifdef HAVE_MPI - if( CommunicatorType::isDistributed() ) //If we started solver with MPI - { - //Distributed mesh for MPI overlaps (without MPI null pointer) - const Meshes::DistributedMeshes::DistributedMesh< MeshType >* meshPom = mesh->getDistributedMesh(); - vecLowerOverlaps = meshPom->getLowerOverlap(); - vecUpperOverlaps = meshPom->getUpperOverlap(); - } -#endif -} - - - - template< typename Real, typename Device, typename Index, typename Communicator, typename Anisotropy > bool @@ -450,15 +434,14 @@ template< typename Real, typename Device, typename Index, typename Communicator, typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Communicator, Anisotropy >:: -getInfoFromNeighbours( int& calculatedBefore, int& calculateMPIAgain, const MeshPointer& mesh ) +getInfoFromNeighbours( int& calculatedBefore, int& calculateMPIAgain, + const Meshes::DistributedMeshes::DistributedMesh< MeshType >& distributedMesh ) { - Meshes::DistributedMeshes::DistributedMesh< MeshType >* meshDistr = mesh->getDistributedMesh(); - int calculateFromNeighbours[6] = {0,0,0,0,0,0}; - const int *neighbours = meshDistr->getNeighbors(); // Getting neighbors of distributed mesh + const int *neighbours = distributedMesh.getNeighbors(); // Getting neighbors of distributed mesh MPI::Request *requestsInformation; - requestsInformation = new MPI::Request[ meshDistr->getNeighborsCount() ]; + requestsInformation = new MPI::Request[ distributedMesh.getNeighborsCount() ]; int neighCount = 0; // should this thread calculate again? diff --git a/src/Examples/flow-sw/navierStokesProblem_impl.h b/src/Examples/flow-sw/navierStokesProblem_impl.h index fc4948e452b81372f908682a382dc1c382c38381..e42c80894ee62126104c4e17bc872212f8c4bde7 100644 --- a/src/Examples/flow-sw/navierStokesProblem_impl.h +++ b/src/Examples/flow-sw/navierStokesProblem_impl.h @@ -171,32 +171,30 @@ makeSnapshot( const RealType& time, DofVectorPointer& dofs ) { std::cout << std::endl << "Writing output at time " << time << " step " << step << "." << std::endl; - + this->bindDofs( dofs ); PhysicalVariablesGetter< MeshType > physicalVariablesGetter; physicalVariablesGetter.getVelocity( this->conservativeVariables, this->velocity ); physicalVariablesGetter.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + FileName fileName; - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); fileName.setFileNameBase( "density-" ); - this->conservativeVariables->getDensity()->save( fileName.getFileName() ); - + this->conservativeVariables->getDensity()->write( "density", fileName.getFileName() ); + fileName.setFileNameBase( "velocity-" ); - this->velocity->save( fileName.getFileName() ); + this->velocity->write( "velocity", fileName.getFileName() ); fileName.setFileNameBase( "pressure-" ); - this->pressure->save( fileName.getFileName() ); + this->pressure->write( "pressure", fileName.getFileName() ); - /*fileName.setFileNameBase( "energy-" ); - if( ! this->conservativeVariables->getEnergy()->save( fileName.getFileName() ) ) - return false; + fileName.setFileNameBase( "energy-" ); + this->conservativeVariables->getEnergy()->write( "energy", fileName.getFileName() ); fileName.setFileNameBase( "momentum-" ); - if( ! this->conservativeVariables->getMomentum()->save( fileName.getFileName() ) ) - return false;*/ - + this->conservativeVariables->getMomentum()->write( "momentum", fileName.getFileName() ); + return true; } @@ -214,7 +212,7 @@ getExplicitUpdate( const RealType& time, { typedef typename MeshType::Cell Cell; const MeshPointer& mesh = this->getMesh(); - + /**** * Bind DOFs */ @@ -231,7 +229,7 @@ getExplicitUpdate( const RealType& time, PhysicalVariablesGetter< typename MeshPointer::ObjectType > physicalVariables; physicalVariables.getVelocity( this->conservativeVariables, this->velocity ); physicalVariables.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + /**** * Set-up operators */ @@ -240,7 +238,7 @@ getExplicitUpdate( const RealType& time, typedef typename InviscidOperators::MomentumYOperatorType MomentumYOperatorType; typedef typename InviscidOperators::MomentumZOperatorType MomentumZOperatorType; typedef typename InviscidOperators::EnergyOperatorType EnergyOperatorType; - + this->inviscidOperatorsPointer->setTau( tau ); this->inviscidOperatorsPointer->setVelocity( this->velocity ); this->inviscidOperatorsPointer->setPressure( this->pressure ); @@ -276,23 +274,23 @@ getExplicitUpdate( const RealType& time, /**** * Continuity equation - */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, DensityBoundaryConditionsType, RightHandSide > explicitUpdaterContinuity; + */ + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, DensityBoundaryConditionsType, RightHandSide > explicitUpdaterContinuity; explicitUpdaterContinuity.setDifferentialOperator( this->inviscidOperatorsPointer->getContinuityOperator() ); explicitUpdaterContinuity.setBoundaryConditions( this->boundaryConditionPointer->getDensityBoundaryCondition() ); explicitUpdaterContinuity.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterContinuity.template update< typename Mesh::Cell, CommunicatorType >( - time, tau, mesh, + time, tau, mesh, this->conservativeVariables->getDensity(), this->conservativeVariablesRHS->getDensity() ); /**** * Momentum equations */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, MomentumXBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumX; + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, MomentumXBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumX; explicitUpdaterMomentumX.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumXOperator() ); explicitUpdaterMomentumX.setBoundaryConditions( this->boundaryConditionPointer->getMomentumXBoundaryCondition() ); - explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumX.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 0 ], // uRhoVelocityX, @@ -303,40 +301,40 @@ getExplicitUpdate( const RealType& time, Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumYOperatorType, MomentumYBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumY; explicitUpdaterMomentumY.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumYOperator() ); explicitUpdaterMomentumY.setBoundaryConditions( this->boundaryConditionPointer->getMomentumYBoundaryCondition() ); - explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumY.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 1 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 1 ] ); //, fuRhoVelocityX ); } - + if( Dimensions > 2 ) { Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumZOperatorType, MomentumZBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumZ; explicitUpdaterMomentumZ.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumZOperator() ); explicitUpdaterMomentumZ.setBoundaryConditions( this->boundaryConditionPointer->getMomentumZBoundaryCondition() ); - explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumZ.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 2 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 2 ] ); //, fuRhoVelocityX ); } - - + + /**** * Energy equation */ Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, EnergyOperatorType, EnergyBoundaryConditionsType, RightHandSide > explicitUpdaterEnergy; explicitUpdaterEnergy.setDifferentialOperator( this->inviscidOperatorsPointer->getEnergyOperator() ); explicitUpdaterEnergy.setBoundaryConditions( this->boundaryConditionPointer->getEnergyBoundaryCondition() ); - explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterEnergy.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, this->conservativeVariablesRHS->getEnergy(), // uRhoVelocityX, this->conservativeVariablesRHS->getEnergy() ); //, fuRhoVelocityX ); /* this->pressure->write( "pressure3", "gnuplot" ); - getchar(); + getchar(); this->conservativeVariablesRHS->getDensity()->write( "density", "gnuplot" ); this->conservativeVariablesRHS->getEnergy()->write( "energy", "gnuplot" ); this->conservativeVariablesRHS->getMomentum()->write( "momentum", "gnuplot", 0.05 ); @@ -403,10 +401,10 @@ postIterate( const RealType& time, MeshFunctionType velocityX( mesh, this->velocityX ); MeshFunctionType velocityY( mesh, this->velocityY ); MeshFunctionType pressure( mesh, this->pressure ); - MeshFunctionType uRho( mesh, _uRho ); - MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); - MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); - MeshFunctionType uEnergy( mesh, _uEnergy ); + MeshFunctionType uRho( mesh, _uRho ); + MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); + MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); + MeshFunctionType uEnergy( mesh, _uEnergy ); //Generating differential operators Velocity navierStokes2DVelocity; VelocityX navierStokes2DVelocityX; diff --git a/src/Examples/flow-vl/navierStokesProblem_impl.h b/src/Examples/flow-vl/navierStokesProblem_impl.h index fc4948e452b81372f908682a382dc1c382c38381..e42c80894ee62126104c4e17bc872212f8c4bde7 100644 --- a/src/Examples/flow-vl/navierStokesProblem_impl.h +++ b/src/Examples/flow-vl/navierStokesProblem_impl.h @@ -171,32 +171,30 @@ makeSnapshot( const RealType& time, DofVectorPointer& dofs ) { std::cout << std::endl << "Writing output at time " << time << " step " << step << "." << std::endl; - + this->bindDofs( dofs ); PhysicalVariablesGetter< MeshType > physicalVariablesGetter; physicalVariablesGetter.getVelocity( this->conservativeVariables, this->velocity ); physicalVariablesGetter.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + FileName fileName; - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); fileName.setFileNameBase( "density-" ); - this->conservativeVariables->getDensity()->save( fileName.getFileName() ); - + this->conservativeVariables->getDensity()->write( "density", fileName.getFileName() ); + fileName.setFileNameBase( "velocity-" ); - this->velocity->save( fileName.getFileName() ); + this->velocity->write( "velocity", fileName.getFileName() ); fileName.setFileNameBase( "pressure-" ); - this->pressure->save( fileName.getFileName() ); + this->pressure->write( "pressure", fileName.getFileName() ); - /*fileName.setFileNameBase( "energy-" ); - if( ! this->conservativeVariables->getEnergy()->save( fileName.getFileName() ) ) - return false; + fileName.setFileNameBase( "energy-" ); + this->conservativeVariables->getEnergy()->write( "energy", fileName.getFileName() ); fileName.setFileNameBase( "momentum-" ); - if( ! this->conservativeVariables->getMomentum()->save( fileName.getFileName() ) ) - return false;*/ - + this->conservativeVariables->getMomentum()->write( "momentum", fileName.getFileName() ); + return true; } @@ -214,7 +212,7 @@ getExplicitUpdate( const RealType& time, { typedef typename MeshType::Cell Cell; const MeshPointer& mesh = this->getMesh(); - + /**** * Bind DOFs */ @@ -231,7 +229,7 @@ getExplicitUpdate( const RealType& time, PhysicalVariablesGetter< typename MeshPointer::ObjectType > physicalVariables; physicalVariables.getVelocity( this->conservativeVariables, this->velocity ); physicalVariables.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + /**** * Set-up operators */ @@ -240,7 +238,7 @@ getExplicitUpdate( const RealType& time, typedef typename InviscidOperators::MomentumYOperatorType MomentumYOperatorType; typedef typename InviscidOperators::MomentumZOperatorType MomentumZOperatorType; typedef typename InviscidOperators::EnergyOperatorType EnergyOperatorType; - + this->inviscidOperatorsPointer->setTau( tau ); this->inviscidOperatorsPointer->setVelocity( this->velocity ); this->inviscidOperatorsPointer->setPressure( this->pressure ); @@ -276,23 +274,23 @@ getExplicitUpdate( const RealType& time, /**** * Continuity equation - */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, DensityBoundaryConditionsType, RightHandSide > explicitUpdaterContinuity; + */ + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, DensityBoundaryConditionsType, RightHandSide > explicitUpdaterContinuity; explicitUpdaterContinuity.setDifferentialOperator( this->inviscidOperatorsPointer->getContinuityOperator() ); explicitUpdaterContinuity.setBoundaryConditions( this->boundaryConditionPointer->getDensityBoundaryCondition() ); explicitUpdaterContinuity.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterContinuity.template update< typename Mesh::Cell, CommunicatorType >( - time, tau, mesh, + time, tau, mesh, this->conservativeVariables->getDensity(), this->conservativeVariablesRHS->getDensity() ); /**** * Momentum equations */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, MomentumXBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumX; + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, MomentumXBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumX; explicitUpdaterMomentumX.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumXOperator() ); explicitUpdaterMomentumX.setBoundaryConditions( this->boundaryConditionPointer->getMomentumXBoundaryCondition() ); - explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumX.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 0 ], // uRhoVelocityX, @@ -303,40 +301,40 @@ getExplicitUpdate( const RealType& time, Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumYOperatorType, MomentumYBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumY; explicitUpdaterMomentumY.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumYOperator() ); explicitUpdaterMomentumY.setBoundaryConditions( this->boundaryConditionPointer->getMomentumYBoundaryCondition() ); - explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumY.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 1 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 1 ] ); //, fuRhoVelocityX ); } - + if( Dimensions > 2 ) { Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumZOperatorType, MomentumZBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumZ; explicitUpdaterMomentumZ.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumZOperator() ); explicitUpdaterMomentumZ.setBoundaryConditions( this->boundaryConditionPointer->getMomentumZBoundaryCondition() ); - explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumZ.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 2 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 2 ] ); //, fuRhoVelocityX ); } - - + + /**** * Energy equation */ Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, EnergyOperatorType, EnergyBoundaryConditionsType, RightHandSide > explicitUpdaterEnergy; explicitUpdaterEnergy.setDifferentialOperator( this->inviscidOperatorsPointer->getEnergyOperator() ); explicitUpdaterEnergy.setBoundaryConditions( this->boundaryConditionPointer->getEnergyBoundaryCondition() ); - explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterEnergy.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, this->conservativeVariablesRHS->getEnergy(), // uRhoVelocityX, this->conservativeVariablesRHS->getEnergy() ); //, fuRhoVelocityX ); /* this->pressure->write( "pressure3", "gnuplot" ); - getchar(); + getchar(); this->conservativeVariablesRHS->getDensity()->write( "density", "gnuplot" ); this->conservativeVariablesRHS->getEnergy()->write( "energy", "gnuplot" ); this->conservativeVariablesRHS->getMomentum()->write( "momentum", "gnuplot", 0.05 ); @@ -403,10 +401,10 @@ postIterate( const RealType& time, MeshFunctionType velocityX( mesh, this->velocityX ); MeshFunctionType velocityY( mesh, this->velocityY ); MeshFunctionType pressure( mesh, this->pressure ); - MeshFunctionType uRho( mesh, _uRho ); - MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); - MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); - MeshFunctionType uEnergy( mesh, _uEnergy ); + MeshFunctionType uRho( mesh, _uRho ); + MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); + MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); + MeshFunctionType uEnergy( mesh, _uEnergy ); //Generating differential operators Velocity navierStokes2DVelocity; VelocityX navierStokes2DVelocityX; diff --git a/src/Examples/flow/navierStokesProblem_impl.h b/src/Examples/flow/navierStokesProblem_impl.h index 556645cfda30280200393d8a92213559640a7abc..c4c5795c8eb38f28ccd91f12f73b21b322dc2cb2 100644 --- a/src/Examples/flow/navierStokesProblem_impl.h +++ b/src/Examples/flow/navierStokesProblem_impl.h @@ -183,34 +183,30 @@ makeSnapshot( const RealType& time, DofVectorPointer& dofs ) { std::cout << std::endl << "Writing output at time " << time << " step " << step << "." << std::endl; - + this->bindDofs( dofs ); PhysicalVariablesGetter< MeshType > physicalVariablesGetter; physicalVariablesGetter.getVelocity( this->conservativeVariables, this->velocity ); physicalVariablesGetter.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + FileName fileName; - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); fileName.setFileNameBase( "density-" ); -// if( ! this->conservativeVariables->getDensity()->save( fileName.getFileName() ) ) -// return false; - + this->conservativeVariables->getDensity()->write( "density", fileName.getFileName() ); + fileName.setFileNameBase( "velocity-" ); - this->velocity->save( fileName.getFileName() ); + this->velocity->write( "velocity", fileName.getFileName() ); + + fileName.setFileNameBase( "pressure-" ); + this->pressure->write( "pressure", fileName.getFileName() ); -// fileName.setFileNameBase( "pressure-" ); -// if( ! this->pressure->save( fileName.getFileName() ) ) -// return false; + fileName.setFileNameBase( "energy-" ); + this->conservativeVariables->getEnergy()->write( "energy", fileName.getFileName() ); -// fileName.setFileNameBase( "energy-" ); -// if( ! this->conservativeVariables->getEnergy()->save( fileName.getFileName() ) ) -// return false; + fileName.setFileNameBase( "momentum-" ); + this->conservativeVariables->getMomentum()->write( "momentum", fileName.getFileName() ); -// fileName.setFileNameBase( "momentum-" ); -// if( ! this->conservativeVariables->getMomentum()->save( fileName.getFileName() ) ) -// return false; - return true; } @@ -228,7 +224,7 @@ getExplicitUpdate( const RealType& time, { typedef typename MeshType::Cell Cell; const MeshPointer& mesh = this->getMesh(); - + /**** * Bind DOFs */ @@ -236,14 +232,14 @@ getExplicitUpdate( const RealType& time, this->conservativeVariablesRHS->bind( mesh, *_fu ); this->velocity->setMesh( mesh ); this->pressure->setMesh( mesh ); - + /**** * Resolve the physical variables */ PhysicalVariablesGetter< typename MeshPointer::ObjectType > physicalVariables; physicalVariables.getVelocity( this->conservativeVariables, this->velocity ); physicalVariables.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + /**** * Set-up operators */ @@ -252,7 +248,7 @@ getExplicitUpdate( const RealType& time, typedef typename InviscidOperators::MomentumYOperatorType MomentumYOperatorType; typedef typename InviscidOperators::MomentumZOperatorType MomentumZOperatorType; typedef typename InviscidOperators::EnergyOperatorType EnergyOperatorType; - + this->inviscidOperatorsPointer->setTau( tau ); this->inviscidOperatorsPointer->setVelocity( this->velocity ); this->inviscidOperatorsPointer->setPressure( this->pressure ); @@ -285,22 +281,22 @@ getExplicitUpdate( const RealType& time, /**** * Continuity equation - */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, DensityBoundaryConditionsType, RightHandSide > explicitUpdaterContinuity; + */ + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, DensityBoundaryConditionsType, RightHandSide > explicitUpdaterContinuity; explicitUpdaterContinuity.setDifferentialOperator( this->inviscidOperatorsPointer->getContinuityOperator() ); explicitUpdaterContinuity.setBoundaryConditions( this->boundaryConditionPointer->getDensityBoundaryCondition() ); explicitUpdaterContinuity.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterContinuity.template update< typename Mesh::Cell, CommunicatorType >( - time, tau, mesh, + time, tau, mesh, this->conservativeVariables->getDensity(), this->conservativeVariablesRHS->getDensity() ); /**** * Momentum equations */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, MomentumXBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumX; + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, MomentumXBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumX; explicitUpdaterMomentumX.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumXOperator() ); explicitUpdaterMomentumX.setBoundaryConditions( this->boundaryConditionPointer->getMomentumXBoundaryCondition() ); - explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumX.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 0 ], // uRhoVelocityX, @@ -311,36 +307,36 @@ getExplicitUpdate( const RealType& time, Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumYOperatorType, MomentumYBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumY; explicitUpdaterMomentumY.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumYOperator() ); explicitUpdaterMomentumY.setBoundaryConditions( this->boundaryConditionPointer->getMomentumYBoundaryCondition() ); - explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumY.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 1 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 1 ] ); //, fuRhoVelocityX ); } - + if( Dimensions > 2 ) { Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumZOperatorType, MomentumZBoundaryConditionsType, RightHandSide > explicitUpdaterMomentumZ; explicitUpdaterMomentumZ.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumZOperator() ); explicitUpdaterMomentumZ.setBoundaryConditions( this->boundaryConditionPointer->getMomentumZBoundaryCondition() ); - explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumZ.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 2 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 2 ] ); //, fuRhoVelocityX ); } - + /**** * Energy equation */ Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, EnergyOperatorType, EnergyBoundaryConditionsType, RightHandSide > explicitUpdaterEnergy; explicitUpdaterEnergy.setDifferentialOperator( this->inviscidOperatorsPointer->getEnergyOperator() ); explicitUpdaterEnergy.setBoundaryConditions( this->boundaryConditionPointer->getEnergyBoundaryCondition() ); - explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterEnergy.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, this->conservativeVariables->getEnergy(), // uRhoVelocityX, this->conservativeVariablesRHS->getEnergy() ); //, fuRhoVelocityX ); - + /* this->conservativeVariablesRHS->getDensity()->write( "density", "gnuplot" ); this->conservativeVariablesRHS->getEnergy()->write( "energy", "gnuplot" ); @@ -409,10 +405,10 @@ postIterate( const RealType& time, MeshFunctionType velocityX( mesh, this->velocityX ); MeshFunctionType velocityY( mesh, this->velocityY ); MeshFunctionType pressure( mesh, this->pressure ); - MeshFunctionType uRho( mesh, _uRho ); - MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); - MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); - MeshFunctionType uEnergy( mesh, _uEnergy ); + MeshFunctionType uRho( mesh, _uRho ); + MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); + MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); + MeshFunctionType uEnergy( mesh, _uEnergy ); //Generating differential operators Velocity navierStokes2DVelocity; VelocityX navierStokes2DVelocityX; diff --git a/src/Examples/heat-equation/tnl-heat-equation-eoc.h b/src/Examples/heat-equation/tnl-heat-equation-eoc.h index e1f617a14adae46ea11f2f362655c5dc015290d8..4d585d9410d78237d45537f5455a39cfe78a8253 100644 --- a/src/Examples/heat-equation/tnl-heat-equation-eoc.h +++ b/src/Examples/heat-equation/tnl-heat-equation-eoc.h @@ -10,8 +10,6 @@ #pragma once -#define MPIIO - #include <TNL/Solvers/Solver.h> #include <TNL/Solvers/FastBuildConfigTag.h> #include <TNL/Solvers/BuildConfigTags.h> diff --git a/src/Examples/heat-equation/tnl-heat-equation.h b/src/Examples/heat-equation/tnl-heat-equation.h index 0cf06e24c10759847a0f59f4d42eb98e8973171c..d4e3b1c93194916039c839d03a795cdcb68b605f 100644 --- a/src/Examples/heat-equation/tnl-heat-equation.h +++ b/src/Examples/heat-equation/tnl-heat-equation.h @@ -10,8 +10,6 @@ #pragma once -#define MPIIO - #include <TNL/Solvers/Solver.h> #include <TNL/Solvers/FastBuildConfigTag.h> #include <TNL/Solvers/BuildConfigTags.h> @@ -48,10 +46,7 @@ class heatEquationConfig config.addEntry< String >( "boundary-conditions-file", "File with the values of the boundary conditions.", "boundary.tnl" ); config.addEntry< double >( "boundary-conditions-constant", "This sets a value in case of the constant boundary conditions." ); config.addEntry< double >( "right-hand-side-constant", "This sets a constant value for the right-hand side.", 0.0 ); - config.addEntry< String >( "initial-condition", "File with the initial condition.", "initial.tnl"); - config.addEntry< String >( "distributed-grid-io-type", "Choose Distributed Grid IO Type", "LocalCopy"); - config.addEntryEnum< String >( "LocalCopy" ); - config.addEntryEnum< String >( "MpiIO" ); + config.addEntry< String >( "initial-condition", "File with the initial condition.", "initial.vti"); }; }; diff --git a/src/Examples/inviscid-flow-sw/eulerProblem_impl.h b/src/Examples/inviscid-flow-sw/eulerProblem_impl.h index 423008fde206617beab80b3cb8af8a82d69a880d..f56fb295a9406b719e1b5d72cffc904c98bbe93e 100644 --- a/src/Examples/inviscid-flow-sw/eulerProblem_impl.h +++ b/src/Examples/inviscid-flow-sw/eulerProblem_impl.h @@ -168,30 +168,30 @@ makeSnapshot( const RealType& time, DofVectorPointer& dofs ) { std::cout << std::endl << "Writing output at time " << time << " step " << step << "." << std::endl; - + this->bindDofs( dofs ); PhysicalVariablesGetter< MeshType > physicalVariablesGetter; physicalVariablesGetter.getVelocity( this->conservativeVariables, this->velocity ); physicalVariablesGetter.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + FileName fileName; - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); fileName.setFileNameBase( "density-" ); - this->conservativeVariables->getDensity()->save( fileName.getFileName() ); - + this->conservativeVariables->getDensity()->write( "density", fileName.getFileName() ); + fileName.setFileNameBase( "velocity-" ); - this->velocity->save( fileName.getFileName() ); + this->velocity->write( "velocity", fileName.getFileName() ); fileName.setFileNameBase( "pressure-" ); - this->pressure->save( fileName.getFileName() ); + this->pressure->write( "pressure", fileName.getFileName() ); fileName.setFileNameBase( "energy-" ); - this->conservativeVariables->getEnergy()->save( fileName.getFileName() ); + this->conservativeVariables->getEnergy()->write( "energy", fileName.getFileName() ); fileName.setFileNameBase( "momentum-" ); - this->conservativeVariables->getMomentum()->save( fileName.getFileName() ); - + this->conservativeVariables->getMomentum()->write( "momentum", fileName.getFileName() ); + return true; } @@ -209,7 +209,7 @@ getExplicitUpdate( const RealType& time, { typedef typename MeshType::Cell Cell; const MeshPointer& mesh = this->getMesh(); - + /**** * Bind DOFs */ @@ -226,7 +226,7 @@ getExplicitUpdate( const RealType& time, PhysicalVariablesGetter< typename MeshPointer::ObjectType > physicalVariables; physicalVariables.getVelocity( this->conservativeVariables, this->velocity ); physicalVariables.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + /**** * Set-up operators */ @@ -235,7 +235,7 @@ getExplicitUpdate( const RealType& time, typedef typename InviscidOperators::MomentumYOperatorType MomentumYOperatorType; typedef typename InviscidOperators::MomentumZOperatorType MomentumZOperatorType; typedef typename InviscidOperators::EnergyOperatorType EnergyOperatorType; - + this->inviscidOperatorsPointer->setTau( tau ); this->inviscidOperatorsPointer->setVelocity( this->velocity ); this->inviscidOperatorsPointer->setPressure( this->pressure ); @@ -246,23 +246,23 @@ getExplicitUpdate( const RealType& time, // getchar(); /**** * Continuity equation - */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterContinuity; + */ + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterContinuity; explicitUpdaterContinuity.setDifferentialOperator( this->inviscidOperatorsPointer->getContinuityOperator() ); explicitUpdaterContinuity.setBoundaryConditions( this->boundaryConditionPointer ); explicitUpdaterContinuity.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterContinuity.template update< typename Mesh::Cell, CommunicatorType >( - time, tau, mesh, + time, tau, mesh, this->conservativeVariables->getDensity(), this->conservativeVariablesRHS->getDensity() ); /**** * Momentum equations */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumX; + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumX; explicitUpdaterMomentumX.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumXOperator() ); explicitUpdaterMomentumX.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumX.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 0 ], // uRhoVelocityX, @@ -273,40 +273,40 @@ getExplicitUpdate( const RealType& time, Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumYOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumY; explicitUpdaterMomentumY.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumYOperator() ); explicitUpdaterMomentumY.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumY.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 1 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 1 ] ); //, fuRhoVelocityX ); } - + if( Dimensions > 2 ) { Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumZOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumZ; explicitUpdaterMomentumZ.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumZOperator() ); explicitUpdaterMomentumZ.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumZ.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 2 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 2 ] ); //, fuRhoVelocityX ); } - - + + /**** * Energy equation */ Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, EnergyOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterEnergy; explicitUpdaterEnergy.setDifferentialOperator( this->inviscidOperatorsPointer->getEnergyOperator() ); explicitUpdaterEnergy.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterEnergy.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, this->conservativeVariablesRHS->getEnergy(), // uRhoVelocityX, this->conservativeVariablesRHS->getEnergy() ); //, fuRhoVelocityX ); /* this->pressure->write( "pressure3", "gnuplot" ); - getchar(); + getchar(); this->conservativeVariablesRHS->getDensity()->write( "density", "gnuplot" ); this->conservativeVariablesRHS->getEnergy()->write( "energy", "gnuplot" ); this->conservativeVariablesRHS->getMomentum()->write( "momentum", "gnuplot", 0.05 ); @@ -373,10 +373,10 @@ postIterate( const RealType& time, MeshFunctionType velocityX( mesh, this->velocityX ); MeshFunctionType velocityY( mesh, this->velocityY ); MeshFunctionType pressure( mesh, this->pressure ); - MeshFunctionType uRho( mesh, _uRho ); - MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); - MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); - MeshFunctionType uEnergy( mesh, _uEnergy ); + MeshFunctionType uRho( mesh, _uRho ); + MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); + MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); + MeshFunctionType uEnergy( mesh, _uEnergy ); //Generating differential operators Velocity euler2DVelocity; VelocityX euler2DVelocityX; diff --git a/src/Examples/inviscid-flow-vl/eulerProblem_impl.h b/src/Examples/inviscid-flow-vl/eulerProblem_impl.h index 423008fde206617beab80b3cb8af8a82d69a880d..f56fb295a9406b719e1b5d72cffc904c98bbe93e 100644 --- a/src/Examples/inviscid-flow-vl/eulerProblem_impl.h +++ b/src/Examples/inviscid-flow-vl/eulerProblem_impl.h @@ -168,30 +168,30 @@ makeSnapshot( const RealType& time, DofVectorPointer& dofs ) { std::cout << std::endl << "Writing output at time " << time << " step " << step << "." << std::endl; - + this->bindDofs( dofs ); PhysicalVariablesGetter< MeshType > physicalVariablesGetter; physicalVariablesGetter.getVelocity( this->conservativeVariables, this->velocity ); physicalVariablesGetter.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + FileName fileName; - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); fileName.setFileNameBase( "density-" ); - this->conservativeVariables->getDensity()->save( fileName.getFileName() ); - + this->conservativeVariables->getDensity()->write( "density", fileName.getFileName() ); + fileName.setFileNameBase( "velocity-" ); - this->velocity->save( fileName.getFileName() ); + this->velocity->write( "velocity", fileName.getFileName() ); fileName.setFileNameBase( "pressure-" ); - this->pressure->save( fileName.getFileName() ); + this->pressure->write( "pressure", fileName.getFileName() ); fileName.setFileNameBase( "energy-" ); - this->conservativeVariables->getEnergy()->save( fileName.getFileName() ); + this->conservativeVariables->getEnergy()->write( "energy", fileName.getFileName() ); fileName.setFileNameBase( "momentum-" ); - this->conservativeVariables->getMomentum()->save( fileName.getFileName() ); - + this->conservativeVariables->getMomentum()->write( "momentum", fileName.getFileName() ); + return true; } @@ -209,7 +209,7 @@ getExplicitUpdate( const RealType& time, { typedef typename MeshType::Cell Cell; const MeshPointer& mesh = this->getMesh(); - + /**** * Bind DOFs */ @@ -226,7 +226,7 @@ getExplicitUpdate( const RealType& time, PhysicalVariablesGetter< typename MeshPointer::ObjectType > physicalVariables; physicalVariables.getVelocity( this->conservativeVariables, this->velocity ); physicalVariables.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + /**** * Set-up operators */ @@ -235,7 +235,7 @@ getExplicitUpdate( const RealType& time, typedef typename InviscidOperators::MomentumYOperatorType MomentumYOperatorType; typedef typename InviscidOperators::MomentumZOperatorType MomentumZOperatorType; typedef typename InviscidOperators::EnergyOperatorType EnergyOperatorType; - + this->inviscidOperatorsPointer->setTau( tau ); this->inviscidOperatorsPointer->setVelocity( this->velocity ); this->inviscidOperatorsPointer->setPressure( this->pressure ); @@ -246,23 +246,23 @@ getExplicitUpdate( const RealType& time, // getchar(); /**** * Continuity equation - */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterContinuity; + */ + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterContinuity; explicitUpdaterContinuity.setDifferentialOperator( this->inviscidOperatorsPointer->getContinuityOperator() ); explicitUpdaterContinuity.setBoundaryConditions( this->boundaryConditionPointer ); explicitUpdaterContinuity.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterContinuity.template update< typename Mesh::Cell, CommunicatorType >( - time, tau, mesh, + time, tau, mesh, this->conservativeVariables->getDensity(), this->conservativeVariablesRHS->getDensity() ); /**** * Momentum equations */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumX; + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumX; explicitUpdaterMomentumX.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumXOperator() ); explicitUpdaterMomentumX.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumX.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 0 ], // uRhoVelocityX, @@ -273,40 +273,40 @@ getExplicitUpdate( const RealType& time, Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumYOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumY; explicitUpdaterMomentumY.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumYOperator() ); explicitUpdaterMomentumY.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumY.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 1 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 1 ] ); //, fuRhoVelocityX ); } - + if( Dimensions > 2 ) { Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumZOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumZ; explicitUpdaterMomentumZ.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumZOperator() ); explicitUpdaterMomentumZ.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumZ.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, ( *this->conservativeVariables->getMomentum() )[ 2 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 2 ] ); //, fuRhoVelocityX ); } - - + + /**** * Energy equation */ Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, EnergyOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterEnergy; explicitUpdaterEnergy.setDifferentialOperator( this->inviscidOperatorsPointer->getEnergyOperator() ); explicitUpdaterEnergy.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterEnergy.template update< typename Mesh::Cell, CommunicatorType >( time, tau, mesh, this->conservativeVariablesRHS->getEnergy(), // uRhoVelocityX, this->conservativeVariablesRHS->getEnergy() ); //, fuRhoVelocityX ); /* this->pressure->write( "pressure3", "gnuplot" ); - getchar(); + getchar(); this->conservativeVariablesRHS->getDensity()->write( "density", "gnuplot" ); this->conservativeVariablesRHS->getEnergy()->write( "energy", "gnuplot" ); this->conservativeVariablesRHS->getMomentum()->write( "momentum", "gnuplot", 0.05 ); @@ -373,10 +373,10 @@ postIterate( const RealType& time, MeshFunctionType velocityX( mesh, this->velocityX ); MeshFunctionType velocityY( mesh, this->velocityY ); MeshFunctionType pressure( mesh, this->pressure ); - MeshFunctionType uRho( mesh, _uRho ); - MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); - MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); - MeshFunctionType uEnergy( mesh, _uEnergy ); + MeshFunctionType uRho( mesh, _uRho ); + MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); + MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); + MeshFunctionType uEnergy( mesh, _uEnergy ); //Generating differential operators Velocity euler2DVelocity; VelocityX euler2DVelocityX; diff --git a/src/Examples/inviscid-flow/eulerProblem_impl.h b/src/Examples/inviscid-flow/eulerProblem_impl.h index 5e0827ff8acf1de691fced7fc8251fda153ab0c4..5a7a42d1e9b3964b022a78bb89daa1b89f2a7d6d 100644 --- a/src/Examples/inviscid-flow/eulerProblem_impl.h +++ b/src/Examples/inviscid-flow/eulerProblem_impl.h @@ -169,27 +169,27 @@ makeSnapshot( const RealType& time, DofVectorPointer& dofs ) { std::cout << std::endl << "Writing output at time " << time << " step " << step << "." << std::endl; - + this->bindDofs( dofs ); PhysicalVariablesGetter< MeshType > physicalVariablesGetter; physicalVariablesGetter.getVelocity( this->conservativeVariables, this->velocity ); physicalVariablesGetter.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + FileName fileName; - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); fileName.setFileNameBase( "density-" ); - this->conservativeVariables->getDensity()->save( fileName.getFileName() ); - + this->conservativeVariables->getDensity()->write( "density", fileName.getFileName() ); + fileName.setFileNameBase( "velocity-" ); - this->velocity->save( fileName.getFileName() ); + this->velocity->write( "velocity", fileName.getFileName() ); fileName.setFileNameBase( "pressure-" ); - this->pressure->save( fileName.getFileName() ); + this->pressure->write( "pressure", fileName.getFileName() ); fileName.setFileNameBase( "energy-" ); - this->conservativeVariables->getEnergy()->save( fileName.getFileName() ); - + this->conservativeVariables->getEnergy()->write( "energy", fileName.getFileName() ); + return true; } @@ -206,7 +206,7 @@ getExplicitUpdate( const RealType& time, DofVectorPointer& _fu ) { typedef typename MeshType::Cell Cell; - + /**** * Bind DOFs */ @@ -214,14 +214,14 @@ getExplicitUpdate( const RealType& time, this->conservativeVariablesRHS->bind( this->getMesh(), *_fu ); this->velocity->setMesh( this->getMesh() ); this->pressure->setMesh( this->getMesh() ); - + /**** * Resolve the physical variables */ PhysicalVariablesGetter< typename MeshPointer::ObjectType > physicalVariables; physicalVariables.getVelocity( this->conservativeVariables, this->velocity ); physicalVariables.getPressure( this->conservativeVariables, this->gamma, this->pressure ); - + /**** * Set-up operators */ @@ -230,29 +230,29 @@ getExplicitUpdate( const RealType& time, typedef typename InviscidOperators::MomentumYOperatorType MomentumYOperatorType; typedef typename InviscidOperators::MomentumZOperatorType MomentumZOperatorType; typedef typename InviscidOperators::EnergyOperatorType EnergyOperatorType; - + this->inviscidOperatorsPointer->setTau( tau ); this->inviscidOperatorsPointer->setVelocity( this->velocity ); this->inviscidOperatorsPointer->setPressure( this->pressure ); /**** * Continuity equation - */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterContinuity; + */ + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, ContinuityOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterContinuity; explicitUpdaterContinuity.setDifferentialOperator( this->inviscidOperatorsPointer->getContinuityOperator() ); explicitUpdaterContinuity.setBoundaryConditions( this->boundaryConditionPointer ); explicitUpdaterContinuity.setRightHandSide( this->rightHandSidePointer ); - explicitUpdaterContinuity.template update< typename Mesh::Cell, Communicator >( time, tau, this->getMesh(), + explicitUpdaterContinuity.template update< typename Mesh::Cell, Communicator >( time, tau, this->getMesh(), this->conservativeVariables->getDensity(), this->conservativeVariablesRHS->getDensity() ); /**** * Momentum equations */ - Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumX; + Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumXOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumX; explicitUpdaterMomentumX.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumXOperator() ); explicitUpdaterMomentumX.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumX.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumX.template update< typename Mesh::Cell, Communicator >( time, tau, this->getMesh(), ( *this->conservativeVariables->getMomentum() )[ 0 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 0 ] ); //, fuRhoVelocityX ); @@ -262,35 +262,35 @@ getExplicitUpdate( const RealType& time, Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumYOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumY; explicitUpdaterMomentumY.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumYOperator() ); explicitUpdaterMomentumY.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumY.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumY.template update< typename Mesh::Cell, Communicator >( time, tau, this->getMesh(), ( *this->conservativeVariables->getMomentum() )[ 1 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 1 ] ); //, fuRhoVelocityX ); } - + if( Dimensions > 2 ) { Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, MomentumZOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterMomentumZ; explicitUpdaterMomentumZ.setDifferentialOperator( this->inviscidOperatorsPointer->getMomentumZOperator() ); explicitUpdaterMomentumZ.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterMomentumZ.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterMomentumZ.template update< typename Mesh::Cell, Communicator >( time, tau, this->getMesh(), ( *this->conservativeVariables->getMomentum() )[ 2 ], // uRhoVelocityX, ( *this->conservativeVariablesRHS->getMomentum() )[ 2 ] ); //, fuRhoVelocityX ); } - - + + /**** * Energy equation */ Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, EnergyOperatorType, BoundaryCondition, RightHandSide > explicitUpdaterEnergy; explicitUpdaterEnergy.setDifferentialOperator( this->inviscidOperatorsPointer->getEnergyOperator() ); explicitUpdaterEnergy.setBoundaryConditions( this->boundaryConditionPointer ); - explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); + explicitUpdaterEnergy.setRightHandSide( this->rightHandSidePointer ); explicitUpdaterEnergy.template update< typename Mesh::Cell, Communicator >( time, tau, this->getMesh(), this->conservativeVariables->getEnergy(), // uRhoVelocityX, this->conservativeVariablesRHS->getEnergy() ); //, fuRhoVelocityX ); - + /*this->conservativeVariablesRHS->getDensity()->write( "density", "gnuplot" ); this->conservativeVariablesRHS->getEnergy()->write( "energy", "gnuplot" ); this->conservativeVariablesRHS->getMomentum()->write( "momentum", "gnuplot", 0.05 ); @@ -370,10 +370,10 @@ postIterate( const RealType& time, MeshFunctionType velocityX( mesh, this->velocityX ); MeshFunctionType velocityY( mesh, this->velocityY ); MeshFunctionType pressure( mesh, this->pressure ); - MeshFunctionType uRho( mesh, _uRho ); - MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); - MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); - MeshFunctionType uEnergy( mesh, _uEnergy ); + MeshFunctionType uRho( mesh, _uRho ); + MeshFunctionType uRhoVelocityX( mesh, _uRhoVelocityX ); + MeshFunctionType uRhoVelocityY( mesh, _uRhoVelocityY ); + MeshFunctionType uEnergy( mesh, _uEnergy ); //Generating differential operators Velocity euler2DVelocity; VelocityX euler2DVelocityX; diff --git a/src/Examples/transport-equation/transportEquationProblemEoc_impl.h b/src/Examples/transport-equation/transportEquationProblemEoc_impl.h index 6bff33bc77dda9e947837ee6d97ba9c6f073f436..5f5bd575fbe8d9bbd16c5fefa4b185a673ba36ef 100644 --- a/src/Examples/transport-equation/transportEquationProblemEoc_impl.h +++ b/src/Examples/transport-equation/transportEquationProblemEoc_impl.h @@ -51,7 +51,7 @@ setup( const Config::ParameterContainer& parameters, ! this->differentialOperatorPointer->setup( this->getMesh(), parameters, prefix ) || ! this->boundaryConditionPointer->setup( this->getMesh(), parameters, prefix + "boundary-conditions-" ) ) return false; - + /**** * Render the exact solution */ @@ -69,7 +69,7 @@ setup( const Config::ParameterContainer& parameters, typedef Functions::OperatorFunction< HeavisideType, VectorNormType > InitialConditionType; String velocityFieldType = parameters.getParameter< String >( "velocity-field" ); if( velocityFieldType == "constant" ) - { + { typedef Operators::Analytic::Shift< Dimension, RealType > ShiftOperatorType; typedef Functions::OperatorFunction< ShiftOperatorType, InitialConditionType > ExactSolutionType; Pointers::SharedPointer< ExactSolutionType, Devices::Host > exactSolution; @@ -87,20 +87,20 @@ setup( const Config::ParameterContainer& parameters, evaluator.evaluate( u, exactSolution, time ); FileName fileName; fileName.setFileNameBase( "exact-u-" ); - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); - u->save( fileName.getFileName() ); + u->write( "u", fileName.getFileName() ); while( time < finalTime ) { time += snapshotPeriod; if( time > finalTime ) time = finalTime; - exactSolution->getOperator().setShift( time * velocity ); + exactSolution->getOperator().setShift( time * velocity ); std::cerr << time * velocity << std::endl; std::cerr << exactSolution->getOperator().getShift() << std::endl; evaluator.evaluate( u, exactSolution, time ); fileName.setIndex( ++step ); - u->save( fileName.getFileName() ); + u->write( "u", fileName.getFileName() ); } } if( velocityFieldType == "rotation" ) @@ -108,7 +108,7 @@ setup( const Config::ParameterContainer& parameters, // TODO: implement this using RotationXY operator } } - + return true; } @@ -126,13 +126,9 @@ setInitialCondition( const Config::ParameterContainer& parameters, //const String& initialConditionFile = parameters.getParameter< String >( "initial-condition" ); FileName fileName; fileName.setFileNameBase( "exact-u-" ); - fileName.setExtension( "tnl" ); - fileName.setIndex( 0 ); - try - { - this->uPointer->boundLoad( fileName.getFileName() ); - } - catch(...) + fileName.setExtension( "vti" ); + fileName.setIndex( 0 ); + if( ! Functions::readMeshFunction( *this->uPointer, "u", fileName.getFileName() ) ) { std::cerr << "I am not able to load the initial condition from the file " << fileName.getFileName() << "." << std::endl; return false; diff --git a/src/Examples/transport-equation/transportEquationProblem_impl.h b/src/Examples/transport-equation/transportEquationProblem_impl.h index 79271a30589b3d25ace4f33f58bcc2aa5dbd3868..26d5ee9a589d7d9b9585dafb3c1f05743eb98662 100644 --- a/src/Examples/transport-equation/transportEquationProblem_impl.h +++ b/src/Examples/transport-equation/transportEquationProblem_impl.h @@ -106,11 +106,7 @@ setInitialCondition( const Config::ParameterContainer& parameters, { this->bindDofs( dofs ); const String& initialConditionFile = parameters.getParameter< String >( "initial-condition" ); - try - { - this->uPointer->boundLoad( initialConditionFile ); - } - catch(...) + if( ! Functions::readMeshFunction( *this->uPointer, "u", initialConditionFile ) ) { std::cerr << "I am not able to load the initial condition from the file " << initialConditionFile << "." << std::endl; return false; @@ -161,9 +157,9 @@ makeSnapshot( const RealType& time, printDofs.bind( this->getMesh(), *dofs ); FileName fileName; fileName.setFileNameBase( "u-" ); - fileName.setExtension( "tnl" ); + fileName.setExtension( "vti" ); fileName.setIndex( step ); - printDofs.save( fileName.getFileName() ); + printDofs.write( "u", fileName.getFileName() ); return true; } @@ -193,10 +189,10 @@ getExplicitUpdate( const RealType& time, this->bindDofs( _u ); Solvers::PDE::ExplicitUpdater< Mesh, MeshFunctionType, DifferentialOperator, BoundaryCondition, RightHandSide > explicitUpdater; Pointers::SharedPointer< MeshFunctionType > u; - u->bind( mesh, *_u ); + u->bind( mesh, *_u ); Pointers::SharedPointer< MeshFunctionType > fu; fu->bind( mesh, *_fu ); - differentialOperatorPointer->setTau(tau); + differentialOperatorPointer->setTau(tau); differentialOperatorPointer->setVelocityField( this->velocityField ); explicitUpdater.setDifferentialOperator( this->differentialOperatorPointer ); explicitUpdater.setBoundaryConditions( this->boundaryConditionPointer ); diff --git a/src/Python/pytnl/tnl/Grid.h b/src/Python/pytnl/tnl/Grid.h index 2622bd5c93dc07a5d67bfca2dde02ef72fdca6c7..c0b7c89c06f39d8784b172e0f5a41a0d85ec085a 100644 --- a/src/Python/pytnl/tnl/Grid.h +++ b/src/Python/pytnl/tnl/Grid.h @@ -54,11 +54,9 @@ void export_Grid( py::module & m, const char* name ) // void (Grid::* _setDimensions1)(const IndexType) = &Grid::setDimensions; void (Grid::* _setDimensions2)(const typename Grid::CoordinatesType &) = &Grid::setDimensions; - auto grid = py::class_<Grid, TNL::Object>( m, name ) + auto grid = py::class_<Grid>( m, name ) .def(py::init<>()) .def_static("getMeshDimension", &Grid::getMeshDimension) - .def_static("getSerializationType", &Grid::getSerializationType) - .def("getSerializationTypeVirtual", &Grid::getSerializationTypeVirtual) // FIXME: number of parameters depends on the grid dimension // .def("setDimensions", _setDimensions1) .def("setDimensions", _setDimensions2) diff --git a/src/Python/pytnl/tnl/Mesh.h b/src/Python/pytnl/tnl/Mesh.h index 3097f111f528fb06aef62f9d46af611a33509b6d..97c37f712d0438704fdae8ff62b78a43ac283273 100644 --- a/src/Python/pytnl/tnl/Mesh.h +++ b/src/Python/pytnl/tnl/Mesh.h @@ -98,11 +98,9 @@ void export_MeshEntity( Scope & scope, const char* name ) template< typename Mesh > void export_Mesh( py::module & m, const char* name ) { - auto mesh = py::class_< Mesh, TNL::Object >( m, name ) + auto mesh = py::class_< Mesh >( m, name ) .def(py::init<>()) .def_static("getMeshDimension", &Mesh::getMeshDimension) - .def_static("getSerializationType", &Mesh::getSerializationType) - .def("getSerializationTypeVirtual", &Mesh::getSerializationTypeVirtual) .def("getEntitiesCount", &mesh_getEntitiesCount< Mesh, typename Mesh::Cell >) .def("getEntitiesCount", &mesh_getEntitiesCount< Mesh, typename Mesh::Face >) .def("getEntitiesCount", &mesh_getEntitiesCount< Mesh, typename Mesh::Vertex >) diff --git a/src/Python/pytnl/tnl/MeshReaders.cpp b/src/Python/pytnl/tnl/MeshReaders.cpp index c009300f3c447d593c9b125911811ce0239195fd..861277ebe99814a976e7bde1355879250aab39d9 100644 --- a/src/Python/pytnl/tnl/MeshReaders.cpp +++ b/src/Python/pytnl/tnl/MeshReaders.cpp @@ -15,6 +15,9 @@ void export_MeshReaders( py::module & m ) // bindings against the actual class, NOT the trampoline .def("reset", &MeshReader::reset) .def("detectMesh", &MeshReader::detectMesh) + .def("loadMesh", &MeshReader::template loadMesh< Grid1D >) + .def("loadMesh", &MeshReader::template loadMesh< Grid2D >) + .def("loadMesh", &MeshReader::template loadMesh< Grid3D >) .def("loadMesh", &MeshReader::template loadMesh< MeshOfEdges >) .def("loadMesh", &MeshReader::template loadMesh< MeshOfTriangles >) .def("loadMesh", &MeshReader::template loadMesh< MeshOfQuadrangles >) @@ -28,7 +31,7 @@ void export_MeshReaders( py::module & m ) .def(py::init<std::string>()) ; - // base class for VTUReader and PVTUReader + // base class for VTUReader, VTIReader and PVTUReader py::class_< XMLVTK, PyXMLVTK, MeshReader >( m, "XMLVTK" ) .def(py::init<std::string>()) ; @@ -36,4 +39,8 @@ void export_MeshReaders( py::module & m ) py::class_< TNL::Meshes::Readers::VTUReader, XMLVTK >( m, "VTUReader" ) .def(py::init<std::string>()) ; + + py::class_< TNL::Meshes::Readers::VTIReader, XMLVTK >( m, "VTIReader" ) + .def(py::init<std::string>()) + ; } diff --git a/src/Python/pytnl/tnl/MeshReaders.h b/src/Python/pytnl/tnl/MeshReaders.h index 22b40a6719319251168ad9dfe0922071bd2b9d91..f339f9b652c30dce83e97f7b8712b4f4c3b682c6 100644 --- a/src/Python/pytnl/tnl/MeshReaders.h +++ b/src/Python/pytnl/tnl/MeshReaders.h @@ -1,5 +1,6 @@ #include <TNL/Meshes/Readers/VTKReader.h> #include <TNL/Meshes/Readers/VTUReader.h> +#include <TNL/Meshes/Readers/VTIReader.h> // trampoline classes needed for overriding virtual methods // https://pybind11.readthedocs.io/en/stable/advanced/classes.html diff --git a/src/Python/pytnl/tnl/MeshWriters.cpp b/src/Python/pytnl/tnl/MeshWriters.cpp index 01f79ce2d6a8a3b1f4af2773ac27653148ec4fb3..bfafa5047610511c13d102b855a3739ab20c3c8f 100644 --- a/src/Python/pytnl/tnl/MeshWriters.cpp +++ b/src/Python/pytnl/tnl/MeshWriters.cpp @@ -8,6 +8,7 @@ #include <TNL/Meshes/Writers/VTKWriter.h> #include <TNL/Meshes/Writers/VTUWriter.h> +#include <TNL/Meshes/Writers/VTIWriter.h> template< typename Writer, TNL::Meshes::VTK::FileFormat default_format > void export_MeshWriter( py::module & m, const char* name ) @@ -81,10 +82,13 @@ void export_MeshWriters( py::module & m ) { export_MeshWriter< TNL::Meshes::Writers::VTKWriter< Grid1D >, TNL::Meshes::VTK::FileFormat::binary >( m, "VTKWriter_Grid1D" ); export_MeshWriter< TNL::Meshes::Writers::VTUWriter< Grid1D >, TNL::Meshes::VTK::FileFormat::zlib_compressed >( m, "VTUWriter_Grid1D" ); + export_MeshWriter< TNL::Meshes::Writers::VTIWriter< Grid1D >, TNL::Meshes::VTK::FileFormat::zlib_compressed >( m, "VTIWriter_Grid1D" ); export_MeshWriter< TNL::Meshes::Writers::VTKWriter< Grid2D >, TNL::Meshes::VTK::FileFormat::binary >( m, "VTKWriter_Grid2D" ); export_MeshWriter< TNL::Meshes::Writers::VTUWriter< Grid2D >, TNL::Meshes::VTK::FileFormat::zlib_compressed >( m, "VTUWriter_Grid2D" ); + export_MeshWriter< TNL::Meshes::Writers::VTIWriter< Grid2D >, TNL::Meshes::VTK::FileFormat::zlib_compressed >( m, "VTIWriter_Grid2D" ); export_MeshWriter< TNL::Meshes::Writers::VTKWriter< Grid3D >, TNL::Meshes::VTK::FileFormat::binary >( m, "VTKWriter_Grid3D" ); export_MeshWriter< TNL::Meshes::Writers::VTUWriter< Grid3D >, TNL::Meshes::VTK::FileFormat::zlib_compressed >( m, "VTUWriter_Grid3D" ); + export_MeshWriter< TNL::Meshes::Writers::VTIWriter< Grid3D >, TNL::Meshes::VTK::FileFormat::zlib_compressed >( m, "VTIWriter_Grid3D" ); export_MeshWriter< TNL::Meshes::Writers::VTKWriter< MeshOfEdges >, TNL::Meshes::VTK::FileFormat::binary >( m, "VTKWriter_MeshOfEdges" ); export_MeshWriter< TNL::Meshes::Writers::VTUWriter< MeshOfEdges >, TNL::Meshes::VTK::FileFormat::zlib_compressed >( m, "VTUWriter_MeshOfEdges" ); diff --git a/src/TNL/Functions/MeshFunction.h b/src/TNL/Functions/MeshFunction.h index 6dce8d9f2bda62e09e1a555aac6062c55e5445aa..b475feebf4ad267d0614cd51bbebf2e4213ceb9a 100644 --- a/src/TNL/Functions/MeshFunction.h +++ b/src/TNL/Functions/MeshFunction.h @@ -22,7 +22,6 @@ template< typename Mesh, int MeshEntityDimension = Mesh::getMeshDimension(), typename Real = typename Mesh::RealType > class MeshFunction : - public Object, public Domain< Mesh::getMeshDimension(), MeshDomain > { //static_assert( Mesh::DeviceType::DeviceType == Vector::DeviceType::DeviceType, @@ -46,10 +45,6 @@ class MeshFunction : MeshFunction( const MeshFunction& meshFunction ); - static String getSerializationType(); - - virtual String getSerializationTypeVirtual() const; - static void configSetup( Config::ConfigDescription& config, const String& prefix = "" ); @@ -65,6 +60,8 @@ class MeshFunction : const MeshPointer& getMeshPointer() const; + MeshPointer& getMeshPointer(); + static IndexType getDofs( const MeshPointer& meshPointer ); __cuda_callable__ const VectorType& getData() const; @@ -94,6 +91,7 @@ class MeshFunction : __cuda_callable__ RealType& operator[]( const IndexType& meshEntityIndex ); + __cuda_callable__ const RealType& operator[]( const IndexType& meshEntityIndex ) const; @@ -112,20 +110,9 @@ class MeshFunction : RealType getMaxNorm() const; - void save( File& file ) const; - - void load( File& file ); - - void boundLoad( File& file ); - - void boundLoad( const String& fileName ); - - bool write( const String& fileName, - const String& format = "vtk" ) const; - - using Object::save; - - using Object::load; + bool write( const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) const; protected: diff --git a/src/TNL/Functions/MeshFunction.hpp b/src/TNL/Functions/MeshFunction.hpp index 6d8f91ebccbd1c80e53bf3fe8a9c13dfded18d0b..a1545a6458f061a1d202f70ca747fc1cd4c4fad8 100644 --- a/src/TNL/Functions/MeshFunction.hpp +++ b/src/TNL/Functions/MeshFunction.hpp @@ -8,16 +8,14 @@ /* See Copyright Notice in tnl/Copyright */ +#pragma once + #include <TNL/Assert.h> #include <TNL/Pointers/DevicePointer.h> #include <TNL/Functions/MeshFunction.h> #include <TNL/Functions/MeshFunctionEvaluator.h> #include <TNL/Functions/MeshFunctionNormGetter.h> -#include <TNL/Functions/MeshFunctionGnuplotWriter.h> -#include <TNL/Meshes/Writers/VTKWriter.h> -#include <TNL/Meshes/Writers/VTUWriter.h> - -#pragma once +#include <TNL/Functions/MeshFunctionIO.h> namespace TNL { namespace Functions { @@ -50,30 +48,6 @@ MeshFunction( const MeshFunction& meshFunction ) this->data = meshFunction.getData(); } -template< typename Mesh, - int MeshEntityDimension, - typename Real > -String -MeshFunction< Mesh, MeshEntityDimension, Real >:: -getSerializationType() -{ - return String( "Functions::MeshFunction< " ) + - TNL::getSerializationType< Mesh >() + ", " + - convertToString( MeshEntityDimension ) + ", " + - getType< Real >() + - " >"; -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -String -MeshFunction< Mesh, MeshEntityDimension, Real >:: -getSerializationTypeVirtual() const -{ - return this->getSerializationType(); -} - template< typename Mesh, int MeshEntityDimension, typename Real > @@ -83,6 +57,7 @@ configSetup( Config::ConfigDescription& config, const String& prefix ) { config.addEntry< String >( prefix + "file", "Dataset for the mesh function." ); + config.addEntry< String >( prefix + "function-name", "Name of the mesh function in the input file.", "f" ); } template< typename Mesh, @@ -95,16 +70,9 @@ setup( const MeshPointer& meshPointer, const String& prefix ) { this->setMesh( meshPointer ); - if( parameters.checkParameter( prefix + "file" ) ) - { - String fileName = parameters.getParameter< String >( prefix + "file" ); - this->load( fileName ); - } - else - { - throw std::runtime_error( "Missing parameter " + prefix + "file." ); - } - return true; + const String fileName = parameters.getParameter< String >( prefix + "file" ); + const String functionName = parameters.getParameter< String >( prefix + "function-name" ); + return readMeshFunction( *this, functionName, fileName ); } template< typename Mesh, @@ -123,7 +91,7 @@ template< typename Mesh, typename Real > template< typename Device > __cuda_callable__ -const typename MeshFunction< Mesh, MeshEntityDimension, Real >::MeshType& +const typename MeshFunction< Mesh, MeshEntityDimension, Real >::MeshType& MeshFunction< Mesh, MeshEntityDimension, Real >:: getMesh() const { @@ -140,6 +108,16 @@ getMeshPointer() const return this->meshPointer; } +template< typename Mesh, + int MeshEntityDimension, + typename Real > +typename MeshFunction< Mesh, MeshEntityDimension, Real >::MeshPointer& +MeshFunction< Mesh, MeshEntityDimension, Real >:: +getMeshPointer() +{ + return this->meshPointer; +} + template< typename Mesh, int MeshEntityDimension, typename Real > @@ -154,7 +132,7 @@ template< typename Mesh, int MeshEntityDimension, typename Real > __cuda_callable__ -const typename MeshFunction< Mesh, MeshEntityDimension, Real >::VectorType& +const typename MeshFunction< Mesh, MeshEntityDimension, Real >::VectorType& MeshFunction< Mesh, MeshEntityDimension, Real >:: getData() const { @@ -165,7 +143,7 @@ template< typename Mesh, int MeshEntityDimension, typename Real > __cuda_callable__ -typename MeshFunction< Mesh, MeshEntityDimension, Real >::VectorType& +typename MeshFunction< Mesh, MeshEntityDimension, Real >::VectorType& MeshFunction< Mesh, MeshEntityDimension, Real >:: getData() { @@ -341,94 +319,16 @@ getMaxNorm() const return max( abs( this->data ) ); } -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunction< Mesh, MeshEntityDimension, Real >:: -save( File& file ) const -{ - TNL_ASSERT_EQ( this->data.getSize(), this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(), - "Size of the mesh function data does not match the mesh." ); - Object::save( file ); - file << this->data; -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunction< Mesh, MeshEntityDimension, Real >:: -load( File& file ) -{ - Object::load( file ); - file >> this->data; - const IndexType meshSize = this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(); - if( this->data.getSize() != meshSize ) - throw Exceptions::FileDeserializationError( file.getFileName(), "mesh function data size does not match the mesh size (expected " + std::to_string(meshSize) + ", got " + std::to_string(this->data.getSize()) + ")." ); -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunction< Mesh, MeshEntityDimension, Real >:: -boundLoad( File& file ) -{ - Object::load( file ); - file >> this->data.getView(); -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunction< Mesh, MeshEntityDimension, Real >:: -boundLoad( const String& fileName ) -{ - File file; - file.open( fileName, std::ios_base::in ); - this->boundLoad( file ); -} - template< typename Mesh, int MeshEntityDimension, typename Real > bool MeshFunction< Mesh, MeshEntityDimension, Real >:: -write( const String& fileName, - const String& format ) const +write( const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat ) const { - std::fstream file; - file.open( fileName.getString(), std::ios::out ); - if( ! file ) - { - std::cerr << "Unable to open a file " << fileName << "." << std::endl; - return false; - } - if( format == "vtk" ) { - Meshes::Writers::VTKWriter< Mesh > writer( file ); - writer.template writeEntities< getEntitiesDimension() >( *meshPointer ); - if( MeshFunction::getEntitiesDimension() == 0 ) - writer.writePointData( getData(), "cellFunctionValues", 1 ); - else - writer.writeCellData( getData(), "pointFunctionValues", 1 ); - } - else if( format == "vtu" ) { - Meshes::Writers::VTUWriter< Mesh > writer( file ); - writer.template writeEntities< getEntitiesDimension() >( *meshPointer ); - if( MeshFunction::getEntitiesDimension() == 0 ) - writer.writePointData( getData(), "cellFunctionValues", 1 ); - else - writer.writeCellData( getData(), "pointFunctionValues", 1 ); - } - else if( format == "gnuplot" ) - return MeshFunctionGnuplotWriter< MeshFunction >::write( *this, file ); - else { - std::cerr << "Unknown output format: " << format << std::endl; - return false; - } - return true; + return writeMeshFunction( *this, functionName, fileName, fileFormat ); } template< typename Mesh, diff --git a/src/TNL/Functions/MeshFunctionIO.h b/src/TNL/Functions/MeshFunctionIO.h new file mode 100644 index 0000000000000000000000000000000000000000..35ed818978857ee97efee75f90059b9720c8018b --- /dev/null +++ b/src/TNL/Functions/MeshFunctionIO.h @@ -0,0 +1,285 @@ +/*************************************************************************** + MeshFunctionIO.h - description + ------------------- + begin : Jun 22, 2021 + copyright : (C) 2017 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +#pragma once + +#include <type_traits> +#include <experimental/filesystem> + +#include <TNL/Meshes/Traits.h> +#include <TNL/Meshes/Readers/getMeshReader.h> +#include <TNL/Meshes/Writers/VTKWriter.h> +#include <TNL/Meshes/Writers/VTUWriter.h> +#include <TNL/Meshes/Writers/VTIWriter.h> +#include <TNL/Meshes/Writers/PVTIWriter.h> +#include <TNL/Functions/MeshFunctionGnuplotWriter.h> + +namespace TNL { +namespace Functions { + +template< typename MeshFunction > +bool +readMeshFunction( MeshFunction& function, + const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) +{ + std::shared_ptr< Meshes::Readers::MeshReader > reader = Meshes::Readers::getMeshReader( fileName, fileFormat ); + if( reader == nullptr ) + return false; + + reader->detectMesh(); + + // load the mesh if the function does not have it yet + if( function.getMesh() == typename MeshFunction::MeshType {} ) + reader->loadMesh( *function.getMeshPointer() ); + + Meshes::Readers::MeshReader::VariantVector data; + if( function.getEntitiesDimension() == 0 ) + data = reader->readPointData( functionName ); + else if( function.getEntitiesDimension() == function.getMeshDimension() ) + data = reader->readCellData( functionName ); + else { + std::cerr << "The mesh function with entities dimension " << function.getEntitiesDimension() << " cannot be read from the file " << fileName << std::endl; + return false; + } + + visit( [&](auto&& array) { + const auto entitiesCount = function.getMesh().template getEntitiesCount< MeshFunction::getEntitiesDimension() >(); + if( array.size() == (std::size_t) entitiesCount ) + Algorithms::MultiDeviceMemoryOperations< typename MeshFunction::VectorType::DeviceType, Devices::Host > + ::copy( function.getData().getData(), array.data(), array.size() ); + else + throw Exceptions::FileDeserializationError( fileName, "mesh function data size does not match the mesh size (expected " + std::to_string(entitiesCount) + ", got " + std::to_string(array.size()) + ")." ); + }, + data + ); + + return true; +} + +template< typename MeshFunction > +bool +readDistributedMeshFunction( Meshes::DistributedMeshes::DistributedMesh< typename MeshFunction::MeshType >& distributedMesh, + MeshFunction& function, + const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) +{ + std::shared_ptr< Meshes::Readers::MeshReader > reader = Meshes::Readers::getMeshReader( fileName, fileFormat ); + if( reader == nullptr ) + return false; + + reader->detectMesh(); + + // load the mesh if it was not loaded yet + using MeshType = typename MeshFunction::MeshType; + using DistributedMeshType = Meshes::DistributedMeshes::DistributedMesh< MeshType >; + if( distributedMesh == DistributedMeshType {} ) { + if( reader->getMeshType() == "Meshes::DistributedMesh" ) + dynamic_cast<Meshes::Readers::PVTUReader&>(*reader).loadMesh( distributedMesh ); + else if( reader->getMeshType() == "Meshes::DistributedGrid" ) + dynamic_cast<Meshes::Readers::PVTIReader&>(*reader).loadMesh( distributedMesh ); + else + throw std::runtime_error( "Unknown type of a distributed mesh: " + reader->getMeshType() ); + } + if( function.getMesh() != distributedMesh.getLocalMesh() ) + // FIXME: DistributedMesh does not have a SharedPointer of the local mesh, + // the interface is fucked up (it should not require us to put SharedPointer everywhere) + *function.getMeshPointer() = distributedMesh.getLocalMesh(); + + Meshes::Readers::MeshReader::VariantVector data; + if( function.getEntitiesDimension() == 0 ) + data = reader->readPointData( functionName ); + else if( function.getEntitiesDimension() == function.getMeshDimension() ) + data = reader->readCellData( functionName ); + else { + std::cerr << "The mesh function with entities dimension " << function.getEntitiesDimension() << " cannot be read from the file " << fileName << std::endl; + return false; + } + + visit( [&](auto&& array) { + const auto entitiesCount = function.getMesh().template getEntitiesCount< MeshFunction::getEntitiesDimension() >(); + if( array.size() == (std::size_t) entitiesCount ) + Algorithms::MultiDeviceMemoryOperations< typename MeshFunction::VectorType::DeviceType, Devices::Host > + ::copy( function.getData().getData(), array.data(), array.size() ); + else + throw Exceptions::FileDeserializationError( fileName, "mesh function data size does not match the mesh size (expected " + std::to_string(entitiesCount) + ", got " + std::to_string(array.size()) + ")." ); + }, + data + ); + + return true; +} + +// specialization for grids +template< typename MeshFunction > +std::enable_if_t< Meshes::isGrid< typename MeshFunction::MeshType >::value, bool > +writeMeshFunction( const MeshFunction& function, + const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) +{ + std::ofstream file; + file.open( fileName ); + if( ! file ) + { + std::cerr << "Unable to open a file " << fileName << "." << std::endl; + return false; + } + + namespace fs = std::experimental::filesystem; + std::string format = fileFormat; + if( format == "auto" ) { + format = fs::path(fileName).extension(); + if( format.length() > 0 ) + // remove dot from the extension + format = format.substr(1); + } + + if( format == "vti" ) { + Meshes::Writers::VTIWriter< typename MeshFunction::MeshType > writer( file ); + writer.writeImageData( function.getMesh() ); + if( MeshFunction::getEntitiesDimension() == 0 ) + writer.writePointData( function.getData(), functionName, 1 ); + else + writer.writeCellData( function.getData(), functionName, 1 ); + } + else if( format == "gnuplot" || format == "gplt" || format == "plt" ) + return MeshFunctionGnuplotWriter< MeshFunction >::write( function, file ); + else { + std::cerr << "Unknown output format: " << format << std::endl; + return false; + } + return true; +} + +// specialization for meshes +template< typename MeshFunction > +std::enable_if_t< ! Meshes::isGrid< typename MeshFunction::MeshType >::value, bool > +writeMeshFunction( const MeshFunction& function, + const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) +{ + std::ofstream file; + file.open( fileName ); + if( ! file ) + { + std::cerr << "Unable to open a file " << fileName << "." << std::endl; + return false; + } + + namespace fs = std::experimental::filesystem; + std::string format = fileFormat; + if( format == "auto" ) { + format = fs::path(fileName).extension(); + if( format.length() > 0 ) + // remove dot from the extension + format = format.substr(1); + } + + if( format == "vtk" ) { + Meshes::Writers::VTKWriter< typename MeshFunction::MeshType > writer( file ); + writer.template writeEntities< MeshFunction::getEntitiesDimension() >( function.getMesh() ); + if( MeshFunction::getEntitiesDimension() == 0 ) + writer.writePointData( function.getData(), functionName, 1 ); + else + writer.writeCellData( function.getData(), functionName, 1 ); + } + else if( format == "vtu" ) { + Meshes::Writers::VTUWriter< typename MeshFunction::MeshType > writer( file ); + writer.template writeEntities< MeshFunction::getEntitiesDimension() >( function.getMesh() ); + if( MeshFunction::getEntitiesDimension() == 0 ) + writer.writePointData( function.getData(), functionName, 1 ); + else + writer.writeCellData( function.getData(), functionName, 1 ); + } + else if( format == "gnuplot" || format == "gplt" || format == "plt" ) + return MeshFunctionGnuplotWriter< MeshFunction >::write( function, file ); + else { + std::cerr << "Unknown output format: " << format << std::endl; + return false; + } + return true; +} + +// specialization for grids +template< typename MeshFunction > +std::enable_if_t< Meshes::isGrid< typename MeshFunction::MeshType >::value, bool > +writeDistributedMeshFunction( const Meshes::DistributedMeshes::DistributedMesh< typename MeshFunction::MeshType >& distributedMesh, + const MeshFunction& function, + const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) +{ + namespace fs = std::experimental::filesystem; + std::string format = fileFormat; + if( format == "auto" ) { + format = fs::path(fileName).extension(); + if( format.length() > 0 ) + // remove dot from the extension + format = format.substr(1); + } + + if( format == "pvti" ) { + const MPI_Comm group = distributedMesh.getCommunicationGroup(); + std::ofstream file; + if( TNL::MPI::GetRank( group ) == 0 ) + file.open( fileName ); + + using PVTI = Meshes::Writers::PVTIWriter< typename MeshFunction::MeshType >; + PVTI pvti( file ); + // TODO: write metadata: step and time + pvti.writeImageData( distributedMesh ); + // TODO + //if( distributedMesh.getGhostLevels() > 0 ) { + // pvti.template writePPointData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); + // pvti.template writePCellData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); + //} + if( function.getEntitiesDimension() == 0 ) + pvti.template writePPointData< typename MeshFunction::RealType >( functionName ); + else + pvti.template writePCellData< typename MeshFunction::RealType >( functionName ); + const std::string subfilePath = pvti.addPiece( fileName, distributedMesh ); + + // create a .vti file for local data + // TODO: write metadata: step and time + using Writer = Meshes::Writers::VTIWriter< typename MeshFunction::MeshType >; + std::ofstream subfile( subfilePath ); + Writer writer( subfile ); + // NOTE: passing the local mesh to writeImageData does not work correctly, just like meshFunction->write(...) + // (it does not write the correct extent of the subdomain - globalBegin is only in the distributed grid) + // NOTE: globalBegin and globalEnd here are without overlaps + writer.writeImageData( distributedMesh.getGlobalGrid().getOrigin(), + distributedMesh.getGlobalBegin() - distributedMesh.getLowerOverlap(), + distributedMesh.getGlobalBegin() + distributedMesh.getLocalSize() + distributedMesh.getUpperOverlap(), + distributedMesh.getGlobalGrid().getSpaceSteps() ); + if( function.getEntitiesDimension() == 0 ) + writer.writePointData( function.getData(), functionName ); + else + writer.writeCellData( function.getData(), functionName ); + // TODO + //if( mesh.getGhostLevels() > 0 ) { + // writer.writePointData( mesh.vtkPointGhostTypes(), Meshes::VTK::ghostArrayName() ); + // writer.writeCellData( mesh.vtkCellGhostTypes(), Meshes::VTK::ghostArrayName() ); + //} + } + else { + std::cerr << "Unknown output format: " << format << std::endl; + return false; + } + return true; +} + +// TODO: specialization of writeDistributedMeshFunction for unstructured mesh + +} // namespace Functions +} // namespace TNL diff --git a/src/TNL/Functions/MeshFunctionView.h b/src/TNL/Functions/MeshFunctionView.h index c66a59ce5c980266686b286dec5ea58dd649c16e..e812f526ba6047c32b4e48e7618304ed41ddc803 100644 --- a/src/TNL/Functions/MeshFunctionView.h +++ b/src/TNL/Functions/MeshFunctionView.h @@ -22,7 +22,6 @@ template< typename Mesh, int MeshEntityDimension = Mesh::getMeshDimension(), typename Real = typename Mesh::RealType > class MeshFunctionView : - public Object, public Domain< Mesh::getMeshDimension(), MeshDomain > { //static_assert( Mesh::DeviceType::DeviceType == Vector::DeviceType::DeviceType, @@ -54,10 +53,6 @@ class MeshFunctionView : Pointers::SharedPointer< Vector >& data, const IndexType& offset = 0 ); - static String getSerializationType(); - - virtual String getSerializationTypeVirtual() const; - static void configSetup( Config::ConfigDescription& config, const String& prefix = "" ); @@ -89,6 +84,8 @@ class MeshFunctionView : const MeshPointer& getMeshPointer() const; + MeshPointer& getMeshPointer(); + static IndexType getDofs( const MeshPointer& meshPointer ); __cuda_callable__ const VectorType& getData() const; @@ -118,6 +115,7 @@ class MeshFunctionView : __cuda_callable__ RealType& operator[]( const IndexType& meshEntityIndex ); + __cuda_callable__ const RealType& operator[]( const IndexType& meshEntityIndex ) const; @@ -136,20 +134,9 @@ class MeshFunctionView : RealType getMaxNorm() const; - void save( File& file ) const; - - void load( File& file ); - - void boundLoad( File& file ); - - void boundLoad( const String& fileName ); - - bool write( const String& fileName, - const String& format = "vtk" ) const; - - using Object::save; - - using Object::load; + bool write( const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) const; protected: diff --git a/src/TNL/Functions/MeshFunctionView.hpp b/src/TNL/Functions/MeshFunctionView.hpp index 15b70c4edf8da7343489b145a1222ec1319d3712..cbae2ca5c304e10e7e03ba9e4d0acb5bc5458e0d 100644 --- a/src/TNL/Functions/MeshFunctionView.hpp +++ b/src/TNL/Functions/MeshFunctionView.hpp @@ -8,16 +8,14 @@ /* See Copyright Notice in tnl/Copyright */ +#pragma once + #include <TNL/Assert.h> #include <TNL/Pointers/DevicePointer.h> #include <TNL/Functions/MeshFunctionView.h> #include <TNL/Functions/MeshFunctionEvaluator.h> #include <TNL/Functions/MeshFunctionNormGetter.h> -#include <TNL/Functions/MeshFunctionGnuplotWriter.h> -#include <TNL/Meshes/Writers/VTKWriter.h> -#include <TNL/Meshes/Writers/VTUWriter.h> - -#pragma once +#include <TNL/Functions/MeshFunctionIO.h> namespace TNL { namespace Functions { @@ -75,30 +73,6 @@ MeshFunctionView( const MeshPointer& meshPointer, this->data.bind( *data, offset, getMesh().template getEntitiesCount< typename Mesh::template EntityType< MeshEntityDimension > >() ); } -template< typename Mesh, - int MeshEntityDimension, - typename Real > -String -MeshFunctionView< Mesh, MeshEntityDimension, Real >:: -getSerializationType() -{ - return String( "Functions::MeshFunction< " ) + - TNL::getSerializationType< Mesh >() + ", " + - convertToString( MeshEntityDimension ) + ", " + - getType< Real >() + - " >"; -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -String -MeshFunctionView< Mesh, MeshEntityDimension, Real >:: -getSerializationTypeVirtual() const -{ - return this->getSerializationType(); -} - template< typename Mesh, int MeshEntityDimension, typename Real > @@ -108,6 +82,7 @@ configSetup( Config::ConfigDescription& config, const String& prefix ) { config.addEntry< String >( prefix + "file", "Dataset for the mesh function." ); + config.addEntry< String >( prefix + "function-name", "Name of the mesh function in the input file.", "f" ); } template< typename Mesh, @@ -120,16 +95,9 @@ setup( const MeshPointer& meshPointer, const String& prefix ) { this->setMesh( meshPointer ); - if( parameters.checkParameter( prefix + "file" ) ) - { - String fileName = parameters.getParameter< String >( prefix + "file" ); - this->load( fileName ); - } - else - { - throw std::runtime_error( "Missing parameter " + prefix + "file." ); - } - return true; + const String fileName = parameters.getParameter< String >( prefix + "file" ); + const String functionName = parameters.getParameter< String >( prefix + "function-name" ); + return readMeshFunction( *this, functionName, fileName ); } template< typename Mesh, @@ -208,7 +176,7 @@ template< typename Mesh, typename Real > template< typename Device > __cuda_callable__ -const typename MeshFunctionView< Mesh, MeshEntityDimension, Real >::MeshType& +const typename MeshFunctionView< Mesh, MeshEntityDimension, Real >::MeshType& MeshFunctionView< Mesh, MeshEntityDimension, Real >:: getMesh() const { @@ -225,6 +193,16 @@ getMeshPointer() const return this->meshPointer; } +template< typename Mesh, + int MeshEntityDimension, + typename Real > +typename MeshFunctionView< Mesh, MeshEntityDimension, Real >::MeshPointer& +MeshFunctionView< Mesh, MeshEntityDimension, Real >:: +getMeshPointer() +{ + return this->meshPointer; +} + template< typename Mesh, int MeshEntityDimension, typename Real > @@ -239,7 +217,7 @@ template< typename Mesh, int MeshEntityDimension, typename Real > __cuda_callable__ -const typename MeshFunctionView< Mesh, MeshEntityDimension, Real >::VectorType& +const typename MeshFunctionView< Mesh, MeshEntityDimension, Real >::VectorType& MeshFunctionView< Mesh, MeshEntityDimension, Real >:: getData() const { @@ -250,7 +228,7 @@ template< typename Mesh, int MeshEntityDimension, typename Real > __cuda_callable__ -typename MeshFunctionView< Mesh, MeshEntityDimension, Real >::VectorType& +typename MeshFunctionView< Mesh, MeshEntityDimension, Real >::VectorType& MeshFunctionView< Mesh, MeshEntityDimension, Real >:: getData() { @@ -426,94 +404,16 @@ getMaxNorm() const return max( abs( this->data ) ); } -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunctionView< Mesh, MeshEntityDimension, Real >:: -save( File& file ) const -{ - TNL_ASSERT_EQ( this->data.getSize(), this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(), - "Size of the mesh function data does not match the mesh." ); - Object::save( file ); - file << this->data; -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunctionView< Mesh, MeshEntityDimension, Real >:: -load( File& file ) -{ - Object::load( file ); - file >> this->data; - const IndexType meshSize = this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(); - if( this->data.getSize() != meshSize ) - throw Exceptions::FileDeserializationError( file.getFileName(), "mesh function data size does not match the mesh size (expected " + std::to_string(meshSize) + ", got " + std::to_string(this->data.getSize()) + ")." ); -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunctionView< Mesh, MeshEntityDimension, Real >:: -boundLoad( File& file ) -{ - Object::load( file ); - file >> this->data.getView(); -} - -template< typename Mesh, - int MeshEntityDimension, - typename Real > -void -MeshFunctionView< Mesh, MeshEntityDimension, Real >:: -boundLoad( const String& fileName ) -{ - File file; - file.open( fileName, std::ios_base::in ); - this->boundLoad( file ); -} - template< typename Mesh, int MeshEntityDimension, typename Real > bool MeshFunctionView< Mesh, MeshEntityDimension, Real >:: -write( const String& fileName, - const String& format ) const -{ - std::fstream file; - file.open( fileName.getString(), std::ios::out ); - if( ! file ) - { - std::cerr << "Unable to open a file " << fileName << "." << std::endl; - return false; - } - if( format == "vtk" ) { - Meshes::Writers::VTKWriter< Mesh > writer( file ); - writer.template writeEntities< getEntitiesDimension() >( *meshPointer ); - if( MeshFunctionView::getEntitiesDimension() == 0 ) - writer.writePointData( getData(), "cellFunctionValues", 1 ); - else - writer.writeCellData( getData(), "pointFunctionValues", 1 ); - } - else if( format == "vtu" ) { - Meshes::Writers::VTUWriter< Mesh > writer( file ); - writer.template writeEntities< getEntitiesDimension() >( *meshPointer ); - if( MeshFunctionView::getEntitiesDimension() == 0 ) - writer.writePointData( getData(), "cellFunctionValues", 1 ); - else - writer.writeCellData( getData(), "pointFunctionValues", 1 ); - } - else if( format == "gnuplot" ) - return MeshFunctionGnuplotWriter< MeshFunctionView >::write( *this, file ); - else { - std::cerr << "Unknown output format: " << format << std::endl; - return false; - } - return true; +write( const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat ) const +{ + return writeMeshFunction( *this, functionName, fileName, fileFormat ); } template< typename Mesh, diff --git a/src/TNL/Functions/VectorField.h b/src/TNL/Functions/VectorField.h index f0e875608bf16ef49b1ff3c88ad546c7b8633973..771f49f1ce1654ea1c6e304a243907fd91ada962 100644 --- a/src/TNL/Functions/VectorField.h +++ b/src/TNL/Functions/VectorField.h @@ -10,6 +10,8 @@ #pragma once +#include <experimental/filesystem> + #include <TNL/Functions/Domain.h> #include <TNL/Devices/Cuda.h> #include <TNL/Config/ParameterContainer.h> @@ -18,22 +20,23 @@ #include <TNL/Functions/VectorFieldGnuplotWriter.h> #include <TNL/Meshes/Writers/VTKWriter.h> #include <TNL/Meshes/Writers/VTUWriter.h> +#include <TNL/Meshes/Writers/VTIWriter.h> namespace TNL { namespace Functions { template< int Size, typename Function > -class VectorField - : public Functions::Domain< Function::getDomainDimension(), +class VectorField + : public Functions::Domain< Function::getDomainDimension(), Function::getDomainType() > { public: - + typedef Function FunctionType; typedef typename FunctionType::RealType RealType; typedef typename FunctionType::PointType PointType; - + static void configSetup( Config::ConfigDescription& config, const String& prefix = "" ) { @@ -55,35 +58,34 @@ class VectorField return true; } - __cuda_callable__ + __cuda_callable__ const FunctionType& operator[]( int i ) const { return this->vectorField[ i ]; } - - __cuda_callable__ + + __cuda_callable__ FunctionType& operator[]( int i ) { return this->vectorField[ i ]; } protected: - + Containers::StaticArray< Size, FunctionType > vectorField; }; - - + + template< int Size, typename Mesh, int MeshEntityDimension, typename Real > class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > -: public Functions::Domain< MeshFunction< Mesh, MeshEntityDimension, Real >::getDomainDimension(), - MeshFunction< Mesh, MeshEntityDimension, Real >::getDomainType() >, - public Object +: public Functions::Domain< MeshFunction< Mesh, MeshEntityDimension, Real >::getDomainDimension(), + MeshFunction< Mesh, MeshEntityDimension, Real >::getDomainType() > { public: - + typedef Mesh MeshType; typedef Real RealType; typedef Pointers::SharedPointer< MeshType > MeshPointer; @@ -92,13 +94,13 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > typedef typename MeshType::DeviceType DeviceType; typedef typename MeshType::GlobalIndexType IndexType; typedef Containers::StaticVector< Size, RealType > VectorType; - + static constexpr int getEntitiesDimension() { return FunctionType::getEntitiesDimension(); } - + static constexpr int getMeshDimension() { return MeshType::getMeshDimension(); } static constexpr int getVectorDimension() { return Size; } - + static void configSetup( Config::ConfigDescription& config, const String& prefix = "" ) @@ -106,35 +108,21 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > for( int i = 0; i < Size; i++ ) FunctionType::configSetup( config, prefix + convertToString( i ) + "-" ); } - + VectorField() {}; - + VectorField( const MeshPointer& meshPointer ) { for( int i = 0; i < Size; i++ ) this->vectorField[ i ]->setMesh( meshPointer ); }; - - static String getSerializationType() - { - return String( "Functions::VectorField< " ) + - convertToString( Size) + ", " + - FunctionType::getSerializationType() + - " >"; - } - virtual String getSerializationTypeVirtual() const - { - return this->getSerializationType(); - } - - void setMesh( const MeshPointer& meshPointer ) { for( int i = 0; i < Size; i++ ) this->vectorField[ i ]->setMesh( meshPointer ); } - + template< typename Device = Devices::Host > __cuda_callable__ const MeshType& getMesh() const @@ -146,7 +134,7 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > { return this->vectorField[ 0 ]->getMeshPointer(); } - + bool setup( const MeshPointer& meshPointer, const Config::ParameterContainer& parameters, const String& prefix = "" ) @@ -159,31 +147,31 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > } return true; } - + static IndexType getDofs( const MeshPointer& meshPointer ) { return Size * FunctionType::getDofs( meshPointer ); } - - __cuda_callable__ + + __cuda_callable__ const FunctionPointer& operator[]( int i ) const { return this->vectorField[ i ]; } - - __cuda_callable__ + + __cuda_callable__ FunctionPointer& operator[]( int i ) { return this->vectorField[ i ]; } - - __cuda_callable__ + + __cuda_callable__ void setElement( const IndexType i, const VectorType& v ) { for( int j = 0; j < Size; j++ ) ( *this )[ j ]->getData().setElement( i, v[ j ] ); } - + __cuda_callable__ VectorType getElement( const IndexType i ) const { @@ -192,7 +180,7 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > v[ j ] = ( *this )[ j ]->getData().getElement( i ); return v; } - + __cuda_callable__ VectorType getVector( const IndexType index ) const { @@ -221,46 +209,29 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > v[ i ] = this->vectorField[ i ].template getData< Devices::Cuda >()( meshEntity ); return v; } - - void save( File& file ) const - { - Object::save( file ); - for( int i = 0; i < Size; i++ ) - vectorField[ i ]->save( file ); - } - void load( File& file ) - { - Object::load( file ); - for( int i = 0; i < Size; i++ ) - vectorField[ i ]->load( file ); - } - - void boundLoad( File& file ) - { - Object::load( file ); - for( int i = 0; i < Size; i++ ) - vectorField[ i ]->boundLoad( file ); - } - - void boundLoad( const String& fileName ) - { - File file; - file.open( fileName, std::ios_base::in ); - this->boundLoad( file ); - } - - bool write( const String& fileName, - const String& format = "vtk" ) const + bool write( const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) const { std::fstream file; - file.open( fileName.getString(), std::ios::out ); + file.open( fileName, std::ios::out ); if( ! file ) { std::cerr << "Unable to open a file " << fileName << "." << std::endl; return false; } - if( format == "vtk" || format == "vtu" ) { + + namespace fs = std::experimental::filesystem; + std::string format = fileFormat; + if( format == "auto" ) { + format = fs::path(fileName).extension(); + if( format.length() > 0 ) + // remove dot from the extension + format = format.substr(1); + } + + if( format == "vtk" || format == "vtu" || format == "vti" ) { // copy all values from the vector field into a contiguous array using BufferType = Containers::Array< typename VectorField::RealType, Devices::Host, IndexType >; const IndexType entitiesCount = getMeshPointer()->template getEntitiesCount< getEntitiesDimension() >(); @@ -277,20 +248,28 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > Meshes::Writers::VTKWriter< Mesh > writer( file ); writer.template writeEntities< getEntitiesDimension() >( *getMeshPointer() ); if( getEntitiesDimension() == 0 ) - writer.writePointData( buffer, "cellVectorFieldValues", 3 ); + writer.writePointData( buffer, functionName, 3 ); else - writer.writeCellData( buffer, "pointVectorFieldValues", 3 ); + writer.writeCellData( buffer, functionName, 3 ); } else if( format == "vtu" ) { Meshes::Writers::VTUWriter< Mesh > writer( file ); writer.template writeEntities< getEntitiesDimension() >( *getMeshPointer() ); if( getEntitiesDimension() == 0 ) - writer.writePointData( buffer, "cellVectorFieldValues", 3 ); + writer.writePointData( buffer, functionName, 3 ); + else + writer.writeCellData( buffer, functionName, 3 ); + } + else if( format == "vti" ) { + Meshes::Writers::VTIWriter< Mesh > writer( file ); + writer.template writeEntities< getEntitiesDimension() >( *getMeshPointer() ); + if( getEntitiesDimension() == 0 ) + writer.writePointData( buffer, functionName, 3 ); else - writer.writeCellData( buffer, "pointVectorFieldValues", 3 ); + writer.writeCellData( buffer, functionName, 3 ); } } - else if( format == "gnuplot" ) + else if( format == "gnuplot" || format == "gplt" || format == "plt" ) return VectorFieldGnuplotWriter< VectorField >::write( *this, file ); else { std::cerr << "Unknown output format: " << format << std::endl; @@ -299,28 +278,23 @@ class VectorField< Size, MeshFunction< Mesh, MeshEntityDimension, Real > > return true; } - using Object::save; - - using Object::load; - protected: Containers::StaticArray< Size, FunctionPointer > vectorField; }; - - + + template< int Size, typename Mesh, int MeshEntityDimension, typename Real > class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > -: public Functions::Domain< MeshFunctionView< Mesh, MeshEntityDimension, Real >::getDomainDimension(), - MeshFunctionView< Mesh, MeshEntityDimension, Real >::getDomainType() >, - public Object +: public Functions::Domain< MeshFunctionView< Mesh, MeshEntityDimension, Real >::getDomainDimension(), + MeshFunctionView< Mesh, MeshEntityDimension, Real >::getDomainType() > { public: - + typedef Mesh MeshType; typedef Real RealType; typedef Pointers::SharedPointer< MeshType > MeshPointer; @@ -329,13 +303,13 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > typedef typename MeshType::DeviceType DeviceType; typedef typename MeshType::GlobalIndexType IndexType; typedef Containers::StaticVector< Size, RealType > VectorType; - + static constexpr int getEntitiesDimension() { return FunctionType::getEntitiesDimension(); } - + static constexpr int getMeshDimension() { return MeshType::getMeshDimension(); } static constexpr int getVectorDimension() { return Size; } - + static void configSetup( Config::ConfigDescription& config, const String& prefix = "" ) @@ -343,35 +317,21 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > for( int i = 0; i < Size; i++ ) FunctionType::configSetup( config, prefix + convertToString( i ) + "-" ); } - + VectorField() {}; - + VectorField( const MeshPointer& meshPointer ) { for( int i = 0; i < Size; i++ ) this->vectorField[ i ]->setMesh( meshPointer ); }; - - static String getSerializationType() - { - return String( "Functions::VectorField< " ) + - convertToString( Size) + ", " + - FunctionType::getSerializationType() + - " >"; - } - virtual String getSerializationTypeVirtual() const - { - return this->getSerializationType(); - } - - void setMesh( const MeshPointer& meshPointer ) { for( int i = 0; i < Size; i++ ) this->vectorField[ i ]->setMesh( meshPointer ); } - + template< typename Device = Devices::Host > __cuda_callable__ const MeshType& getMesh() const @@ -383,7 +343,7 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > { return this->vectorField[ 0 ]->getMeshPointer(); } - + bool setup( const MeshPointer& meshPointer, const Config::ParameterContainer& parameters, const String& prefix = "" ) @@ -396,12 +356,12 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > } return true; } - + static IndexType getDofs( const MeshPointer& meshPointer ) { return Size * FunctionType::getDofs( meshPointer ); } - + void bind( VectorField& vectorField ) { for( int i = 0; i < Size; i ++ ) @@ -409,7 +369,7 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > this->vectorField[ i ]->bind( vectorField[ i ] ); } }; - + template< typename Vector > void bind( const MeshPointer& meshPointer, Vector& data, @@ -423,7 +383,7 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > offset += this->vectorField[ i ]->getDofs(meshPointer); } } - + template< typename Vector > void bind( const MeshPointer& meshPointer, Pointers::SharedPointer< Vector >& dataPtr, @@ -435,28 +395,28 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > { this->vectorField[ i ]->bind( meshPointer, dataPtr, offset ); offset += this->vectorField[ i ]->getDofs( meshPointer ); - } + } } - __cuda_callable__ + __cuda_callable__ const FunctionPointer& operator[]( int i ) const { return this->vectorField[ i ]; } - - __cuda_callable__ + + __cuda_callable__ FunctionPointer& operator[]( int i ) { return this->vectorField[ i ]; } - - __cuda_callable__ + + __cuda_callable__ void setElement( const IndexType i, const VectorType& v ) { for( int j = 0; j < Size; j++ ) ( *this )[ j ]->getData().setElement( i, v[ j ] ); } - + __cuda_callable__ VectorType getElement( const IndexType i ) const { @@ -465,7 +425,7 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > v[ j ] = ( *this )[ j ]->getData().getElement( i ); return v; } - + __cuda_callable__ VectorType getVector( const IndexType index ) const { @@ -494,46 +454,29 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > v[ i ] = this->vectorField[ i ].template getData< Devices::Cuda >()( meshEntity ); return v; } - - void save( File& file ) const - { - Object::save( file ); - for( int i = 0; i < Size; i++ ) - vectorField[ i ]->save( file ); - } - - void load( File& file ) - { - Object::load( file ); - for( int i = 0; i < Size; i++ ) - vectorField[ i ]->load( file ); - } - - void boundLoad( File& file ) - { - Object::load( file ); - for( int i = 0; i < Size; i++ ) - vectorField[ i ]->boundLoad( file ); - } - void boundLoad( const String& fileName ) - { - File file; - file.open( fileName, std::ios_base::in ); - this->boundLoad( file ); - } - - bool write( const String& fileName, - const String& format = "vtk" ) const + bool write( const std::string& functionName, + const std::string& fileName, + const std::string& fileFormat = "auto" ) const { std::fstream file; - file.open( fileName.getString(), std::ios::out ); + file.open( fileName, std::ios::out ); if( ! file ) { std::cerr << "Unable to open a file " << fileName << "." << std::endl; return false; } - if( format == "vtk" || format == "vtu" ) { + + namespace fs = std::experimental::filesystem; + std::string format = fileFormat; + if( format == "auto" ) { + format = fs::path(fileName).extension(); + if( format.length() > 0 ) + // remove dot from the extension + format = format.substr(1); + } + + if( format == "vtk" || format == "vtu" || format == "vti" ) { // copy all values from the vector field into a contiguous array using BufferType = Containers::Array< typename VectorField::RealType, Devices::Host, IndexType >; const IndexType entitiesCount = getMeshPointer()->template getEntitiesCount< getEntitiesDimension() >(); @@ -550,20 +493,28 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > Meshes::Writers::VTKWriter< Mesh > writer( file ); writer.template writeEntities< getEntitiesDimension() >( *getMeshPointer() ); if( getEntitiesDimension() == 0 ) - writer.writePointData( buffer, "cellVectorFieldValues", 3 ); + writer.writePointData( buffer, functionName, 3 ); else - writer.writeCellData( buffer, "pointVectorFieldValues", 3 ); + writer.writeCellData( buffer, functionName, 3 ); } else if( format == "vtu" ) { Meshes::Writers::VTUWriter< Mesh > writer( file ); writer.template writeEntities< getEntitiesDimension() >( *getMeshPointer() ); if( getEntitiesDimension() == 0 ) - writer.writePointData( buffer, "cellVectorFieldValues", 3 ); + writer.writePointData( buffer, functionName, 3 ); else - writer.writeCellData( buffer, "pointVectorFieldValues", 3 ); + writer.writeCellData( buffer, functionName, 3 ); + } + else if( format == "vti" ) { + Meshes::Writers::VTIWriter< Mesh > writer( file ); + writer.template writeEntities< getEntitiesDimension() >( *getMeshPointer() ); + if( getEntitiesDimension() == 0 ) + writer.writePointData( buffer, functionName, 3 ); + else + writer.writeCellData( buffer, functionName, 3 ); } } - else if( format == "gnuplot" ) + else if( format == "gnuplot" || format == "gplt" || format == "plt" ) return VectorFieldGnuplotWriter< VectorField >::write( *this, file ); else { std::cerr << "Unknown output format: " << format << std::endl; @@ -572,10 +523,6 @@ class VectorField< Size, MeshFunctionView< Mesh, MeshEntityDimension, Real > > return true; } - using Object::save; - - using Object::load; - protected: Containers::StaticArray< Size, FunctionPointer > vectorField; @@ -595,6 +542,5 @@ std::ostream& operator << ( std::ostream& str, const VectorField< Dimension, Fun return str; } - -} //namespace Functions -} //namepsace TNL +} // namespace Functions +} // namepsace TNL diff --git a/src/TNL/Meshes/DistributedMeshes/Directions.h b/src/TNL/Meshes/DistributedMeshes/Directions.h index 165e7642e9d5999ea4f424b878c33bbafc98555a..80606abb0c25ca73201f96ce72da07cbf91bf57f 100644 --- a/src/TNL/Meshes/DistributedMeshes/Directions.h +++ b/src/TNL/Meshes/DistributedMeshes/Directions.h @@ -4,51 +4,51 @@ #include <TNL/Containers/StaticVector.h> namespace TNL { -namespace Meshes { +namespace Meshes { namespace DistributedMeshes { -//index of direction can be written as number in 3-base system +//index of direction can be written as number in 3-base system // -> 1 order x axis, 2 order y axis, 3 order z axis // -> 0 - not used, 1 negative direction, 2 positive direction //finaly we subtrackt 1 because we dont need (0,0,0) aka 0 aka no direction -//enum Directions2D { Left = 0 , Right = 1 , Up = 2, UpLeft =3, UpRight=4, Down=5, DownLeft=6, DownRight=7 }; +//enum Directions2D { Left = 0 , Right = 1 , Up = 2, UpLeft =3, UpRight=4, Down=5, DownLeft=6, DownRight=7 }; /*MEH - osa zed je zdola nahoru, asi--- -enum Directions3D { West = 0 , East = 1 , +enum Directions3D { West = 0 , East = 1 , North = 2, NorthWest = 3, NorthEast = 4, South = 5, SouthWest = 6, SouthEast = 7, Top = 8, TopWest = 9, TopEast =10, TopNorth = 11, TopNorthWest = 12, TopNorthEast = 13, TopSouth = 14, TopSouthWest = 15,TopSouthEast = 16, - Bottom = 17 ,BottomWest = 18 , BottomEast = 19 , + Bottom = 17 ,BottomWest = 18 , BottomEast = 19 , BottomNorth = 20, BottomNorthWest = 21, BottomNorthEast = 22, BottomSouth = 23, BottomSouthWest = 24, BottomSouthEast = 25, };*/ /* with self -enum Directions3D { - ZzYzXz = 0, ZzYzXm = 1, ZzYzXp = 2, +enum Directions3D { + ZzYzXz = 0, ZzYzXm = 1, ZzYzXp = 2, ZzYmXz = 3, ZzYmXm = 4, ZzYmXp = 5, - ZzYpXz = 6, ZzYpXm = 7, ZzYpXp = 8, - ZmYzXz = 9, ZmYzXm = 10, ZmYzXp = 11, + ZzYpXz = 6, ZzYpXm = 7, ZzYpXp = 8, + ZmYzXz = 9, ZmYzXm = 10, ZmYzXp = 11, ZmYmXz = 12, ZmYmXm = 13, ZmYmXp = 14, ZmYpXz = 15, ZmYpXm = 16, ZmYpXp = 17, - ZpYzXz = 18, ZpYzXm = 19, ZpYzXp = 20, + ZpYzXz = 18, ZpYzXm = 19, ZpYzXp = 20, ZpYmXz = 21, ZpYmXm = 22, ZpYmXp = 23, ZpYpXz = 24, ZpYpXm = 25, ZpYpXp = 26 }; */ -enum Directions3D { - ZzYzXm = 0, ZzYzXp = 1, +enum Directions3D { + ZzYzXm = 0, ZzYzXp = 1, ZzYmXz = 2, ZzYmXm = 3, ZzYmXp = 4, - ZzYpXz = 5, ZzYpXm = 6, ZzYpXp = 7, - ZmYzXz = 8, ZmYzXm = 9, ZmYzXp = 10, + ZzYpXz = 5, ZzYpXm = 6, ZzYpXp = 7, + ZmYzXz = 8, ZmYzXm = 9, ZmYzXp = 10, ZmYmXz = 11, ZmYmXm = 12, ZmYmXp = 13, ZmYpXz = 14, ZmYpXm = 15, ZmYpXp = 16, - ZpYzXz = 17, ZpYzXm = 18, ZpYzXp = 19, + ZpYzXz = 17, ZpYzXm = 18, ZpYzXp = 19, ZpYmXz = 20, ZpYmXm = 21, ZpYmXp = 22, ZpYpXz = 23, ZpYpXm = 24, ZpYpXp = 25 }; @@ -84,7 +84,7 @@ public: } return res; } - + /* static int getDirection(int direction) { @@ -109,21 +109,20 @@ public: result+=add(direction3); return result-1; }*/ - - static int add(int direction) + + static constexpr int add(int direction) { if(direction==0) return 0; if(direction>0) - return 2*pow3(direction-1); //positive direction has higer index + return 2*i3pow(direction-1); //positive direction has higer index else - return pow3(-direction-1); - - + return i3pow(-direction-1); } - static int pow3(int exp) + // return 3^exp + static constexpr int i3pow(int exp) { int ret=1; for(int i=0;i<exp;i++) @@ -132,37 +131,6 @@ public: } }; -//for c++11 -- in c++14 simply 3^dim-1 -template<int dim> -class DirectionCount -{ -public: - static constexpr int get(){return 0;} -}; - -template <> -class DirectionCount<1> -{ -public: - static constexpr int get(){return 2;} -}; - -template <> -class DirectionCount<2> -{ -public: - static constexpr int get(){return 8;} -}; - -template <> -class DirectionCount<3> -{ -public: - static constexpr int get(){return 26;} -}; - - } // namespace DistributedMeshes } // namespace Meshes } // namespace TNL - diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid.h b/src/TNL/Meshes/DistributedMeshes/DistributedGrid.h index 4082024e378d844f9155bbabbedaccfd6f468599..c112b8d6518a1d122d54d3574031641a85dc16a9 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid.h +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid.h @@ -1,5 +1,5 @@ /*************************************************************************** - DistributedGrid_Base.h - part common for all Dimensionensions + DistributedGrid.h - description ------------------- begin : July 07, 2018 copyright : (C) 2018 by Tomas Oberhuber @@ -16,41 +16,33 @@ #include <TNL/Meshes/DistributedMeshes/Directions.h> #include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> - namespace TNL { namespace Meshes { namespace DistributedMeshes { - - template< int Dimension, typename Real, typename Device, typename Index > class DistributedMesh< Grid< Dimension, Real, Device, Index > > { - public: - - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef Grid< Dimension, Real, Device, IndexType > GridType; - typedef typename GridType::PointType PointType; - typedef Containers::StaticVector< Dimension, IndexType > CoordinatesType; - typedef Containers::StaticVector< Dimension, IndexType > SubdomainOverlapsType; + public: + using RealType = Real; + using DeviceType = Device; + using IndexType = Index; + using GlobalIndexType = Index; + using GridType = Grid< Dimension, Real, Device, IndexType >; + using PointType = typename GridType::PointType; + using CoordinatesType = Containers::StaticVector< Dimension, IndexType >; + using SubdomainOverlapsType = Containers::StaticVector< Dimension, IndexType >; static constexpr int getMeshDimension() { return Dimension; }; - static constexpr int getNeighborsCount() { return DirectionCount<Dimension>::get(); } //c++14 may use Directions::pow3(Dimension)-1 + static constexpr int getNeighborsCount() { return Directions::i3pow(Dimension)-1; } - DistributedMesh(); + DistributedMesh() = default; - ~DistributedMesh(); - - static void configSetup( Config::ConfigDescription& config ); - - bool setup( const Config::ParameterContainer& parameters, - const String& prefix ); + ~DistributedMesh() = default; void setDomainDecomposition( const CoordinatesType& domainDecomposition ); @@ -63,21 +55,22 @@ class DistributedMesh< Grid< Dimension, Real, Device, Index > > void setOverlaps( const SubdomainOverlapsType& lower, const SubdomainOverlapsType& upper); - void setupGrid( GridType& grid); + // for compatibility with DistributedMesh + void setGhostLevels( int levels ); + int getGhostLevels() const; bool isDistributed() const; bool isBoundarySubdomain() const; - // TODO: replace it with getLowerOverlap() and getUpperOverlap() - // It is still being used in cuts set-up - const CoordinatesType& getOverlap() const { return this->overlap;}; - //currently used overlaps at this subdomain const SubdomainOverlapsType& getLowerOverlap() const; const SubdomainOverlapsType& getUpperOverlap() const; + // returns the local grid WITH overlap + const GridType& getLocalMesh() const; + //number of elements of local sub domain WITHOUT overlap // TODO: getSubdomainDimensions const CoordinatesType& getLocalSize() const; @@ -89,20 +82,10 @@ class DistributedMesh< Grid< Dimension, Real, Device, Index > > //coordinates of begin of local subdomain without overlaps in global grid const CoordinatesType& getGlobalBegin() const; - //number of elements of local sub domain WITH overlap - // TODO: replace with localGrid - const CoordinatesType& getLocalGridSize() const; - - //coordinates of begin of local subdomain without overlaps in local grid - const CoordinatesType& getLocalBegin() const; - const CoordinatesType& getSubdomainCoordinates() const; - const PointType& getLocalOrigin() const; - const PointType& getSpaceSteps() const; - //aka MPI-communcicator - void setCommunicationGroup(MPI_Comm group); + void setCommunicationGroup( MPI_Comm group ); MPI_Comm getCommunicationGroup() const; template< int EntityDimension > @@ -129,46 +112,41 @@ class DistributedMesh< Grid< Dimension, Real, Device, Index > > void writeProlog( Logger& logger ); + bool operator==( const DistributedMesh& other ) const; + + bool operator!=( const DistributedMesh& other ) const; + public: bool isThereNeighbor(const CoordinatesType &direction) const; void setupNeighbors(); - void print( std::ostream& str ) const; + GridType globalGrid, localGrid; + CoordinatesType localSize = 0; + CoordinatesType globalBegin = 0; - GridType globalGrid; - PointType localOrigin; - CoordinatesType localBegin; - CoordinatesType localSize; - CoordinatesType localGridSize; - CoordinatesType overlap; - //CoordinatesType globalDimensions; - CoordinatesType globalBegin; - PointType spaceSteps; + SubdomainOverlapsType lowerOverlap = 0; + SubdomainOverlapsType upperOverlap = 0; - SubdomainOverlapsType lowerOverlap, upperOverlap, globalLowerOverlap, globalUpperOverlap; - - CoordinatesType domainDecomposition; - CoordinatesType subdomainCoordinates; + CoordinatesType domainDecomposition = 0; + CoordinatesType subdomainCoordinates = 0; // TODO: static arrays int neighbors[ getNeighborsCount() ]; int periodicNeighbors[ getNeighborsCount() ]; - IndexType Dimensions; - bool distributed; - - int rank; - int nproc; + bool distributed = false; - bool isSet; + bool isSet = false; //aka MPI-communicator - MPI_Comm group; - + MPI_Comm group = MPI::AllGroup(); }; +template< int Dimension, typename Real, typename Device, typename Index > +std::ostream& operator<<( std::ostream& str, const DistributedMesh< Grid< Dimension, Real, Device, Index > >& grid ); + } // namespace DistributedMeshes } // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid.hpp b/src/TNL/Meshes/DistributedMeshes/DistributedGrid.hpp index c48fec9af40e64d4f8dc12ff51c323e47360f09f..043c61c74d4f0998e6de71c36fb7594092dd4578 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid.hpp +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid.hpp @@ -1,5 +1,5 @@ /*************************************************************************** - DistributedGrid_Base.hpp - description + DistributedGrid.hpp - description ------------------- begin : July 07, 2018 copyright : (C) 2018 by Tomas Oberhuber @@ -13,47 +13,12 @@ #include <cstdlib> #include "DistributedGrid.h" +#include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> #include <TNL/MPI/Wrappers.h> namespace TNL { - namespace Meshes { - namespace DistributedMeshes { - -template<int Dimension, typename Real, typename Device, typename Index > -DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -DistributedMesh() - : domainDecomposition( 0 ), isSet( false ) {} - -template<int Dimension, typename Real, typename Device, typename Index > -DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -~DistributedMesh() -{ -} - - -template<int Dimension, typename Real, typename Device, typename Index > -void -DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -configSetup( Config::ConfigDescription& config ) -{ - config.addEntry< int >( "grid-domain-decomposition-x", "Number of grid subdomains along x-axis.", 0 ); - config.addEntry< int >( "grid-domain-decomposition-y", "Number of grid subdomains along y-axis.", 0 ); - config.addEntry< int >( "grid-domain-decomposition-z", "Number of grid subdomains along z-axis.", 0 ); -} - -template<int Dimension, typename Real, typename Device, typename Index > -bool -DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -setup( const Config::ParameterContainer& parameters, - const String& prefix ) -{ - this->domainDecomposition[ 0 ] = parameters.getParameter< int >( "grid-domain-decomposition-x" ); - if( Dimension > 1 ) - this->domainDecomposition[ 1 ] = parameters.getParameter< int >( "grid-domain-decomposition-y" ); - if( Dimension > 2 ) - this->domainDecomposition[ 2 ] = parameters.getParameter< int >( "grid-domain-decomposition-z" ); - return true; -} +namespace Meshes { +namespace DistributedMeshes { template< int Dimension, typename Real, typename Device, typename Index > void @@ -74,41 +39,25 @@ getDomainDecomposition() const template< int Dimension, typename Real, typename Device, typename Index > void DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -setGlobalGrid( const GridType &globalGrid ) +setGlobalGrid( const GridType& globalGrid ) { - this->group = MPI::AllGroup(); - this->globalGrid = globalGrid; this->isSet=true; - this->overlap.setValue( 1 ); // TODO: Remove this - its only for compatibility with old code - this->lowerOverlap.setValue( 0 ); - this->upperOverlap.setValue( 0 ); for( int i = 0; i < getNeighborsCount(); i++ ) this->neighbors[ i ] = -1; - this->Dimensions= GridType::getMeshDimension(); - this->spaceSteps=globalGrid.getSpaceSteps(); - this->distributed=false; - - this->rank=MPI::GetRank(group); - this->nproc=MPI::GetSize(group); - //use MPI only if have more than one process - if(this->nproc>1) - { - this->distributed=true; - } + // use MPI only if have more than one process + this->distributed = MPI::GetSize(group) > 1; if( !this->distributed ) { this->subdomainCoordinates.setValue( 0 ); this->domainDecomposition.setValue( 0 ); - this->localOrigin=globalGrid.getOrigin(); - this->localGridSize=globalGrid.getDimensions(); - this->localSize=globalGrid.getDimensions(); - this->globalBegin=CoordinatesType(0); - this->localBegin.setValue( 0 ); - return; + localGrid.setOrigin( globalGrid.getOrigin() ); + localGrid.setDimensions( globalGrid.getDimensions() ); + this->localSize = globalGrid.getDimensions(); + this->globalBegin = 0; } else { @@ -117,12 +66,12 @@ setGlobalGrid( const GridType &globalGrid ) int dims[ Dimension ]; for( int i = 0; i < Dimension; i++ ) dims[ i ] = this->domainDecomposition[ i ]; - MPI::Compute_dims( this->nproc, Dimension, dims ); + MPI::Compute_dims( MPI::GetSize(group), Dimension, dims ); for( int i = 0; i < Dimension; i++ ) this->domainDecomposition[ i ] = dims[ i ]; - int size = this->nproc; - int tmp = this->rank; + int size = MPI::GetSize(group); + int tmp = MPI::GetRank(group); for( int i = Dimension - 1; i >= 0; i-- ) { size = size / this->domainDecomposition[ i ]; @@ -146,9 +95,12 @@ setGlobalGrid( const GridType &globalGrid ) ( this->subdomainCoordinates[ i ] - numberOfLarger[ i ] ) * this->localSize[ i ]; } - this->localGridSize = this->localSize; + localGrid.setDimensions( this->localSize ); this->setupNeighbors(); - } + } + + // setting space steps computes the grid proportions as a side efect + localGrid.setSpaceSteps( globalGrid.getSpaceSteps() ); } template< int Dimension, typename Real, typename Device, typename Index > @@ -159,47 +111,59 @@ setOverlaps( const SubdomainOverlapsType& lower, { this->lowerOverlap = lower; this->upperOverlap = upper; - this->localOrigin = this->globalGrid.getOrigin() + this->globalGrid.getSpaceSteps() * (this->globalBegin - this->lowerOverlap); - this->localBegin = this->lowerOverlap; - this->localGridSize = this->localSize + this->lowerOverlap + this->upperOverlap; + localGrid.setOrigin( this->globalGrid.getOrigin() + this->globalGrid.getSpaceSteps() * (this->globalBegin - this->lowerOverlap) ); + localGrid.setDimensions( this->localSize + this->lowerOverlap + this->upperOverlap ); + // setting space steps computes the grid proportions as a side efect + localGrid.setSpaceSteps( globalGrid.getSpaceSteps() ); + + // update local begin and end + localGrid.setLocalBegin( this->lowerOverlap ); + localGrid.setLocalEnd( localGrid.getDimensions() - this->upperOverlap ); + + // update interior begin and end + CoordinatesType interiorBegin = this->lowerOverlap; + CoordinatesType interiorEnd = localGrid.getDimensions() - this->upperOverlap; + const int* neighbors = getNeighbors(); + if( neighbors[ ZzYzXm ] == -1 ) + interiorBegin[0] += 1; + if( neighbors[ ZzYzXp ] == -1 ) + interiorEnd[0] -= 1; + if( ZzYmXz < getNeighborsCount() && neighbors[ ZzYmXz ] == -1 ) + interiorBegin[1] += 1; + if( ZzYpXz < getNeighborsCount() && neighbors[ ZzYpXz ] == -1 ) + interiorEnd[1] -= 1; + if( ZmYzXz < getNeighborsCount() && neighbors[ ZmYzXz ] == -1 ) + interiorBegin[2] += 1; + if( ZpYzXz < getNeighborsCount() && neighbors[ ZpYzXz ] == -1 ) + interiorEnd[2] -= 1; + localGrid.setInteriorBegin( interiorBegin ); + localGrid.setInteriorEnd( interiorEnd ); } - template< int Dimension, typename Real, typename Device, typename Index > void DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -setupGrid( GridType& grid) -{ - TNL_ASSERT_TRUE(this->isSet,"DistributedGrid is not set, but used by SetupGrid"); - grid.setOrigin(this->localOrigin); - grid.setDimensions(this->localGridSize); - //compute local proportions by side efect - grid.setSpaceSteps(this->spaceSteps); - grid.setDistMesh(this); -}; - -template< int Dimension, typename Real, typename Device, typename Index > -const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -getSubdomainCoordinates() const +setGhostLevels( int levels ) { - return this->subdomainCoordinates; + SubdomainOverlapsType lowerOverlap, upperOverlap; + SubdomainOverlapsGetter< GridType >::getOverlaps( this, lowerOverlap, upperOverlap, levels ); + setOverlaps( lowerOverlap, upperOverlap ); } template< int Dimension, typename Real, typename Device, typename Index > -const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::PointType& +int DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -getLocalOrigin() const +getGhostLevels() const { - return this->localOrigin; + return TNL::max( TNL::max(lowerOverlap), TNL::max(upperOverlap) ); } template< int Dimension, typename Real, typename Device, typename Index > -const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::PointType& +const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::CoordinatesType& DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -getSpaceSteps() const +getSubdomainCoordinates() const { - return this->spaceSteps; + return this->subdomainCoordinates; } template< int Dimension, typename Real, typename Device, typename Index > @@ -237,6 +201,14 @@ getUpperOverlap() const return this->upperOverlap; }; +template< int Dimension, typename Real, typename Device, typename Index > +const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::GridType& +DistributedMesh< Grid< Dimension, Real, Device, Index > >:: +getLocalMesh() const +{ + return this->localGrid; +} + template< int Dimension, typename Real, typename Device, typename Index > const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::CoordinatesType& DistributedMesh< Grid< Dimension, Real, Device, Index > >:: @@ -269,22 +241,6 @@ getGlobalBegin() const return this->globalBegin; } -template< int Dimension, typename Real, typename Device, typename Index > -const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -getLocalGridSize() const -{ - return this->localGridSize; -} - -template< int Dimension, typename Real, typename Device, typename Index > -const typename DistributedMesh< Grid< Dimension, Real, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -getLocalBegin() const -{ - return this->localBegin; -} - template< int Dimension, typename Real, typename Device, typename Index > template< int EntityDimension > Index @@ -306,9 +262,9 @@ getEntitiesCount() const template< int Dimension, typename Real, typename Device, typename Index > void DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -setCommunicationGroup(MPI_Comm group) +setCommunicationGroup( MPI_Comm group ) { - this->group=group; + this->group = group; } template< int Dimension, typename Real, typename Device, typename Index > @@ -316,7 +272,7 @@ MPI_Comm DistributedMesh< Grid< Dimension, Real, Device, Index > >:: getCommunicationGroup() const { - return this->group; + return this->group; } template< int Dimension, typename Real, typename Device, typename Index > @@ -402,81 +358,86 @@ template< int Dimension, typename Real, typename Device, typename Index > template<typename DistributedGridType > bool DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -SetupByCut(DistributedGridType &inputDistributedGrid, - Containers::StaticVector<Dimension, int> savedDimensions, - Containers::StaticVector<DistributedGridType::getMeshDimension()-Dimension,int> reducedDimensions, - Containers::StaticVector<DistributedGridType::getMeshDimension()-Dimension,IndexType> fixedIndexs) +SetupByCut( DistributedGridType &inputDistributedGrid, + Containers::StaticVector<Dimension, int> savedDimensions, + Containers::StaticVector<DistributedGridType::getMeshDimension()-Dimension,int> reducedDimensions, + Containers::StaticVector<DistributedGridType::getMeshDimension()-Dimension,IndexType> fixedIndexs) { + bool isInCut=true; + const int coDimension = DistributedGridType::getMeshDimension()-Dimension; + for( int i = 0; i < coDimension; i++ ) + { + auto begin = inputDistributedGrid.getGlobalBegin(); + auto size = inputDistributedGrid.getLocalSize(); + isInCut &= fixedIndexs[i] > begin[reducedDimensions[i]] && fixedIndexs[i] < begin[reducedDimensions[i]] + size[reducedDimensions[i]]; + } - int coDimensionension=DistributedGridType::getMeshDimension()-Dimension; - - bool isInCut=true; - for(int i=0;i<coDimensionension; i++) + // create new group with used nodes + const MPI_Comm oldGroup = inputDistributedGrid.getCommunicationGroup(); + if(isInCut) + { + this->isSet=true; + + auto fromGlobalMesh = inputDistributedGrid.getGlobalGrid(); + // set global grid + typename GridType::PointType outOrigin; + typename GridType::PointType outProportions; + typename GridType::CoordinatesType outDimensions; + // set local grid + typename GridType::PointType localOrigin; + typename GridType::CoordinatesType localBegin, localGridSize; + + for(int i=0; i<Dimension;i++) { - auto begin=inputDistributedGrid.getGlobalBegin(); - auto size= inputDistributedGrid.getLocalSize(); - isInCut &= fixedIndexs[i]>begin[reducedDimensions[i]] && fixedIndexs[i]< (begin[reducedDimensions[i]]+size[reducedDimensions[i]]); + outOrigin[i] = fromGlobalMesh.getOrigin()[savedDimensions[i]]; + outProportions[i] = fromGlobalMesh.getProportions()[savedDimensions[i]]; + outDimensions[i] = fromGlobalMesh.getDimensions()[savedDimensions[i]]; + + this->domainDecomposition[i] = inputDistributedGrid.getDomainDecomposition()[savedDimensions[i]]; + this->subdomainCoordinates[i] = inputDistributedGrid.getSubdomainCoordinates()[savedDimensions[i]]; + + this->lowerOverlap[i] = inputDistributedGrid.getLowerOverlap()[savedDimensions[i]]; + this->upperOverlap[i] = inputDistributedGrid.getUpperOverlap()[savedDimensions[i]]; + this->localSize[i] = inputDistributedGrid.getLocalSize()[savedDimensions[i]]; + this->globalBegin[i] = inputDistributedGrid.getGlobalBegin()[savedDimensions[i]]; + localGridSize[i] = inputDistributedGrid.getLocalMesh().getDimensions()[savedDimensions[i]]; + localBegin[i] = inputDistributedGrid.getLocalMesh().getLocalBegin()[savedDimensions[i]]; + localOrigin[i] = inputDistributedGrid.getLocalMesh().getOrigin()[savedDimensions[i]]; } - //create new group with used nodes - const MPI_Comm oldGroup=inputDistributedGrid.getCommunicationGroup(); - if(isInCut) - { - this->isSet=true; - - auto fromGlobalMesh=inputDistributedGrid.getGlobalGrid(); - //set global grid - typename GridType::PointType outOrigin; - typename GridType::PointType outProportions; - typename GridType::CoordinatesType outDimensions; - - for(int i=0; i<Dimension;i++) - { - outOrigin[i]=fromGlobalMesh.getOrigin()[savedDimensions[i]]; - outProportions[i]=fromGlobalMesh.getProportions()[savedDimensions[i]]; - outDimensions[i]=fromGlobalMesh.getDimensions()[savedDimensions[i]]; - - this->domainDecomposition[i]=inputDistributedGrid.getDomainDecomposition()[savedDimensions[i]]; - this->subdomainCoordinates[i]=inputDistributedGrid.getSubdomainCoordinates()[savedDimensions[i]]; - - this->overlap[i]=inputDistributedGrid.getOverlap()[savedDimensions[i]];//TODO: RomoveThis - this->lowerOverlap[i]=inputDistributedGrid.getLowerOverlap()[savedDimensions[i]]; - this->upperOverlap[i]=inputDistributedGrid.getUpperOverlap()[savedDimensions[i]]; - this->localSize[i]=inputDistributedGrid.getLocalSize()[savedDimensions[i]]; - this->globalBegin[i]=inputDistributedGrid.getGlobalBegin()[savedDimensions[i]]; - this->localGridSize[i]=inputDistributedGrid.getLocalGridSize()[savedDimensions[i]]; - this->localBegin[i]=inputDistributedGrid.getLocalBegin()[savedDimensions[i]]; - - this->localOrigin[i]=inputDistributedGrid.getLocalOrigin()[savedDimensions[i]]; - this->spaceSteps[i]=inputDistributedGrid.getSpaceSteps()[savedDimensions[i]]; - } - - int newRank = getRankOfProcCoord(this->subdomainCoordinates); - this->group = MPI::Comm_split( oldGroup, 1, newRank ); + this->globalGrid.setDimensions(outDimensions); + this->globalGrid.setDomain(outOrigin,outProportions); - setupNeighbors(); + // setOverlaps resets the local grid +// setOverlaps( this->lowerOverlap, this->upperOverlap ); + localGrid.setDimensions( localGridSize ); + localGrid.setOrigin( localOrigin ); + // setting space steps computes the grid proportions as a side efect + localGrid.setSpaceSteps( globalGrid.getSpaceSteps() ); + localGrid.setLocalBegin( localBegin ); + localGrid.setLocalEnd( localBegin + localSize ); + // TODO: set interiorBegin, interiorEnd + const int newRank = getRankOfProcCoord(this->subdomainCoordinates); + this->group = MPI::Comm_split( oldGroup, 1, newRank ); - bool isDistributed=false; - for(int i=0;i<Dimension; i++) - { - isDistributed|=(domainDecomposition[i]>1); - } + setupNeighbors(); - this->distributed=isDistributed; - - this->globalGrid.setDimensions(outDimensions); - this->globalGrid.setDomain(outOrigin,outProportions); - - return true; - } - else + bool isDistributed = false; + for( int i = 0; i < Dimension; i++ ) { - this->group = MPI::Comm_split( oldGroup, MPI_UNDEFINED, 0 ); + isDistributed |= domainDecomposition[i] > 1; } + this->distributed = isDistributed; + return true; + } + else + { + this->group = MPI::Comm_split( oldGroup, MPI_UNDEFINED, 0 ); return false; + } } template< int Dimension, typename Real, typename Device, typename Index > @@ -510,39 +471,61 @@ writeProlog( Logger& logger ) } template< int Dimension, typename Real, typename Device, typename Index > -void +bool +DistributedMesh< Grid< Dimension, Real, Device, Index > >:: +operator==( const DistributedMesh& other ) const +{ + return globalGrid == other.globalGrid + && localGrid == other.localGrid + && localSize == other.localSize + && globalBegin == other.globalBegin + && lowerOverlap == other.lowerOverlap + && upperOverlap == other.upperOverlap + && domainDecomposition == other.domainDecomposition + && subdomainCoordinates == other.subdomainCoordinates + && distributed == other.distributed + && isSet == other.isSet + && group == other.group; +} + +template< int Dimension, typename Real, typename Device, typename Index > +bool DistributedMesh< Grid< Dimension, Real, Device, Index > >:: -print( std::ostream& str ) const +operator!=( const DistributedMesh& other ) const +{ + return ! operator==( other ); +} + +template< int Dimension, typename Real, typename Device, typename Index > +std::ostream& operator<<( std::ostream& str, const DistributedMesh< Grid< Dimension, Real, Device, Index > >& grid ) { for( int j = 0; j < MPI::GetSize(); j++ ) { if( j == MPI::GetRank() ) { str << "Node : " << MPI::GetRank() << std::endl - << " localOrigin : " << localOrigin << std::endl - << " localBegin : " << localBegin << std::endl - << " localSize : " << localSize << std::endl - << " localGridSize : " << localGridSize << std::endl - << " overlap : " << overlap << std::endl - << " globalBegin : " << globalBegin << std::endl - << " spaceSteps : " << spaceSteps << std::endl - << " lowerOverlap : " << lowerOverlap << std::endl - << " upperOverlap : " << upperOverlap << std::endl - << " domainDecomposition : " << domainDecomposition << std::endl - << " subdomainCoordinates : " << subdomainCoordinates << std::endl + << " globalGrid : " << grid.getGlobalGrid() << std::endl + << " localGrid : " << grid.getLocalMesh() << std::endl + << " localSize : " << grid.getLocalSize() << std::endl + << " globalBegin : " << grid.globalBegin << std::endl + << " lowerOverlap : " << grid.lowerOverlap << std::endl + << " upperOverlap : " << grid.upperOverlap << std::endl + << " domainDecomposition : " << grid.domainDecomposition << std::endl + << " subdomainCoordinates : " << grid.subdomainCoordinates << std::endl << " neighbors : "; - for( int i = 0; i < getNeighborsCount(); i++ ) - str << " " << neighbors[ i ]; + for( int i = 0; i < grid.getNeighborsCount(); i++ ) + str << " " << grid.getNeighbors()[ i ]; str << std::endl; str << " periodicNeighbours : "; - for( int i = 0; i < getNeighborsCount(); i++ ) - str << " " << periodicNeighbors[ i ]; + for( int i = 0; i < grid.getNeighborsCount(); i++ ) + str << " " << grid.getPeriodicNeighbors()[ i ]; str << std::endl; } MPI::Barrier(); } + return str; } - } //namespace DistributedMeshes - } // namespace Meshes +} // namespace DistributedMeshes +} // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGridIO.h b/src/TNL/Meshes/DistributedMeshes/DistributedGridIO.h deleted file mode 100644 index edb08baf7b6cd909988e50446a19a1a66df42e6a..0000000000000000000000000000000000000000 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGridIO.h +++ /dev/null @@ -1,56 +0,0 @@ -/*************************************************************************** - DistributedGrid.h - description - ------------------- - begin : October 5, 2017 - copyright : (C) 2017 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#pragma once - -#include <iostream> - -#include <TNL/File.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> -#include <TNL/Meshes/DistributedMeshes/CopyEntitiesHelper.h> -#include <TNL/Functions/MeshFunction.h> -#include <TNL/Devices/Host.h> -#include <TNL/Devices/Cuda.h> - -namespace TNL { -namespace Meshes { -namespace DistributedMeshes { - -enum DistrGridIOTypes { Dummy = 0 , LocalCopy = 1, MpiIO=2 }; - -template< typename MeshFunction, - DistrGridIOTypes type = LocalCopy, - typename Mesh = typename MeshFunction::MeshType, - typename Device = typename MeshFunction::DeviceType > -class DistributedGridIO -{ -}; - -template< typename MeshFunctionType > -class DistributedGridIO< MeshFunctionType, Dummy > -{ - bool save(const String& fileName, MeshFunctionType &meshFunction) - { - return true; - } - - bool load(const String& fileName, MeshFunctionType &meshFunction) - { - return true; - } -}; - -} // namespace DistributedMeshes -} // namespace Meshes -} // namespace TNL - -//not clean logic of includes... -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO_MeshFunction.h> -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO_VectorField.h> diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGridIO_MeshFunction.h b/src/TNL/Meshes/DistributedMeshes/DistributedGridIO_MeshFunction.h deleted file mode 100644 index 698d7e41dc7ebbf5b2cf2481bb97c991620dcc96..0000000000000000000000000000000000000000 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGridIO_MeshFunction.h +++ /dev/null @@ -1,521 +0,0 @@ -/*************************************************************************** - DistributedGridIO_NeshFunction.h - description - ------------------- - begin : October 5, 2017 - copyright : (C) 2017 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#pragma once - -#include <TNL/Functions/MeshFunction.h> -#include <TNL/Functions/MeshFunctionView.h> -#include <TNL/MPI/getDataType.h> - -namespace TNL { -namespace Meshes { -namespace DistributedMeshes { - - -/* - * This variant cerate copy of MeshFunction but smaller, reduced to local entities, without overlap. - * It is slow and has high RAM consumption - */ -template< typename MeshFunction, - int Dimension, - typename MeshReal, - typename Device, - typename Index > -class DistributedGridIO< - MeshFunction, - LocalCopy, - Meshes::Grid< Dimension, MeshReal, Device, Index > > -{ - public: - using MeshType = Meshes::Grid< Dimension, MeshReal, Device, Index >; - using MeshFunctionType = MeshFunction; - using MeshFunctionViewType = Functions::MeshFunctionView< MeshType, MeshFunction::getEntitiesDimension(), typename MeshFunction::RealType >; - using CoordinatesType = typename MeshFunctionType::MeshType::CoordinatesType; - using PointType = typename MeshFunctionType::MeshType::PointType; - using VectorType = Containers::Vector< typename MeshFunctionType::RealType, typename MeshFunctionType::DeviceType, typename MeshFunctionType::IndexType >; - //typedef DistributedGrid< MeshType,MeshFunctionType::getMeshDimension()> DistributedGridType; - - static bool save(const String& fileName, MeshFunctionType &meshFunction) - { - auto *distrGrid=meshFunction.getMesh().getDistributedMesh(); - - if(distrGrid==NULL) //not distributed - { - meshFunction.save(fileName); - return true; - } - - const MeshType& mesh=meshFunction.getMesh(); - - PointType spaceSteps=mesh.getSpaceSteps(); - PointType origin=mesh.getOrigin(); - - CoordinatesType localSize=distrGrid->getLocalSize(); - CoordinatesType localBegin=distrGrid->getLocalBegin(); - - Pointers::SharedPointer<MeshType> newMesh; - newMesh->setDimensions(localSize); - newMesh->setSpaceSteps(spaceSteps); - CoordinatesType newOrigin; - newMesh->setOrigin(origin+spaceSteps*localBegin); - - File meshFile; - meshFile.open( fileName+String("-mesh-")+distrGrid->printProcessCoords()+String(".tnl"), std::ios_base::out ); - newMesh->save( meshFile ); - meshFile.close(); - - VectorType newDof(newMesh-> template getEntitiesCount< typename MeshType::Cell >()); - - MeshFunctionViewType newMeshFunction; - newMeshFunction.bind(newMesh,newDof); - - CoordinatesType zeroCoord; - zeroCoord.setValue(0); - - CopyEntitiesHelper<MeshFunctionViewType>::Copy(meshFunction,newMeshFunction,localBegin,zeroCoord,localSize); - - File file; - file.open( fileName+String("-")+distrGrid->printProcessCoords()+String(".tnl"), std::ios_base::out ); - newMeshFunction.save(file); - file.close(); - - return true; - - }; - - static bool load(const String& fileName,MeshFunctionType &meshFunction) - { - auto *distrGrid=meshFunction.getMesh().getDistributedMesh(); - if(distrGrid==NULL) //not distributed - { - meshFunction.boundLoad(fileName); - return true; - } - - const MeshType& mesh=meshFunction.getMesh(); - - PointType spaceSteps=mesh.getSpaceSteps(); - PointType origin=mesh.getOrigin(); - - CoordinatesType localSize=distrGrid->getLocalSize(); - CoordinatesType localBegin=distrGrid->getLocalBegin(); - - Pointers::SharedPointer<MeshType> newMesh; - newMesh->setDimensions(localSize); - newMesh->setSpaceSteps(spaceSteps); - CoordinatesType newOrigin; - newMesh->setOrigin(origin+spaceSteps*localBegin); - - VectorType newDof(newMesh-> template getEntitiesCount< typename MeshType::Cell >()); - MeshFunctionType newMeshFunction; - newMeshFunction.bind(newMesh,newDof); - - CoordinatesType zeroCoord; - zeroCoord.setValue(0); - - File file; - file.open( fileName+String("-")+distrGrid->printProcessCoords()+String(".tnl"), std::ios_base::in ); - newMeshFunction.boundLoad(file); - file.close(); - CopyEntitiesHelper<MeshFunctionType>::Copy(newMeshFunction,meshFunction,zeroCoord,localBegin,localSize); - - return true; - }; - -}; - -/* - * Save distributed data into single file without overlaps using MPIIO and MPI datatypes, - * EXPLOSIVE: works with only Grids and MPI - * BAD IMPLEMENTTION creating MPI-Types at every save! -- I dont want contamine more places by MPI.. - */ - -#ifdef HAVE_MPI -template<typename MeshFunctionType> -class DistributedGridIO_MPIIOBase -{ - public: - - using RealType = typename MeshFunctionType::RealType; - typedef typename MeshFunctionType::MeshType MeshType; - typedef typename MeshFunctionType::MeshType::CoordinatesType CoordinatesType; - typedef typename MeshFunctionType::MeshType::PointType PointType; - typedef typename MeshFunctionType::VectorType VectorType; - //typedef DistributedGrid< MeshType,MeshFunctionType::getMeshDimension()> DistributedGridType; - - static bool save(const String& fileName, MeshFunctionType &meshFunction, RealType *data) - { - auto *distrGrid=meshFunction.getMesh().getDistributedMesh(); - - if(distrGrid==NULL) //not distributed - { - meshFunction.save(fileName); - } - - MPI_Comm group=distrGrid->getCommunicationGroup(); - - MPI_File file; - int ok=MPI_File_open( group, - const_cast< char* >( fileName.getString() ), - MPI_MODE_CREATE | MPI_MODE_WRONLY, - MPI_INFO_NULL, - &file); - if( ok != 0 ) - throw std::runtime_error("Open file falied"); - - int written=save(file,meshFunction, data,0); - - MPI_File_close(&file); - - return written>0; - - }; - - static int save(MPI_File &file, MeshFunctionType &meshFunction, RealType *data, int offset) - { - - auto *distrGrid=meshFunction.getMesh().getDistributedMesh(); - MPI_Comm group=distrGrid->getCommunicationGroup(); - MPI_Datatype ftype; - MPI_Datatype atype; - int dataCount=CreateDataTypes(distrGrid,&ftype,&atype); - - int headerSize; - - MPI_File_set_view(file,0,MPI_BYTE,MPI_BYTE,"native",MPI_INFO_NULL); - - if(MPI::GetRank(group)==0) - { - MPI_File_seek(file,offset,MPI_SEEK_SET); - headerSize=writeMeshFunctionHeader(file,meshFunction,dataCount); - } - MPI_Bcast(&headerSize, 1, MPI_INT,0, group); - - offset +=headerSize; - - MPI_File_set_view(file,offset, - TNL::MPI::getDataType<RealType>(), - ftype,"native",MPI_INFO_NULL); - - MPI_Status wstatus; - - MPI_File_write(file,data,1,atype,&wstatus); - - MPI_Type_free(&atype); - MPI_Type_free(&ftype); - - return headerSize+dataCount*sizeof(RealType); //size of written data - - }; - - template<typename DitsributedGridType> - static int CreateDataTypes(DitsributedGridType *distrGrid,MPI_Datatype *ftype,MPI_Datatype *atype) - { - int dim=distrGrid->getMeshDimension(); - - int fstarts[dim]; - int flsize[dim]; - int fgsize[dim]; - - hackArray(dim,fstarts,distrGrid->getGlobalBegin().getData()); - hackArray(dim,flsize,distrGrid->getLocalSize().getData()); - hackArray(dim,fgsize,distrGrid->getGlobalSize().getData()); - - MPI_Type_create_subarray(dim, - fgsize,flsize,fstarts, - MPI_ORDER_C, - TNL::MPI::getDataType<RealType>(), - ftype); - - MPI_Type_commit(ftype); - - int agsize[dim]; - int alsize[dim]; - int astarts[dim]; - - hackArray(dim,astarts,distrGrid->getLocalBegin().getData()); - hackArray(dim,alsize,distrGrid->getLocalSize().getData()); - hackArray(dim,agsize,distrGrid->getLocalGridSize().getData()); - - MPI_Type_create_subarray(dim, - agsize,alsize,astarts, - MPI_ORDER_C, - TNL::MPI::getDataType<RealType>(), - atype); - MPI_Type_commit(atype); - - int dataCount=1; - for(int i=0;i<dim;i++) - dataCount*=fgsize[i]; - - return dataCount; - - } - - template<typename Index> - static void hackArray(int dim, int* out, Index* in) - { - if(dim==1) - { - out[0]=in[0]; - } - - if(dim==2) - { - out[1]=in[0]; - out[0]=in[1]; - } - - if(dim==3) - { - out[0]=in[2]; - out[1]=in[1]; - out[2]=in[0]; - } - } - - static unsigned int writeMeshFunctionHeader(MPI_File file,MeshFunctionType &meshFunction, int length ) - { - - unsigned int size=0; - int count; - MPI_Status wstatus; - - //Magic - MPI_File_write( file, const_cast< void* >( ( const void* ) "TNLMN" ), 5, MPI_CHAR,&wstatus ); - MPI_Get_count(&wstatus,MPI_CHAR,&count); - size+=count*sizeof(char); - - //Meshfunction type - String meshFunctionSerializationType=meshFunction.getSerializationTypeVirtual(); - int meshFunctionSerializationTypeLength=meshFunctionSerializationType.getLength(); - MPI_File_write(file,&meshFunctionSerializationTypeLength,1,MPI_INT,&wstatus); - MPI_Get_count(&wstatus,MPI_INT,&count); - size+=count*sizeof(int); - MPI_File_write(file,const_cast< void* >( ( const void* ) meshFunctionSerializationType.getString() ),meshFunctionSerializationType.getLength(),MPI_CHAR,&wstatus); - MPI_Get_count(&wstatus,MPI_CHAR,&count); - size+=count*sizeof(char); - - //Magic - MPI_File_write( file, const_cast< void* >( ( const void* ) "TNLMN" ),5,MPI_CHAR,&wstatus); - MPI_Get_count(&wstatus,MPI_CHAR,&count); - size+=count*sizeof(char); - //Vector Type -// String dataSerializationType=meshFunction.getData().getSerializationTypeVirtual(); - String dataSerializationType = Containers::detail::ArrayIO< RealType, typename MeshFunctionType::DeviceType, typename MeshFunctionType::IndexType >::getSerializationType(); - int dataSerializationTypeLength=dataSerializationType.getLength(); - MPI_File_write(file,&dataSerializationTypeLength,1,MPI_INT,&wstatus); - MPI_Get_count(&wstatus,MPI_INT,&count); - size+=count*sizeof(int); - MPI_File_write( file, const_cast< void* >( ( const void* ) dataSerializationType.getString() ), dataSerializationType.getLength(), MPI_CHAR, &wstatus ); - MPI_Get_count(&wstatus,MPI_CHAR,&count); - size+=count*sizeof(char); - //Data count - MPI_File_write(file,&(length),1,MPI_INT,&wstatus); - MPI_Get_count(&wstatus,MPI_INT,&count); - size+=count*sizeof(int); - - return size; - }; - - static bool load(const String& fileName,MeshFunctionType &meshFunction, RealType* data ) - { - auto *distrGrid=meshFunction.getMesh().getDistributedMesh(); - if(distrGrid==NULL) //not distributed - { - meshFunction.boundLoad(fileName); - return true; - } - - MPI_Comm group=distrGrid->getCommunicationGroup(); - - MPI_File file; - if( MPI_File_open( group, - const_cast< char* >( fileName.getString() ), - MPI_MODE_RDONLY, - MPI_INFO_NULL, - &file ) != 0 ) - { - std::cerr << "Unable to open file " << fileName.getString() << std::endl; - return false; - } - bool ret= load(file, meshFunction, data,0)>0; - - MPI_File_close(&file); - return ret; - } - - /* Funky bomb - no checks - only dirty load */ - static int load(MPI_File &file,MeshFunctionType &meshFunction, RealType* data, int offset ) - { - auto *distrGrid=meshFunction.getMesh().getDistributedMesh(); - - MPI_Comm group=distrGrid->getCommunicationGroup(); - MPI_Datatype ftype; - MPI_Datatype atype; - int dataCount=CreateDataTypes(distrGrid,&ftype,&atype); - - MPI_File_set_view(file,0,MPI_BYTE,MPI_BYTE,"native",MPI_INFO_NULL); - - int headerSize=0; - - if(MPI::GetRank(group)==0) - { - MPI_File_seek(file,offset,MPI_SEEK_SET); - headerSize=readMeshFunctionHeader(file,meshFunction,dataCount); - } - MPI_Bcast(&headerSize, 1, MPI_INT,0, group); - - if(headerSize<0) - return false; - - offset+=headerSize; - - MPI_File_set_view(file,offset, - TNL::MPI::getDataType<RealType>(), - ftype,"native",MPI_INFO_NULL); - MPI_Status wstatus; - MPI_File_read(file,(void*)data,1,atype,&wstatus); - - MPI_Type_free(&atype); - MPI_Type_free(&ftype); - - return headerSize+dataCount*sizeof(RealType); //size of readed data; - }; - - //it shoudl check some loaded files...... but chcek nothing... - static int readMeshFunctionHeader(MPI_File file,MeshFunctionType &meshFunction, int length) - { - MPI_Status rstatus; - char buffer[255]; - int size=0; - int count=0; - - MPI_File_read(file, (void *)buffer,5, MPI_CHAR, &rstatus);//MAGIC - size+=5*sizeof(char); - MPI_File_read(file, (void *)&count,1, MPI_INT, &rstatus);//SIZE OF DATATYPE - size+=1*sizeof(int); - MPI_File_read(file, (void *)&buffer,count, MPI_CHAR, &rstatus);//DATATYPE - size+=count*sizeof(char); - - MPI_File_read(file, (void *)buffer,5, MPI_CHAR, &rstatus);//MAGIC - size+=5*sizeof(char); - MPI_File_read(file, (void *)&count,1, MPI_INT, &rstatus);//SIZE OF DATATYPE - size+=1*sizeof(int); - MPI_File_read(file, (void *)&buffer,count, MPI_CHAR, &rstatus);//DATATYPE - size+=count*sizeof(char); - MPI_File_read(file, (void *)&count,1, MPI_INT, &rstatus);//DATACOUNT - size+=1*sizeof(int); - - if(count!=length) - { - std::cerr<<"Chyba naÄÃtánà MeshFunction, délka dat v souboru neodpovÃdá oÄekávané délce" << std::endl; - size=-1; - } - - return size; - }; - -}; -#endif - -template< typename MeshFunction, - int Dimension, - typename MeshReal, - typename Index > -class DistributedGridIO< - MeshFunction, - MpiIO, - Meshes::Grid< Dimension, MeshReal, Devices::Cuda, Index >, - Devices::Cuda > -{ - public: - using MeshType = Meshes::Grid< Dimension, MeshReal, Devices::Cuda, Index >; - using MeshFunctionType = MeshFunction; - - static bool save(const String& fileName, MeshFunctionType &meshFunction) - { -#ifdef HAVE_MPI - if(MPI::isInitialized())//i.e. - isUsed - { - using HostVectorType = Containers::Vector<typename MeshFunctionType::RealType, Devices::Host, typename MeshFunctionType::IndexType >; - HostVectorType hostVector; - hostVector=meshFunction.getData(); - typename MeshFunctionType::RealType * data=hostVector.getData(); - return DistributedGridIO_MPIIOBase<MeshFunctionType>::save(fileName,meshFunction,data); - } -#endif - std::cout << "MPIIO can be used only when MPI is initialized." << std::endl; - return false; - }; - - static bool load(const String& fileName,MeshFunctionType &meshFunction) - { -#ifdef HAVE_MPI - if(MPI::isInitialized())//i.e. - isUsed - { - using HostVectorType = Containers::Vector<typename MeshFunctionType::RealType, Devices::Host, typename MeshFunctionType::IndexType >; - HostVectorType hostVector; - hostVector.setLike(meshFunction.getData()); - auto* data=hostVector.getData(); - DistributedGridIO_MPIIOBase<MeshFunctionType>::load(fileName,meshFunction,data); - meshFunction.getData()=hostVector; - return true; - } -#endif - std::cout << "MPIIO can be used only when MPI is initialized." << std::endl; - return false; - }; -}; - -template< typename MeshFunction, - int Dimension, - typename MeshReal, - typename Index > -class DistributedGridIO< - MeshFunction, - MpiIO, - Meshes::Grid< Dimension, MeshReal, Devices::Host, Index >, - Devices::Host > -{ - public: - using MeshType = Meshes::Grid< Dimension, MeshReal, Devices::Host, Index >; - using MeshFunctionType = MeshFunction; - - static bool save(const String& fileName, MeshFunctionType &meshFunction) - { -#ifdef HAVE_MPI - if(MPI::isInitialized())//i.e. - isUsed - { - typename MeshFunctionType::RealType* data=meshFunction.getData().getData(); - return DistributedGridIO_MPIIOBase<MeshFunctionType>::save(fileName,meshFunction,data); - } -#endif - std::cout << "MPIIO can be used only when MPI is initialized." << std::endl; - return false; - }; - - static bool load(const String& fileName,MeshFunctionType &meshFunction) - { -#ifdef HAVE_MPI - if(MPI::isInitialized())//i.e. - isUsed - { - typename MeshFunctionType::RealType* data = meshFunction.getData().getData(); - return DistributedGridIO_MPIIOBase<MeshFunctionType>::load(fileName,meshFunction,data); - } -#endif - std::cout << "MPIIO can be used only when MPI is initialized." << std::endl; - return false; - }; -}; - - } //namespace DistributedMeshes - } //namespace Meshes -} //namespace TNL diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGridIO_VectorField.h b/src/TNL/Meshes/DistributedMeshes/DistributedGridIO_VectorField.h deleted file mode 100644 index 8febf3c723b19bfffef001a70c6b3ed769a96420..0000000000000000000000000000000000000000 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGridIO_VectorField.h +++ /dev/null @@ -1,190 +0,0 @@ -/*************************************************************************** - DistributedGridIO_NeshFunction.h - description - ------------------- - begin : October 5, 2017 - copyright : (C) 2017 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#pragma once - -#include <TNL/Functions/VectorField.h> -#include <TNL/Meshes/Grid.h> - -namespace TNL { -namespace Meshes { -namespace DistributedMeshes { - -template< typename MeshFunction, - DistrGridIOTypes type = LocalCopy, - typename Mesh = typename MeshFunction::MeshType, - typename Device = typename MeshFunction::DeviceType > -class DistributedGridIO_VectorField -{ -}; - -template< - int Size, - typename MeshFunction, - int Dimension, - typename MeshReal, - typename Device, - typename Index > -class DistributedGridIO_VectorField< - Functions::VectorField< Size, MeshFunction >, - MpiIO, - Meshes::Grid< Dimension, MeshReal, Device, Index >, - Device > -{ - public: - using MeshType = Meshes::Grid< Dimension, MeshReal, Device, Index >; - using MeshFunctionType = MeshFunction; - using VectorFieldType = Functions::VectorField< Size, MeshFunctionType >; - using CoordinatesType = typename MeshFunctionType::MeshType::CoordinatesType; - using PointType = typename MeshFunctionType::MeshType::PointType; - using VectorType = typename MeshFunctionType::VectorType; - - static bool save(const String& fileName, Functions::VectorField< Size, MeshFunctionType > &vectorField) - { -#ifdef HAVE_MPI - if(MPI::isInitialized())//i.e. - isUsed - { - auto *distrGrid=vectorField.getMesh().getDistributedMesh(); - if(distrGrid==NULL) - { - vectorField.save(fileName); - return true; - } - - MPI_Comm group=distrGrid->getCommunicationGroup(); - - //write - MPI_File file; - MPI_File_open( group, - const_cast< char* >( fileName.getString() ), - MPI_MODE_CREATE | MPI_MODE_WRONLY, - MPI_INFO_NULL, - &file); - - - int offset=0; //global offset -> every mesh function creates it's own data types we need manage global offset - if(MPI::GetRank(group)==0) - offset+=writeVectorFieldHeader(file,vectorField); - MPI_Bcast(&offset, 1, MPI_INT,0, group); - - for( int i = 0; i < vectorField.getVectorDimension(); i++ ) - { - typename MeshFunctionType::RealType * data=vectorField[i]->getData().getData(); //here manage data transfer Device... - int size = DistributedGridIO_MPIIOBase<MeshFunctionType>::save(file,*(vectorField[i]),data,offset); - offset+=size; - if( size==0 ) - return false; - } - - MPI_File_close(&file); - return true; - } -#endif - std::cout << "MPIIO can be used only when MPI is initialized." << std::endl; - return false; - - }; - -#ifdef HAVE_MPI - private: - static unsigned int writeVectorFieldHeader(MPI_File &file,Functions::VectorField<Size,MeshFunctionType > &vectorField) - { - unsigned int size=0; - int count; - MPI_Status wstatus; - - //Magic - MPI_File_write( file, const_cast< void* >( ( const void* ) "TNLMN" ), 5, MPI_CHAR,&wstatus ); - MPI_Get_count(&wstatus,MPI_CHAR,&count); - size+=count*sizeof(char); - - //VectorField type - String vectorFieldSerializationType=vectorField.getSerializationTypeVirtual(); - int vectorFieldSerializationTypeLength=vectorFieldSerializationType.getLength(); - MPI_File_write(file,&vectorFieldSerializationTypeLength,1,MPI_INT,&wstatus); - MPI_Get_count(&wstatus,MPI_INT,&count); - size+=count*sizeof(int); - MPI_File_write(file,const_cast< void* >( ( const void* ) vectorFieldSerializationType.getString() ),vectorFieldSerializationType.getLength(),MPI_CHAR,&wstatus); - MPI_Get_count(&wstatus,MPI_CHAR,&count); - size+=count*sizeof(char); - - return size; - } - - static unsigned int readVectorFieldHeader(MPI_File &file,Functions::VectorField<Size,MeshFunctionType> &vectorField) - { - MPI_Status rstatus; - char buffer[255]; - int size=0; - int count=0; - - MPI_File_read(file, (void *)buffer,5, MPI_CHAR, &rstatus);//MAGIC - size+=5*sizeof(char); - MPI_File_read(file, (void *)&count,1, MPI_INT, &rstatus);//SIZE OF DATATYPE - size+=1*sizeof(int); - MPI_File_read(file, (void *)&buffer,count, MPI_CHAR, &rstatus);//DATATYPE - size+=count*sizeof(char); - - return size; - } -#endif - - public: - static bool load(const String& fileName, Functions::VectorField<Size,MeshFunctionType> &vectorField) - { -#ifdef HAVE_MPI - if(MPI::isInitialized())//i.e. - isUsed - { - auto *distrGrid=vectorField.getMesh().getDistributedMesh(); - if(distrGrid==NULL) - { - vectorField.save(fileName); - return true; - } - - MPI_Comm group=distrGrid->getCommunicationGroup(); - - //write - MPI_File file; - MPI_File_open( group, - const_cast< char* >( fileName.getString() ), - MPI_MODE_RDONLY, - MPI_INFO_NULL, - &file); - - - int offset=0; //global offset -> every meshfunctoion creates it's own datatypes we need manage global offset - if(MPI::GetRank(group)==0) - offset+=readVectorFieldHeader(file,vectorField); - MPI_Bcast(&offset, 1, MPI_INT,0, group); - - for( int i = 0; i < vectorField.getVectorDimension(); i++ ) - { - typename MeshFunctionType::RealType * data=vectorField[i]->getData().getData(); //here manage data transfer Device... - int size = DistributedGridIO_MPIIOBase<MeshFunctionType>::load(file,*(vectorField[i]),data,offset); - offset+=size; - if( size==0 ) - return false; - } - - MPI_File_close(&file); - return true; - } -#endif - std::cout << "MPIIO can be used only when MPI is initialized." << std::endl; - return false; - - }; - -}; - -} -} -} diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h b/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h index ed68150a041dc4ed209ac3a15ea226b96c801c6e..afc5c6c7736ba908d774198b42c63efae74fba05 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h @@ -30,14 +30,14 @@ template< int MeshDimension, class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridReal, Device, Index > >, MeshDimension > { public: - static constexpr int getMeshDimension() { return MeshDimension; }; - static constexpr int getNeighborCount() {return DirectionCount<MeshDimension>::get();}; - typedef typename Grid< MeshDimension, GridReal, Device, Index >::Cell Cell; - typedef typename Grid< MeshDimension, GridReal, Device, Index >::DistributedMeshType DistributedGridType; + typedef DistributedMesh< Grid< MeshDimension, GridReal, Device, Index > > DistributedGridType; typedef typename DistributedGridType::CoordinatesType CoordinatesType; using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; + static constexpr int getMeshDimension() { return DistributedGridType::getMeshDimension(); }; + static constexpr int getNeighborsCount() { return DistributedGridType::getNeighborsCount(); }; + enum PeriodicBoundariesCopyDirection { BoundaryToOverlap, @@ -49,7 +49,7 @@ class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridRea isSet = false; }; - DistributedMeshSynchronizer( DistributedGridType *distributedGrid ) + DistributedMeshSynchronizer( const DistributedGridType *distributedGrid ) { isSet = false; setDistributedGrid( distributedGrid ); @@ -60,7 +60,7 @@ class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridRea this->periodicBoundariesCopyDirection = dir; } - void setDistributedGrid( DistributedGridType *distributedGrid ) + void setDistributedGrid( const DistributedGridType *distributedGrid ) { isSet = true; @@ -69,12 +69,12 @@ class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridRea const SubdomainOverlapsType& lowerOverlap = this->distributedGrid->getLowerOverlap(); const SubdomainOverlapsType& upperOverlap = this->distributedGrid->getUpperOverlap(); - const CoordinatesType& localBegin = this->distributedGrid->getLocalBegin(); + const CoordinatesType& localBegin = this->distributedGrid->getLocalMesh().getLocalBegin(); const CoordinatesType& localSize = this->distributedGrid->getLocalSize(); const int *neighbors = distributedGrid->getNeighbors(); - for( int i=0; i<this->getNeighborCount(); i++ ) + for( int i=0; i<this->getNeighborsCount(); i++ ) { Index sendSize=1;//send and receive areas have the same size @@ -126,7 +126,7 @@ class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridRea if( !distributedGrid->isDistributed() ) return; // allocate buffers (setSize does nothing if the array size is already correct) - for( int i=0; i<this->getNeighborCount(); i++ ) { + for( int i=0; i<this->getNeighborsCount(); i++ ) { sendBuffers[ i ].setSize( sendSizes[ i ] * sizeof(RealType) ); recieveBuffers[ i ].setSize( sendSizes[ i ] * sizeof(RealType)); } @@ -143,12 +143,12 @@ class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridRea PeriodicBoundariesMaskPointer( nullptr ) ); // the mask is used only when receiving data ); //async send and receive - MPI_Request requests[2*this->getNeighborCount()]; + MPI_Request requests[2*this->getNeighborsCount()]; MPI_Comm group = distributedGrid->getCommunicationGroup(); int requestsCount( 0 ); //send everything, recieve everything - for( int i=0; i<this->getNeighborCount(); i++ ) + for( int i=0; i<this->getNeighborsCount(); i++ ) { /*TNL_MPI_PRINT( "Sending data... " << i << " sizes -> " << sendSizes[ i ] << "sendDimensions -> " << sendDimensions[ i ] @@ -199,7 +199,7 @@ class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridRea using RealType = typename MeshFunctionType::RealType; using Helper = BufferEntitiesHelper< MeshFunctionType, PeriodicBoundariesMaskPointer, getMeshDimension(), RealType, Device >; - for(int i=0;i<this->getNeighborCount();i++) + for(int i=0;i<this->getNeighborsCount();i++) { bool isBoundary=( neighbor[ i ] == -1 ); if( ! isBoundary || periodicBoundaries ) @@ -211,24 +211,22 @@ class DistributedMeshSynchronizer< DistributedMesh< Grid< MeshDimension, GridRea private: - Containers::StaticArray< getNeighborCount(), int > sendSizes; - Containers::Array< std::uint8_t, Device, Index > sendBuffers[getNeighborCount()]; - Containers::Array< std::uint8_t, Device, Index > recieveBuffers[getNeighborCount()]; + Containers::StaticArray< getNeighborsCount(), int > sendSizes; + Containers::Array< std::uint8_t, Device, Index > sendBuffers[getNeighborsCount()]; + Containers::Array< std::uint8_t, Device, Index > recieveBuffers[getNeighborsCount()]; PeriodicBoundariesCopyDirection periodicBoundariesCopyDirection = BoundaryToOverlap; - CoordinatesType sendDimensions[getNeighborCount()]; - CoordinatesType recieveDimensions[getNeighborCount()]; - CoordinatesType sendBegin[getNeighborCount()]; - CoordinatesType recieveBegin[getNeighborCount()]; + CoordinatesType sendDimensions[getNeighborsCount()]; + CoordinatesType recieveDimensions[getNeighborsCount()]; + CoordinatesType sendBegin[getNeighborsCount()]; + CoordinatesType recieveBegin[getNeighborsCount()]; - DistributedGridType *distributedGrid; + const DistributedGridType *distributedGrid; bool isSet; }; - } // namespace DistributedMeshes } // namespace Meshes } // namespace TNL - diff --git a/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h b/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h index b479544f7e1ebccb739027758d046a4263aa25e6..c92a17cd2b8051bcae7f4b368f41ecb28d1b7088 100644 --- a/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h +++ b/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h @@ -11,11 +11,13 @@ #pragma once #include <TNL/Meshes/Grid.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> namespace TNL { - namespace Meshes { - namespace DistributedMeshes { +namespace Meshes { +namespace DistributedMeshes { + +template< typename Mesh > +class DistributedMesh; template< typename Mesh > class SubdomainOverlapsGetter @@ -118,9 +120,8 @@ class SubdomainOverlapsGetter< Grid< 3, Real, Device, Index > > }; - - } // namespace DistributedMeshes - } // namespace Meshes +} // namespace DistributedMeshes +} // namespace Meshes } // namespace TNL #include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.hpp> diff --git a/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.hpp b/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.hpp index aa185e1ecf0d08193feb8a58abeb40785914eead..782355c246972610004c83090bd2b5f91d20b8f7 100644 --- a/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.hpp +++ b/src/TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.hpp @@ -15,8 +15,8 @@ #include <TNL/Meshes/Grid.h> namespace TNL { - namespace Meshes { - namespace DistributedMeshes { +namespace Meshes { +namespace DistributedMeshes { /* * TODO: This could work when the MPI directions are rewritten @@ -32,6 +32,9 @@ getOverlaps( const DistributedMeshType* distributedMesh, IndexType subdomainOverlapSize, const SubdomainOverlapsType& periodicBoundariesOverlapSize ) { + // initialize to 0 + lower = upper = 0; + if( ! MPI::isDistributed() ) return; TNL_ASSERT_TRUE( distributedMesh != NULL, "" ); @@ -70,6 +73,9 @@ getOverlaps( const DistributedMeshType* distributedMesh, const SubdomainOverlapsType& lowerPeriodicBoundariesOverlapSize, const SubdomainOverlapsType& upperPeriodicBoundariesOverlapSize ) { + // initialize to 0 + lower = upper = 0; + if( MPI::GetSize() == 1 ) return; TNL_ASSERT_TRUE( distributedMesh != NULL, "" ); @@ -101,6 +107,9 @@ getOverlaps( const DistributedMeshType* distributedMesh, const SubdomainOverlapsType& lowerPeriodicBoundariesOverlapSize, const SubdomainOverlapsType& upperPeriodicBoundariesOverlapSize ) { + // initialize to 0 + lower = upper = 0; + if( MPI::GetSize() == 1 ) return; TNL_ASSERT_TRUE( distributedMesh != NULL, "" ); @@ -143,6 +152,9 @@ getOverlaps( const DistributedMeshType* distributedMesh, const SubdomainOverlapsType& lowerPeriodicBoundariesOverlapSize, const SubdomainOverlapsType& upperPeriodicBoundariesOverlapSize ) { + // initialize to 0 + lower = upper = 0; + if( MPI::GetSize() == 1 ) return; TNL_ASSERT_TRUE( distributedMesh != NULL, "" ); @@ -181,6 +193,6 @@ getOverlaps( const DistributedMeshType* distributedMesh, upper[ 2 ] = upperPeriodicBoundariesOverlapSize[ 2 ]; } - } // namespace DistributedMeshes - } // namespace Meshes +} // namespace DistributedMeshes +} // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/DummyMesh.h b/src/TNL/Meshes/DummyMesh.h index e0caf6d3c403fd6227f7b8ab269c0ea1cc9e5267..13337da6e654a381a8d390bd988e163288a4b4f8 100644 --- a/src/TNL/Meshes/DummyMesh.h +++ b/src/TNL/Meshes/DummyMesh.h @@ -10,8 +10,6 @@ #pragma once -#include <TNL/String.h> -#include <TNL/File.h> #include <TNL/Devices/Host.h> namespace TNL { @@ -26,16 +24,8 @@ public: typedef Real RealType; typedef Device DeviceType; typedef Index IndexType; - - constexpr static int getMeshDimension() { return 1; } - - void save( File& file ) const {} - - void load( File& file ) {} - void save( const String& fileName ) const {} - - void load( const String& fileName ) {} + constexpr static int getMeshDimension() { return 1; } }; } // namespace Meshes diff --git a/src/TNL/Meshes/Grid.h b/src/TNL/Meshes/Grid.h index c196e8b88708bd228707c3b6d059a35a4039a3f8..4d69fc3c4a22ba1cebf2313d266014b7dc4767cd 100644 --- a/src/TNL/Meshes/Grid.h +++ b/src/TNL/Meshes/Grid.h @@ -10,21 +10,45 @@ #pragma once -#include <TNL/Object.h> #include <TNL/Devices/Host.h> -#include <TNL/Containers/StaticVector.h> -#include <TNL/Containers/Vector.h> namespace TNL { -namespace Meshes { +namespace Meshes { template< int Dimension, typename Real = double, typename Device = Devices::Host, typename Index = int > -class Grid : public Object +class Grid; + +template< int Dimension, typename Real, typename Device, typename Index > +bool operator==( const Grid< Dimension, Real, Device, Index >& lhs, + const Grid< Dimension, Real, Device, Index >& rhs ) +{ + return lhs.getDimensions() == rhs.getDimensions() + && lhs.getOrigin() == rhs.getOrigin() + && lhs.getProportions() == rhs.getProportions(); +} + +template< int Dimension, typename Real, typename Device, typename Index > +bool operator!=( const Grid< Dimension, Real, Device, Index >& lhs, + const Grid< Dimension, Real, Device, Index >& rhs ) +{ + return ! (lhs == rhs); +} + +template< int Dimension, typename Real, typename Device, typename Index > +std::ostream& operator<<( std::ostream& str, const Grid< Dimension, Real, Device, Index >& grid ) { -}; + str << "Grid dimensions: " << grid.getDimensions() << std::endl; + str << " origin: " << grid.getOrigin() << std::endl; + str << " proportions: " << grid.getProportions() << std::endl; + str << " localBegin: " << grid.getLocalBegin() << std::endl; + str << " localEnd: " << grid.getLocalEnd() << std::endl; + str << " interiorBegin: " << grid.getInteriorBegin() << std::endl; + str << " interiorEnd: " << grid.getInteriorEnd() << std::endl; + return str; +} } // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/GridDetails/Grid1D.h b/src/TNL/Meshes/GridDetails/Grid1D.h index 67b6e78e8c7f0c3a243abc80dab2fe4d319ac8b1..64f783a174252a8153a5406eed14e661f541b04e 100644 --- a/src/TNL/Meshes/GridDetails/Grid1D.h +++ b/src/TNL/Meshes/GridDetails/Grid1D.h @@ -17,7 +17,6 @@ #include <TNL/Meshes/GridDetails/NeighborGridEntityGetter.h> #include <TNL/Meshes/GridEntity.h> #include <TNL/Meshes/GridEntityConfig.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> namespace TNL { namespace Meshes { @@ -25,17 +24,14 @@ namespace Meshes { template< typename Real, typename Device, typename Index > -class Grid< 1, Real, Device, Index > : public Object +class Grid< 1, Real, Device, Index > { - public: - - typedef Real RealType; - typedef Device DeviceType; - typedef Index GlobalIndexType; - typedef Containers::StaticVector< 1, Real > PointType; - typedef Containers::StaticVector< 1, Index > CoordinatesType; - - typedef DistributedMeshes::DistributedMesh <Grid> DistributedMeshType; +public: + using RealType = Real; + using DeviceType = Device; + using GlobalIndexType = Index; + using PointType = Containers::StaticVector< 1, Real >; + using CoordinatesType = Containers::StaticVector< 1, Index >; // TODO: deprecated and to be removed (GlobalIndexType shall be used instead) typedef Index IndexType; @@ -57,22 +53,12 @@ class Grid< 1, Real, Device, Index > : public Object * \brief Basic constructor. */ Grid(); - + Grid( const Index xSize ); // empty destructor is needed only to avoid crappy nvcc warnings ~Grid() {} - /** - * \brief Returns (host) type of grid Real (value), Device type and the type of Index. - */ - static String getSerializationType(); - - /** - * \brief Returns (host) type of grid Real (value), Device type and the type of Index. - */ - virtual String getSerializationTypeVirtual() const; - /** * \brief Sets the size of dimensions. * \param xSize Size of dimesion x. @@ -88,6 +74,26 @@ class Grid< 1, Real, Device, Index > : public Object __cuda_callable__ const CoordinatesType& getDimensions() const; + void setLocalBegin( const CoordinatesType& begin ); + + __cuda_callable__ + const CoordinatesType& getLocalBegin() const; + + void setLocalEnd( const CoordinatesType& end ); + + __cuda_callable__ + const CoordinatesType& getLocalEnd() const; + + void setInteriorBegin( const CoordinatesType& begin ); + + __cuda_callable__ + const CoordinatesType& getInteriorBegin() const; + + void setInteriorEnd( const CoordinatesType& end ); + + __cuda_callable__ + const CoordinatesType& getInteriorEnd() const; + /** * \brief Sets the origin. * \param origin Starting point of this grid. @@ -180,42 +186,18 @@ class Grid< 1, Real, Device, Index > : public Object */ __cuda_callable__ inline RealType getSmallestSpaceStep() const; - - void setDistMesh(DistributedMeshType * distMesh); - - DistributedMeshType * getDistributedMesh() const; - - /** - * \brief Method for saving the object to a file as a binary data - */ - void save( File& file ) const; - - /** - * \brief Method for restoring the object from a file. - */ - void load( File& file ); - - /** - * \brief Method for saving the object to a file. - */ - void save( const String& fileName ) const; - - /** - * \brief Method for restoring the object from a file. - */ - void load( const String& fileName ); void writeProlog( Logger& logger ) const; - protected: +protected: void computeProportions(); - + void computeSpaceStepPowers(); void computeSpaceSteps(); - CoordinatesType dimensions; + CoordinatesType dimensions, localBegin, localEnd, interiorBegin, interiorEnd; IndexType numberOfCells, numberOfVertices; @@ -224,8 +206,6 @@ class Grid< 1, Real, Device, Index > : public Object PointType spaceSteps; RealType spaceStepsProducts[ 5 ]; - - DistributedMeshType *distGrid; }; } // namespace Meshes diff --git a/src/TNL/Meshes/GridDetails/Grid1D_impl.h b/src/TNL/Meshes/GridDetails/Grid1D_impl.h index 679b473f1cebdc9e95a515676aec7bbceeb13229..0ad33b103f5130413f446912e4fb551e8c3844e3 100644 --- a/src/TNL/Meshes/GridDetails/Grid1D_impl.h +++ b/src/TNL/Meshes/GridDetails/Grid1D_impl.h @@ -14,7 +14,6 @@ #include <iomanip> #include <TNL/String.h> #include <TNL/Assert.h> -#include <TNL/Meshes/GridDetails/GnuplotWriter.h> #include <TNL/Meshes/GridDetails/GridEntityGetter_impl.h> #include <TNL/Meshes/GridDetails/NeighborGridEntityGetter1D_impl.h> #include <TNL/Meshes/GridDetails/Grid1D.h> @@ -28,8 +27,7 @@ template< typename Real, typename Index > Grid< 1, Real, Device, Index >::Grid() : numberOfCells( 0 ), - numberOfVertices( 0 ), - distGrid(nullptr) + numberOfVertices( 0 ) { } @@ -38,32 +36,11 @@ template< typename Real, typename Index > Grid< 1, Real, Device, Index >::Grid( const Index xSize ) : numberOfCells( 0 ), - numberOfVertices( 0 ), - distGrid(nullptr) + numberOfVertices( 0 ) { this->setDimensions( xSize ); } -template< typename Real, - typename Device, - typename Index > -String Grid< 1, Real, Device, Index >::getSerializationType() -{ - return String( "Meshes::Grid< " ) + - convertToString( getMeshDimension() ) + ", " + - getType< RealType >() + ", " + - getType< Devices::Host >() + ", " + - getType< IndexType >() + " >"; -}; - -template< typename Real, - typename Device, - typename Index > -String Grid< 1, Real, Device, Index >::getSerializationTypeVirtual() const -{ - return this->getSerializationType(); -}; - template< typename Real, typename Device, typename Index > @@ -87,7 +64,7 @@ void Grid< 1, Real, Device, Index > ::computeSpaceStepPowers() this->spaceStepsProducts[ 2 ] = 1.0; this->spaceStepsProducts[ 3 ] = hx; this->spaceStepsProducts[ 4 ] = hx * hx; - + } @@ -112,11 +89,17 @@ template< typename Real, typename Index > void Grid< 1, Real, Device, Index >::setDimensions( const Index xSize ) { - TNL_ASSERT_GT( xSize, 0, "Grid size must be positive." ); + TNL_ASSERT_GE( xSize, 0, "Grid size must be non-negative." ); this->dimensions.x() = xSize; this->numberOfCells = xSize; this->numberOfVertices = xSize + 1; computeSpaceSteps(); + + // only default behaviour, DistributedGrid must use the setters explicitly after setDimensions + localBegin = 0; + interiorBegin = 1; + localEnd = dimensions; + interiorEnd = dimensions - 1; } template< typename Real, @@ -137,11 +120,84 @@ const typename Grid< 1, Real, Device, Index >::CoordinatesType& return this->dimensions; } +template< typename Real, + typename Device, + typename Index > +void Grid< 1, Real, Device, Index >::setLocalBegin( const CoordinatesType& begin ) +{ + localBegin = begin; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 1, Real, Device, Index >::CoordinatesType& + Grid< 1, Real, Device, Index >::getLocalBegin() const +{ + return localBegin; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 1, Real, Device, Index >::setLocalEnd( const CoordinatesType& end ) +{ + localEnd = end; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 1, Real, Device, Index >::CoordinatesType& + Grid< 1, Real, Device, Index >:: + getLocalEnd() const +{ + return localEnd; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 1, Real, Device, Index >::setInteriorBegin( const CoordinatesType& begin ) +{ + interiorBegin = begin; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 1, Real, Device, Index >::CoordinatesType& + Grid< 1, Real, Device, Index >::getInteriorBegin() const +{ + return interiorBegin; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 1, Real, Device, Index >::setInteriorEnd( const CoordinatesType& end ) +{ + interiorEnd = end; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 1, Real, Device, Index >::CoordinatesType& + Grid< 1, Real, Device, Index >::getInteriorEnd() const +{ + return interiorEnd; +} + template< typename Real, typename Device, typename Index > void Grid< 1, Real, Device, Index >::setDomain( const PointType& origin, - const PointType& proportions ) + const PointType& proportions ) { this->origin = origin; this->proportions = proportions; @@ -247,7 +303,7 @@ getSpaceSteps() const template< typename Real, typename Device, typename Index > -inline void +inline void Grid< 1, Real, Device, Index >:: setSpaceSteps(const typename Grid< 1, Real, Device, Index >::PointType& steps) { @@ -290,63 +346,6 @@ getSmallestSpaceStep() const return this->spaceSteps.x(); } -template< typename Real, - typename Device, - typename Index > -void Grid< 1, Real, Device, Index >:: setDistMesh(DistributedMeshType * distMesh) -{ - this->distGrid=distMesh; -} - -template< typename Real, - typename Device, - typename Index > -DistributedMeshes::DistributedMesh <Grid< 1, Real, Device, Index >> * -Grid< 1, Real, Device, Index >:: getDistributedMesh(void) const -{ - return this->distGrid; -} - -template< typename Real, - typename Device, - typename Index > -void Grid< 1, Real, Device, Index >::save( File& file ) const -{ - Object::save( file ); - this->origin.save( file ); - this->proportions.save( file ); - this->dimensions.save( file ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 1, Real, Device, Index >::load( File& file ) -{ - Object::load( file ); - CoordinatesType dimensions; - this->origin.load( file ); - this->proportions.load( file ); - dimensions.load( file ); - this->setDimensions( dimensions ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 1, Real, Device, Index >::save( const String& fileName ) const -{ - Object::save( fileName ); -} - -template< typename Real, - typename Device, - typename Index > -void Grid< 1, Real, Device, Index >::load( const String& fileName ) -{ - Object::load( fileName ); -} - template< typename Real, typename Device, typename Index > @@ -354,8 +353,6 @@ void Grid< 1, Real, Device, Index >:: writeProlog( Logger& logger ) const { - if( this->getDistributedMesh() && this->getDistributedMesh()->isDistributed() ) - return this->getDistributedMesh()->writeProlog( logger ); logger.writeParameter( "Dimension:", getMeshDimension() ); logger.writeParameter( "Domain origin:", this->origin ); logger.writeParameter( "Domain proportions:", this->proportions ); diff --git a/src/TNL/Meshes/GridDetails/Grid2D.h b/src/TNL/Meshes/GridDetails/Grid2D.h index 3fd9194bd74517085227c84a97a4d8061d3d8221..d11487b5d84cd757735f81391d2aea8aee6982df 100644 --- a/src/TNL/Meshes/GridDetails/Grid2D.h +++ b/src/TNL/Meshes/GridDetails/Grid2D.h @@ -17,7 +17,6 @@ #include <TNL/Meshes/GridDetails/NeighborGridEntityGetter.h> #include <TNL/Meshes/GridEntity.h> #include <TNL/Meshes/GridEntityConfig.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> namespace TNL { namespace Meshes { @@ -25,7 +24,7 @@ namespace Meshes { template< typename Real, typename Device, typename Index > -class Grid< 2, Real, Device, Index > : public Object +class Grid< 2, Real, Device, Index > { public: @@ -35,8 +34,6 @@ class Grid< 2, Real, Device, Index > : public Object typedef Containers::StaticVector< 2, Real > PointType; typedef Containers::StaticVector< 2, Index > CoordinatesType; - typedef DistributedMeshes::DistributedMesh <Grid> DistributedMeshType; - // TODO: deprecated and to be removed (GlobalIndexType shall be used instead) typedef Index IndexType; @@ -60,16 +57,6 @@ class Grid< 2, Real, Device, Index > : public Object // empty destructor is needed only to avoid crappy nvcc warnings ~Grid() {} - /** - * \brief See Grid1D::getSerializationType(). - */ - static String getSerializationType(); - - /** - * \brief See Grid1D::getSerializationTypeVirtual(). - */ - virtual String getSerializationTypeVirtual() const; - /** * \brief Sets the size of dimensions. * \param xSize Size of dimension x. @@ -88,6 +75,26 @@ class Grid< 2, Real, Device, Index > : public Object __cuda_callable__ const CoordinatesType& getDimensions() const; + void setLocalBegin( const CoordinatesType& begin ); + + __cuda_callable__ + const CoordinatesType& getLocalBegin() const; + + void setLocalEnd( const CoordinatesType& end ); + + __cuda_callable__ + const CoordinatesType& getLocalEnd() const; + + void setInteriorBegin( const CoordinatesType& begin ); + + __cuda_callable__ + const CoordinatesType& getInteriorBegin() const; + + void setInteriorEnd( const CoordinatesType& end ); + + __cuda_callable__ + const CoordinatesType& getInteriorEnd() const; + /** * \brief See Grid1D::setDomain(). */ @@ -179,44 +186,19 @@ class Grid< 2, Real, Device, Index > : public Object __cuda_callable__ inline RealType getSmallestSpaceStep() const; - - void setDistMesh(DistributedMeshType * distGrid); - - DistributedMeshType * getDistributedMesh() const; - - /** - * \brief See Grid1D::save( File& file ) const. - */ - void save( File& file ) const; - - /** - * \brief See Grid1D::load( File& file ). - */ - void load( File& file ); - - /** - * \brief See Grid1D::save( const String& fileName ) const. - */ - void save( const String& fileName ) const; - - /** - * \brief See Grid1D::load( const String& fileName ). - */ - void load( const String& fileName ); - void writeProlog( Logger& logger ) const; protected: - + void computeProportions(); - + __cuda_callable__ void computeSpaceStepPowers(); __cuda_callable__ void computeSpaceSteps(); - CoordinatesType dimensions; + CoordinatesType dimensions, localBegin, localEnd, interiorBegin, interiorEnd; IndexType numberOfCells, numberOfNxFaces, numberOfNyFaces, numberOfFaces, numberOfVertices; @@ -225,9 +207,7 @@ class Grid< 2, Real, Device, Index > : public Object PointType spaceSteps; RealType spaceStepsProducts[ 5 ][ 5 ]; - - DistributedMeshType *distGrid; - + template< typename, typename, int > friend class GridEntityGetter; }; diff --git a/src/TNL/Meshes/GridDetails/Grid2D_impl.h b/src/TNL/Meshes/GridDetails/Grid2D_impl.h index 3d8a4c19400c807aa5adf0bc701daf28ec6a63a9..fc290d23d430fa53b909beb7cdb588f1e9174785 100644 --- a/src/TNL/Meshes/GridDetails/Grid2D_impl.h +++ b/src/TNL/Meshes/GridDetails/Grid2D_impl.h @@ -14,12 +14,10 @@ #include <iomanip> #include <TNL/String.h> #include <TNL/Assert.h> -#include <TNL/Meshes/GridDetails/GnuplotWriter.h> #include <TNL/Meshes/GridDetails/GridEntityGetter_impl.h> #include <TNL/Meshes/GridDetails/NeighborGridEntityGetter2D_impl.h> #include <TNL/Meshes/GridDetails/Grid2D.h> #include <TNL/Meshes/GridDetails/GridEntityMeasureGetter.h> -#include <TNL/Containers/Vector.h> namespace TNL { namespace Meshes { @@ -32,8 +30,7 @@ Grid< 2, Real, Device, Index > :: Grid() numberOfNxFaces( 0 ), numberOfNyFaces( 0 ), numberOfFaces( 0 ), - numberOfVertices( 0 ), - distGrid(nullptr) + numberOfVertices( 0 ) { } @@ -45,32 +42,11 @@ Grid< 2, Real, Device, Index >::Grid( const Index xSize, const Index ySize ) numberOfNxFaces( 0 ), numberOfNyFaces( 0 ), numberOfFaces( 0 ), - numberOfVertices( 0 ), - distGrid(nullptr) + numberOfVertices( 0 ) { this->setDimensions( xSize, ySize ); } -template< typename Real, - typename Device, - typename Index > -String Grid< 2, Real, Device, Index > :: getSerializationType() -{ - return String( "Meshes::Grid< " ) + - convertToString( getMeshDimension() ) + ", " + - getType< RealType >() + ", " + - getType< Devices::Host >() + ", " + - getType< IndexType >() + " >"; -}; - -template< typename Real, - typename Device, - typename Index > -String Grid< 2, Real, Device, Index > :: getSerializationTypeVirtual() const -{ - return this->getSerializationType(); -}; - template< typename Real, typename Device, typename Index > @@ -154,8 +130,8 @@ template< typename Real, typename Index > void Grid< 2, Real, Device, Index > :: setDimensions( const Index xSize, const Index ySize ) { - TNL_ASSERT_GT( xSize, 0, "Grid size must be positive." ); - TNL_ASSERT_GT( ySize, 0, "Grid size must be positive." ); + TNL_ASSERT_GE( xSize, 0, "Grid size must be non-negative." ); + TNL_ASSERT_GE( ySize, 0, "Grid size must be non-negative." ); this->dimensions.x() = xSize; this->dimensions.y() = ySize; @@ -165,6 +141,12 @@ void Grid< 2, Real, Device, Index > :: setDimensions( const Index xSize, const I this->numberOfFaces = this->numberOfNxFaces + this->numberOfNyFaces; this->numberOfVertices = ( xSize + 1 ) * ( ySize + 1 ); computeSpaceSteps(); + + // only default behaviour, DistributedGrid must use the setters explicitly after setDimensions + localBegin = 0; + interiorBegin = 1; + localEnd = dimensions; + interiorEnd = dimensions - 1; } template< typename Real, @@ -185,6 +167,79 @@ Grid< 2, Real, Device, Index > :: getDimensions() const return this->dimensions; } +template< typename Real, + typename Device, + typename Index > +void Grid< 2, Real, Device, Index >::setLocalBegin( const CoordinatesType& begin ) +{ + localBegin = begin; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 2, Real, Device, Index >::CoordinatesType& + Grid< 2, Real, Device, Index >::getLocalBegin() const +{ + return localBegin; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 2, Real, Device, Index >::setLocalEnd( const CoordinatesType& end ) +{ + localEnd = end; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 2, Real, Device, Index >::CoordinatesType& + Grid< 2, Real, Device, Index >:: + getLocalEnd() const +{ + return localEnd; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 2, Real, Device, Index >::setInteriorBegin( const CoordinatesType& begin ) +{ + interiorBegin = begin; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 2, Real, Device, Index >::CoordinatesType& + Grid< 2, Real, Device, Index >::getInteriorBegin() const +{ + return interiorBegin; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 2, Real, Device, Index >::setInteriorEnd( const CoordinatesType& end ) +{ + interiorEnd = end; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 2, Real, Device, Index >::CoordinatesType& + Grid< 2, Real, Device, Index >::getInteriorEnd() const +{ + return interiorEnd; +} + template< typename Real, typename Device, typename Index > @@ -305,7 +360,7 @@ getSpaceSteps() const template< typename Real, typename Device, typename Index > -inline void +inline void Grid< 2, Real, Device, Index >:: setSpaceSteps(const typename Grid< 2, Real, Device, Index >::PointType& steps) { @@ -359,63 +414,6 @@ Real Grid< 2, Real, Device, Index > :: getSmallestSpaceStep() const return min( this->spaceSteps.x(), this->spaceSteps.y() ); } -template< typename Real, - typename Device, - typename Index > -void Grid< 2, Real, Device, Index >:: setDistMesh(DistributedMeshType* distMesh) -{ - this->distGrid=distMesh; -} - -template< typename Real, - typename Device, - typename Index > -DistributedMeshes::DistributedMesh <Grid< 2, Real, Device, Index >> * -Grid< 2, Real, Device, Index >:: getDistributedMesh(void) const -{ - return this->distGrid; -} - -template< typename Real, - typename Device, - typename Index > -void Grid< 2, Real, Device, Index > :: save( File& file ) const -{ - Object::save( file ); - this->origin.save( file ); - this->proportions.save( file ); - this->dimensions.save( file ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 2, Real, Device, Index > :: load( File& file ) -{ - Object::load( file ); - CoordinatesType dimensions; - this->origin.load( file ); - this->proportions.load( file ); - dimensions.load( file ); - this->setDimensions( dimensions ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 2, Real, Device, Index > :: save( const String& fileName ) const -{ - Object::save( fileName ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 2, Real, Device, Index > :: load( const String& fileName ) -{ - Object::load( fileName ); -}; - template< typename Real, typename Device, typename Index > @@ -423,8 +421,6 @@ void Grid< 2, Real, Device, Index >:: writeProlog( Logger& logger ) const { - if( this->getDistributedMesh() && this->getDistributedMesh()->isDistributed() ) - return this->getDistributedMesh()->writeProlog( logger ); logger.writeParameter( "Dimension:", getMeshDimension() ); logger.writeParameter( "Domain origin:", this->origin ); logger.writeParameter( "Domain proportions:", this->proportions ); diff --git a/src/TNL/Meshes/GridDetails/Grid3D.h b/src/TNL/Meshes/GridDetails/Grid3D.h index 91357ba1265d120a8bd1d8a6918de9109c906201..3f1e871e023cb5adc86ef82d621b70eb02d927c4 100644 --- a/src/TNL/Meshes/GridDetails/Grid3D.h +++ b/src/TNL/Meshes/GridDetails/Grid3D.h @@ -24,7 +24,7 @@ namespace Meshes { template< typename Real, typename Device, typename Index > -class Grid< 3, Real, Device, Index > : public Object +class Grid< 3, Real, Device, Index > { public: @@ -34,8 +34,6 @@ class Grid< 3, Real, Device, Index > : public Object typedef Containers::StaticVector< 3, Real > PointType; typedef Containers::StaticVector< 3, Index > CoordinatesType; - typedef DistributedMeshes::DistributedMesh <Grid> DistributedMeshType; - // TODO: deprecated and to be removed (GlobalIndexType shall be used instead) typedef Index IndexType; @@ -60,16 +58,6 @@ class Grid< 3, Real, Device, Index > : public Object // empty destructor is needed only to avoid crappy nvcc warnings ~Grid() {} - /** - * \brief See Grid1D::getSerializationType(). - */ - static String getSerializationType(); - - /** - * \brief See Grid1D::getSerializationTypeVirtual(). - */ - virtual String getSerializationTypeVirtual() const; - /** * \brief Sets the size of dimensions. * \param xSize Size of dimesion x. @@ -89,6 +77,26 @@ class Grid< 3, Real, Device, Index > : public Object __cuda_callable__ const CoordinatesType& getDimensions() const; + void setLocalBegin( const CoordinatesType& begin ); + + __cuda_callable__ + const CoordinatesType& getLocalBegin() const; + + void setLocalEnd( const CoordinatesType& end ); + + __cuda_callable__ + const CoordinatesType& getLocalEnd() const; + + void setInteriorBegin( const CoordinatesType& begin ); + + __cuda_callable__ + const CoordinatesType& getInteriorBegin() const; + + void setInteriorEnd( const CoordinatesType& end ); + + __cuda_callable__ + const CoordinatesType& getInteriorEnd() const; + /** * \brief See Grid1D::setDomain(). */ @@ -152,10 +160,6 @@ class Grid< 3, Real, Device, Index > : public Object * \brief See Grid1D::setSpaceSteps(). */ inline void setSpaceSteps(const PointType& steps); - - void setDistMesh(DistributedMeshType * distGrid); - - DistributedMeshType * getDistributedMesh(void) const; /** * \brief Returns product of space steps to the xPow. @@ -191,37 +195,17 @@ class Grid< 3, Real, Device, Index > : public Object __cuda_callable__ RealType getSmallestSpaceStep() const; - /** - * \brief See Grid1D::save( File& file ) const. - */ - void save( File& file ) const; - - /** - * \brief See Grid1D::load( File& file ). - */ - void load( File& file ); - - /** - * \brief See Grid1D::save( const String& fileName ) const. - */ - void save( const String& fileName ) const; - - /** - * \brief See Grid1D::load( const String& fileName ). - */ - void load( const String& fileName ); - void writeProlog( Logger& logger ) const; protected: void computeProportions(); - - void computeSpaceStepPowers(); - + + void computeSpaceStepPowers(); + void computeSpaceSteps(); - CoordinatesType dimensions; + CoordinatesType dimensions, localBegin, localEnd, interiorBegin, interiorEnd; IndexType numberOfCells, numberOfNxFaces, numberOfNyFaces, numberOfNzFaces, numberOfNxAndNyFaces, numberOfFaces, @@ -235,8 +219,6 @@ class Grid< 3, Real, Device, Index > : public Object PointType spaceSteps; RealType spaceStepsProducts[ 5 ][ 5 ][ 5 ]; - - DistributedMeshType *distGrid; template< typename, typename, int > friend class GridEntityGetter; diff --git a/src/TNL/Meshes/GridDetails/Grid3D_impl.h b/src/TNL/Meshes/GridDetails/Grid3D_impl.h index 0b1f86d6b2d105fe68404803cfcbe322d1ffd8be..3dafeb2a3816004c90c14730fa6f2f7888fbd2de 100644 --- a/src/TNL/Meshes/GridDetails/Grid3D_impl.h +++ b/src/TNL/Meshes/GridDetails/Grid3D_impl.h @@ -14,7 +14,6 @@ #include <iomanip> #include <TNL/String.h> #include <TNL/Assert.h> -#include <TNL/Meshes/GridDetails/GnuplotWriter.h> #include <TNL/Meshes/GridDetails/GridEntityGetter_impl.h> #include <TNL/Meshes/GridDetails/NeighborGridEntityGetter3D_impl.h> #include <TNL/Meshes/GridDetails/Grid3D.h> @@ -38,8 +37,7 @@ Grid< 3, Real, Device, Index > :: Grid() numberOfDzEdges( 0 ), numberOfDxAndDyEdges( 0 ), numberOfEdges( 0 ), - numberOfVertices( 0 ), - distGrid(nullptr) + numberOfVertices( 0 ) { } @@ -58,33 +56,12 @@ Grid< 3, Real, Device, Index >::Grid( const Index xSize, const Index ySize, cons numberOfDzEdges( 0 ), numberOfDxAndDyEdges( 0 ), numberOfEdges( 0 ), - numberOfVertices( 0 ), - distGrid(nullptr) + numberOfVertices( 0 ) { this->setDimensions( xSize, ySize, zSize ); } -template< typename Real, - typename Device, - typename Index > -String Grid< 3, Real, Device, Index > :: getSerializationType() -{ - return String( "Meshes::Grid< " ) + - convertToString( getMeshDimension() ) + ", " + - getType< RealType >() + ", " + - getType< Devices::Host >() + ", " + - getType< IndexType >() + " >"; -}; - -template< typename Real, - typename Device, - typename Index > -String Grid< 3, Real, Device, Index > :: getSerializationTypeVirtual() const -{ - return this->getSerializationType(); -}; - template< typename Real, typename Device, typename Index > @@ -97,9 +74,9 @@ void Grid< 3, Real, Device, Index > :: computeSpaceSteps() this->spaceSteps.x() = this->proportions.x() / ( Real ) this->getDimensions().x(); this->spaceSteps.y() = this->proportions.y() / ( Real ) this->getDimensions().y(); this->spaceSteps.z() = this->proportions.z() / ( Real ) this->getDimensions().z(); - + this->computeSpaceStepPowers(); - + } }; @@ -107,7 +84,7 @@ template< typename Real, typename Device, typename Index > void Grid< 3, Real, Device, Index > :: computeSpaceStepPowers() -{ +{ const RealType& hx = this->spaceSteps.x(); const RealType& hy = this->spaceSteps.y(); const RealType& hz = this->spaceSteps.z(); @@ -203,9 +180,9 @@ template< typename Real, typename Index > void Grid< 3, Real, Device, Index > :: setSpaceSteps(const PointType& steps) { - this->spaceSteps=steps; + this->spaceSteps=steps; computeSpaceStepPowers(); - computeProportions(); + computeProportions(); } @@ -214,9 +191,9 @@ template< typename Real, typename Index > void Grid< 3, Real, Device, Index > :: setDimensions( const Index xSize, const Index ySize, const Index zSize ) { - TNL_ASSERT_GT( xSize, 0, "Grid size must be positive." ); - TNL_ASSERT_GT( ySize, 0, "Grid size must be positive." ); - TNL_ASSERT_GT( zSize, 0, "Grid size must be positive." ); + TNL_ASSERT_GE( xSize, 0, "Grid size must be non-negative." ); + TNL_ASSERT_GE( ySize, 0, "Grid size must be non-negative." ); + TNL_ASSERT_GE( zSize, 0, "Grid size must be non-negative." ); this->dimensions.x() = xSize; this->dimensions.y() = ySize; @@ -241,6 +218,12 @@ void Grid< 3, Real, Device, Index > :: setDimensions( const Index xSize, const I this->cellZNeighborsStep = xSize * ySize; computeSpaceSteps(); + + // only default behaviour, DistributedGrid must use the setters explicitly after setDimensions + localBegin = 0; + interiorBegin = 1; + localEnd = dimensions; + interiorEnd = dimensions - 1; } template< typename Real, @@ -261,6 +244,79 @@ const typename Grid< 3, Real, Device, Index > :: CoordinatesType& return this->dimensions; } +template< typename Real, + typename Device, + typename Index > +void Grid< 3, Real, Device, Index >::setLocalBegin( const CoordinatesType& begin ) +{ + localBegin = begin; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 3, Real, Device, Index >::CoordinatesType& + Grid< 3, Real, Device, Index >::getLocalBegin() const +{ + return localBegin; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 3, Real, Device, Index >::setLocalEnd( const CoordinatesType& end ) +{ + localEnd = end; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 3, Real, Device, Index >::CoordinatesType& + Grid< 3, Real, Device, Index >:: + getLocalEnd() const +{ + return localEnd; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 3, Real, Device, Index >::setInteriorBegin( const CoordinatesType& begin ) +{ + interiorBegin = begin; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 3, Real, Device, Index >::CoordinatesType& + Grid< 3, Real, Device, Index >::getInteriorBegin() const +{ + return interiorBegin; +} + +template< typename Real, + typename Device, + typename Index > +void Grid< 3, Real, Device, Index >::setInteriorEnd( const CoordinatesType& end ) +{ + interiorEnd = end; +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +const typename Grid< 3, Real, Device, Index >::CoordinatesType& + Grid< 3, Real, Device, Index >::getInteriorEnd() const +{ + return interiorEnd; +} + template< typename Real, typename Device, typename Index > @@ -429,63 +485,6 @@ Real Grid< 3, Real, Device, Index > :: getSmallestSpaceStep() const return min( this->spaceSteps.x(), min( this->spaceSteps.y(), this->spaceSteps.z() ) ); } -template< typename Real, - typename Device, - typename Index > -void Grid< 3, Real, Device, Index >:: setDistMesh(DistributedMeshType * distMesh) -{ - this->distGrid=distMesh; -} - -template< typename Real, - typename Device, - typename Index > -DistributedMeshes::DistributedMesh <Grid< 3, Real, Device, Index >> * -Grid< 3, Real, Device, Index >:: getDistributedMesh(void) const -{ - return this->distGrid; -} - -template< typename Real, - typename Device, - typename Index > -void Grid< 3, Real, Device, Index > :: save( File& file ) const -{ - Object::save( file ); - this->origin.save( file ); - this->proportions.save( file ); - this->dimensions.save( file ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 3, Real, Device, Index >::load( File& file ) -{ - Object :: load( file ); - CoordinatesType dimensions; - this->origin.load( file ); - this->proportions.load( file ); - dimensions.load( file ); - this->setDimensions( dimensions ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 3, Real, Device, Index >::save( const String& fileName ) const -{ - Object::save( fileName ); -}; - -template< typename Real, - typename Device, - typename Index > -void Grid< 3, Real, Device, Index >::load( const String& fileName ) -{ - Object::load( fileName ); -}; - template< typename Real, typename Device, typename Index > @@ -493,8 +492,6 @@ void Grid< 3, Real, Device, Index >:: writeProlog( Logger& logger ) const { - if( this->getDistributedMesh() && this->getDistributedMesh()->isDistributed() ) - return this->getDistributedMesh()->writeProlog( logger ); logger.writeParameter( "Dimension:", getMeshDimension() ); logger.writeParameter( "Domain origin:", this->origin ); logger.writeParameter( "Domain proportions:", this->proportions ); diff --git a/src/TNL/Meshes/GridDetails/GridTraverser_1D.hpp b/src/TNL/Meshes/GridDetails/GridTraverser_1D.hpp index c1aab9660d50ee8fe6917ae08c6bb869e333c056..47dacb1a25345b10044c75e90e3f75d1fd08d9fd 100644 --- a/src/TNL/Meshes/GridDetails/GridTraverser_1D.hpp +++ b/src/TNL/Meshes/GridDetails/GridTraverser_1D.hpp @@ -52,7 +52,7 @@ processEntities( entity.getCoordinates() = begin; entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); - entity.getCoordinates() = end; + entity.getCoordinates() = end - 1; entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); } @@ -66,7 +66,7 @@ processEntities( GridEntity entity( *gridPointer ); #pragma omp for // TODO: g++ 5.5 crashes when coding this loop without auxiliary x as bellow - for( IndexType x = begin.x(); x <= end.x(); x++ ) + for( IndexType x = begin.x(); x < end.x(); x++ ) { entity.getCoordinates().x() = x; entity.refresh(); @@ -78,7 +78,7 @@ processEntities( { GridEntity entity( *gridPointer ); for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.refresh(); @@ -88,7 +88,7 @@ processEntities( #else GridEntity entity( *gridPointer ); for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.refresh(); @@ -119,10 +119,10 @@ GridTraverser1D( typedef Index IndexType; typedef Meshes::Grid< 1, Real, Devices::Cuda, Index > GridType; typename GridType::CoordinatesType coordinates; - + coordinates.x() = begin.x() + ( gridIdx * Cuda::getMaxGridSize() + blockIdx.x ) * blockDim.x + threadIdx.x; - if( coordinates <= end ) - { + if( coordinates < end ) + { GridEntity entity( *grid, coordinates ); entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); @@ -145,7 +145,7 @@ GridBoundaryTraverser1D( typedef Index IndexType; typedef Meshes::Grid< 1, Real, Devices::Cuda, Index > GridType; typename GridType::CoordinatesType coordinates; - + if( threadIdx.x == 0 ) { coordinates.x() = begin.x(); @@ -155,7 +155,7 @@ GridBoundaryTraverser1D( } if( threadIdx.x == 1 ) { - coordinates.x() = end.x(); + coordinates.x() = end.x() - 1; GridEntity entity( *grid, coordinates ); entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); @@ -204,7 +204,7 @@ processEntities( blockSize, blocksCount, gridsCount, - end.x() - begin.x() + 1 ); + end.x() - begin.x() ); dim3 gridIdx; for( gridIdx.x = 0; gridIdx.x < gridsCount.x; gridIdx.x++ ) { @@ -225,7 +225,7 @@ processEntities( /*dim3 cudaBlockSize( 256 ); dim3 cudaBlocks; - cudaBlocks.x = Cuda::getNumberOfBlocks( end.x() - begin.x() + 1, cudaBlockSize.x ); + cudaBlocks.x = Cuda::getNumberOfBlocks( end.x() - begin.x(), cudaBlockSize.x ); const IndexType cudaXGrids = Cuda::getNumberOfGrids( cudaBlocks.x ); for( IndexType gridXIdx = 0; gridXIdx < cudaXGrids; gridXIdx ++ ) diff --git a/src/TNL/Meshes/GridDetails/GridTraverser_2D.hpp b/src/TNL/Meshes/GridDetails/GridTraverser_2D.hpp index a1a33cdfcaef51ddbca46ceac66fd9d0ac98df05..19d0c43eb575d23405770138f218e366de35d05e 100644 --- a/src/TNL/Meshes/GridDetails/GridTraverser_2D.hpp +++ b/src/TNL/Meshes/GridDetails/GridTraverser_2D.hpp @@ -49,28 +49,28 @@ processEntities( if( processOnlyBoundaryEntities ) { GridEntity entity( *gridPointer, begin, gridEntityParameters... ); - + if( YOrthogonalBoundary ) for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.getCoordinates().y() = begin.y(); entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); - entity.getCoordinates().y() = end.y(); + entity.getCoordinates().y() = end.y() - 1; entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); } if( XOrthogonalBoundary ) for( entity.getCoordinates().y() = begin.y(); - entity.getCoordinates().y() <= end.y(); + entity.getCoordinates().y() < end.y(); entity.getCoordinates().y() ++ ) { entity.getCoordinates().x() = begin.x(); entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); - entity.getCoordinates().x() = end.x(); + entity.getCoordinates().x() = end.x() - 1; entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); } @@ -85,8 +85,8 @@ processEntities( GridEntity entity( *gridPointer, begin, gridEntityParameters... ); #pragma omp for // TODO: g++ 5.5 crashes when coding this loop without auxiliary x and y as bellow - for( IndexType y = begin.y(); y <= end.y(); y ++ ) - for( IndexType x = begin.x(); x <= end.x(); x ++ ) + for( IndexType y = begin.y(); y < end.y(); y ++ ) + for( IndexType x = begin.x(); x < end.x(); x ++ ) { entity.getCoordinates().x() = x; entity.getCoordinates().y() = y; @@ -99,10 +99,10 @@ processEntities( { GridEntity entity( *gridPointer, begin, gridEntityParameters... ); for( entity.getCoordinates().y() = begin.y(); - entity.getCoordinates().y() <= end.y(); + entity.getCoordinates().y() < end.y(); entity.getCoordinates().y() ++ ) for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.refresh(); @@ -112,10 +112,10 @@ processEntities( #else GridEntity entity( *gridPointer, begin, gridEntityParameters... ); for( entity.getCoordinates().y() = begin.y(); - entity.getCoordinates().y() <= end.y(); + entity.getCoordinates().y() < end.y(); entity.getCoordinates().y() ++ ) for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.refresh(); @@ -128,7 +128,7 @@ processEntities( /**** * 2D traverser, CUDA */ -#ifdef HAVE_CUDA +#ifdef HAVE_CUDA template< typename Real, typename Index, typename GridEntity, @@ -136,7 +136,7 @@ template< typename Real, typename EntitiesProcessor, bool processOnlyBoundaryEntities, typename... GridEntityParameters > -__global__ void +__global__ void GridTraverser2D( const Meshes::Grid< 2, Real, Devices::Cuda, Index >* grid, UserData userData, @@ -150,8 +150,8 @@ GridTraverser2D( coordinates.x() = begin.x() + Cuda::getGlobalThreadIdx_x( gridIdx ); coordinates.y() = begin.y() + Cuda::getGlobalThreadIdx_y( gridIdx ); - - if( coordinates <= end ) + + if( coordinates < end ) { GridEntity entity( *grid, coordinates, gridEntityParameters... ); entity.refresh(); @@ -173,7 +173,7 @@ template< typename Real, typename EntitiesProcessor, bool processOnlyBoundaryEntities, typename... GridEntityParameters > -__global__ void +__global__ void GridTraverser2DBoundaryAlongX( const Meshes::Grid< 2, Real, Devices::Cuda, Index >* grid, UserData userData, @@ -188,8 +188,8 @@ GridTraverser2DBoundaryAlongX( coordinates.x() = beginX + Cuda::getGlobalThreadIdx_x( gridIdx ); coordinates.y() = fixedY; - - if( coordinates.x() <= endX ) + + if( coordinates.x() < endX ) { GridEntity entity( *grid, coordinates, gridEntityParameters... ); entity.refresh(); @@ -208,7 +208,7 @@ template< typename Real, typename EntitiesProcessor, bool processOnlyBoundaryEntities, typename... GridEntityParameters > -__global__ void +__global__ void GridTraverser2DBoundaryAlongY( const Meshes::Grid< 2, Real, Devices::Cuda, Index >* grid, UserData userData, @@ -223,8 +223,8 @@ GridTraverser2DBoundaryAlongY( coordinates.x() = fixedX; coordinates.y() = beginY + Cuda::getGlobalThreadIdx_x( gridIdx ); - - if( coordinates.y() <= endY ) + + if( coordinates.y() < endY ) { GridEntity entity( *grid, coordinates, gridEntityParameters... ); entity.refresh(); @@ -232,7 +232,7 @@ GridTraverser2DBoundaryAlongY( ( *grid, userData, entity ); - } + } } @@ -243,7 +243,7 @@ template< typename Real, typename EntitiesProcessor, bool processOnlyBoundaryEntities, typename... GridEntityParameters > -__global__ void +__global__ void GridTraverser2DBoundary( const Meshes::Grid< 2, Real, Devices::Cuda, Index >* grid, UserData userData, @@ -257,17 +257,17 @@ GridTraverser2DBoundary( { using GridType = Meshes::Grid< 2, Real, Devices::Cuda, Index >; using CoordinatesType = typename GridType::CoordinatesType; - + const Index faceIdx = blockIdx.x / blocksPerFace; const Index faceBlockIdx = blockIdx.x % blocksPerFace; const Index threadId = faceBlockIdx * blockDim. x + threadIdx.x; if( faceIdx < 2 ) { - const Index entitiesAlongX = endX - beginX + 1; + const Index entitiesAlongX = endX - beginX; if( threadId < entitiesAlongX ) { - GridEntity entity( *grid, - CoordinatesType( beginX + threadId, faceIdx == 0 ? beginY : endY ), + GridEntity entity( *grid, + CoordinatesType( beginX + threadId, faceIdx == 0 ? beginY : endY - 1 ), gridEntityParameters... ); //printf( "faceIdx %d Thread %d -> %d %d \n ", faceIdx, threadId, entity.getCoordinates().x(), entity.getCoordinates().y() ); entity.refresh(); @@ -276,31 +276,31 @@ GridTraverser2DBoundary( } else { - const Index entitiesAlongY = endY - beginY - 1; + const Index entitiesAlongY = endY - beginY; if( threadId < entitiesAlongY ) { - GridEntity entity( *grid, - CoordinatesType( faceIdx == 2 ? beginX : endX, beginY + threadId + 1 ), + GridEntity entity( *grid, + CoordinatesType( faceIdx == 2 ? beginX : endX - 1, beginY + threadId + 1 ), gridEntityParameters... ); //printf( "faceIdx %d Thread %d -> %d %d \n ", faceIdx, threadId, entity.getCoordinates().x(), entity.getCoordinates().y() ); entity.refresh(); EntitiesProcessor::processEntity( *grid, userData, entity ); } } - - - + + + /*const Index aux = max( entitiesAlongX, entitiesAlongY ); const Index& warpSize = Cuda::getWarpSize(); const Index threadsPerAxis = warpSize * ( aux / warpSize + ( aux % warpSize != 0 ) ); - + Index threadId = Cuda::getGlobalThreadIdx_x( gridIdx ); - GridEntity entity( *grid, + GridEntity entity( *grid, CoordinatesType( 0, 0 ), gridEntityParameters... ); CoordinatesType& coordinates = entity.getCoordinates(); const Index axisIndex = threadId / threadsPerAxis; - //printf( "axisIndex %d, threadId %d thradsPerAxis %d \n", axisIndex, threadId, threadsPerAxis ); + //printf( "axisIndex %d, threadId %d thradsPerAxis %d \n", axisIndex, threadId, threadsPerAxis ); threadId -= axisIndex * threadsPerAxis; switch( axisIndex ) { @@ -314,7 +314,7 @@ GridTraverser2DBoundary( } break; case 2: - coordinates = CoordinatesType( beginX + threadId, endY ); + coordinates = CoordinatesType( beginX + threadId, endY - 1 ); if( threadId < entitiesAlongX ) { //printf( "X2: Thread %d -> %d %d \n ", threadId, coordinates.x(), coordinates.y() ); @@ -332,7 +332,7 @@ GridTraverser2DBoundary( } break; case 4: - coordinates = CoordinatesType( endX, beginY + threadId + 1 ); + coordinates = CoordinatesType( endX - 1, beginY + threadId + 1 ); if( threadId < entitiesAlongY ) { //printf( "Y2: Thread %d -> %d %d \n ", threadId, coordinates.x(), coordinates.y() ); @@ -341,13 +341,13 @@ GridTraverser2DBoundary( } break; }*/ - + /*if( threadId < entitiesAlongX ) { - GridEntity entity( *grid, + GridEntity entity( *grid, CoordinatesType( beginX + threadId, beginY ), gridEntityParameters... ); - //printf( "X1: Thread %d -> %d %d x %d %d \n ", threadId, + //printf( "X1: Thread %d -> %d %d x %d %d \n ", threadId, // entity.getCoordinates().x(), entity.getCoordinates().y(), // grid->getDimensions().x(), grid->getDimensions().y() ); entity.refresh(); @@ -355,8 +355,8 @@ GridTraverser2DBoundary( } else if( ( threadId -= entitiesAlongX ) < entitiesAlongX && threadId >= 0 ) { - GridEntity entity( *grid, - CoordinatesType( beginX + threadId, endY ), + GridEntity entity( *grid, + CoordinatesType( beginX + threadId, endY - 1 ), gridEntityParameters... ); entity.refresh(); //printf( "X2: Thread %d -> %d %d \n ", threadId, entity.getCoordinates().x(), entity.getCoordinates().y() ); @@ -369,12 +369,12 @@ GridTraverser2DBoundary( gridEntityParameters... ); entity.refresh(); //printf( "Y1: Thread %d -> %d %d \n ", threadId, entity.getCoordinates().x(), entity.getCoordinates().y() ); - EntitiesProcessor::processEntity( *grid, userData, entity ); + EntitiesProcessor::processEntity( *grid, userData, entity ); } else if( ( ( threadId -= entitiesAlongY - 1 ) < entitiesAlongY - 1 ) && threadId >= 0 ) { GridEntity entity( *grid, - CoordinatesType( endX, beginY + threadId + 1 ), + CoordinatesType( endX - 1, beginY + threadId + 1 ), gridEntityParameters... ); entity.refresh(); //printf( "Y2: Thread %d -> %d %d \n ", threadId, entity.getCoordinates().x(), entity.getCoordinates().y() ); @@ -407,16 +407,16 @@ processEntities( const GridEntityParameters&... gridEntityParameters ) { #ifdef HAVE_CUDA - if( processOnlyBoundaryEntities && + if( processOnlyBoundaryEntities && ( GridEntity::getEntityDimension() == 2 || GridEntity::getEntityDimension() == 0 ) ) { #ifdef GRID_TRAVERSER_USE_STREAMS dim3 cudaBlockSize( 256 ); dim3 cudaBlocksCountAlongX, cudaGridsCountAlongX, cudaBlocksCountAlongY, cudaGridsCountAlongY; - Cuda::setupThreads( cudaBlockSize, cudaBlocksCountAlongX, cudaGridsCountAlongX, end.x() - begin.x() + 1 ); - Cuda::setupThreads( cudaBlockSize, cudaBlocksCountAlongY, cudaGridsCountAlongY, end.y() - begin.y() - 1 ); - + Cuda::setupThreads( cudaBlockSize, cudaBlocksCountAlongX, cudaGridsCountAlongX, end.x() - begin.x() ); + Cuda::setupThreads( cudaBlockSize, cudaBlocksCountAlongY, cudaGridsCountAlongY, end.y() - begin.y() - 2 ); + auto& pool = Cuda::StreamPool::getInstance(); Pointers::synchronizeSmartPointersOnDevice< Devices::Cuda >(); @@ -475,16 +475,16 @@ processEntities( cudaStreamSynchronize( s3 ); cudaStreamSynchronize( s4 ); #else // not defined GRID_TRAVERSER_USE_STREAMS - dim3 cudaBlockSize( 256 ); + dim3 cudaBlockSize( 256 ); dim3 cudaBlocksCount, cudaGridsCount; - const IndexType entitiesAlongX = end.x() - begin.x() + 1; - const IndexType entitiesAlongY = end.x() - begin.x() - 1; + const IndexType entitiesAlongX = end.x() - begin.x(); + const IndexType entitiesAlongY = end.x() - begin.x() - 2; const IndexType maxFaceSize = max( entitiesAlongX, entitiesAlongY ); const IndexType blocksPerFace = maxFaceSize / cudaBlockSize.x + ( maxFaceSize % cudaBlockSize.x != 0 ); IndexType cudaThreadsCount = 4 * cudaBlockSize.x * blocksPerFace; Cuda::setupThreads( cudaBlockSize, cudaBlocksCount, cudaGridsCount, cudaThreadsCount ); - //std::cerr << "blocksPerFace = " << blocksPerFace << "Threads count = " << cudaThreadsCount - // << "cudaBlockCount = " << cudaBlocksCount.x << std::endl; + //std::cerr << "blocksPerFace = " << blocksPerFace << "Threads count = " << cudaThreadsCount + // << "cudaBlockCount = " << cudaBlocksCount.x << std::endl; dim3 gridIdx, cudaGridSize; Pointers::synchronizeSmartPointersOnDevice< Devices::Cuda >(); for( gridIdx.x = 0; gridIdx.x < cudaGridsCount.x; gridIdx.x++ ) @@ -504,17 +504,17 @@ processEntities( gridEntityParameters... ); } #endif //GRID_TRAVERSER_USE_STREAMS - //getchar(); - TNL_CHECK_CUDA_DEVICE; + //getchar(); + TNL_CHECK_CUDA_DEVICE; } else { dim3 cudaBlockSize( 16, 16 ); dim3 cudaBlocksCount, cudaGridsCount; Cuda::setupThreads( cudaBlockSize, cudaBlocksCount, cudaGridsCount, - end.x() - begin.x() + 1, - end.y() - begin.y() + 1 ); - + end.x() - begin.x(), + end.y() - begin.y() ); + auto& pool = Cuda::StreamPool::getInstance(); const cudaStream_t& s = pool.getStream( stream ); diff --git a/src/TNL/Meshes/GridDetails/GridTraverser_3D.hpp b/src/TNL/Meshes/GridDetails/GridTraverser_3D.hpp index 48e8c352348b78138dc4aa1280069562ed1fc9c5..7bfe80d7b1c4c460299c6860d6333e31da1f1172 100644 --- a/src/TNL/Meshes/GridDetails/GridTraverser_3D.hpp +++ b/src/TNL/Meshes/GridDetails/GridTraverser_3D.hpp @@ -49,49 +49,49 @@ processEntities( if( processOnlyBoundaryEntities ) { GridEntity entity( *gridPointer, begin, gridEntityParameters... ); - + if( ZOrthogonalBoundary ) for( entity.getCoordinates().y() = begin.y(); - entity.getCoordinates().y() <= end.y(); + entity.getCoordinates().y() < end.y(); entity.getCoordinates().y() ++ ) for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.getCoordinates().z() = begin.z(); entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); - entity.getCoordinates().z() = end.z(); + entity.getCoordinates().z() = end.z() - 1; entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); } if( YOrthogonalBoundary ) for( entity.getCoordinates().z() = begin.z(); - entity.getCoordinates().z() <= end.z(); + entity.getCoordinates().z() < end.z(); entity.getCoordinates().z() ++ ) for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.getCoordinates().y() = begin.y(); entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); - entity.getCoordinates().y() = end.y(); + entity.getCoordinates().y() = end.y() - 1; entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); } if( XOrthogonalBoundary ) for( entity.getCoordinates().z() = begin.z(); - entity.getCoordinates().z() <= end.z(); + entity.getCoordinates().z() < end.z(); entity.getCoordinates().z() ++ ) for( entity.getCoordinates().y() = begin.y(); - entity.getCoordinates().y() <= end.y(); + entity.getCoordinates().y() < end.y(); entity.getCoordinates().y() ++ ) { entity.getCoordinates().x() = begin.x(); entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); - entity.getCoordinates().x() = end.x(); + entity.getCoordinates().x() = end.x() - 1; entity.refresh(); EntitiesProcessor::processEntity( entity.getMesh(), userData, entity ); } @@ -106,9 +106,9 @@ processEntities( GridEntity entity( *gridPointer, begin, gridEntityParameters... ); #pragma omp for // TODO: g++ 5.5 crashes when coding this loop without auxiliary x and y as bellow - for( IndexType z = begin.z(); z <= end.z(); z ++ ) - for( IndexType y = begin.y(); y <= end.y(); y ++ ) - for( IndexType x = begin.x(); x <= end.x(); x ++ ) + for( IndexType z = begin.z(); z < end.z(); z ++ ) + for( IndexType y = begin.y(); y < end.y(); y ++ ) + for( IndexType x = begin.x(); x < end.x(); x ++ ) { entity.getCoordinates().x() = x; entity.getCoordinates().y() = y; @@ -122,13 +122,13 @@ processEntities( { GridEntity entity( *gridPointer, begin, gridEntityParameters... ); for( entity.getCoordinates().z() = begin.z(); - entity.getCoordinates().z() <= end.z(); + entity.getCoordinates().z() < end.z(); entity.getCoordinates().z() ++ ) for( entity.getCoordinates().y() = begin.y(); - entity.getCoordinates().y() <= end.y(); + entity.getCoordinates().y() < end.y(); entity.getCoordinates().y() ++ ) for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.refresh(); @@ -138,13 +138,13 @@ processEntities( #else GridEntity entity( *gridPointer, begin, gridEntityParameters... ); for( entity.getCoordinates().z() = begin.z(); - entity.getCoordinates().z() <= end.z(); + entity.getCoordinates().z() < end.z(); entity.getCoordinates().z() ++ ) for( entity.getCoordinates().y() = begin.y(); - entity.getCoordinates().y() <= end.y(); + entity.getCoordinates().y() < end.y(); entity.getCoordinates().y() ++ ) for( entity.getCoordinates().x() = begin.x(); - entity.getCoordinates().x() <= end.x(); + entity.getCoordinates().x() < end.x(); entity.getCoordinates().x() ++ ) { entity.refresh(); @@ -181,7 +181,7 @@ GridTraverser3D( coordinates.y() = begin.y() + Cuda::getGlobalThreadIdx_y( gridIdx ); coordinates.z() = begin.z() + Cuda::getGlobalThreadIdx_z( gridIdx ); - if( coordinates <= end ) + if( coordinates < end ) { GridEntity entity( *grid, coordinates, gridEntityParameters... ); entity.refresh(); @@ -202,14 +202,14 @@ template< typename Real, typename EntitiesProcessor, bool processOnlyBoundaryEntities, typename... GridEntityParameters > -__global__ void +__global__ void GridTraverser3DBoundaryAlongXY( const Meshes::Grid< 3, Real, Devices::Cuda, Index >* grid, UserData userData, const Index beginX, const Index endX, const Index beginY, - const Index endY, + const Index endY, const Index fixedZ, const dim3 gridIdx, const GridEntityParameters... gridEntityParameters ) @@ -219,9 +219,9 @@ GridTraverser3DBoundaryAlongXY( coordinates.x() = beginX + Cuda::getGlobalThreadIdx_x( gridIdx ); coordinates.y() = beginY + Cuda::getGlobalThreadIdx_y( gridIdx ); - coordinates.z() = fixedZ; - - if( coordinates.x() <= endX && coordinates.y() <= endY ) + coordinates.z() = fixedZ; + + if( coordinates.x() < endX && coordinates.y() < endY ) { GridEntity entity( *grid, coordinates, gridEntityParameters... ); entity.refresh(); @@ -239,14 +239,14 @@ template< typename Real, typename EntitiesProcessor, bool processOnlyBoundaryEntities, typename... GridEntityParameters > -__global__ void +__global__ void GridTraverser3DBoundaryAlongXZ( const Meshes::Grid< 3, Real, Devices::Cuda, Index >* grid, UserData userData, const Index beginX, const Index endX, const Index beginZ, - const Index endZ, + const Index endZ, const Index fixedY, const dim3 gridIdx, const GridEntityParameters... gridEntityParameters ) @@ -257,8 +257,8 @@ GridTraverser3DBoundaryAlongXZ( coordinates.x() = beginX + Cuda::getGlobalThreadIdx_x( gridIdx ); coordinates.y() = fixedY; coordinates.z() = beginZ + Cuda::getGlobalThreadIdx_y( gridIdx ); - - if( coordinates.x() <= endX && coordinates.z() <= endZ ) + + if( coordinates.x() < endX && coordinates.z() < endZ ) { GridEntity entity( *grid, coordinates, gridEntityParameters... ); entity.refresh(); @@ -266,7 +266,7 @@ GridTraverser3DBoundaryAlongXZ( ( *grid, userData, entity ); - } + } } template< typename Real, @@ -276,14 +276,14 @@ template< typename Real, typename EntitiesProcessor, bool processOnlyBoundaryEntities, typename... GridEntityParameters > -__global__ void +__global__ void GridTraverser3DBoundaryAlongYZ( const Meshes::Grid< 3, Real, Devices::Cuda, Index >* grid, UserData userData, const Index beginY, const Index endY, const Index beginZ, - const Index endZ, + const Index endZ, const Index fixedX, const dim3 gridIdx, const GridEntityParameters... gridEntityParameters ) @@ -294,8 +294,8 @@ GridTraverser3DBoundaryAlongYZ( coordinates.x() = fixedX; coordinates.y() = beginY + Cuda::getGlobalThreadIdx_x( gridIdx ); coordinates.z() = beginZ + Cuda::getGlobalThreadIdx_y( gridIdx ); - - if( coordinates.y() <= endY && coordinates.z() <= endZ ) + + if( coordinates.y() < endY && coordinates.z() < endZ ) { GridEntity entity( *grid, coordinates, gridEntityParameters... ); entity.refresh(); @@ -303,7 +303,7 @@ GridTraverser3DBoundaryAlongYZ( ( *grid, userData, entity ); - } + } } #endif @@ -329,18 +329,18 @@ processEntities( const int& stream, const GridEntityParameters&... gridEntityParameters ) { -#ifdef HAVE_CUDA - if( processOnlyBoundaryEntities && +#ifdef HAVE_CUDA + if( processOnlyBoundaryEntities && ( GridEntity::getEntityDimension() == 3 || GridEntity::getEntityDimension() == 0 ) ) { dim3 cudaBlockSize( 16, 16 ); - const IndexType entitiesAlongX = end.x() - begin.x() + 1; - const IndexType entitiesAlongY = end.y() - begin.y() + 1; - const IndexType entitiesAlongZ = end.z() - begin.z() + 1; - + const IndexType entitiesAlongX = end.x() - begin.x(); + const IndexType entitiesAlongY = end.y() - begin.y(); + const IndexType entitiesAlongZ = end.z() - begin.z(); + dim3 cudaBlocksCountAlongXY, cudaBlocksCountAlongXZ, cudaBlocksCountAlongYZ, cudaGridsCountAlongXY, cudaGridsCountAlongXZ, cudaGridsCountAlongYZ; - + Cuda::setupThreads( cudaBlockSize, cudaBlocksCountAlongXY, cudaGridsCountAlongXY, entitiesAlongX, entitiesAlongY ); Cuda::setupThreads( cudaBlockSize, cudaBlocksCountAlongXZ, cudaGridsCountAlongXZ, entitiesAlongX, entitiesAlongZ - 2 ); Cuda::setupThreads( cudaBlockSize, cudaBlocksCountAlongYZ, cudaGridsCountAlongYZ, entitiesAlongY - 2, entitiesAlongZ - 2 ); @@ -354,7 +354,7 @@ processEntities( const cudaStream_t& s4 = pool.getStream( stream + 3 ); const cudaStream_t& s5 = pool.getStream( stream + 4 ); const cudaStream_t& s6 = pool.getStream( stream + 5 ); - + dim3 gridIdx, gridSize; for( gridIdx.y = 0; gridIdx.y < cudaGridsCountAlongXY.y; gridIdx.y++ ) for( gridIdx.x = 0; gridIdx.x < cudaGridsCountAlongXY.x; gridIdx.x++ ) @@ -449,11 +449,11 @@ processEntities( { dim3 cudaBlockSize( 8, 8, 8 ); dim3 cudaBlocksCount, cudaGridsCount; - + Cuda::setupThreads( cudaBlockSize, cudaBlocksCount, cudaGridsCount, - end.x() - begin.x() + 1, - end.y() - begin.y() + 1, - end.z() - begin.z() + 1 ); + end.x() - begin.x(), + end.y() - begin.y(), + end.z() - begin.z() ); auto& pool = Cuda::StreamPool::getInstance(); const cudaStream_t& s = pool.getStream( stream ); diff --git a/src/TNL/Meshes/GridDetails/Traverser_Grid1D.h b/src/TNL/Meshes/GridDetails/Traverser_Grid1D.h index d6b49f9bad1d1622f5555a5ddcdeb363fe893eb1..19ce29b5c5d5b4e5033932dabfb686d9c1a75aeb 100644 --- a/src/TNL/Meshes/GridDetails/Traverser_Grid1D.h +++ b/src/TNL/Meshes/GridDetails/Traverser_Grid1D.h @@ -26,8 +26,6 @@ class Traverser< Meshes::Grid< 1, Real, Device, Index >, GridEntity, 1 > using GridType = Meshes::Grid< 1, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > @@ -56,8 +54,6 @@ class Traverser< Meshes::Grid< 1, Real, Device, Index >, GridEntity, 0 > using GridType = Meshes::Grid< 1, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > diff --git a/src/TNL/Meshes/GridDetails/Traverser_Grid1D_impl.h b/src/TNL/Meshes/GridDetails/Traverser_Grid1D_impl.h index d1f21cde2f2434f524500f29f6260d0a5e9d369e..c566cc7c05f3b3d104c7895c92dce5c84d953fc2 100644 --- a/src/TNL/Meshes/GridDetails/Traverser_Grid1D_impl.h +++ b/src/TNL/Meshes/GridDetails/Traverser_Grid1D_impl.h @@ -11,8 +11,6 @@ #pragma once #include <TNL/Meshes/GridDetails/GridTraverser.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> - namespace TNL { namespace Meshes { @@ -35,41 +33,37 @@ processBoundaryEntities( const GridPointer& gridPointer, * Boundary cells */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimensions." ); - - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || ! distributedGrid->isDistributed() ) + + if( gridPointer->getLocalBegin() < gridPointer->getInteriorBegin() && gridPointer->getInteriorEnd() < gridPointer->getLocalEnd() ) + { + // 2 boundaries (left and right) + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true >( + gridPointer, + gridPointer->getInteriorBegin() - 1, + gridPointer->getInteriorEnd() + 1, + userData, + asynchronousMode ); + } + else if( gridPointer->getLocalBegin() < gridPointer->getInteriorBegin() ) { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true >( - gridPointer, - CoordinatesType( 0 ), - gridPointer->getDimensions() - CoordinatesType( 1 ), - userData, - asynchronousMode ); + // 1 boundary (left) + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getInteriorBegin() - 1, + gridPointer->getInteriorBegin(), + userData, + asynchronousMode ); } - else //Distributed + else if( gridPointer->getInteriorEnd() < gridPointer->getLocalEnd() ) { - const int* neighbors=distributedGrid->getNeighbors(); - if( neighbors[ Meshes::DistributedMeshes::ZzYzXm ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( 0 ) + distributedGrid->getLowerOverlap(), - CoordinatesType( 0 ) + distributedGrid->getLowerOverlap(), - userData, - asynchronousMode ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZzYzXp ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - gridPointer->getDimensions() - CoordinatesType( 1 ) - distributedGrid->getUpperOverlap(), - gridPointer->getDimensions() - CoordinatesType( 1 ) - distributedGrid->getUpperOverlap(), - userData, - asynchronousMode ); - } + // 1 boundary (right) + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getInteriorEnd(), + gridPointer->getInteriorEnd() + 1, + userData, + asynchronousMode ); } - } template< typename Real, @@ -88,43 +82,12 @@ processInteriorEntities( const GridPointer& gridPointer, */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimension." ); - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( 1 ), - gridPointer->getDimensions() - CoordinatesType( 2 ), - userData, - asynchronousMode ); - } - else //Distributed - { - CoordinatesType begin( distributedGrid->getLowerOverlap() ); - CoordinatesType end( gridPointer->getDimensions() - distributedGrid->getUpperOverlap() - CoordinatesType( 1 ) ); - - const int* neighbors = distributedGrid->getNeighbors(); - if( neighbors[ Meshes::DistributedMeshes::ZzYzXm ] == -1 ) - begin += CoordinatesType( 1 ); - - if( neighbors[ Meshes::DistributedMeshes::ZzYzXp ] == -1 ) - end -= CoordinatesType( 1 ); - - /* - TNL_MPI_PRINT( " lowerOverlap = " << distributedGrid->getLowerOverlap() << - " upperOverlap = " << distributedGrid->getUpperOverlap() << - " gridPointer->getDimensions() = " << gridPointer->getDimensions() << - "begin = " << begin << " end = " << end); - */ - - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - end, - userData, - asynchronousMode ); - } - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getInteriorBegin(), + gridPointer->getInteriorEnd(), + userData, + asynchronousMode ); } template< typename Real, @@ -143,30 +106,13 @@ processAllEntities( * All cells */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimensions." ); - - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( 0 ), - gridPointer->getDimensions() - CoordinatesType( 1 ), - userData, - asynchronousMode ); - } - else //Distributed - { - CoordinatesType begin( distributedGrid->getLowerOverlap() ); - CoordinatesType end( gridPointer->getDimensions() - distributedGrid->getUpperOverlap() - 1 ); - - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - end, - userData, - asynchronousMode ); - } + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getLocalBegin(), + gridPointer->getLocalEnd(), + userData, + asynchronousMode ); } /**** @@ -191,7 +137,7 @@ processBoundaryEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true >( gridPointer, CoordinatesType( 0 ), - gridPointer->getDimensions(), + gridPointer->getDimensions() + 1, userData, asynchronousMode ); } @@ -215,7 +161,7 @@ processInteriorEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( gridPointer, CoordinatesType( 1 ), - gridPointer->getDimensions() - CoordinatesType( 1 ), + gridPointer->getDimensions(), userData, asynchronousMode ); } @@ -240,7 +186,7 @@ processAllEntities( GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( gridPointer, CoordinatesType( 0 ), - gridPointer->getDimensions(), + gridPointer->getDimensions() + 1, userData, asynchronousMode ); } diff --git a/src/TNL/Meshes/GridDetails/Traverser_Grid2D.h b/src/TNL/Meshes/GridDetails/Traverser_Grid2D.h index 3e0322b61d4c6f44966878e954fc4c08e41e53a0..e6688138aaac22c3f0b5b56e33571381d4d20784 100644 --- a/src/TNL/Meshes/GridDetails/Traverser_Grid2D.h +++ b/src/TNL/Meshes/GridDetails/Traverser_Grid2D.h @@ -14,7 +14,7 @@ #include <TNL/Pointers/SharedPointer.h> namespace TNL { -namespace Meshes { +namespace Meshes { template< typename Real, typename Device, @@ -26,8 +26,6 @@ class Traverser< Meshes::Grid< 2, Real, Device, Index >, GridEntity, 2 > using GridType = Meshes::Grid< 2, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > @@ -54,8 +52,6 @@ class Traverser< Meshes::Grid< 2, Real, Device, Index >, GridEntity, 1 > using GridType = Meshes::Grid< 2, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > @@ -83,8 +79,6 @@ class Traverser< Meshes::Grid< 2, Real, Device, Index >, GridEntity, 0 > using GridType = Meshes::Grid< 2, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > diff --git a/src/TNL/Meshes/GridDetails/Traverser_Grid2D_impl.h b/src/TNL/Meshes/GridDetails/Traverser_Grid2D_impl.h index 858dd376385b1a2eb3ff7c06dfb19e27f5538551..d4bcccaf28a7ef73e1daeabd25a4b4b893f3256c 100644 --- a/src/TNL/Meshes/GridDetails/Traverser_Grid2D_impl.h +++ b/src/TNL/Meshes/GridDetails/Traverser_Grid2D_impl.h @@ -34,66 +34,52 @@ processBoundaryEntities( const GridPointer& gridPointer, */ static_assert( GridEntity::getEntityDimension() == 2, "The entity has wrong dimension." ); - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) + if( gridPointer->getLocalBegin() < gridPointer->getInteriorBegin() && gridPointer->getInteriorEnd() < gridPointer->getLocalEnd() ) { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 1 >( - gridPointer, - CoordinatesType( 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1 ), - userData, - asynchronousMode, - 0 ); + // 4 boundaries (left, right, down, up) + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 1 >( + gridPointer, + gridPointer->getInteriorBegin() - 1, + gridPointer->getInteriorEnd() + 1, + userData, + asynchronousMode, + 0 ); } - else //Distributed + else { - const CoordinatesType begin = distributedGrid->getLowerOverlap(); - const CoordinatesType end = gridPointer->getDimensions() - distributedGrid->getUpperOverlap() - - CoordinatesType( 1, 1 ); - const int* neighbors=distributedGrid->getNeighbors(); - if( neighbors[ Meshes::DistributedMeshes::ZzYzXm ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - CoordinatesType( begin.x(), end.y() ), - userData, - asynchronousMode, - 0 ); - } - - if(neighbors[Meshes::DistributedMeshes::ZzYzXp]==-1) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( end.x(), begin.y() ), - end, - userData, - asynchronousMode, - 0 ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZzYmXz ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - CoordinatesType( end.x(), begin.y() ), - userData, - asynchronousMode, - 0 ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZzYpXz ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( begin.x(), end.y() ), - end, - userData, - asynchronousMode, - 0 ); - } + const CoordinatesType begin = gridPointer->getLocalBegin(); + const CoordinatesType end = gridPointer->getLocalEnd(); + const CoordinatesType skipBegin = gridPointer->getInteriorBegin(); + const CoordinatesType skipEnd = gridPointer->getInteriorEnd(); + + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + begin, + CoordinatesType( end.x(), skipBegin.y() ), + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( begin.x(), skipEnd.y() ), + end, + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( begin.x(), skipBegin.y() ), + CoordinatesType( skipBegin.x(), skipEnd.y() ), + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( skipEnd.x(), skipBegin.y() ), + CoordinatesType( end.x(), skipEnd.y() ), + userData, + asynchronousMode, + 0 ); } } @@ -112,44 +98,14 @@ processInteriorEntities( const GridPointer& gridPointer, * Interior cells */ static_assert( GridEntity::getEntityDimension() == 2, "The entity has wrong dimensions." ); - - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( 1, 1 ), - gridPointer->getDimensions() - CoordinatesType( 2, 2 ), - userData, - asynchronousMode, - 0 ); - } - else // distributed - { - const int* neighbors = distributedGrid->getNeighbors(); - CoordinatesType begin( distributedGrid->getLowerOverlap()); - CoordinatesType end( gridPointer->getDimensions() - distributedGrid->getUpperOverlap()- CoordinatesType(1,1) ); - if( neighbors[ Meshes::DistributedMeshes::ZzYzXm ] == -1 ) - begin.x() += 1 ; - - if( neighbors[ Meshes::DistributedMeshes::ZzYzXp ] == -1 ) - end.x() -= 1; - - if( neighbors[ Meshes::DistributedMeshes::ZzYmXz ] == -1 ) - begin.y() += 1 ; - - if( neighbors[ Meshes::DistributedMeshes::ZzYpXz ] == -1 ) - end.y() -= 1; - - - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - end, - userData, - asynchronousMode, - 0); - } + + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getInteriorBegin(), + gridPointer->getInteriorEnd(), + userData, + asynchronousMode, + 0 ); } template< typename Real, @@ -167,32 +123,14 @@ processAllEntities( const GridPointer& gridPointer, * All cells */ static_assert( GridEntity::getEntityDimension() == 2, "The entity has wrong dimension." ); - - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1 ), - userData, - asynchronousMode, - 0 ); - } - else - { - //const int* neighbors=distributedGrid->getNeighbors(); - CoordinatesType begin( distributedGrid->getLowerOverlap() ); - CoordinatesType end( gridPointer->getDimensions() - distributedGrid->getUpperOverlap()- CoordinatesType(1,1) ); - - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - end, - userData, - asynchronousMode, - 0); - } + + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getLocalBegin(), + gridPointer->getLocalEnd(), + userData, + asynchronousMode, + 0 ); } /**** @@ -213,11 +151,11 @@ processBoundaryEntities( const GridPointer& gridPointer, * Boundary faces */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 0, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 1 ), + gridPointer->getDimensions() + CoordinatesType( 1, 0 ), userData, asynchronousMode, 1, @@ -227,7 +165,7 @@ processBoundaryEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 0, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 0 ), + gridPointer->getDimensions() + CoordinatesType( 0, 1 ), userData, asynchronousMode, 0, @@ -250,11 +188,11 @@ processInteriorEntities( const GridPointer& gridPointer, * Interior faces */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 1, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1 ), + gridPointer->getDimensions(), userData, asynchronousMode, 1, @@ -264,7 +202,7 @@ processInteriorEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 1 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1 ), + gridPointer->getDimensions(), userData, asynchronousMode, 0, @@ -287,11 +225,11 @@ processAllEntities( const GridPointer& gridPointer, * All faces */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 1 ), + gridPointer->getDimensions() + CoordinatesType( 1, 0 ), userData, asynchronousMode, 1, @@ -301,7 +239,7 @@ processAllEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 0 ), + gridPointer->getDimensions() + CoordinatesType( 0, 1 ), userData, asynchronousMode, 0, @@ -324,11 +262,11 @@ processBoundaryEntities( const GridPointer& gridPointer, * Boundary vertices */ static_assert( GridEntity::getEntityDimension() == 0, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 1 >( gridPointer, CoordinatesType( 0, 0 ), - gridPointer->getDimensions(), + gridPointer->getDimensions() + CoordinatesType( 1, 1 ), userData, asynchronousMode, 0 ); @@ -349,16 +287,16 @@ processInteriorEntities( const GridPointer& gridPointer, * Interior vertices */ static_assert( GridEntity::getEntityDimension() == 0, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( gridPointer, CoordinatesType( 1, 1 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1 ), + gridPointer->getDimensions(), userData, asynchronousMode, 0 ); } - + template< typename Real, typename Device, typename Index, @@ -374,11 +312,11 @@ processAllEntities( const GridPointer& gridPointer, * All vertices */ static_assert( GridEntity::getEntityDimension() == 0, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( gridPointer, CoordinatesType( 0, 0 ), - gridPointer->getDimensions(), + gridPointer->getDimensions() + CoordinatesType( 1, 1 ), userData, asynchronousMode, 0 ); diff --git a/src/TNL/Meshes/GridDetails/Traverser_Grid3D.h b/src/TNL/Meshes/GridDetails/Traverser_Grid3D.h index 71b2cd1d6b2e4940cab21829555a259300734c6f..db5f12a5336a17e88ec6d4964830a2b5b23d4151 100644 --- a/src/TNL/Meshes/GridDetails/Traverser_Grid3D.h +++ b/src/TNL/Meshes/GridDetails/Traverser_Grid3D.h @@ -26,8 +26,6 @@ class Traverser< Meshes::Grid< 3, Real, Device, Index >, GridEntity, 3 > using GridType = Meshes::Grid< 3, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > @@ -54,8 +52,6 @@ class Traverser< Meshes::Grid< 3, Real, Device, Index >, GridEntity, 2 > using GridType = Meshes::Grid< 3, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > @@ -82,8 +78,6 @@ class Traverser< Meshes::Grid< 3, Real, Device, Index >, GridEntity, 1 > using GridType = Meshes::Grid< 3, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > @@ -111,8 +105,6 @@ class Traverser< Meshes::Grid< 3, Real, Device, Index >, GridEntity, 0 > using GridType = Meshes::Grid< 3, Real, Device, Index >; using GridPointer = Pointers::SharedPointer< GridType >; using CoordinatesType = typename GridType::CoordinatesType; - using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; template< typename EntitiesProcessor, typename UserData > diff --git a/src/TNL/Meshes/GridDetails/Traverser_Grid3D_impl.h b/src/TNL/Meshes/GridDetails/Traverser_Grid3D_impl.h index a43c4bfb242dd97e855773399116452eee7e54fe..ad85b6ef723267097d824afa37027e14e21b11b8 100644 --- a/src/TNL/Meshes/GridDetails/Traverser_Grid3D_impl.h +++ b/src/TNL/Meshes/GridDetails/Traverser_Grid3D_impl.h @@ -36,88 +36,66 @@ processBoundaryEntities( const GridPointer& gridPointer, */ static_assert( GridEntity::getEntityDimension() == 3, "The entity has wrong dimension." ); - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) + if( gridPointer->getLocalBegin() < gridPointer->getInteriorBegin() && gridPointer->getInteriorEnd() < gridPointer->getLocalEnd() ) { + // 6 boundaries (left, right, down, up, front, back) GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 1, 1 >( - gridPointer, - CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 1 ), - userData, + gridPointer, + gridPointer->getInteriorBegin() - 1, + gridPointer->getInteriorEnd() + 1, + userData, asynchronousMode, - 0 ); + 0 ); } - else // distributed + else { - const CoordinatesType begin = distributedGrid->getLowerOverlap(); - const CoordinatesType end = gridPointer->getDimensions() - distributedGrid->getUpperOverlap() - - CoordinatesType( 1, 1, 1 ); - const int* neighbors = distributedGrid->getNeighbors(); - if( neighbors[ Meshes::DistributedMeshes::ZzYzXm ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - CoordinatesType( begin.x(), end.y(), end.z() ), - userData, - asynchronousMode, - 0 ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZzYzXp ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( end.x() , begin.y(), begin.z() ), - end, - userData, - asynchronousMode, - 0 ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZzYmXz ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - CoordinatesType( end.x(), begin.y(), end.z() ), - userData, - asynchronousMode, - 0 ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZzYpXz ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( begin.x(), end.y(), begin.z() ), - end, - userData, - asynchronousMode, - 0 ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZmYzXz ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - CoordinatesType( end.x(), end.y(), begin.z() ), - userData, - asynchronousMode, - 0 ); - } - - if( neighbors[ Meshes::DistributedMeshes::ZpYzXz ] == -1 ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( begin.x(), begin.y(), end.z() ), - end, - userData, - asynchronousMode, - 0 ); - } + const CoordinatesType begin = gridPointer->getLocalBegin(); + const CoordinatesType end = gridPointer->getLocalEnd(); + const CoordinatesType skipBegin = gridPointer->getInteriorBegin(); + const CoordinatesType skipEnd = gridPointer->getInteriorEnd(); + + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + begin, + CoordinatesType( end.x(), end.y(), skipBegin.z() ), + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( begin.x(), begin.y(), skipEnd.z() ), + end, + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( begin.x(), begin.y(), skipBegin.z() ), + CoordinatesType( end.x(), skipBegin.y(), skipEnd.z() ), + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( begin.x(), skipEnd.y(), skipBegin.z() ), + CoordinatesType( end.x(), end.y(), skipEnd.z() ), + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( begin.x(), skipBegin.y(), skipBegin.z() ), + CoordinatesType( skipBegin.x(), skipEnd.y(), skipEnd.z() ), + userData, + asynchronousMode, + 0 ); + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + CoordinatesType( skipEnd.x(), skipBegin.y(), skipBegin.z() ), + CoordinatesType( end.x(), skipEnd.y(), skipEnd.z() ), + userData, + asynchronousMode, + 0 ); } } @@ -136,50 +114,14 @@ processInteriorEntities( const GridPointer& gridPointer, * Interior cells */ static_assert( GridEntity::getEntityDimension() == 3, "The entity has wrong dimension." ); - - DistributedGridType* distributedGrid = gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( 1, 1, 1 ), - gridPointer->getDimensions() - CoordinatesType( 2, 2, 2 ), - userData, - asynchronousMode, - 0 ); - } - else - { - const int* neighbors = distributedGrid->getNeighbors(); - CoordinatesType begin( distributedGrid->getLowerOverlap()); - CoordinatesType end( gridPointer->getDimensions() - distributedGrid->getUpperOverlap()- CoordinatesType(1,1,1) ); - - if( neighbors[ Meshes::DistributedMeshes::ZzYzXm ] == -1 ) - begin.x() += 1 ; - - if( neighbors[ Meshes::DistributedMeshes::ZzYzXp ] == -1 ) - end.x() -= 1; - - if( neighbors[ Meshes::DistributedMeshes::ZzYmXz ] == -1 ) - begin.y() += 1; - - if( neighbors[ Meshes::DistributedMeshes::ZzYpXz ] == -1 ) - end.y() -= 1; - - if( neighbors[ Meshes::DistributedMeshes::ZmYzXz ] == -1 ) - begin.z() += 1 ; - - if( neighbors[ Meshes::DistributedMeshes::ZpYzXz ] == -1 ) - end.z() -= 1; - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - end, - userData, - asynchronousMode, - 0 ); - } + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getInteriorBegin(), + gridPointer->getInteriorEnd(), + userData, + asynchronousMode, + 0 ); } template< typename Real, @@ -197,31 +139,14 @@ processAllEntities( const GridPointer& gridPointer, * All cells */ static_assert( GridEntity::getEntityDimension() == 3, "The entity has wrong dimension." ); - - DistributedGridType* distributedGrid=gridPointer->getDistributedMesh(); - if( distributedGrid == nullptr || !distributedGrid->isDistributed() ) - { - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 1 ), - userData, - asynchronousMode, - 0 ); - } - else - { - CoordinatesType begin( distributedGrid->getLowerOverlap()); - CoordinatesType end( gridPointer->getDimensions() - distributedGrid->getUpperOverlap()- CoordinatesType(1,1,1) ); - GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( - gridPointer, - begin, - end, - userData, - asynchronousMode, - 0 ); - } + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( + gridPointer, + gridPointer->getLocalBegin(), + gridPointer->getLocalEnd(), + userData, + asynchronousMode, + 0 ); } /**** @@ -242,11 +167,11 @@ processBoundaryEntities( const GridPointer& gridPointer, * Boundary faces */ static_assert( GridEntity::getEntityDimension() == 2, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 0, 0, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 1, 1 ), + gridPointer->getDimensions() + CoordinatesType( 1, 0, 0 ), userData, asynchronousMode, 2, @@ -256,17 +181,17 @@ processBoundaryEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 0, 1, 0, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 0, 1 ), + gridPointer->getDimensions() + CoordinatesType( 0, 1, 0 ), userData, asynchronousMode, 1, CoordinatesType( 0, 1, 0 ), CoordinatesType( 1, 0, 1 ) ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 0, 0, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 0 ), + gridPointer->getDimensions() + CoordinatesType( 0, 0, 1 ), userData, asynchronousMode, 0, @@ -289,11 +214,11 @@ processInteriorEntities( const GridPointer& gridPointer, * Interior faces */ static_assert( GridEntity::getEntityDimension() == 2, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 1, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 1 ), + gridPointer->getDimensions(), userData, asynchronousMode, 2, @@ -303,7 +228,7 @@ processInteriorEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 1, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 1 ), + gridPointer->getDimensions(), userData, asynchronousMode, 1, @@ -313,7 +238,7 @@ processInteriorEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 1 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 1 ), + gridPointer->getDimensions(), userData, asynchronousMode, 0, @@ -339,7 +264,7 @@ processAllEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 1, 1 ), + gridPointer->getDimensions() + CoordinatesType( 1, 0, 0 ), userData, asynchronousMode, 2, @@ -349,17 +274,17 @@ processAllEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 0, 1 ), + gridPointer->getDimensions() + CoordinatesType( 0, 1, 0 ), userData, asynchronousMode, 1, CoordinatesType( 0, 1, 0 ), CoordinatesType( 1, 0, 1 ) ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 0 ), + gridPointer->getDimensions() + CoordinatesType( 0, 0, 1 ), userData, asynchronousMode, 0, @@ -385,11 +310,11 @@ processBoundaryEntities( const GridPointer& gridPointer, * Boundary edges */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 0, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 0, 0 ), + gridPointer->getDimensions() + CoordinatesType( 0, 1, 1 ), userData, asynchronousMode, 2, @@ -399,17 +324,17 @@ processBoundaryEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 0, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 1, 0 ), + gridPointer->getDimensions() + CoordinatesType( 1, 0, 1 ), userData, asynchronousMode, 1, CoordinatesType( 1, 0, 1 ), CoordinatesType( 0, 1, 0 ) ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 1, 0, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 0, 1 ), + gridPointer->getDimensions() + CoordinatesType( 1, 1, 0 ), userData, asynchronousMode, 0, @@ -432,11 +357,11 @@ processInteriorEntities( const GridPointer& gridPointer, * Interior edges */ static_assert( GridEntity::getEntityDimension() == 1, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 1, 1 ), - gridPointer->getDimensions() - CoordinatesType( 0, 1, 1 ), + gridPointer->getDimensions() + CoordinatesType( 1, 0, 0 ), userData, asynchronousMode, 2, @@ -446,7 +371,7 @@ processInteriorEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 1, 0, 1 ), - gridPointer->getDimensions() - CoordinatesType( 1, 0, 1 ), + gridPointer->getDimensions() + CoordinatesType( 0, 1, 0 ), userData, asynchronousMode, 1, @@ -456,7 +381,7 @@ processInteriorEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 1, 1, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 0 ), + gridPointer->getDimensions() + CoordinatesType( 0, 0, 1 ), userData, asynchronousMode, 0, @@ -482,31 +407,31 @@ processAllEntities( const GridPointer& gridPointer, GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 1, 0, 0 ), + gridPointer->getDimensions() + CoordinatesType( 0, 1, 1 ), userData, asynchronousMode, 2, - CoordinatesType( 0, 1, 1 ), + CoordinatesType( 0, 1, 1 ), CoordinatesType( 1, 0, 0 ) ); GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 1, 0 ), + gridPointer->getDimensions() + CoordinatesType( 1, 0, 1 ), userData, asynchronousMode, 1, - CoordinatesType( 1, 0, 1 ), + CoordinatesType( 1, 0, 1 ), CoordinatesType( 0, 1, 0 ) ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false, 1, 1, 1, CoordinatesType, CoordinatesType >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions() - CoordinatesType( 0, 0, 1 ), + gridPointer->getDimensions() + CoordinatesType( 1, 1, 0 ), userData, asynchronousMode, 0, - CoordinatesType( 1, 1, 0 ), + CoordinatesType( 1, 1, 0 ), CoordinatesType( 0, 0, 1 ) ); } @@ -528,11 +453,11 @@ processBoundaryEntities( const GridPointer& gridPointer, * Boundary vertices */ static_assert( GridEntity::getEntityDimension() == 0, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, true, 1, 1, 1 >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions(), + gridPointer->getDimensions() + CoordinatesType( 1, 1, 1 ), userData, asynchronousMode, 0 ); @@ -553,16 +478,16 @@ processInteriorEntities( const GridPointer& gridPointer, * Interior vertices */ static_assert( GridEntity::getEntityDimension() == 0, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( gridPointer, CoordinatesType( 1, 1, 1 ), - gridPointer->getDimensions() - CoordinatesType( 1, 1, 1 ), + gridPointer->getDimensions(), userData, asynchronousMode, 0 ); } - + template< typename Real, typename Device, typename Index, @@ -578,11 +503,11 @@ processAllEntities( const GridPointer& gridPointer, * All vertices */ static_assert( GridEntity::getEntityDimension() == 0, "The entity has wrong dimension." ); - + GridTraverser< GridType >::template processEntities< GridEntity, EntitiesProcessor, UserData, false >( gridPointer, CoordinatesType( 0, 0, 0 ), - gridPointer->getDimensions(), + gridPointer->getDimensions() + CoordinatesType( 1, 1, 1 ), userData, asynchronousMode, 0 ); diff --git a/src/TNL/Meshes/GridEntity.h b/src/TNL/Meshes/GridEntity.h index 80041a7539d6c852fb4ce59e8c2ed98224897191..573089dc38dcde12dca7cce878040401bbbde5e4 100644 --- a/src/TNL/Meshes/GridEntity.h +++ b/src/TNL/Meshes/GridEntity.h @@ -10,6 +10,7 @@ #pragma once +#include <TNL/Containers/StaticVector.h> #include <TNL/Meshes/GridDetails/NeighborGridEntitiesStorage.h> namespace TNL { @@ -43,24 +44,24 @@ template< int Dimension, class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, EntityDimension, Config > { public: - + typedef Meshes::Grid< Dimension, Real, Device, Index > GridType; typedef GridType MeshType; typedef typename GridType::RealType RealType; typedef typename GridType::IndexType IndexType; typedef typename GridType::CoordinatesType CoordinatesType; typedef Config ConfigType; - - constexpr static int getMeshDimension() { return GridType::getMeshDimension(); }; - + + constexpr static int getMeshDimension() { return GridType::getMeshDimension(); }; + constexpr static int getEntityDimension() { return EntityDimension; }; - + typedef Containers::StaticVector< getMeshDimension(), IndexType > EntityOrientationType; typedef Containers::StaticVector< getMeshDimension(), IndexType > EntityBasisType; typedef typename GridType::PointType PointType; - + typedef NeighborGridEntitiesStorage< GridEntity, Config > NeighborGridEntitiesStorageType; - + template< int NeighborEntityDimension = getEntityDimension() > using NeighborEntities = NeighborGridEntityGetter< @@ -68,22 +69,22 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, EntityDimensio EntityDimension, Config >, NeighborEntityDimension >; - + __cuda_callable__ inline GridEntity( const GridType& grid ); - + __cuda_callable__ inline GridEntity( const GridType& grid, const CoordinatesType& coordinates, const EntityOrientationType& orientation, const EntityBasisType& basis ); - + __cuda_callable__ inline const CoordinatesType& getCoordinates() const; - + __cuda_callable__ inline CoordinatesType& getCoordinates(); - + __cuda_callable__ inline void setCoordinates( const CoordinatesType& coordinates ); @@ -98,55 +99,55 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, EntityDimensio __cuda_callable__ inline Index getIndex() const; - + __cuda_callable__ inline const EntityOrientationType& getOrientation() const; - + __cuda_callable__ inline void setOrientation( const EntityOrientationType& orientation ); - + __cuda_callable__ inline const EntityBasisType& getBasis() const; - + __cuda_callable__ inline void setBasis( const EntityBasisType& basis ); - + template< int NeighborEntityDimension = getEntityDimension() > __cuda_callable__ inline const NeighborEntities< NeighborEntityDimension >& getNeighborEntities() const; - + __cuda_callable__ inline bool isBoundaryEntity() const; - + __cuda_callable__ inline PointType getCenter() const; - + __cuda_callable__ inline const RealType& getMeasure() const; - + __cuda_callable__ inline const GridType& getMesh() const; - + protected: - + const GridType& grid; - + IndexType entityIndex; - + CoordinatesType coordinates; - + EntityOrientationType orientation; - + EntityBasisType basis; - + NeighborGridEntitiesStorageType neighborEntitiesStorage; - + //__cuda_callable__ inline //GridEntity(); - + friend class BoundaryGridEntityChecker< GridEntity >; - + friend class GridEntityCenterGetter< GridEntity >; }; @@ -161,7 +162,7 @@ template< int Dimension, class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, Dimension, Config > { public: - + typedef Meshes::Grid< Dimension, Real, Device, Index > GridType; typedef GridType MeshType; typedef typename GridType::RealType RealType; @@ -169,16 +170,16 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, Dimension, Con typedef typename GridType::CoordinatesType CoordinatesType; typedef typename GridType::PointType PointType; typedef Config ConfigType; - + constexpr static int getMeshDimension() { return GridType::getMeshDimension(); }; - + constexpr static int getEntityDimension() { return getMeshDimension(); }; - - + + typedef Containers::StaticVector< getMeshDimension(), IndexType > EntityOrientationType; typedef Containers::StaticVector< getMeshDimension(), IndexType > EntityBasisType; typedef NeighborGridEntitiesStorage< GridEntity, Config > NeighborGridEntitiesStorageType; - + template< int NeighborEntityDimension = getEntityDimension() > using NeighborEntities = NeighborGridEntityGetter< @@ -190,19 +191,19 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, Dimension, Con __cuda_callable__ inline GridEntity( const GridType& grid ); - + __cuda_callable__ inline GridEntity( const GridType& grid, const CoordinatesType& coordinates, const EntityOrientationType& orientation = EntityOrientationType( ( Index ) 0 ), const EntityBasisType& basis = EntityBasisType( ( Index ) 1 ) ); - + __cuda_callable__ inline const CoordinatesType& getCoordinates() const; - + __cuda_callable__ inline CoordinatesType& getCoordinates(); - + __cuda_callable__ inline void setCoordinates( const CoordinatesType& coordinates ); @@ -217,54 +218,54 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, Dimension, Con __cuda_callable__ inline Index getIndex() const; - + __cuda_callable__ inline const EntityOrientationType getOrientation() const; - + __cuda_callable__ inline void setOrientation( const EntityOrientationType& orientation ){}; - + __cuda_callable__ inline const EntityBasisType getBasis() const; - + __cuda_callable__ inline void setBasis( const EntityBasisType& basis ){}; - + template< int NeighborEntityDimension = Dimension > __cuda_callable__ inline const NeighborEntities< NeighborEntityDimension >& getNeighborEntities() const; - + __cuda_callable__ inline bool isBoundaryEntity() const; - + __cuda_callable__ inline PointType getCenter() const; - + __cuda_callable__ inline const RealType& getMeasure() const; - + __cuda_callable__ inline const PointType& getEntityProportions() const; - + __cuda_callable__ inline const GridType& getMesh() const; protected: - + const GridType& grid; - + IndexType entityIndex; - + CoordinatesType coordinates; - + NeighborGridEntitiesStorageType neighborEntitiesStorage; - + //__cuda_callable__ inline //GridEntity(); - + friend class BoundaryGridEntityChecker< GridEntity >; - + friend class GridEntityCenterGetter< GridEntity >; }; @@ -279,7 +280,7 @@ template< int Dimension, class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, 0, Config > { public: - + typedef Meshes::Grid< Dimension, Real, Device, Index > GridType; typedef GridType MeshType; typedef typename GridType::RealType RealType; @@ -287,15 +288,15 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, 0, Config > typedef typename GridType::CoordinatesType CoordinatesType; typedef typename GridType::PointType PointType; typedef Config ConfigType; - + constexpr static int getMeshDimension() { return GridType::getMeshDimension(); }; - + constexpr static int getEntityDimension() { return 0; }; - + typedef Containers::StaticVector< getMeshDimension(), IndexType > EntityOrientationType; typedef Containers::StaticVector< getMeshDimension(), IndexType > EntityBasisType; typedef NeighborGridEntitiesStorage< GridEntity, Config > NeighborGridEntitiesStorageType; - + template< int NeighborEntityDimension = getEntityDimension() > using NeighborEntities = NeighborGridEntityGetter< @@ -307,19 +308,19 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, 0, Config > __cuda_callable__ inline GridEntity( const GridType& grid ); - + __cuda_callable__ inline GridEntity( const GridType& grid, const CoordinatesType& coordinates, const EntityOrientationType& orientation = EntityOrientationType( ( Index ) 0 ), const EntityBasisType& basis = EntityOrientationType( ( Index ) 0 ) ); - + __cuda_callable__ inline const CoordinatesType& getCoordinates() const; - + __cuda_callable__ inline CoordinatesType& getCoordinates(); - + __cuda_callable__ inline void setCoordinates( const CoordinatesType& coordinates ); @@ -334,28 +335,28 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, 0, Config > __cuda_callable__ inline Index getIndex() const; - + __cuda_callable__ inline const EntityOrientationType getOrientation() const; - + __cuda_callable__ inline void setOrientation( const EntityOrientationType& orientation ){}; - + __cuda_callable__ inline const EntityBasisType getBasis() const; - + __cuda_callable__ inline void setBasis( const EntityBasisType& basis ){}; - + template< int NeighborEntityDimension = getEntityDimension() > __cuda_callable__ inline const NeighborEntities< NeighborEntityDimension >& getNeighborEntities() const; - + __cuda_callable__ inline bool isBoundaryEntity() const; - + __cuda_callable__ inline PointType getCenter() const; @@ -365,25 +366,25 @@ class GridEntity< Meshes::Grid< Dimension, Real, Device, Index >, 0, Config > __cuda_callable__ inline const RealType getMeasure() const; - + __cuda_callable__ inline PointType getEntityProportions() const; - + __cuda_callable__ inline const GridType& getMesh() const; - + protected: - + const GridType& grid; - + IndexType entityIndex; - + CoordinatesType coordinates; - + NeighborGridEntitiesStorageType neighborEntitiesStorage; - + friend class BoundaryGridEntityChecker< GridEntity >; - + friend class GridEntityCenterGetter< GridEntity >; }; diff --git a/src/TNL/Meshes/Mesh.h b/src/TNL/Meshes/Mesh.h index 41e24412b65b0e8a004be28b3505ddfe62587c67..506850eceaafc7f652b0ef77284c7f1eff4384a8 100644 --- a/src/TNL/Meshes/Mesh.h +++ b/src/TNL/Meshes/Mesh.h @@ -17,7 +17,6 @@ #pragma once #include <ostream> -#include <TNL/Object.h> #include <TNL/Logger.h> #include <TNL/Containers/Vector.h> #include <TNL/Meshes/MeshDetails/ConfigValidator.h> @@ -64,8 +63,7 @@ class MeshInitializableBase< MeshConfig, Devices::Cuda, MeshType > template< typename MeshConfig, typename Device = Devices::Host > class Mesh - : public Object, - public ConfigValidator< MeshConfig >, + : public ConfigValidator< MeshConfig >, public MeshInitializableBase< MeshConfig, Device, Mesh< MeshConfig, Device > >, public StorageLayerFamily< MeshConfig, Device >, public EntityTags::LayerFamily< MeshConfig, Device, Mesh< MeshConfig, Device > > @@ -110,10 +108,6 @@ class Mesh using Face = EntityType< getMeshDimension() - 1 >; using Vertex = EntityType< 0 >; - static String getSerializationType(); - - virtual String getSerializationTypeVirtual() const; - /** * \brief Returns the count of mesh entities of the given dimension. */ @@ -265,13 +259,6 @@ class Mesh const GlobalIndexArray& iperm ); - void save( File& file ) const; - - void load( File& file ); - - using Object::load; - using Object::save; - void print( std::ostream& str ) const; bool operator==( const Mesh& mesh ) const; diff --git a/src/TNL/Meshes/Mesh.hpp b/src/TNL/Meshes/Mesh.hpp index 278ef215dd033aa6062ae1dfaa32c5cd37f6a660..b7394ea2c0454efd58e1e83b79e4c5bfa9c41108 100644 --- a/src/TNL/Meshes/Mesh.hpp +++ b/src/TNL/Meshes/Mesh.hpp @@ -85,22 +85,6 @@ getMeshDimension() return MeshTraitsType::meshDimension; } -template< typename MeshConfig, typename Device > -String -Mesh< MeshConfig, Device >:: -getSerializationType() -{ - return String( "Meshes::Mesh< ") + TNL::getType< MeshConfig >() + " >"; -} - -template< typename MeshConfig, typename Device > -String -Mesh< MeshConfig, Device >:: -getSerializationTypeVirtual() const -{ - return this->getSerializationType(); -} - template< typename MeshConfig, typename Device > template< int Dimension > __cuda_callable__ @@ -341,43 +325,6 @@ reorderEntities( const GlobalIndexArray& perm, } -template< typename MeshConfig, typename Device > -void -Mesh< MeshConfig, Device >:: -save( File& file ) const -{ - // saving via host is necessary due to segment-based sparse matrices - if( std::is_same< Device, Devices::Cuda >::value ) { - Mesh< MeshConfig, Devices::Host > hostMesh; - hostMesh = *this; - hostMesh.save( file ); - } - else { - Object::save( file ); - StorageBaseType::save( file ); - EntityTagsLayerFamily::save( file ); - } -} - -template< typename MeshConfig, typename Device > -void -Mesh< MeshConfig, Device >:: -load( File& file ) -{ - // loading via host is necessary for the initialization of the dual graph (and due to segment-based sparse matrices) - if( std::is_same< Device, Devices::Cuda >::value ) { - Mesh< MeshConfig, Devices::Host > hostMesh; - hostMesh.load( file ); - *this = hostMesh; - } - else { - Object::load( file ); - StorageBaseType::load( file ); - EntityTagsLayerFamily::load( file ); - this->initializeDualGraph( *this ); - } -} - template< typename MeshConfig, typename Device > void Mesh< MeshConfig, Device >:: diff --git a/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h b/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h index b7b79c4e8883d469bb57afc474d75609dc9b8ae7..0fc2bebafe3e5df7983c19f58872c993c4bb0892 100644 --- a/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h +++ b/src/TNL/Meshes/MeshDetails/layers/EntityTags/Layer.h @@ -206,17 +206,6 @@ public: return ghostsOffset; } - void save( File& file ) const - { - file << tags; - } - - void load( File& file ) - { - file >> tags; - updateEntityTagsLayer( DimensionTag() ); - } - void print( std::ostream& str ) const { str << "Boundary tags for entities of dimension " << DimensionTag::value << " are: "; @@ -285,9 +274,6 @@ protected: void getGhostEntitiesCount() const; void getGhostEntitiesOffset() const; - void save( File& file ) const {} - void load( File& file ) {} - void print( std::ostream& str ) const {} bool operator==( const Layer& layer ) const diff --git a/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h b/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h index 2c30e8316b97f3d695f54c87fa60639c1dda9f2e..712bee34ee5fb05b0f6952d25e4661a7b186c546 100644 --- a/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h +++ b/src/TNL/Meshes/MeshDetails/layers/EntityTags/LayerFamily.h @@ -83,18 +83,6 @@ protected: } - void save( File& file ) const - { - LayerType::save( file ); - BaseType::save( file ); - } - - void load( File& file ) - { - LayerType::load( file ); - BaseType::load( file ); - } - void print( std::ostream& str ) const { LayerType::print( str ); @@ -133,9 +121,6 @@ protected: template< typename Device_ > LayerInheritor& operator=( const LayerInheritor< MeshConfig, Device_, DimensionTag< MeshConfig::meshDimension + 1 > >& other ) { return *this; } - void save( File& file ) const {} - void load( File& file ) {} - void print( std::ostream& str ) const {} bool operator==( const LayerInheritor& layer ) const diff --git a/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h index b6404eb683cc14a992ae69028cbf586dffa5b0fd..38bddd6578a361a4c98069b5df20615f61f96b84 100644 --- a/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h +++ b/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h @@ -89,18 +89,6 @@ public: DualGraphLayer< MeshConfig, Device >::operator==( layer ) ); } - void save( File& file ) const - { - file << points; - BaseType::save( file ); - } - - void load( File& file ) - { - file >> points; - BaseType::load( file ); - } - void print( std::ostream& str ) const { str << "Vertex coordinates are: " << points << std::endl; @@ -282,22 +270,6 @@ public: return *this; } - void save( File& file ) const - { - SubentityStorageBaseType::save( file ); - SuperentityStorageBaseType::save( file ); - file.save( &entitiesCount, 1 ); - BaseType::save( file ); - } - - void load( File& file ) - { - SubentityStorageBaseType::load( file ); - SuperentityStorageBaseType::load( file ); - file.load( &entitiesCount, 1 ); - BaseType::load( file ); - } - void print( std::ostream& str ) const { str << "Number of entities with dimension " << DimensionTag::value << ": " << entitiesCount << std::endl; @@ -367,9 +339,6 @@ protected: void setEntitiesCount() {} void getEntitiesCount() const {} - void save( File& file ) const {} - void load( File& file ) {} - void print( std::ostream& str ) const {} bool operator==( const StorageLayer& meshLayer ) const diff --git a/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h index ed84e2b8257ddcc3319498edf0d7ffbd9382e249..5aa1ee57960b0c0e26a03986b6cc139403fff59a 100644 --- a/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h +++ b/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h @@ -122,18 +122,6 @@ protected: } - void save( File& file ) const - { - BaseType::save( file ); - matrix.save( file ); - } - - void load( File& file ) - { - BaseType::load( file ); - matrix.load( file ); - } - void print( std::ostream& str ) const { BaseType::print( str ); @@ -224,9 +212,6 @@ protected: return true; } - void save( File& file ) const {} - void load( File& file ) {} - void getSubentitiesCount( SubdimensionTag ) {} void getSubentitiesMatrix( SubdimensionTag ) {} }; diff --git a/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h index 339090de556b1c6c5f171643ae6a3c28b528be30..3cd6a5a2963de03c035652a171d9b462aa20490a 100644 --- a/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h +++ b/src/TNL/Meshes/MeshDetails/layers/SuperentityStorageLayer.h @@ -134,19 +134,6 @@ protected: } - void save( File& file ) const - { - BaseType::save( file ); - matrix.save( file ); - } - - void load( File& file ) - { - BaseType::load( file ); - matrix.load( file ); - matrix.getCompressedRowLengths( superentitiesCounts ); - } - void print( std::ostream& str ) const { BaseType::print( str ); @@ -236,9 +223,6 @@ protected: return true; } - void save( File& file ) const {} - void load( File& file ) {} - void getSuperentitiesMatrix( SuperdimensionTag ) {} }; diff --git a/src/TNL/Meshes/Readers/MeshReader.h b/src/TNL/Meshes/Readers/MeshReader.h index 8bf8189ba161899a54527ad7c0fee281ee9c246b..778d0faa202d1ac46da505582b73b369de8ecb27 100644 --- a/src/TNL/Meshes/Readers/MeshReader.h +++ b/src/TNL/Meshes/Readers/MeshReader.h @@ -18,6 +18,7 @@ #include <TNL/Meshes/MeshBuilder.h> #include <TNL/Meshes/VTKTraits.h> +#include <TNL/Meshes/Traits.h> namespace TNL { namespace Meshes { @@ -84,17 +85,81 @@ public: * \brief Method which loads the intermediate mesh representation into a * mesh object. * + * This overload applies to structured grids, i.e. \ref TNL::Meshes::Grid. + * * When the method exits, the intermediate mesh representation is destroyed * to save memory. However, depending on the specific file format, the mesh * file may remain open so that the user can load additional data. */ template< typename MeshType > - void loadMesh( MeshType& mesh ) + std::enable_if_t< isGrid< MeshType >::value > + loadMesh( MeshType& mesh ) { // check that detectMesh has been called if( meshType == "" ) detectMesh(); + // check if we have a grid + if( meshType != "Meshes::Grid" ) + throw MeshReaderError( "MeshReader", "the file does not contain a structured grid, it is " + meshType ); + + if( getMeshDimension() != mesh.getMeshDimension() ) + throw MeshReaderError( "MeshReader", "cannot load a " + std::to_string(getMeshDimension()) + "-dimensional " + "grid into a mesh of type " + std::string(getType(mesh)) ); + + // check that the grid attributes were set + if( gridExtent.size() != 6 ) + throw MeshReaderError( "MeshReader", "gridExtent has invalid size: " + std::to_string(gridExtent.size()) + " (should be 6)" ); + if( gridOrigin.size() != 3 ) + throw MeshReaderError( "MeshReader", "gridOrigin has invalid size: " + std::to_string(gridOrigin.size()) + " (should be 3)" ); + if( gridSpacing.size() != 3 ) + throw MeshReaderError( "MeshReader", "gridSpacing has invalid size: " + std::to_string(gridSpacing.size()) + " (should be 3)" ); + + // split the extent into begin and end + typename MeshType::CoordinatesType begin, end; + for( int i = 0; i < begin.getSize(); i++ ) { + begin[i] = gridExtent[2 * i]; + end[i] = gridExtent[2 * i + 1]; + } + mesh.setDimensions(end - begin); + + // transform the origin and calculate proportions + typename MeshType::PointType origin, proportions; + for( int i = 0; i < origin.getSize(); i++ ) { + origin[i] = gridOrigin[i] + begin[i] * gridSpacing[i]; + proportions[i] = (end[i] - begin[i]) * gridSpacing[i]; + } + mesh.setDomain( origin, proportions ); + } + + /** + * \brief Method which loads the intermediate mesh representation into a + * mesh object. + * + * This overload applies to unstructured meshes, i.e. \ref TNL::Meshes::Mesh. + * + * When the method exits, the intermediate mesh representation is destroyed + * to save memory. However, depending on the specific file format, the mesh + * file may remain open so that the user can load additional data. + */ + template< typename MeshType > + std::enable_if_t< ! isGrid< MeshType >::value > + loadMesh( MeshType& mesh ) + { + // check that detectMesh has been called + if( meshType == "" ) + detectMesh(); + + // check if we have an unstructured mesh + if( meshType != "Meshes::Mesh" ) + throw MeshReaderError( "MeshReader", "the file does not contain an unstructured mesh, it is " + meshType ); + + // skip empty mesh (the cell shape is indeterminate) + if( NumberOfPoints == 0 && NumberOfCells == 0 ) { + mesh = MeshType {}; + return; + } + // check that the cell shape mathes const VTK::EntityShape meshCellShape = VTK::TopologyToEntityShape< typename MeshType::template EntityTraits< MeshType::getMeshDimension() >::EntityTopology >::shape; if( meshCellShape != cellShape ) @@ -102,7 +167,6 @@ public: + "of cells used in the file (" + VTK::getShapeName(cellShape) + ")" ); using MeshBuilder = MeshBuilder< MeshType >; - using IndexType = typename MeshType::GlobalIndexType; using PointType = typename MeshType::PointType; using CellSeedType = typename MeshBuilder::CellSeedType; @@ -147,7 +211,7 @@ public: pointsArray = connectivityArray = offsetsArray = typesArray = {}; if( ! meshBuilder.build( mesh ) ) - throw MeshReaderError( "VTKReader", "MeshBuilder failed" ); + throw MeshReaderError( "MeshReader", "MeshBuilder failed" ); } virtual VariantVector @@ -218,6 +282,10 @@ protected: int meshDimension, worldDimension; VTK::EntityShape cellShape = VTK::EntityShape::Vertex; + // intermediate representation of a grid (this is relevant only for TNL::Meshes::Grid) + std::vector< std::int64_t > gridExtent; + std::vector< double > gridOrigin, gridSpacing; + // intermediate representation of the unstructured mesh (matches the VTU // file format, other formats have to be converted) VariantVector pointsArray, connectivityArray, offsetsArray, typesArray; @@ -230,6 +298,10 @@ protected: NumberOfPoints = NumberOfCells = 0; meshDimension = worldDimension = 0; cellShape = VTK::EntityShape::Vertex; + + gridExtent = {}; + gridOrigin = gridSpacing = {}; + pointsArray = connectivityArray = offsetsArray = typesArray = {}; pointsType = connectivityType = offsetsType = typesType = ""; } diff --git a/src/TNL/Meshes/Readers/PVTIReader.h b/src/TNL/Meshes/Readers/PVTIReader.h new file mode 100644 index 0000000000000000000000000000000000000000..742578dfce9a4c03dc9ee81cff9c09969c9577b9 --- /dev/null +++ b/src/TNL/Meshes/Readers/PVTIReader.h @@ -0,0 +1,335 @@ +/*************************************************************************** + PVTIReader.h - description + ------------------- + begin : Jun 26, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +// Implemented by: Jakub Klinkovský + +#pragma once + +#include <experimental/filesystem> + +#include <TNL/MPI/Wrappers.h> +#include <TNL/MPI/Utils.h> +#include <TNL/Meshes/Readers/VTIReader.h> +#include <TNL/Meshes/MeshDetails/layers/EntityTags/Traits.h> + +namespace TNL { +namespace Meshes { +namespace Readers { + +class PVTIReader +: public XMLVTK +{ + std::string + getSourcePath( std::string source ) + { + namespace fs = std::experimental::filesystem; + return fs::path(fileName).parent_path() / source; + } + +#ifdef HAVE_TINYXML2 + void readParallelImageData() + { + using namespace tinyxml2; + + // read the required attributes + const std::string extent = getAttributeString( datasetElement, "WholeExtent" ); + const std::string origin = getAttributeString( datasetElement, "Origin" ); + const std::string spacing = getAttributeString( datasetElement, "Spacing" ); + + // parse the extent + { + std::stringstream ss( extent ); + gridExtent.resize( 6, 0 ); + for( int i = 0; i < 6; i++ ) { + ss >> gridExtent[i]; + // check conversion error + if( ! ss.good() ) + throw MeshReaderError( "VTIReader", "invalid extent: not a number: " + extent ); + } + // check remaining characters + std::string suffix; + ss >> std::ws >> suffix; + if( ! suffix.empty() ) + throw MeshReaderError( "VTIReader", "invalid extent " + extent + ": trailing characters: " + suffix ); + } + + // parse the origin + { + std::stringstream ss( origin ); + gridOrigin.resize( 3 ); + for( int i = 0; i < 3; i++ ) { + ss >> gridOrigin[i]; + // check conversion error + if( ! ss.good() ) + throw MeshReaderError( "VTIReader", "invalid origin: not a number: " + origin ); + } + // check remaining characters + std::string suffix; + ss >> std::ws >> suffix; + if( ! suffix.empty() ) + throw MeshReaderError( "VTIReader", "invalid origin " + origin + ": trailing characters: " + suffix ); + } + + // parse the spacing + { + std::stringstream ss( spacing ); + gridSpacing.resize( 3 ); + for( int i = 0; i < 3; i++ ) { + ss >> gridSpacing[i]; + // check conversion error + if( ! ss.good() ) + throw MeshReaderError( "VTIReader", "invalid spacing: not a number: " + spacing ); + // check negative numbers + if( gridSpacing[i] < 0 ) + throw MeshReaderError( "VTIReader", "invalid spacing: negative number: " + spacing ); + } + // check remaining characters + std::string suffix; + ss >> std::ws >> suffix; + if( ! suffix.empty() ) + throw MeshReaderError( "VTIReader", "invalid spacing " + spacing + ": trailing characters: " + suffix ); + } + + // determine the grid dimension + int dim = 0; + for( int i = 0; i < 3; i++ ) + if( gridSpacing[i] > 0 ) + dim++; + else + break; + worldDimension = meshDimension = dim; + + // populate cellShape (just for completeness, not necessary for GridTypeResolver) + if( meshDimension == 1 ) + cellShape = VTK::EntityShape::Line; + else if( meshDimension == 2 ) + cellShape = VTK::EntityShape::Pixel; + else if( meshDimension == 3 ) + cellShape = VTK::EntityShape::Voxel; + + // RealType is not stored in the VTI file, so just set the default + pointsType = "double"; + + // set the index type + connectivityType = headerType; + + + // read GhostLevel attribute + ghostLevels = getAttributeInteger( datasetElement, "GhostLevel" ); + // read MinCommonVertices attribute (TNL-specific, optional) + minCommonVertices = getAttributeInteger( datasetElement, "MinCommonVertices", 0 ); + + // read pieces info + const XMLElement* piece = getChildSafe( datasetElement, "Piece" ); + while( piece ) { + const std::string source = getAttributeString( piece, "Source" ); + if( source != "" ) { + pieceSources.push_back( getSourcePath( source ) ); + } + else + throw MeshReaderError( "PVTIReader", "the Source attribute of a <Piece> element was found empty." ); + // find next + piece = piece->NextSiblingElement( "Piece" ); + } + if( pieceSources.size() == 0 ) + throw MeshReaderError( "PVTIReader", "the file does not contain any <Piece> element." ); + + // check that the number of pieces matches the number of MPI ranks + const int nproc = MPI::GetSize( group ); + if( (int) pieceSources.size() != nproc ) + throw MeshReaderError( "PVTIReader", "the number of subdomains does not match the number of MPI ranks (" + + std::to_string(pieceSources.size()) + " vs " + std::to_string(nproc) + ")." ); + + // read the local piece source + const int rank = MPI::GetRank( group ); + localReader.setFileName( pieceSources[ rank ] ); + localReader.detectMesh(); + + // check that local attributes are the same as global attributes + if( getWorldDimension() != localReader.getWorldDimension() ) + throw MeshReaderError( "PVTIReader", "the world dimension of a subdomain does not match the global grid." ); + if( getMeshDimension() != localReader.getMeshDimension() ) + throw MeshReaderError( "PVTIReader", "the mesh dimension of a subdomain does not match the global grid." ); + if( getCellShape() != localReader.getCellShape() ) + throw MeshReaderError( "PVTIReader", "the cell shape of a subdomain does not match the global grid." ); + if( getRealType() != localReader.getRealType() ) + throw MeshReaderError( "PVTIReader", "the real type of a subdomain does not match the global grid." ); + if( getGlobalIndexType() != localReader.getGlobalIndexType() ) + throw MeshReaderError( "PVTIReader", "the global index type of a subdomain does not match the global grid." ); + + // TODO: assert that all MPI ranks have the same attributes + + // TODO +// if( ghostLevels > 0 ) { +// // load the vtkGhostType arrays from PointData and CellData +// pointTags = localReader.readPointData( VTK::ghostArrayName() ); +// cellTags = localReader.readCellData( VTK::ghostArrayName() ); +// } + } +#endif + +public: + PVTIReader() = default; + + PVTIReader( const std::string& fileName, MPI_Comm group = MPI::AllGroup() ) + : XMLVTK( fileName ), group( group ) + {} + + virtual void detectMesh() override + { +#ifdef HAVE_TINYXML2 + reset(); + try { + openVTKFile(); + } + catch( const MeshReaderError& ) { + reset(); + throw; + } + + // verify file type + if( fileType == "PImageData" ) + readParallelImageData(); + else + throw MeshReaderError( "PVTIReader", "the reader cannot read data of the type " + fileType + ". Use a different reader if possible." ); + + // indicate success by setting the mesh type + meshType = "Meshes::DistributedGrid"; +#else + throw_no_tinyxml(); +#endif + } + + template< typename MeshType > + std::enable_if_t< isDistributedGrid< MeshType >::value > + loadMesh( MeshType& mesh ) + { + // check that detectMesh has been called + if( meshType == "" ) + detectMesh(); + + // check if we have a distributed grid + if( meshType != "Meshes::DistributedGrid" ) + throw MeshReaderError( "MeshReader", "the file does not contain a distributed structured grid, it is " + meshType ); + + // set the communication group + mesh.setCommunicationGroup( group ); + + // TODO: set the domain decomposition +// mesh.setDomainDecomposition( decomposition ); + + // load the global grid (meshType must be faked before calling loadMesh) + typename MeshType::GridType globalGrid; + meshType = "Meshes::Grid"; + MeshReader::loadMesh( globalGrid ); + meshType = "Meshes::DistributedGrid"; + + // set the global grid from the extent in the .pvti file + // (this actually does the decomposition, i.e. computes the local size etc.) + mesh.setGlobalGrid( globalGrid ); + + // set ghost levels (this updates the lower and upper overlaps on the + // distributed grid, as well as the localOrigin, localBegin and + // localGridSize based on the overlaps) + mesh.setGhostLevels( ghostLevels ); + // check MinCommonVertices + // TODO +// if( minCommonVertices > 0 && minCommonVertices != MeshType::Config::dualGraphMinCommonVertices ) +// std::cerr << "WARNING: the mesh was decomposed with different MinCommonVertices value than the value set in the mesh configuration " +// "(" << minCommonVertices << " vs " << MeshType::Config::dualGraphMinCommonVertices << ")." << std::endl; + + // load the local mesh and check with the subdomain + typename MeshType::GridType localMesh; + localReader.loadMesh( localMesh ); + if( localMesh != mesh.getLocalMesh() ) { + std::stringstream msg; + msg << "The grid from the " << MPI::GetRank( group ) << "-th subdomain .vti file does not match the local grid of the DistributedGrid." + << "\n- Grid from the .vti file:\n" << localMesh + << "\n- Local grid from the DistributedGrid:\n" << mesh.getLocalMesh(); + throw MeshReaderError( "PVTIReader", msg.str() ); + } + +// using Index = typename MeshType::IndexType; +// const Index pointsCount = mesh.getLocalMesh().template getEntitiesCount< 0 >(); +// const Index cellsCount = mesh.getLocalMesh().template getEntitiesCount< MeshType::getMeshDimension() >(); + +/* // TODO + if( ghostLevels > 0 ) { + // assign point ghost tags + using mpark::get; + const std::vector<std::uint8_t> pointTags = get< std::vector<std::uint8_t> >( this->pointTags ); + if( (Index) pointTags.size() != pointsCount ) + throw MeshReaderError( "PVTIReader", "the vtkGhostType array in PointData has wrong size: " + std::to_string(pointTags.size()) ); + mesh.vtkPointGhostTypes() = pointTags; + for( Index i = 0; i < pointsCount; i++ ) + if( pointTags[ i ] & (std::uint8_t) VTK::PointGhostTypes::DUPLICATEPOINT ) + localMesh.template addEntityTag< 0 >( i, EntityTags::GhostEntity ); + + // assign cell ghost tags + using mpark::get; + const std::vector<std::uint8_t> cellTags = get< std::vector<std::uint8_t> >( this->cellTags ); + if( (Index) cellTags.size() != cellsCount ) + throw MeshReaderError( "PVTIReader", "the vtkGhostType array in CellData has wrong size: " + std::to_string(cellTags.size()) ); + mesh.vtkCellGhostTypes() = cellTags; + for( Index i = 0; i < cellsCount; i++ ) { + if( cellTags[ i ] & (std::uint8_t) VTK::CellGhostTypes::DUPLICATECELL ) + localMesh.template addEntityTag< MeshType::getMeshDimension() >( i, EntityTags::GhostEntity ); + } + + // reset arrays since they are not needed anymore + this->pointTags = this->cellTags = {}; + } +*/ + } + + template< typename MeshType > + std::enable_if_t< ! isDistributedGrid< MeshType >::value > + loadMesh( MeshType& mesh ) + { + throw MeshReaderError( "MeshReader", "the PVTI reader cannot be used to load a distributed unstructured mesh." ); + } + + virtual VariantVector + readPointData( std::string arrayName ) override + { + return localReader.readPointData( arrayName ); + } + + virtual VariantVector + readCellData( std::string arrayName ) override + { + return localReader.readCellData( arrayName ); + } + + virtual void reset() override + { + resetBase(); + ghostLevels = 0; + pieceSources = {}; + localReader.reset(); + pointTags = cellTags = {}; + } + +protected: + MPI_Comm group; + + int ghostLevels = 0; + int minCommonVertices = 0; + std::vector<std::string> pieceSources; + + VTIReader localReader; + + // additinal arrays we need to read from the localReader + VariantVector pointTags, cellTags; +}; + +} // namespace Readers +} // namespace Meshes +} // namespace TNL diff --git a/src/TNL/Meshes/Readers/PVTUReader.h b/src/TNL/Meshes/Readers/PVTUReader.h index 725aa7fec4baaf797afdda3908f126b728744fc2..99b05b53c9038f97779fdcfc73b26de183222801 100644 --- a/src/TNL/Meshes/Readers/PVTUReader.h +++ b/src/TNL/Meshes/Readers/PVTUReader.h @@ -15,6 +15,7 @@ #include <experimental/filesystem> #include <TNL/MPI/Wrappers.h> +#include <TNL/MPI/Utils.h> #include <TNL/Meshes/Readers/VTUReader.h> #include <TNL/Meshes/MeshDetails/layers/EntityTags/Traits.h> @@ -132,12 +133,24 @@ public: } template< typename MeshType > - void loadMesh( MeshType& mesh ) + std::enable_if_t< isDistributedGrid< MeshType >::value > + loadMesh( MeshType& mesh ) + { + throw MeshReaderError( "MeshReader", "the PVTU reader cannot be used to load a distributed structured grid." ); + } + + template< typename MeshType > + std::enable_if_t< ! isDistributedGrid< MeshType >::value > + loadMesh( MeshType& mesh ) { // check that detectMesh has been called if( meshType == "" ) detectMesh(); + // check if we have a distributed unstructured mesh + if( meshType != "Meshes::DistributedMesh" ) + throw MeshReaderError( "MeshReader", "the file does not contain an unstructured mesh, it is " + meshType ); + // load the local mesh auto& localMesh = mesh.getLocalMesh(); localReader.loadMesh( localMesh ); @@ -204,8 +217,20 @@ public: // reset arrays since they are not needed anymore this->pointTags = this->cellTags = pointGlobalIndices = cellGlobalIndices = {}; - // set the communication group - mesh.setCommunicationGroup( group ); + // check if we need to split the communicator + const Index minCount = MPI::reduce( TNL::min( pointsCount, cellsCount ), MPI_MIN ); + if( minCount == 0 ) { + // split the communicator, remove the ranks which did not get a subdomain + const int color = (pointsCount > 0 && cellsCount > 0) ? 0 : MPI_UNDEFINED; + const MPI_Comm subgroup = MPI::Comm_split( group, color, 0 ); + + // set the communication group + mesh.setCommunicationGroup( subgroup ); + } + else { + // set the communication group + mesh.setCommunicationGroup( group ); + } } virtual VariantVector diff --git a/src/TNL/Meshes/Readers/TNLReader.h b/src/TNL/Meshes/Readers/TNLReader.h deleted file mode 100644 index 5121bbea9d878e110753da150d8b250f9e77e7bc..0000000000000000000000000000000000000000 --- a/src/TNL/Meshes/Readers/TNLReader.h +++ /dev/null @@ -1,171 +0,0 @@ -/*************************************************************************** - TNL.h - description - ------------------- - begin : Nov 20, 2016 - copyright : (C) 2016 by Tomas Oberhuber et al. - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#pragma once - -#include <TNL/String.h> -#include <TNL/Object.h> -#include <TNL/Meshes/VTKTraits.h> - -namespace TNL { -namespace Meshes { -namespace Readers { - -class TNLReader -{ -public: - TNLReader() = delete; - - TNLReader( const String& fileName ) - : fileName( fileName ) - {} - - bool - detectMesh() - { - this->reset(); - - const String objectType = getObjectType( fileName ); - const std::vector< String > parsedMeshType = parseObjectType( objectType ); - if( ! parsedMeshType.size() ) { - std::cerr << "Unable to parse the mesh type " << meshType << "." << std::endl; - return false; - } - - meshType = parsedMeshType[ 0 ]; - if( meshType == "Meshes::Grid" ) { - // save parts necessary to determine the mesh type - meshDimension = worldDimension = std::atoi( parsedMeshType[ 1 ].getString() ); - realType = parsedMeshType[ 2 ]; - globalIndexType = localIndexType = parsedMeshType[ 4 ]; - // populate entity types (not necessary for GridTypeResolver, but while we're at it...) - if( meshDimension == 1 ) - cellShape = VTK::EntityShape::Line; - else if( meshDimension == 2 ) - cellShape = VTK::EntityShape::Quad; - else if( meshDimension == 3 ) - cellShape = VTK::EntityShape::Hexahedron; - } - else if( meshType == "Meshes::Mesh" ) { - const std::vector< String > parsedMeshConfig = parseObjectType( parsedMeshType[ 1 ] ); - if( ! parsedMeshConfig.size() ) { - std::cerr << "Unable to parse the mesh config type " << parsedMeshType[ 1 ] << "." << std::endl; - return false; - } - if( parsedMeshConfig.size() != 6 ) { - std::cerr << "The parsed mesh config type has wrong size (expected 6 elements):" << std::endl; - std::cerr << "[ "; - for( std::size_t i = 0; i < parsedMeshConfig.size() - 1; i++ ) - std::cerr << parsedMeshConfig[ i ] << ", "; - std::cerr << parsedMeshConfig.back() << " ]" << std::endl; - return false; - } - - // save parts necessary to determine the mesh type - const String topology = parsedMeshConfig[ 1 ]; - worldDimension = std::atoi( parsedMeshConfig[ 2 ].getString() ); - realType = parsedMeshConfig[ 3 ]; - globalIndexType = parsedMeshConfig[ 4 ]; - localIndexType = parsedMeshConfig[ 5 ]; - - if( topology == "TNL::Meshes::Topologies::Edge" ) - cellShape = VTK::EntityShape::Line; - else if( topology == "TNL::Meshes::Topologies::Triangle" ) - cellShape = VTK::EntityShape::Triangle; - else if( topology == "TNL::Meshes::Topologies::Quadrangle" ) - cellShape = VTK::EntityShape::Quad; - else if( topology == "TNL::Meshes::Topologies::Tetrahedron" ) - cellShape = VTK::EntityShape::Tetra; - else if( topology == "TNL::Meshes::Topologies::Hexahedron" ) - cellShape = VTK::EntityShape::Hexahedron; - else { - std::cerr << "Detected topology '" << topology << "' is not supported." << std::endl; - return false; - } - } - else { - std::cerr << "The mesh type " << meshType << " is not supported (yet)." << std::endl; - return false; - } - - return true; - } - - template< typename MeshType > - void - loadMesh( MeshType& mesh ) - { - mesh.load( fileName ); - } - - String - getMeshType() const - { - return meshType; - } - - int - getMeshDimension() const - { - return meshDimension; - } - - int - getWorldDimension() const - { - return worldDimension; - } - - VTK::EntityShape - getCellShape() const - { - return cellShape; - } - - String - getRealType() const - { - return realType; - } - - String - getGlobalIndexType() const - { - return globalIndexType; - } - - String - getLocalIndexType() const - { - return localIndexType; - } - -protected: - String fileName; - String meshType; - int meshDimension = 0; - int worldDimension = 0; - VTK::EntityShape cellShape = VTK::EntityShape::Vertex; - String realType; - String globalIndexType; - String localIndexType; - - void reset() - { - meshType = ""; - meshDimension = worldDimension = 0; - cellShape = VTK::EntityShape::Vertex; - realType = localIndexType = globalIndexType = ""; - } -}; - -} // namespace Readers -} // namespace Meshes -} // namespace TNL diff --git a/src/TNL/Meshes/Readers/VTIReader.h b/src/TNL/Meshes/Readers/VTIReader.h new file mode 100644 index 0000000000000000000000000000000000000000..c1ea0cd51f827208e6cea651022e4010b4f91a1a --- /dev/null +++ b/src/TNL/Meshes/Readers/VTIReader.h @@ -0,0 +1,158 @@ +/*************************************************************************** + VTIReader.h - description + ------------------- + begin : Jun 4, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +// Implemented by: Jakub Klinkovský + +#pragma once + +#include <TNL/Meshes/Readers/XMLVTK.h> +#include <cstdint> + +namespace TNL { +namespace Meshes { +namespace Readers { + +class VTIReader +: public XMLVTK +{ +#ifdef HAVE_TINYXML2 + void readImageData() + { + // read the required attributes + const std::string extent = getAttributeString( datasetElement, "WholeExtent" ); + const std::string origin = getAttributeString( datasetElement, "Origin" ); + const std::string spacing = getAttributeString( datasetElement, "Spacing" ); + + // check the <Piece> tag + using namespace tinyxml2; + const XMLElement* piece = getChildSafe( datasetElement, "Piece" ); + if( piece->NextSiblingElement( "Piece" ) ) + // ambiguity - throw error, we don't know which piece to parse (or all of them?) + throw MeshReaderError( "VTIReader", "the serial ImageData file contains more than one <Piece> element" ); + const std::string pieceExtent = getAttributeString( piece, "Extent" ); + if( pieceExtent != extent ) + throw MeshReaderError( "VTIReader", "the <Piece> element has different extent than <ImageData> (" + + pieceExtent + " vs " + extent + ")" ); + + // parse the extent + { + std::stringstream ss( extent ); + gridExtent.resize( 6, 0 ); + for( int i = 0; i < 6; i++ ) { + ss >> gridExtent[i]; + // check conversion error + if( ! ss.good() ) + throw MeshReaderError( "VTIReader", "invalid extent: not a number: " + extent ); + } + // check remaining characters + std::string suffix; + ss >> std::ws >> suffix; + if( ! suffix.empty() ) + throw MeshReaderError( "VTIReader", "invalid extent " + extent + ": trailing characters: " + suffix ); + } + + // parse the origin + { + std::stringstream ss( origin ); + gridOrigin.resize( 3 ); + for( int i = 0; i < 3; i++ ) { + ss >> gridOrigin[i]; + // check conversion error + if( ! ss.good() ) + throw MeshReaderError( "VTIReader", "invalid origin: not a number: " + origin ); + } + // check remaining characters + std::string suffix; + ss >> std::ws >> suffix; + if( ! suffix.empty() ) + throw MeshReaderError( "VTIReader", "invalid origin " + origin + ": trailing characters: " + suffix ); + } + + // parse the spacing + { + std::stringstream ss( spacing ); + gridSpacing.resize( 3 ); + for( int i = 0; i < 3; i++ ) { + ss >> gridSpacing[i]; + // check conversion error + if( ! ss.good() ) + throw MeshReaderError( "VTIReader", "invalid spacing: not a number: " + spacing ); + // check negative numbers + if( gridSpacing[i] < 0 ) + throw MeshReaderError( "VTIReader", "invalid spacing: negative number: " + spacing ); + } + // check remaining characters + std::string suffix; + ss >> std::ws >> suffix; + if( ! suffix.empty() ) + throw MeshReaderError( "VTIReader", "invalid spacing " + spacing + ": trailing characters: " + suffix ); + } + + // determine the grid dimension + int dim = 0; + for( int i = 0; i < 3; i++ ) + if( gridSpacing[i] > 0 ) + dim++; + else + break; + worldDimension = meshDimension = dim; + + // populate cellShape (just for completeness, not necessary for GridTypeResolver) + if( meshDimension == 1 ) + cellShape = VTK::EntityShape::Line; + else if( meshDimension == 2 ) + cellShape = VTK::EntityShape::Pixel; + else if( meshDimension == 3 ) + cellShape = VTK::EntityShape::Voxel; + + // RealType is not stored in the VTI file, so just set the default + pointsType = "double"; + + // set the index type + connectivityType = headerType; + } +#endif + +public: + VTIReader() = default; + + VTIReader( const std::string& fileName ) + : XMLVTK( fileName ) + {} + + virtual void detectMesh() override + { +#ifdef HAVE_TINYXML2 + reset(); + try { + openVTKFile(); + } + catch( const MeshReaderError& ) { + reset(); + throw; + } + + // verify file type + if( fileType == "ImageData" ) + readImageData(); + else + throw MeshReaderError( "VTIReader", "the reader cannot read data of the type " + fileType + ". Use a different reader if possible." ); + + // indicate success by setting the mesh type + meshType = "Meshes::Grid"; +#else + throw_no_tinyxml(); +#endif + } +}; + +} // namespace Readers +} // namespace Meshes +} // namespace TNL diff --git a/src/TNL/Meshes/Readers/VTKReader.h b/src/TNL/Meshes/Readers/VTKReader.h index d6cbfb3e28784cb246c31e7d3ff492a765279af3..530ef7b46d0e36f62a6a5c4c5362123a0eb0ac7e 100644 --- a/src/TNL/Meshes/Readers/VTKReader.h +++ b/src/TNL/Meshes/Readers/VTKReader.h @@ -15,6 +15,7 @@ #include <fstream> #include <sstream> #include <vector> +#include <map> #include <TNL/Meshes/Readers/MeshReader.h> #include <TNL/Endianness.h> @@ -189,6 +190,12 @@ public: } offsetsArray.push_back( connectivityArray.size() ); } + else { + // skip the entity + const std::int32_t subvertices = readValue< std::int32_t >( dataFormat, inputFile ); + for( int v = 0; v < subvertices; v++ ) + skipValue( dataFormat, inputFile, "int" ); + } } // set cell types @@ -317,6 +324,8 @@ protected: // skip the points coordinates for( std::int32_t j = 0; j < components * tuples; j++ ) skipValue( dataFormat, str, datatype ); + // skip end of line (or any whitespace) + str >> std::ws; } } else if( name == "POINTS" ) { @@ -327,6 +336,8 @@ protected: // skip the values for( std::int32_t j = 0; j < 3 * points_count; j++ ) skipValue( dataFormat, str, datatype ); + // skip end of line (or any whitespace) + str >> std::ws; } else if( name == "CELLS" ) { sectionPositions.insert( {"CELLS", currentPosition} ); @@ -336,6 +347,8 @@ protected: // skip the values for( std::int32_t j = 0; j < values_count; j++ ) skipValue( dataFormat, str, "int" ); + // skip end of line (or any whitespace) + str >> std::ws; } else if( name == "CELL_TYPES" ) { sectionPositions.insert( {"CELL_TYPES", currentPosition} ); @@ -346,6 +359,8 @@ protected: for( std::int32_t j = 0; j < count; j++ ) // cell types are stored with great redundancy as int32 in the VTK file skipValue( dataFormat, str, "int" ); + // skip end of line (or any whitespace) + str >> std::ws; } else if( name == "CELL_DATA" || name == "POINT_DATA" ) { if( cells_count == 0 || points_count == 0 ) @@ -423,6 +438,8 @@ protected: // skip the points coordinates for( std::int32_t j = 0; j < components * tuples; j++ ) skipValue( dataFormat, str, datatype ); + // skip end of line (or any whitespace) + str >> std::ws; } continue; } @@ -435,6 +452,8 @@ protected: // skip the values for( std::int32_t j = 0; j < elements * values_per_element; j++ ) skipValue( dataFormat, str, datatype ); + // skip end of line (or any whitespace) + str >> std::ws; } } else diff --git a/src/TNL/Meshes/Readers/VTUReader.h b/src/TNL/Meshes/Readers/VTUReader.h index f9c3902d06fb6c8efb0dec7982b94537a743b45d..3a7ce1aaef82ed11e271823466b01640c4ab5d8f 100644 --- a/src/TNL/Meshes/Readers/VTUReader.h +++ b/src/TNL/Meshes/Readers/VTUReader.h @@ -89,6 +89,9 @@ class VTUReader // check array size if( array.size() != NumberOfCells ) throw MeshReaderError( "VTUReader", "size of the types data array does not match the NumberOfCells attribute" ); + // check empty mesh + if( array.size() == 0 ) + return; cellShape = (VTK::EntityShape) array[0]; meshDimension = getEntityDimension( cellShape ); // TODO: check only entities of the same dimension (edges, faces and cells separately) diff --git a/src/TNL/Meshes/Readers/XMLVTK.h b/src/TNL/Meshes/Readers/XMLVTK.h index 9e2817a17e058abf64dcdf6167a9a4c8b9ca65ac..a898b85bdcb84e36f57ddd367b3229ce65bcba76 100644 --- a/src/TNL/Meshes/Readers/XMLVTK.h +++ b/src/TNL/Meshes/Readers/XMLVTK.h @@ -166,6 +166,10 @@ protected: VariantVector readAsciiBlock( const char* block ) const { + // handle empty array + if( ! block ) + return std::vector<T> {}; + // creating a copy of the block is rather costly, but so is ASCII parsing std::stringstream ss; ss << block; @@ -187,6 +191,10 @@ protected: VariantVector readBinaryBlock( const char* block ) const { + // handle empty array + if( ! block ) + return std::vector<T> {}; + // skip whitespace at the beginning while( *block != '\0' && std::isspace( *block ) ) ++block; @@ -250,8 +258,6 @@ protected: { verifyElement( elem, "DataArray" ); const char* block = elem->GetText(); - if( ! block ) - throw MeshReaderError( "XMLVTK", "the DataArray with Name=\"" + arrayName + "\" does not contain any data" ); const std::string type = getAttributeString( elem, "type" ); const std::string format = getAttributeString( elem, "format" ); if( format == "ascii" ) { @@ -328,13 +334,13 @@ public: // load and verify XML tinyxml2::XMLError status = dom.LoadFile( fileName.c_str() ); if( status != XML_SUCCESS ) - throw MeshReaderError( "XMLVTK", "failed to parse the file as an XML document." ); + throw MeshReaderError( "XMLVTK", "failed to parse the file " + fileName + " as an XML document." ); // verify root element const XMLElement* elem = dom.FirstChildElement(); verifyElement( elem, "VTKFile" ); if( elem->NextSibling() ) - throw MeshReaderError( "XMLVTK", "<VTKFile> is not the only element in the file" ); + throw MeshReaderError( "XMLVTK", "<VTKFile> is not the only element in the file " + fileName ); // verify byte order const std::string systemByteOrder = (isLittleEndian()) ? "LittleEndian" : "BigEndian"; diff --git a/src/TNL/Meshes/Readers/getMeshReader.h b/src/TNL/Meshes/Readers/getMeshReader.h index 2c2c18a8e3da03a923a62be80629aec81ce6d246..41976dcfd3a65584665423d83a60f37e45ff9221 100644 --- a/src/TNL/Meshes/Readers/getMeshReader.h +++ b/src/TNL/Meshes/Readers/getMeshReader.h @@ -12,18 +12,21 @@ #pragma once +#include <memory> #include <experimental/filesystem> #include <TNL/Meshes/Readers/NetgenReader.h> #include <TNL/Meshes/Readers/VTKReader.h> #include <TNL/Meshes/Readers/VTUReader.h> +#include <TNL/Meshes/Readers/VTIReader.h> #include <TNL/Meshes/Readers/PVTUReader.h> +#include <TNL/Meshes/Readers/PVTIReader.h> namespace TNL { namespace Meshes { namespace Readers { -std::shared_ptr< Readers::MeshReader > +inline std::shared_ptr< MeshReader > getMeshReader( const std::string& fileName, const std::string& fileFormat ) { @@ -42,14 +45,18 @@ getMeshReader( const std::string& fileName, return std::make_shared< Readers::VTKReader >( fileName ); else if( format == "vtu" ) return std::make_shared< Readers::VTUReader >( fileName ); + else if( format == "vti" ) + return std::make_shared< Readers::VTIReader >( fileName ); else if( format == "pvtu" ) return std::make_shared< Readers::PVTUReader >( fileName ); + else if( format == "pvti" ) + return std::make_shared< Readers::PVTIReader >( fileName ); if( fileFormat == "auto" ) std::cerr << "File '" << fileName << "' has unsupported format (based on the file extension): " << format << "."; else std::cerr << "Unsupported fileFormat parameter: " << fileFormat << "."; - std::cerr << " Supported formats are 'vtk', 'vtu', 'pvtu' and 'ng'." << std::endl; + std::cerr << " Supported formats are 'ng', 'vtk', 'vtu', 'vti', 'pvtu' and 'pvti'." << std::endl; return nullptr; } diff --git a/src/TNL/Meshes/Traits.h b/src/TNL/Meshes/Traits.h new file mode 100644 index 0000000000000000000000000000000000000000..484ed2e52b77c6bbbe6000f3116632b3c504dde4 --- /dev/null +++ b/src/TNL/Meshes/Traits.h @@ -0,0 +1,48 @@ +/*************************************************************************** + Traits.h - description + ------------------- + begin : Jun 4, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +#pragma once + +#include <type_traits> + +#include <TNL/Meshes/Grid.h> +#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> + +namespace TNL { +namespace Meshes { + +template< typename T > +class isGrid +: public std::false_type +{}; + +template< int Dimension, + typename Real, + typename Device, + typename Index > +class isGrid< Grid< Dimension, Real, Device, Index > > +: public std::true_type +{}; + +template< typename T > +class isDistributedGrid +: public std::false_type +{}; + +template< int Dimension, + typename Real, + typename Device, + typename Index > +class isDistributedGrid< DistributedMeshes::DistributedMesh< Grid< Dimension, Real, Device, Index > > > +: public std::true_type +{}; + +} // namespace Meshes +} // namespace TNL diff --git a/src/TNL/Meshes/TypeResolver/GridTypeResolver.hpp b/src/TNL/Meshes/TypeResolver/GridTypeResolver.hpp index 69fe4e03fd4fc8a0874aa59f4d4f165eb1e6d4db..0c284ca21757eeccd1efa605bf7df47173bab6b3 100644 --- a/src/TNL/Meshes/TypeResolver/GridTypeResolver.hpp +++ b/src/TNL/Meshes/TypeResolver/GridTypeResolver.hpp @@ -170,7 +170,7 @@ resolveTerminate( Reader& reader, Functor&& functor ) { std::cerr << "The mesh type " << TNL::getType< GridType >() << " is disabled in the build configuration." << std::endl; return false; -}; +} template< typename ConfigTag, typename Device > @@ -183,7 +183,7 @@ GridTypeResolver< ConfigTag, Device >::detail< Reader, Functor >:: resolveTerminate( Reader& reader, Functor&& functor ) { return std::forward<Functor>(functor)( reader, GridType{} ); -}; +} } // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.h b/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.h index a62424ef3946982fcfd61e65e8badf227e985145..726b93e5d5f9a9a461e96b09cfbd5381451af707 100644 --- a/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.h +++ b/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.h @@ -33,47 +33,12 @@ resolveAndLoadDistributedMesh( Functor&& functor, const std::string& fileName, const std::string& fileFormat = "auto" ); -template< typename MeshConfig, - typename Device > +template< typename Mesh > bool -loadDistributedMesh( Mesh< MeshConfig, Device >& mesh, - DistributedMeshes::DistributedMesh< Mesh< MeshConfig, Device > >& distributedMesh, +loadDistributedMesh( DistributedMeshes::DistributedMesh< Mesh >& distributedMesh, const std::string& fileName, const std::string& fileFormat = "auto" ); -template< typename Problem, - typename MeshConfig, - typename Device > -bool -decomposeMesh( const Config::ParameterContainer& parameters, - const std::string& prefix, - Mesh< MeshConfig, Device >& mesh, - DistributedMeshes::DistributedMesh< Mesh< MeshConfig, Device > >& distributedMesh, - Problem& problem ); - -// overloads for grids -template< int Dimension, - typename Real, - typename Device, - typename Index > -bool -loadDistributedMesh( Grid< Dimension, Real, Device, Index >& mesh, - DistributedMeshes::DistributedMesh< Grid< Dimension, Real, Device, Index > > &distributedMesh, - const std::string& fileName, - const std::string& fileFormat = "auto" ); - -template< typename Problem, - int Dimension, - typename Real, - typename Device, - typename Index > -bool -decomposeMesh( const Config::ParameterContainer& parameters, - const std::string& prefix, - Grid< Dimension, Real, Device, Index >& mesh, - DistributedMeshes::DistributedMesh< Grid< Dimension, Real, Device, Index > > &distributedMesh, - Problem& problem ); - } // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.hpp b/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.hpp index 1cd1ec76e162195b9e340aac12e0ad8022741593..e6d19a9bbdf02c14a6a926fa0f6214648be0a2b3 100644 --- a/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.hpp +++ b/src/TNL/Meshes/TypeResolver/resolveDistributedMeshType.hpp @@ -13,8 +13,7 @@ #include <experimental/filesystem> #include <TNL/Meshes/TypeResolver/resolveDistributedMeshType.h> -#include <TNL/Meshes/TypeResolver/MeshTypeResolver.h> -#include <TNL/Meshes/Readers/PVTUReader.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> namespace TNL { namespace Meshes { @@ -36,37 +35,7 @@ resolveDistributedMeshType( Functor&& functor, return std::forward<Functor>(functor)( reader, DistributedMesh{ std::move(localMesh) } ); }; - namespace fs = std::experimental::filesystem; - std::string format = fileFormat; - if( format == "auto" ) { - format = fs::path(fileName).extension(); - if( format.length() > 0 ) - // remove dot from the extension - format = format.substr(1); - } - - if( format == "pvtu" ) { - // FIXME: The XML VTK files don't store the local index type. - // The reader has some defaults, but they might be disabled by the BuildConfigTags - in - // this case we should use the first enabled type. - Readers::PVTUReader reader( fileName ); - reader.detectMesh(); - if( reader.getMeshType() == "Meshes::DistributedMesh" ) { - return MeshTypeResolver< ConfigTag, Device >::run( static_cast<Readers::MeshReader&>(reader), wrapper ); - } - else { - std::cerr << "The mesh type " << reader.getMeshType() << " is not supported in the VTK reader." << std::endl; - return false; - } - } - else { - if( fileFormat == "auto" ) - std::cerr << "File '" << fileName << "' has unsupported format (based on the file extension): " << format << "."; - else - std::cerr << "Unsupported fileFormat parameter: " << fileFormat << "."; - std::cerr << " Supported formats are 'pvtu'." << std::endl; - return false; - } + return resolveMeshType< ConfigTag, Device >( wrapper, fileName, fileFormat ); } template< typename ConfigTag, @@ -82,7 +51,12 @@ resolveAndLoadDistributedMesh( Functor&& functor, using MeshType = std::decay_t< decltype(mesh) >; std::cout << "Loading a mesh from the file " << fileName << " ..." << std::endl; try { - dynamic_cast<Readers::PVTUReader&>(reader).loadMesh( mesh ); + if( reader.getMeshType() == "Meshes::DistributedMesh" ) + dynamic_cast<Readers::PVTUReader&>(reader).loadMesh( mesh ); + else if( reader.getMeshType() == "Meshes::DistributedGrid" ) + dynamic_cast<Readers::PVTIReader&>(reader).loadMesh( mesh ); + else + throw std::runtime_error( "Unknown type of a distributed mesh: " + reader.getMeshType() ); } catch( const Meshes::Readers::MeshReaderError& e ) { std::cerr << "Failed to load the mesh from the file " << fileName << ". The error is:\n" << e.what() << std::endl; @@ -93,17 +67,12 @@ resolveAndLoadDistributedMesh( Functor&& functor, return resolveDistributedMeshType< ConfigTag, Device >( wrapper, fileName, fileFormat ); } -template< typename MeshConfig, - typename Device > +template< typename Mesh > bool -loadDistributedMesh( Mesh< MeshConfig, Device >& mesh, - DistributedMeshes::DistributedMesh< Mesh< MeshConfig, Device > >& distributedMesh, +loadDistributedMesh( DistributedMeshes::DistributedMesh< Mesh >& distributedMesh, const std::string& fileName, const std::string& fileFormat ) { - // TODO: simplify interface, pass only the distributed mesh - TNL_ASSERT_EQ( &mesh, &distributedMesh.getLocalMesh(), "mesh is not local mesh of the distributed mesh" ); - namespace fs = std::experimental::filesystem; std::string format = fileFormat; if( format == "auto" ) { @@ -118,87 +87,20 @@ loadDistributedMesh( Mesh< MeshConfig, Device >& mesh, reader.loadMesh( distributedMesh ); return true; } + else if( format == "pvti" ) { + Readers::PVTIReader reader( fileName ); + reader.loadMesh( distributedMesh ); + return true; + } else { if( fileFormat == "auto" ) std::cerr << "File '" << fileName << "' has unsupported format (based on the file extension): " << format << "."; else std::cerr << "Unsupported fileFormat parameter: " << fileFormat << "."; - std::cerr << " Supported formats are 'pvtu'." << std::endl; + std::cerr << " Supported formats are 'pvtu' and 'pvti'." << std::endl; return false; } } -template< typename Problem, - typename MeshConfig, - typename Device > -bool -decomposeMesh( const Config::ParameterContainer& parameters, - const std::string& prefix, - Mesh< MeshConfig, Device >& mesh, - DistributedMeshes::DistributedMesh< Mesh< MeshConfig, Device > >& distributedMesh, - Problem& problem ) -{ - std::cerr << "Distributed Mesh is not supported yet, only Distributed Grid is supported."; - return false; -} - -// overloads for grids -template< int Dimension, - typename Real, - typename Device, - typename Index > -bool -loadDistributedMesh( Grid< Dimension, Real, Device, Index >& mesh, - DistributedMeshes::DistributedMesh< Grid< Dimension, Real, Device, Index > > &distributedMesh, - const std::string& fileName, - const std::string& fileFormat ) -{ - std::cout << "Loading a global mesh from the file " << fileName << "..."; - Grid< Dimension, Real, Device, Index > globalGrid; - try - { - globalGrid.load( fileName ); - } - catch(...) - { - std::cerr << std::endl; - std::cerr << "I am not able to load the global mesh from the file " << fileName << "." << std::endl; - return false; - } - std::cout << " [ OK ] " << std::endl; - - typename Meshes::DistributedMeshes::DistributedMesh<Grid< Dimension, Real, Device, Index >>::SubdomainOverlapsType overlap; - distributedMesh.setGlobalGrid( globalGrid ); - distributedMesh.setupGrid(mesh); - return true; -} - -template< typename Problem, - int Dimension, - typename Real, - typename Device, - typename Index > -bool -decomposeMesh( const Config::ParameterContainer& parameters, - const std::string& prefix, - Grid< Dimension, Real, Device, Index >& mesh, - DistributedMeshes::DistributedMesh< Grid< Dimension, Real, Device, Index > > &distributedMesh, - Problem& problem ) -{ - using GridType = Grid< Dimension, Real, Device, Index >; - using DistributedGridType = DistributedMeshes::DistributedMesh< GridType >; - using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType; - - SubdomainOverlapsType lower( 0 ), upper( 0 ); - distributedMesh.setOverlaps( lower, upper ); - distributedMesh.setupGrid( mesh ); - - problem.getSubdomainOverlaps( parameters, prefix, mesh, lower, upper ); - distributedMesh.setOverlaps( lower, upper ); - distributedMesh.setupGrid( mesh ); - - return true; -} - } // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/TypeResolver/resolveMeshType.h b/src/TNL/Meshes/TypeResolver/resolveMeshType.h index 6386a511e1e77511a724e829c6daa3629d8fff52..2e8df25d8b5ba03c047dbc2f4e3e9e2f31e82d07 100644 --- a/src/TNL/Meshes/TypeResolver/resolveMeshType.h +++ b/src/TNL/Meshes/TypeResolver/resolveMeshType.h @@ -73,10 +73,9 @@ resolveAndLoadMesh( Functor&& functor, * should be avoided. Use \ref resolveAndLoadMesh instead to reuse the mesh * reader instance created in \ref resolveMeshType. */ -template< typename MeshConfig, - typename Device > +template< typename Mesh > bool -loadMesh( Mesh< MeshConfig, Device >& mesh, +loadMesh( Mesh& mesh, const std::string& fileName, const std::string& fileFormat = "auto" ); @@ -86,15 +85,6 @@ loadMesh( Mesh< MeshConfig, Devices::Cuda >& mesh, const std::string& fileName, const std::string& fileFormat = "auto" ); -template< int Dimension, - typename Real, - typename Device, - typename Index > -bool -loadMesh( Grid< Dimension, Real, Device, Index >& grid, - const std::string& fileName, - const std::string& fileFormat = "auto" ); - } // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/TypeResolver/resolveMeshType.hpp b/src/TNL/Meshes/TypeResolver/resolveMeshType.hpp index 397e469dde018e705fb430c905fa01a74fb4bcd3..0f457a75d8422e0d1fc7d8f10000db49713e9ab0 100644 --- a/src/TNL/Meshes/TypeResolver/resolveMeshType.hpp +++ b/src/TNL/Meshes/TypeResolver/resolveMeshType.hpp @@ -15,10 +15,7 @@ #include <TNL/Meshes/TypeResolver/resolveMeshType.h> #include <TNL/Meshes/TypeResolver/GridTypeResolver.h> #include <TNL/Meshes/TypeResolver/MeshTypeResolver.h> -#include <TNL/Meshes/Readers/TNLReader.h> -#include <TNL/Meshes/Readers/NetgenReader.h> -#include <TNL/Meshes/Readers/VTKReader.h> -#include <TNL/Meshes/Readers/VTUReader.h> +#include <TNL/Meshes/Readers/getMeshReader.h> namespace TNL { namespace Meshes { @@ -33,74 +30,18 @@ resolveMeshType( Functor&& functor, { std::cout << "Detecting mesh from file " << fileName << " ..." << std::endl; - namespace fs = std::experimental::filesystem; - std::string format = fileFormat; - if( format == "auto" ) { - format = fs::path(fileName).extension(); - if( format.length() > 0 ) - // remove dot from the extension - format = format.substr(1); - } + std::shared_ptr< Readers::MeshReader > reader = Readers::getMeshReader( fileName, fileFormat ); + if( reader == nullptr ) + return false; - // TODO: when TNLReader is gone, use the MeshReader type instead of a template parameter in the mesh type resolver (and remove static_casts in this function) - if( format == "tnl" ) { - Readers::TNLReader reader( fileName ); - if( ! reader.detectMesh() ) - return false; - if( reader.getMeshType() == "Meshes::Grid" ) - return GridTypeResolver< ConfigTag, Device >::run( reader, functor ); - else if( reader.getMeshType() == "Meshes::Mesh" ) - return MeshTypeResolver< ConfigTag, Device >::run( reader, functor ); - else { - std::cerr << "The mesh type " << reader.getMeshType() << " is not supported in the TNL reader." << std::endl; - return false; - } - } - else if( format == "ng" ) { - // FIXME: The Netgen files don't store the real, global index and local index types. - // The reader has some defaults, but they might be disabled by the BuildConfigTags - in - // this case we should use the first enabled type. - Readers::NetgenReader reader( fileName ); - reader.detectMesh(); - if( reader.getMeshType() == "Meshes::Mesh" ) - return MeshTypeResolver< ConfigTag, Device >::run( static_cast<Readers::MeshReader&>(reader), functor ); - else { - std::cerr << "The mesh type " << reader.getMeshType() << " is not supported in the Netgen reader." << std::endl; - return false; - } - } - else if( format == "vtk" ) { - // FIXME: The VTK files don't store the global and local index types. - // The reader has some defaults, but they might be disabled by the BuildConfigTags - in - // this case we should use the first enabled type. - Readers::VTKReader reader( fileName ); - reader.detectMesh(); - if( reader.getMeshType() == "Meshes::Mesh" ) - return MeshTypeResolver< ConfigTag, Device >::run( static_cast<Readers::MeshReader&>(reader), functor ); - else { - std::cerr << "The mesh type " << reader.getMeshType() << " is not supported in the VTK reader." << std::endl; - return false; - } - } - else if( format == "vtu" ) { - // FIXME: The XML VTK files don't store the local index type. - // The reader has some defaults, but they might be disabled by the BuildConfigTags - in - // this case we should use the first enabled type. - Readers::VTUReader reader( fileName ); - reader.detectMesh(); - if( reader.getMeshType() == "Meshes::Mesh" ) - return MeshTypeResolver< ConfigTag, Device >::run( static_cast<Readers::MeshReader&>(reader), functor ); - else { - std::cerr << "The mesh type " << reader.getMeshType() << " is not supported in the VTK reader." << std::endl; - return false; - } - } + reader->detectMesh(); + + if( reader->getMeshType() == "Meshes::Grid" || reader->getMeshType() == "Meshes::DistributedGrid" ) + return GridTypeResolver< ConfigTag, Device >::run( *reader, functor ); + else if( reader->getMeshType() == "Meshes::Mesh" || reader->getMeshType() == "Meshes::DistributedMesh" ) + return MeshTypeResolver< ConfigTag, Device >::run( *reader, functor ); else { - if( fileFormat == "auto" ) - std::cerr << "File '" << fileName << "' has unsupported format (based on the file extension): " << format << "."; - else - std::cerr << "Unsupported fileFormat parameter: " << fileFormat << "."; - std::cerr << " Supported formats are 'tnl', 'vtk', 'vtu' and 'ng'." << std::endl; + std::cerr << "The mesh type " << reader->getMeshType() << " is not supported." << std::endl; return false; } } @@ -129,47 +70,20 @@ resolveAndLoadMesh( Functor&& functor, return resolveMeshType< ConfigTag, Device >( wrapper, fileName, fileFormat ); } -template< typename MeshConfig, - typename Device > +template< typename Mesh > bool -loadMesh( Mesh< MeshConfig, Device >& mesh, +loadMesh( Mesh& mesh, const std::string& fileName, const std::string& fileFormat ) { std::cout << "Loading a mesh from the file " << fileName << " ..." << std::endl; - namespace fs = std::experimental::filesystem; - std::string format = fileFormat; - if( format == "auto" ) { - format = fs::path(fileName).extension(); - if( format.length() > 0 ) - // remove dot from the extension - format = format.substr(1); - } + std::shared_ptr< Readers::MeshReader > reader = Readers::getMeshReader( fileName, fileFormat ); + if( reader == nullptr ) + return false; try { - if( format == "tnl" ) - mesh.load( fileName ); - else if( format == "ng" ) { - Readers::NetgenReader reader( fileName ); - reader.loadMesh( mesh ); - } - else if( format == "vtk" ) { - Readers::VTKReader reader( fileName ); - reader.loadMesh( mesh ); - } - else if( format == "vtu" ) { - Readers::VTUReader reader( fileName ); - reader.loadMesh( mesh ); - } - else { - if( fileFormat == "auto" ) - std::cerr << "File '" << fileName << "' has unsupported format (based on the file extension): " << format << "."; - else - std::cerr << "Unsupported fileFormat parameter: " << fileFormat << "."; - std::cerr << " Supported formats are 'tnl', 'vtk', 'vtu' and 'ng'." << std::endl; - return false; - } + reader->loadMesh( mesh ); } catch( const Meshes::Readers::MeshReaderError& e ) { std::cerr << "Failed to load the mesh from the file " << fileName << ". The error is:\n" << e.what() << std::endl; @@ -192,26 +106,5 @@ loadMesh( Mesh< MeshConfig, Devices::Cuda >& mesh, return true; } -// overload for grids -template< int Dimension, - typename Real, - typename Device, - typename Index > -bool -loadMesh( Grid< Dimension, Real, Device, Index >& grid, - const std::string& fileName, - const std::string& fileFormat ) -{ - std::cout << "Loading a grid from the file " << fileName << "..." << std::endl; - try { - grid.load( fileName ); - return true; - } - catch(...) { - std::cerr << "I am not able to load the grid from the file " << fileName << "." << std::endl; - return false; - } -} - } // namespace Meshes } // namespace TNL diff --git a/src/TNL/Meshes/Writers/NetgenWriter.h b/src/TNL/Meshes/Writers/NetgenWriter.h index 860034dcda28b1f56565a2f6908b57563526e354..c247c0ff48a31ef300e4c467423fc0833894649e 100644 --- a/src/TNL/Meshes/Writers/NetgenWriter.h +++ b/src/TNL/Meshes/Writers/NetgenWriter.h @@ -59,7 +59,8 @@ public: for( int cellVertexIdx = 0; cellVertexIdx < meshDimension + 1; cellVertexIdx++ ) - str << " " << cell.template getSubentityIndex< 0 >( cellVertexIdx ); + // note: Netgen has 1-based indices + str << " " << cell.template getSubentityIndex< 0 >( cellVertexIdx ) + 1; str << "\n"; } } diff --git a/src/TNL/Meshes/Writers/PVTIWriter.h b/src/TNL/Meshes/Writers/PVTIWriter.h new file mode 100644 index 0000000000000000000000000000000000000000..ce2fe60572dcd84fe86deef3f09d9873d629d10b --- /dev/null +++ b/src/TNL/Meshes/Writers/PVTIWriter.h @@ -0,0 +1,125 @@ +/*************************************************************************** + PVTIWriter.h - description + ------------------- + begin : Jun 25, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +// Implemented by: Jakub Klinkovský + +#pragma once + +#include <TNL/Meshes/Writers/VTIWriter.h> +#include <TNL/Meshes/DistributedMeshes/DistributedGrid.h> + +namespace TNL { +namespace Meshes { +namespace Writers { + +// NOTE: Grid should be the local grid type, not DistributedMesh<Grid<...>> +template< typename Grid > +class PVTIWriter +{ + static_assert( Grid::getMeshDimension() <= 3, "The VTK format supports only 1D, 2D and 3D meshes." ); + +// using HeaderType = std::uint64_t; + // LOL, VTK does not support signed header types (but the GridTypeResolver maps unsigned types to signed, so we are good) + using HeaderType = std::make_unsigned_t< typename Grid::GlobalIndexType >; +public: + using MeshRealType = typename Grid::RealType; + using IndexType = typename Grid::GlobalIndexType; + + PVTIWriter() = delete; + + PVTIWriter( std::ostream& str, VTK::FileFormat format = VTK::FileFormat::zlib_compressed ) + : str(str.rdbuf()), format(format) + {} + + // If desired, cycle and time of the simulation can put into the file. This follows the instructions at + // http://www.visitusers.org/index.php?title=Time_and_Cycle_in_VTK_files + void writeMetadata( std::int32_t cycle = -1, double time = -1 ); + + void writeImageData( const DistributedMeshes::DistributedMesh< Grid >& distributedMesh ); + + void writeImageData( const Grid& globalGrid, + const unsigned GhostLevel = 0, + const unsigned MinCommonVertices = 0 ); + + // Only for compatibility with VTUWriter - calls writeImageData, the EntityDimension is unused + template< int EntityDimension = Grid::getMeshDimension() > + void writeEntities( const DistributedMeshes::DistributedMesh< Grid >& distributedMesh ); + + // Only for compatibility with VTUWriter - calls writeImageData, the EntityDimension is unused + template< int EntityDimension = Grid::getMeshDimension() > + void writeEntities( const Grid& grid, + const unsigned GhostLevel = 0, + const unsigned MinCommonVertices = 0 ); + + template< typename ValueType > + void writePPointData( const String& name, + const int numberOfComponents = 1 ); + + template< typename ValueType > + void writePCellData( const String& name, + const int numberOfComponents = 1 ); + + template< typename ValueType > + void writePDataArray( const String& name, + const int numberOfComponents = 1 ); + + // add a single piece and return its source path + // (useful for sequential writing, e.g. from tnl-decompose-grid) + std::string addPiece( const String& mainFileName, + const unsigned subdomainIndex, + const typename Grid::CoordinatesType& globalBegin, + const typename Grid::CoordinatesType& globalEnd ); + + // add all pieces and return the source path for the current rank + // (useful for parallel writing) + std::string addPiece( const String& mainFileName, + const DistributedMeshes::DistributedMesh< Grid >& distributedMesh ); + + ~PVTIWriter(); + +protected: + void writeHeader(); + + void writeFooter(); + + std::ostream str; + + VTK::FileFormat format; + + // indicator if the <VTKFile> tag is open + bool vtkfileOpen = false; + + // auxiliary holder for metadata (writeMetadata should be callable before + // writeEntities to match the VTU format, but the <ImageData> element can be + // opened only from writeEntities) + std::stringstream metadata; + + // indicator if the <PImageData> tag is open + bool pImageDataOpen = false; + + // indicators if a <PCellData> tag is open or closed + bool pCellDataOpen = false; + bool pCellDataClosed = false; + + // indicators if a <PPointData> tag is open or closed + bool pPointDataOpen = false; + bool pPointDataClosed = false; + + void openPCellData(); + void closePCellData(); + void openPPointData(); + void closePPointData(); +}; + +} // namespace Writers +} // namespace Meshes +} // namespace TNL + +#include <TNL/Meshes/Writers/PVTIWriter.hpp> diff --git a/src/TNL/Meshes/Writers/PVTIWriter.hpp b/src/TNL/Meshes/Writers/PVTIWriter.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9fa1293fe745081cd4559ccf1000f08eed012bf1 --- /dev/null +++ b/src/TNL/Meshes/Writers/PVTIWriter.hpp @@ -0,0 +1,327 @@ +/*************************************************************************** + PVTIWriter.hpp - description + ------------------- + begin : Jun 25, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +// Implemented by: Jakub Klinkovský + +#pragma once + +#include <experimental/filesystem> + +#include <TNL/Meshes/Writers/PVTIWriter.h> + +namespace TNL { +namespace Meshes { +namespace Writers { + +template< typename Grid > +void +PVTIWriter< Grid >::writeMetadata( int cycle, double time ) +{ + if( ! vtkfileOpen ) + writeHeader(); + if( pImageDataOpen ) + throw std::logic_error("The <PImageData> tag is already open, but writeMetadata should be called before writeImageData."); + + if( cycle >= 0 || time >= 0 ) + metadata << "<FieldData>\n"; + + if( cycle >= 0 ) { + metadata << "<DataArray type=\"Int32\" Name=\"CYCLE\" NumberOfTuples=\"1\" format=\"ascii\">" + << cycle << "</DataArray>\n"; + } + if( time >= 0 ) { + metadata.precision( std::numeric_limits< double >::digits10 ); + metadata << "<DataArray type=\"Float64\" Name=\"TIME\" NumberOfTuples=\"1\" format=\"ascii\">" + << time << "</DataArray>\n"; + } + + if( cycle >= 0 || time >= 0 ) + metadata << "</FieldData>\n"; +} + +template< typename Grid > +void +PVTIWriter< Grid >::writeImageData( const DistributedMeshes::DistributedMesh< Grid >& distributedGrid ) +{ + writeImageData( distributedGrid.getGlobalGrid(), distributedGrid.getGhostLevels() ); // TODO: ..., Grid::Config::dualGraphMinCommonVertices ); +} + +template< typename Grid > +void +PVTIWriter< Grid >::writeImageData( const Grid& globalGrid, + const unsigned GhostLevel, + const unsigned MinCommonVertices ) +{ + if( ! vtkfileOpen ) + writeHeader(); + if( pImageDataOpen ) + throw std::logic_error("The <PImageData> tag is already open."); + + std::stringstream extent, origin, spacing; + + auto dims = globalGrid.getDimensions(); + for( IndexType j = 0; j < dims.getSize(); j++ ) + extent << "0 " << dims[ j ] << " "; + // VTK knows only 3D grids + for( IndexType j = dims.getSize(); j < 3; j++ ) + extent << "0 0 "; + + auto o = globalGrid.getOrigin(); + for( IndexType j = 0; j < o.getSize(); j++ ) + origin << std::scientific << o[ j ] << " "; + // VTK knows only 3D grids + for( IndexType j = o.getSize(); j < 3; j++ ) + origin << 0 << " "; + + auto h = globalGrid.getSpaceSteps(); + for( IndexType j = 0; j < h.getSize(); j++ ) + spacing << std::scientific << h[ j ] << " "; + // VTK knows only 3D grids + for( IndexType j = h.getSize(); j < 3; j++ ) + spacing << 0 << " "; + + str << "<PImageData" + << " WholeExtent=\"" << extent.str() << "\"" + << " Origin=\"" << origin.str() << "\"" + << " Spacing=\"" << spacing.str() << "\"" + << " GhostLevel=\"" << GhostLevel << "\""; + if( MinCommonVertices > 0 ) + str << " MinCommonVertices=\"" << MinCommonVertices << "\""; + str << ">\n"; + pImageDataOpen = true; + + // write metadata if present + if( ! metadata.str().empty() ) { + str << metadata.str(); + metadata.str() = ""; + } +} + +template< typename Grid > + template< int EntityDimension > +void +PVTIWriter< Grid >::writeEntities( const DistributedMeshes::DistributedMesh< Grid >& distributedMesh ) +{ + writeImageData( distributedMesh ); +} + +template< typename Grid > + template< int EntityDimension > +void +PVTIWriter< Grid >::writeEntities( const Grid& grid, + const unsigned GhostLevel, + const unsigned MinCommonVertices ) +{ + writeImageData( grid, GhostLevel, MinCommonVertices ); +} + +template< typename Grid > + template< typename ValueType > +void +PVTIWriter< Grid >::writePPointData( const String& name, + const int numberOfComponents ) +{ + if( ! vtkfileOpen ) + throw std::logic_error("The VTKFile has not been opened yet - call writeEntities first."); + openPPointData(); + writePDataArray< ValueType >( name, numberOfComponents ); +} + +template< typename Grid > + template< typename ValueType > +void +PVTIWriter< Grid >::writePCellData( const String& name, + const int numberOfComponents ) +{ + if( ! vtkfileOpen ) + throw std::logic_error("The VTKFile has not been opened yet - call writeEntities first."); + openPCellData(); + writePDataArray< ValueType >( name, numberOfComponents ); +} + +template< typename Grid > + template< typename ValueType > +void +PVTIWriter< Grid >::writePDataArray( const String& name, + const int numberOfComponents ) +{ + if( numberOfComponents != 0 && numberOfComponents != 1 && numberOfComponents != 3 ) + throw std::logic_error("Unsupported numberOfComponents parameter: " + std::to_string(numberOfComponents)); + + str << "<PDataArray type=\"" << VTK::getTypeName( ValueType{} ) << "\" "; + str << "Name=\"" << name << "\" "; + str << "NumberOfComponents=\"" << numberOfComponents << "\"/>\n"; +} + +template< typename Grid > +std::string +PVTIWriter< Grid >::addPiece( const String& mainFileName, + const unsigned subdomainIndex, + const typename Grid::CoordinatesType& globalBegin, + const typename Grid::CoordinatesType& globalEnd ) +{ + if( ! mainFileName.endsWith( ".pvti" ) ) + throw std::logic_error("The mainFileName parameter must be the name of the " + ".pvti file (i.e., it must have the .pvti suffix)."); + + // close PCellData and PPointData sections + closePCellData(); + closePPointData(); + + // prepare the extent + std::stringstream extent; + for( IndexType j = 0; j < Grid::getMeshDimension(); j++ ) + extent << globalBegin[ j ] << " " << globalEnd[ j ] << " "; + // VTK knows only 3D grids + for( IndexType j = Grid::getMeshDimension(); j < 3; j++ ) + extent << "0 0 "; + + namespace fs = std::experimental::filesystem; + + // get the basename of the main file (filename without extension) + const fs::path mainPath = mainFileName.getString(); + const fs::path basename = mainPath.stem(); + + // create subdirectory for subdomains + const fs::path subdirectory = mainPath.parent_path() / basename; + fs::create_directory( subdirectory ); + + // write <Piece> tag + const std::string subfile = "subdomain." + std::to_string(subdomainIndex) + ".vti"; + const std::string source = basename / subfile; + str << "<Piece Extent=\"" << extent.str() << "\" Source=\"" << source << "\"/>\n"; + + // return subfile path + return subdirectory / subfile; +} + +template< typename Grid > +std::string +PVTIWriter< Grid >::addPiece( const String& mainFileName, + const DistributedMeshes::DistributedMesh< Grid >& distributedMesh ) +{ + const MPI_Comm group = distributedMesh.getCommunicationGroup(); + const typename Grid::CoordinatesType& globalBegin = distributedMesh.getGlobalBegin() - distributedMesh.getLowerOverlap(); + const typename Grid::CoordinatesType& globalEnd = globalBegin + distributedMesh.getLocalSize() + distributedMesh.getUpperOverlap(); + + // exchange globalBegin and globalEnd among the ranks + const int nproc = MPI::GetSize( group ); + typename Grid::CoordinatesType beginsForScatter[ nproc ]; + typename Grid::CoordinatesType endsForScatter[ nproc ]; + for( int i = 0; i < nproc; i++ ) { + beginsForScatter[ i ] = globalBegin; + endsForScatter[ i ] = globalEnd; + } + typename Grid::CoordinatesType globalBegins[ nproc ]; + typename Grid::CoordinatesType globalEnds[ nproc ]; + // NOTE: exchanging general data types does not work with MPI + //MPI::Alltoall( beginsForScatter, 1, globalBegins, 1, group ); + //MPI::Alltoall( endsForScatter, 1, globalEnds, 1, group ); + MPI::Alltoall( (char*) beginsForScatter, sizeof(typename Grid::CoordinatesType), (char*) globalBegins, sizeof(typename Grid::CoordinatesType), group ); + MPI::Alltoall( (char*) endsForScatter, sizeof(typename Grid::CoordinatesType), (char*) globalEnds, sizeof(typename Grid::CoordinatesType), group ); + + // add pieces for all ranks, return the source for the current rank + std::string source; + for( int i = 0; i < MPI::GetSize( group ); i++ ) { + const std::string s = addPiece( mainFileName, i, globalBegins[ i ], globalEnds[ i ] ); + if( i == MPI::GetRank( group ) ) + source = s; + } + return source; +} + +template< typename Grid > +void +PVTIWriter< Grid >::writeHeader() +{ + str << "<?xml version=\"1.0\"?>\n"; + str << "<VTKFile type=\"PImageData\" version=\"1.0\""; + if( isLittleEndian() ) + str << " byte_order=\"LittleEndian\""; + else + str << " byte_order=\"BigEndian\""; + str << " header_type=\"" << VTK::getTypeName( HeaderType{} ) << "\""; +#ifdef HAVE_ZLIB + if( format == VTK::FileFormat::zlib_compressed ) + str << " compressor=\"vtkZLibDataCompressor\""; +#endif + str << ">\n"; + + vtkfileOpen = true; +} + +template< typename Grid > +void +PVTIWriter< Grid >::writeFooter() +{ + closePCellData(); + closePPointData(); + str << "</PImageData>\n"; + str << "</VTKFile>\n"; +} + +template< typename Grid > +PVTIWriter< Grid >::~PVTIWriter() +{ + if( vtkfileOpen ) + writeFooter(); +} + +template< typename Grid > +void +PVTIWriter< Grid >::openPCellData() +{ + if( pCellDataClosed ) + throw std::logic_error("The <PCellData> tag has already been closed."); + closePPointData(); + if( ! pCellDataOpen ) { + str << "<PCellData>\n"; + pCellDataOpen = true; + } +} + +template< typename Grid > +void +PVTIWriter< Grid >::closePCellData() +{ + if( pCellDataOpen ) { + str << "</PCellData>\n"; + pCellDataClosed = true; + pCellDataOpen = false; + } +} + +template< typename Grid > +void +PVTIWriter< Grid >::openPPointData() +{ + if( pPointDataClosed ) + throw std::logic_error("The <PPointData> tag has already been closed."); + closePCellData(); + if( ! pPointDataOpen ) { + str << "<PPointData>\n"; + pPointDataOpen = true; + } +} + +template< typename Grid > +void +PVTIWriter< Grid >::closePPointData() +{ + if( pPointDataOpen ) { + str << "</PPointData>\n"; + pPointDataClosed = true; + pPointDataOpen = false; + } +} + +} // namespace Writers +} // namespace Meshes +} // namespace TNL diff --git a/src/TNL/Meshes/Writers/VTIWriter.h b/src/TNL/Meshes/Writers/VTIWriter.h new file mode 100644 index 0000000000000000000000000000000000000000..55bba8611de41b73320c8601b28cfaf740eca76e --- /dev/null +++ b/src/TNL/Meshes/Writers/VTIWriter.h @@ -0,0 +1,124 @@ +/*************************************************************************** + VTIWriter.h - description + ------------------- + begin : Jun 3, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +// Implemented by: Jakub Klinkovský + +#pragma once + +#include <type_traits> + +#include <TNL/Meshes/Grid.h> +#include <TNL/Meshes/VTKTraits.h> + +namespace TNL { +namespace Meshes { +namespace Writers { + +template< typename Mesh > +class VTIWriter +{ + static_assert( Mesh::getMeshDimension() <= 3, "The VTK format supports only 1D, 2D and 3D meshes." ); + +// using HeaderType = std::uint64_t; + // LOL, VTK does not support signed header types (but the GridTypeResolver maps unsigned types to signed, so we are good) + using HeaderType = std::make_unsigned_t< typename Mesh::GlobalIndexType >; +public: + using MeshRealType = typename Mesh::RealType; + using IndexType = typename Mesh::GlobalIndexType; + + VTIWriter() = delete; + + VTIWriter( std::ostream& str, VTK::FileFormat format = VTK::FileFormat::zlib_compressed ) + : str(str.rdbuf()), format(format) + {} + + // If desired, cycle and time of the simulation can put into the file. This follows the instructions at + // http://www.visitusers.org/index.php?title=Time_and_Cycle_in_VTK_files + void writeMetadata( std::int32_t cycle = -1, double time = -1 ); + + // low-level writing method (used also when writing a subdomain for a PVTI dataset) + void writeImageData( const typename Mesh::PointType& origin, + const typename Mesh::CoordinatesType& begin, + const typename Mesh::CoordinatesType& end, + const typename Mesh::PointType& spaceSteps ); + + void writeImageData( const Mesh& mesh ); + + // Only for compatibility with VTUWriter - calls writeImageData, the EntityDimension is unused + template< int EntityDimension = Mesh::getMeshDimension() > + void writeEntities( const Mesh& mesh ); + + template< typename Array > + void writePointData( const Array& array, + const String& name, + const int numberOfComponents = 1 ); + + template< typename Array > + void writeCellData( const Array& array, + const String& name, + const int numberOfComponents = 1 ); + + template< typename Array > + void writeDataArray( const Array& array, + const String& name, + const int numberOfComponents = 1 ); + + ~VTIWriter(); + +protected: + void writeHeader(); + + void writeFooter(); + + std::ostream str; + + VTK::FileFormat format; + + // number of points written to the file + IndexType pointsCount = 0; + + // number of cells (in the VTK sense) written to the file + IndexType cellsCount = 0; + + // indicator if the <VTKFile> tag is open + bool vtkfileOpen = false; + + // auxiliary holder for metadata (writeMetadata should be callable before + // writeEntities to match the VTU format, but the <ImageData> element can be + // opened only from writeEntities) + std::stringstream metadata; + + // indicator if the <ImageData> tag is open + bool imageDataOpen = false; + + // indicator if a <Piece> tag is open + bool pieceOpen = false; + + // indicators if a <CellData> tag is open or closed + bool cellDataOpen = false; + bool cellDataClosed = false; + + // indicators if a <PointData> tag is open or closed + bool pointDataOpen = false; + bool pointDataClosed = false; + + void openCellData(); + void closeCellData(); + void openPointData(); + void closePointData(); + + void closePiece(); +}; + +} // namespace Writers +} // namespace Meshes +} // namespace TNL + +#include <TNL/Meshes/Writers/VTIWriter.hpp> diff --git a/src/TNL/Meshes/Writers/VTIWriter.hpp b/src/TNL/Meshes/Writers/VTIWriter.hpp new file mode 100644 index 0000000000000000000000000000000000000000..72824720558dea8f14e279f5f9d1b023b54fe4ed --- /dev/null +++ b/src/TNL/Meshes/Writers/VTIWriter.hpp @@ -0,0 +1,308 @@ +/*************************************************************************** + VTIWriter.hpp - description + ------------------- + begin : Jun 3, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +// Implemented by: Jakub Klinkovský + +#pragma once + +#include <limits> + +#include <TNL/Meshes/Writers/VTIWriter.h> +#include <TNL/Endianness.h> +#include <TNL/base64.h> +#include <stdexcept> +#ifdef HAVE_ZLIB + #include <TNL/zlib_compression.h> +#endif + +namespace TNL { +namespace Meshes { +namespace Writers { + +template< typename Mesh > +void +VTIWriter< Mesh >::writeMetadata( int cycle, double time ) +{ + if( ! vtkfileOpen ) + writeHeader(); + if( imageDataOpen ) + throw std::logic_error("The <ImageData> tag is already open, but writeMetadata should be called before writeImageData."); + + if( cycle >= 0 || time >= 0 ) + metadata << "<FieldData>\n"; + + if( cycle >= 0 ) { + metadata << "<DataArray type=\"Int32\" Name=\"CYCLE\" NumberOfTuples=\"1\" format=\"ascii\">" + << cycle << "</DataArray>\n"; + } + if( time >= 0 ) { + metadata.precision( std::numeric_limits< double >::digits10 ); + metadata << "<DataArray type=\"Float64\" Name=\"TIME\" NumberOfTuples=\"1\" format=\"ascii\">" + << time << "</DataArray>\n"; + } + + if( cycle >= 0 || time >= 0 ) + metadata << "</FieldData>\n"; +} + +template< typename Mesh > +void +VTIWriter< Mesh >::writeImageData( const typename Mesh::PointType& gridOrigin, + const typename Mesh::CoordinatesType& begin, + const typename Mesh::CoordinatesType& end, + const typename Mesh::PointType& spaceSteps ) +{ + if( ! vtkfileOpen ) + writeHeader(); + if( imageDataOpen ) + throw std::logic_error("The <ImageData> tag is already open."); + + std::stringstream extent, origin, spacing; + + for( IndexType j = 0; j < Mesh::getMeshDimension(); j++ ) + extent << begin[ j ] << " " << end[ j ] << " "; + // VTK knows only 3D grids + for( IndexType j = Mesh::getMeshDimension(); j < 3; j++ ) + extent << "0 0 "; + + for( IndexType j = 0; j < Mesh::getMeshDimension(); j++ ) + origin << std::scientific << gridOrigin[ j ] << " "; + // VTK knows only 3D grids + for( IndexType j = Mesh::getMeshDimension(); j < 3; j++ ) + origin << 0 << " "; + + for( IndexType j = 0; j < Mesh::getMeshDimension(); j++ ) + spacing << std::scientific << spaceSteps[ j ] << " "; + // VTK knows only 3D grids + for( IndexType j = Mesh::getMeshDimension(); j < 3; j++ ) + spacing << 0 << " "; + + str << "<ImageData WholeExtent=\"" << extent.str() << "\" Origin=\"" << origin.str() << "\" Spacing=\"" << spacing.str() << "\">\n"; + imageDataOpen = true; + + str << "<Piece Extent=\"" << extent.str() << "\">\n"; + pieceOpen = true; + + // write metadata if present + if( ! metadata.str().empty() ) { + str << metadata.str(); + metadata.str() = ""; + } + + // sets points and cells counts + pointsCount = TNL::product( end - begin + 1 ); + cellsCount = TNL::product( end - begin ); +} + +template< typename Mesh > +void +VTIWriter< Mesh >::writeImageData( const Mesh& mesh ) +{ + writeImageData( mesh.getOrigin(), 0, mesh.getDimensions(), mesh.getSpaceSteps() ); +} + +template< typename Mesh > + template< int EntityDimension > +void +VTIWriter< Mesh >::writeEntities( const Mesh& mesh ) +{ + writeImageData( mesh ); +} + +template< typename Mesh > + template< typename Array > +void +VTIWriter< Mesh >::writePointData( const Array& array, + const String& name, + const int numberOfComponents ) +{ + if( ! pieceOpen ) + throw std::logic_error("The <Piece> tag has not been opened yet - call writeEntities first."); + if( array.getSize() / numberOfComponents != pointsCount ) + throw std::length_error("Mismatched array size for <PointData> section: " + std::to_string(array.getSize()) + + " (there are " + std::to_string(pointsCount) + " points in the file)"); + openPointData(); + writeDataArray( array, name, numberOfComponents ); +} + +template< typename Mesh > + template< typename Array > +void +VTIWriter< Mesh >::writeCellData( const Array& array, + const String& name, + const int numberOfComponents ) +{ + if( ! pieceOpen ) + throw std::logic_error("The <Piece> tag has not been opened yet - call writeEntities first."); + if( array.getSize() / numberOfComponents != cellsCount ) + throw std::length_error("Mismatched array size for <CellData> section: " + std::to_string(array.getSize()) + + " (there are " + std::to_string(cellsCount) + " cells in the file)"); + openCellData(); + writeDataArray( array, name, numberOfComponents ); +} + +template< typename Mesh > + template< typename Array > +void +VTIWriter< Mesh >::writeDataArray( const Array& array, + const String& name, + const int numberOfComponents ) +{ + // use a host buffer if direct access to the array elements is not possible + if( std::is_same< typename Array::DeviceType, Devices::Cuda >::value ) + { + using HostArray = typename Array::template Self< std::remove_const_t< typename Array::ValueType >, Devices::Host, typename Array::IndexType >; + HostArray hostBuffer; + hostBuffer = array; + writeDataArray( hostBuffer, name, numberOfComponents ); + return; + } + + if( numberOfComponents != 0 && numberOfComponents != 1 && numberOfComponents != 3 ) + throw std::logic_error("Unsupported numberOfComponents parameter: " + std::to_string(numberOfComponents)); + + // write DataArray header + str << "<DataArray type=\"" << VTK::getTypeName( array[0] ) << "\""; + str << " Name=\"" << name << "\""; + if( numberOfComponents > 0 ) + str << " NumberOfComponents=\"" << numberOfComponents << "\""; + str << " format=\"" << ((format == VTK::FileFormat::ascii) ? "ascii" : "binary") << "\">\n"; + + switch( format ) + { + case VTK::FileFormat::ascii: + str.precision( std::numeric_limits< typename Array::ValueType >::digits10 ); + for( IndexType i = 0; i < array.getSize(); i++ ) + // If Array::ValueType is uint8_t, it might be a typedef for unsigned char, which + // would be normally printed as char rather than a number. Hence, we use the trick + // with unary operator+, see https://stackoverflow.com/a/28414758 + str << +array[i] << " "; + str << "\n"; + break; + case VTK::FileFormat::zlib_compressed: +#ifdef HAVE_ZLIB + write_compressed_block< HeaderType >( array.getData(), array.getSize(), str ); + str << "\n"; + break; +#endif + // fall through to binary if HAVE_ZLIB is not defined + case VTK::FileFormat::binary: + base64::write_encoded_block< HeaderType >( array.getData(), array.getSize(), str ); + str << "\n"; + break; + } + + // write DataArray footer + str << "</DataArray>\n"; +} + +template< typename Mesh > +void +VTIWriter< Mesh >::writeHeader() +{ + str << "<?xml version=\"1.0\"?>\n"; + str << "<VTKFile type=\"ImageData\" version=\"1.0\""; + if( isLittleEndian() ) + str << " byte_order=\"LittleEndian\""; + else + str << " byte_order=\"BigEndian\""; + str << " header_type=\"" << VTK::getTypeName( HeaderType{} ) << "\""; +#ifdef HAVE_ZLIB + if( format == VTK::FileFormat::zlib_compressed ) + str << " compressor=\"vtkZLibDataCompressor\""; +#endif + str << ">\n"; + + vtkfileOpen = true; +} + +template< typename Mesh > +void +VTIWriter< Mesh >::writeFooter() +{ + closePiece(); + str << "</ImageData>\n"; + str << "</VTKFile>\n"; +} + +template< typename Mesh > +VTIWriter< Mesh >::~VTIWriter() +{ + if( vtkfileOpen ) + writeFooter(); +} + +template< typename Mesh > +void +VTIWriter< Mesh >::openCellData() +{ + if( cellDataClosed ) + throw std::logic_error("The <CellData> tag has already been closed in the current <Piece> section."); + closePointData(); + if( ! cellDataOpen ) { + str << "<CellData>\n"; + cellDataOpen = true; + } +} + +template< typename Mesh > +void +VTIWriter< Mesh >::closeCellData() +{ + if( cellDataOpen ) { + str << "</CellData>\n"; + cellDataClosed = true; + cellDataOpen = false; + } +} + +template< typename Mesh > +void +VTIWriter< Mesh >::openPointData() +{ + if( pointDataClosed ) + throw std::logic_error("The <PointData> tag has already been closed in the current <Piece> section."); + closeCellData(); + if( ! pointDataOpen ) { + str << "<PointData>\n"; + pointDataOpen = true; + } +} + +template< typename Mesh > +void +VTIWriter< Mesh >::closePointData() +{ + if( pointDataOpen ) { + str << "</PointData>\n"; + pointDataClosed = true; + pointDataOpen = false; + } +} + +template< typename Mesh > +void +VTIWriter< Mesh >::closePiece() +{ + if( pieceOpen ) { + closeCellData(); + closePointData(); + str << "</Piece>\n"; + + // reset indicators - new <Piece> can be started + pieceOpen = false; + cellDataOpen = cellDataClosed = false; + pointDataOpen = pointDataClosed = false; + } +} + +} // namespace Writers +} // namespace Meshes +} // namespace TNL diff --git a/src/TNL/Meshes/Writers/VTUWriter.hpp b/src/TNL/Meshes/Writers/VTUWriter.hpp index 960cc4638683fe596dbffd7c042be9983087738d..058c8427176d00f0b9c67638f8df93d31b3a1e4c 100644 --- a/src/TNL/Meshes/Writers/VTUWriter.hpp +++ b/src/TNL/Meshes/Writers/VTUWriter.hpp @@ -479,7 +479,8 @@ VTUWriter< Mesh >::writeDataArray( const Array& array, throw std::logic_error("Unsupported numberOfComponents parameter: " + std::to_string(numberOfComponents)); // write DataArray header - str << "<DataArray type=\"" << VTK::getTypeName( array[0] ) << "\""; + using ValueType = decltype(array[0]); + str << "<DataArray type=\"" << VTK::getTypeName( ValueType{} ) << "\""; str << " Name=\"" << name << "\""; if( numberOfComponents > 0 ) str << " NumberOfComponents=\"" << numberOfComponents << "\""; diff --git a/src/TNL/Problems/HeatEquationProblem.h b/src/TNL/Problems/HeatEquationProblem.h index 342abe1ba2f2ac3ab5d5ccf4be2e18a49462994a..0c8cb10260a5b252b7d8dc29f8706782b3b774aa 100644 --- a/src/TNL/Problems/HeatEquationProblem.h +++ b/src/TNL/Problems/HeatEquationProblem.h @@ -24,7 +24,6 @@ #include <TNL/Solvers/PDE/LinearSystemAssembler.h> #include <TNL/Solvers/PDE/BackwardTimeDiscretisation.h> -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO.h> #include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> namespace TNL { @@ -66,7 +65,7 @@ class HeatEquationProblem : public PDEProblem< Mesh, void writeProlog( Logger& logger, const Config::ParameterContainer& parameters ) const; - + bool writeEpilog( Logger& logger ); @@ -91,7 +90,7 @@ class HeatEquationProblem : public PDEProblem< Mesh, const RealType& tau, DofVectorPointer& _u, DofVectorPointer& _fu ); - + void applyBoundaryConditions( const RealType& time, DofVectorPointer& dofs ); @@ -128,8 +127,6 @@ class HeatEquationProblem : public PDEProblem< Mesh, Solvers::PDE::BackwardTimeDiscretisation, DofVectorType > systemAssembler; - Meshes::DistributedMeshes::DistrGridIOTypes distributedIOType; - bool catchExceptions = true; }; diff --git a/src/TNL/Problems/HeatEquationProblem_impl.h b/src/TNL/Problems/HeatEquationProblem_impl.h index 27003a6b60a59a6758321ceb5393a993451dec2d..097161b8b43ca5e112d2f6e90f4af424eb9fce03 100644 --- a/src/TNL/Problems/HeatEquationProblem_impl.h +++ b/src/TNL/Problems/HeatEquationProblem_impl.h @@ -82,12 +82,6 @@ setup( const Config::ParameterContainer& parameters, return false; } - String param = parameters.getParameter< String >( "distributed-grid-io-type" ); - if( param == "MpiIO" ) - distributedIOType = Meshes::DistributedMeshes::MpiIO; - if( param == "LocalCopy" ) - distributedIOType = Meshes::DistributedMeshes::LocalCopy; - this->explicitUpdater.setDifferentialOperator( this->differentialOperatorPointer ); this->explicitUpdater.setBoundaryConditions( this->boundaryConditionPointer ); this->explicitUpdater.setRightHandSide( this->rightHandSidePointer ); @@ -139,31 +133,23 @@ setInitialCondition( const Config::ParameterContainer& parameters, this->bindDofs( dofs ); const String& initialConditionFile = parameters.getParameter< String >( "initial-condition" ); if(CommunicatorType::isDistributed()) - { - std::cout<<"Nodes Distribution: " << uPointer->getMesh().getDistributedMesh()->printProcessDistr() << std::endl; - if(distributedIOType==Meshes::DistributedMeshes::MpiIO) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::MpiIO> ::load(initialConditionFile, *uPointer ); - if(distributedIOType==Meshes::DistributedMeshes::LocalCopy) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::LocalCopy> ::load(initialConditionFile, *uPointer ); - synchronizer.setDistributedGrid( uPointer->getMesh().getDistributedMesh() ); - synchronizer.synchronize( *uPointer ); - } - else - { - if( this->catchExceptions ) + { + std::cout<<"Nodes Distribution: " << this->distributedMeshPointer->printProcessDistr() << std::endl; + if( ! Functions::readDistributedMeshFunction( *this->distributedMeshPointer, *this->uPointer, "u", initialConditionFile ) ) + { + std::cerr << "I am not able to load the initial condition from the file " << initialConditionFile << "." << std::endl; + return false; + } + synchronizer.setDistributedGrid( &this->distributedMeshPointer.getData() ); + synchronizer.synchronize( *uPointer ); + } + else + { + if( ! Functions::readMeshFunction( *this->uPointer, "u", initialConditionFile ) ) { - try - { - this->uPointer->boundLoad( initialConditionFile ); - } - catch( std::ios_base::failure& e ) - { - std::cerr << "I am not able to load the initial condition from the file " << initialConditionFile << "." << std::endl; - std::cerr << e.what() << std::endl; - return false; - } + std::cerr << "I am not able to load the initial condition from the file " << initialConditionFile << "." << std::endl; + return false; } - else this->uPointer->boundLoad( initialConditionFile ); } return true; } @@ -210,19 +196,17 @@ makeSnapshot( const RealType& time, FileName fileName; fileName.setFileNameBase( "u-" ); - fileName.setExtension( "tnl" ); fileName.setIndex( step ); if(CommunicatorType::isDistributed()) { - if(distributedIOType==Meshes::DistributedMeshes::MpiIO) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::MpiIO> ::save(fileName.getFileName(), *uPointer ); - if(distributedIOType==Meshes::DistributedMeshes::LocalCopy) - Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType,Meshes::DistributedMeshes::LocalCopy> ::save(fileName.getFileName(), *uPointer ); + fileName.setExtension( "pvti" ); + Functions::writeDistributedMeshFunction( *this->distributedMeshPointer, *this->uPointer, "u", fileName.getFileName() ); } else { - this->uPointer->save( fileName.getFileName() ); + fileName.setExtension( "vti" ); + this->uPointer->write( "u", fileName.getFileName() ); } return true; } diff --git a/src/TNL/Problems/MeanCurvatureFlowProblem_impl.h b/src/TNL/Problems/MeanCurvatureFlowProblem_impl.h index 8ed3c75bd56386ad5d0cfb2fa89d2aa611d11fa5..d71dc065db0093a1a6f95f6f8c8e097a7191437c 100644 --- a/src/TNL/Problems/MeanCurvatureFlowProblem_impl.h +++ b/src/TNL/Problems/MeanCurvatureFlowProblem_impl.h @@ -159,8 +159,8 @@ makeSnapshot( const RealType& time, this->bindDofs( mesh, dofs ); //cout << "dofs = " << dofs << std::endl; String fileName; - FileNameBaseNumberEnding( "u-", step, 5, ".tnl", fileName ); - if( ! this->solution.save( fileName ) ) + FileNameBaseNumberEnding( "u-", step, 5, ".vti", fileName ); + if( ! this->solution.write( "u", fileName ) ) return false; return true; } @@ -188,7 +188,7 @@ getExplicitUpdate( const RealType& time, */ // this->differentialOperator.computeFirstGradient(mesh,time,u); - + //cout << "u = " << u << std::endl; //this->bindDofs( mesh, u ); MeshFunctionType u( mesh, inDofs ); @@ -198,9 +198,9 @@ getExplicitUpdate( const RealType& time, explicitUpdater.setDifferentialOperator( this->differentialOperatorPointer ); explicitUpdater.setBoundaryConditions( this->boundaryConditionPointer ); explicitUpdater.setRightHandSide( this->rightHandSidePointer ); - + explicitUpdater.template update< typename Mesh::Cell >( time, tau, mesh, u, fu ); - + /*cout << "u = " << u << std::endl; std::cout << "fu = " << fu << std::endl; u.save( "u.tnl" ); diff --git a/src/TNL/Problems/PDEProblem.h b/src/TNL/Problems/PDEProblem.h index ee8edce4265453be3884180d31306a0c29fb90d9..96c2db251fbc325cdefa681ebb3f965c5b5ff4e7 100644 --- a/src/TNL/Problems/PDEProblem.h +++ b/src/TNL/Problems/PDEProblem.h @@ -15,7 +15,7 @@ #include <TNL/Pointers/SharedPointer.h> #include <TNL/Matrices/SparseMatrix.h> #include <TNL/Algorithms/Segments/SlicedEllpack.h> -#include <TNL/Solvers/PDE/TimeDependentPDESolver.h> +#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> namespace TNL { namespace Problems { @@ -37,6 +37,7 @@ class PDEProblem : public Problem< Real, Device, Index > using MeshType = Mesh; using MeshPointer = Pointers::SharedPointer< MeshType, DeviceType >; using DistributedMeshType = Meshes::DistributedMeshes::DistributedMesh< MeshType >; + using DistributedMeshPointer = Pointers::SharedPointer< DistributedMeshType, DeviceType >; using SubdomainOverlapsType = typename DistributedMeshType::SubdomainOverlapsType; using DofVectorType = Containers::Vector< RealType, DeviceType, IndexType>; using DofVectorPointer = Pointers::SharedPointer< DofVectorType, DeviceType >; @@ -53,7 +54,7 @@ class PDEProblem : public Problem< Real, Device, Index > using CommonDataPointer = Pointers::SharedPointer< CommonDataType, DeviceType >; static constexpr bool isTimeDependent() { return true; }; - + /**** * This means that the time stepper will be set from the command line arguments. */ @@ -63,24 +64,30 @@ class PDEProblem : public Problem< Real, Device, Index > void writeProlog( Logger& logger, const Config::ParameterContainer& parameters ) const; - + bool writeEpilog( Logger& logger ) const; - - void setMesh( MeshPointer& meshPointer); - + + void setMesh( MeshPointer& meshPointer ); + + void setMesh( DistributedMeshPointer& distributedMeshPointer ); + const MeshPointer& getMesh() const; - + MeshPointer& getMesh(); + const DistributedMeshPointer& getDistributedMesh() const; + + DistributedMeshPointer& getDistributedMesh(); + void setCommonData( CommonDataPointer& commonData ); - + const CommonDataPointer& getCommonData() const; - + CommonDataPointer& getCommonData(); // Width of the subdomain overlaps in case when all of them are the same virtual IndexType subdomainOverlapSize(); - + // Returns default subdomain overlaps i.e. no overlaps on the boundaries, only // in the domain interior. void getSubdomainOverlaps( const Config::ParameterContainer& parameters, @@ -92,7 +99,7 @@ class PDEProblem : public Problem< Real, Device, Index > bool preIterate( const RealType& time, const RealType& tau, DofVectorPointer& dofs ); - + void applyBoundaryConditions( const RealType& time, DofVectorPointer& dofs ); @@ -106,9 +113,11 @@ class PDEProblem : public Problem< Real, Device, Index > DofVectorPointer& dofs ); Solvers::SolverMonitor* getSolverMonitor(); - + MeshPointer meshPointer; - + + DistributedMeshPointer distributedMeshPointer; + CommonDataPointer commonDataPointer; }; diff --git a/src/TNL/Problems/PDEProblem_impl.h b/src/TNL/Problems/PDEProblem_impl.h index f42f18b165887c4ad006bad75e5ac0bdc3beea98..0eaf4df06f533f325c77154e5242631e1f794d4d 100644 --- a/src/TNL/Problems/PDEProblem_impl.h +++ b/src/TNL/Problems/PDEProblem_impl.h @@ -92,6 +92,21 @@ setMesh( MeshPointer& meshPointer) this->meshPointer = meshPointer; } +template< typename Mesh, + typename Communicator, + typename Real, + typename Device, + typename Index > +void +PDEProblem< Mesh, Communicator, Real, Device, Index >:: +setMesh( DistributedMeshPointer& distributedMeshPointer) +{ + this->distributedMeshPointer = distributedMeshPointer; + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the interface is fucked up (it should not require us to put SharedPointer everywhere) + *meshPointer = distributedMeshPointer->getLocalMesh(); +} + template< typename Mesh, typename Communicator, typename Real, @@ -114,6 +129,28 @@ PDEProblem< Mesh, Communicator, Real, Device, Index >::getMesh() return this->meshPointer; } +template< typename Mesh, + typename Communicator, + typename Real, + typename Device, + typename Index > +const typename PDEProblem< Mesh, Communicator, Real, Device, Index >::DistributedMeshPointer& +PDEProblem< Mesh, Communicator, Real, Device, Index >::getDistributedMesh() const +{ + return this->distributedMeshPointer; +} + +template< typename Mesh, + typename Communicator, + typename Real, + typename Device, + typename Index > +typename PDEProblem< Mesh, Communicator, Real, Device, Index >::DistributedMeshPointer& +PDEProblem< Mesh, Communicator, Real, Device, Index >::getDistributedMesh() +{ + return this->distributedMeshPointer; +} + template< typename Mesh, typename Communicator, typename Real, diff --git a/src/TNL/Solvers/PDE/ExplicitTimeStepper.h b/src/TNL/Solvers/PDE/ExplicitTimeStepper.h index d4f6992b37e27cccecf38a193be8435ea2d9fe96..d6fd8a0533118709f89a157d16055969524d92f2 100644 --- a/src/TNL/Solvers/PDE/ExplicitTimeStepper.h +++ b/src/TNL/Solvers/PDE/ExplicitTimeStepper.h @@ -19,7 +19,7 @@ namespace TNL { namespace Solvers { -namespace PDE { +namespace PDE { template< typename Problem, template < typename OdeProblem, typename SolverMonitor > class OdeSolver > @@ -32,7 +32,6 @@ class ExplicitTimeStepper using DeviceType = typename Problem::DeviceType; using IndexType = typename Problem::IndexType; using MeshType = typename Problem::MeshType; - using MeshPointer = Pointers::SharedPointer< MeshType >; using DofVectorType = typename ProblemType::DofVectorType; using DofVectorPointer = Pointers::SharedPointer< DofVectorType, DeviceType >; using SolverMonitorType = IterativeSolverMonitor< RealType, IndexType >; @@ -50,7 +49,7 @@ class ExplicitTimeStepper bool setup( const Config::ParameterContainer& parameters, const String& prefix = "" ); - bool init( const MeshPointer& meshPointer ); + bool init( const MeshType& mesh ); void setSolver( OdeSolverType& odeSolver ); @@ -88,8 +87,6 @@ class ExplicitTimeStepper RealType timeStep; - const MeshPointer* mesh; - Timer preIterateTimer, explicitUpdaterTimer, mainTimer, postIterateTimer; long long int allIterations; @@ -100,4 +97,3 @@ class ExplicitTimeStepper } // namespace TNL #include <TNL/Solvers/PDE/ExplicitTimeStepper_impl.h> - diff --git a/src/TNL/Solvers/PDE/ExplicitTimeStepper_impl.h b/src/TNL/Solvers/PDE/ExplicitTimeStepper_impl.h index fa2d1f8066ed22ebc2626e93ff88deb1e6790177..9428485f493b3aa26cbef792f74756b579095007 100644 --- a/src/TNL/Solvers/PDE/ExplicitTimeStepper_impl.h +++ b/src/TNL/Solvers/PDE/ExplicitTimeStepper_impl.h @@ -49,7 +49,7 @@ template< typename Problem, template < typename OdeProblem, typename SolverMonitor > class OdeSolver > bool ExplicitTimeStepper< Problem, OdeSolver >:: -init( const MeshPointer& meshPointer ) +init( const MeshType& mesh ) { this->explicitUpdaterTimer.reset(); this->mainTimer.reset(); diff --git a/src/TNL/Solvers/PDE/SemiImplicitTimeStepper.h b/src/TNL/Solvers/PDE/SemiImplicitTimeStepper.h index da1612ce2df256c1129fbdb7ba1d1a39575b4deb..ce99ccca6bc8af83125d51fb42a6e7f0a90a228a 100644 --- a/src/TNL/Solvers/PDE/SemiImplicitTimeStepper.h +++ b/src/TNL/Solvers/PDE/SemiImplicitTimeStepper.h @@ -32,7 +32,6 @@ class SemiImplicitTimeStepper typedef typename Problem::DeviceType DeviceType; typedef typename Problem::IndexType IndexType; typedef typename Problem::MeshType MeshType; - typedef typename Problem::MeshPointer MeshPointer; typedef typename ProblemType::DofVectorType DofVectorType; typedef typename ProblemType::MatrixType MatrixType; typedef Pointers::SharedPointer< MatrixType, DeviceType > MatrixPointer; @@ -50,7 +49,7 @@ class SemiImplicitTimeStepper bool setup( const Config::ParameterContainer& parameters, const String& prefix = "" ); - bool init( const MeshPointer& meshPointer ); + bool init( const MeshType& mesh ); void setProblem( ProblemType& problem ); @@ -65,7 +64,7 @@ class SemiImplicitTimeStepper bool solve( const RealType& time, const RealType& stopTime, DofVectorPointer& dofVectorPointer ); - + bool writeEpilog( Logger& logger ) const; protected: diff --git a/src/TNL/Solvers/PDE/SemiImplicitTimeStepper_impl.h b/src/TNL/Solvers/PDE/SemiImplicitTimeStepper_impl.h index 3e8d106b272cf66bf2ed867d0a0943d0b47d8944..5e60d874ac13aba81635276473ae06f566577bb5 100644 --- a/src/TNL/Solvers/PDE/SemiImplicitTimeStepper_impl.h +++ b/src/TNL/Solvers/PDE/SemiImplicitTimeStepper_impl.h @@ -55,7 +55,7 @@ setup( const Config::ParameterContainer& parameters, template< typename Problem > bool SemiImplicitTimeStepper< Problem >:: -init( const MeshPointer& mesh ) +init( const MeshType& mesh ) { if( ! this->problem->setupLinearSystem( this->matrix ) ) { std::cerr << "Failed to set up the linear system." << std::endl; diff --git a/src/TNL/Solvers/PDE/TimeDependentPDESolver.h b/src/TNL/Solvers/PDE/TimeDependentPDESolver.h index 58f4c5cc501592ce041ba4bfcb79ba84759e4389..51b1868408efe0c57a47134e791cabe46ed7cfdb 100644 --- a/src/TNL/Solvers/PDE/TimeDependentPDESolver.h +++ b/src/TNL/Solvers/PDE/TimeDependentPDESolver.h @@ -27,7 +27,7 @@ namespace PDE { template< typename Problem, typename TimeStepper > class TimeDependentPDESolver - : public PDESolver< typename Problem::RealType, + : public PDESolver< typename Problem::RealType, typename Problem::IndexType >, public MeshDependentTimeSteps< typename Problem::MeshType, typename TimeStepper::RealType > @@ -46,7 +46,7 @@ class TimeDependentPDESolver typedef Pointers::SharedPointer< MeshType, DeviceType > MeshPointer; typedef Pointers::SharedPointer< DofVectorType, DeviceType > DofVectorPointer; typedef IterativeSolverMonitor< typename Problem::RealType, typename Problem::IndexType > SolverMonitorType; - + static_assert( ProblemType::isTimeDependent(), "The problem is not time dependent." ); TimeDependentPDESolver(); @@ -55,7 +55,7 @@ class TimeDependentPDESolver const String& prefix = "" ); bool setup( const Config::ParameterContainer& parameters, - const String& prefix = "" ); + const String& prefix = "" ); bool writeProlog( Logger& logger, const Config::ParameterContainer& parameters ); @@ -86,7 +86,7 @@ class TimeDependentPDESolver MeshPointer meshPointer; - Meshes::DistributedMeshes::DistributedMesh<MeshType> distributedMesh; + Pointers::SharedPointer< Meshes::DistributedMeshes::DistributedMesh<MeshType> > distributedMeshPointer; DofVectorPointer dofsPointer; diff --git a/src/TNL/Solvers/PDE/TimeDependentPDESolver_impl.h b/src/TNL/Solvers/PDE/TimeDependentPDESolver_impl.h index 63ba71c8f94719cd73293bdab46a311e4cdf962d..9b853034860942d00117f661e6c4cf34cc5ddf11 100644 --- a/src/TNL/Solvers/PDE/TimeDependentPDESolver_impl.h +++ b/src/TNL/Solvers/PDE/TimeDependentPDESolver_impl.h @@ -39,7 +39,7 @@ configSetup( Config::ConfigDescription& config, const String& prefix ) { BaseType::configSetup( config, prefix ); - config.addEntry< String >( prefix + "initial-condition", "File name with the initial condition.", "init.tnl" ); + config.addEntry< String >( prefix + "initial-condition", "File name with the initial condition.", "init.vti" ); config.addRequiredEntry< double >( prefix + "final-time", "Stop time of the time dependent problem." ); config.addEntry< double >( prefix + "initial-time", "Initial time of the time dependent problem.", 0 ); config.addRequiredEntry< double >( prefix + "snapshot-period", "Time period for writing the problem status."); @@ -61,20 +61,17 @@ setup( const Config::ParameterContainer& parameters, // const String& meshFile = parameters.getParameter< String >( "mesh" ); const String& meshFileFormat = parameters.getParameter< String >( "mesh-format" ); - this->distributedMesh.setup( parameters, prefix ); if( Problem::CommunicatorType::isDistributed() ) { - if( ! Meshes::loadDistributedMesh( *this->meshPointer, distributedMesh, meshFile, meshFileFormat ) ) - return false; - if( ! Meshes::decomposeMesh< Problem >( parameters, prefix, *this->meshPointer, distributedMesh, *problem ) ) + if( ! Meshes::loadDistributedMesh( *distributedMeshPointer, meshFile, meshFileFormat ) ) return false; + problem->setMesh( distributedMeshPointer ); } else { - if( ! Meshes::loadMesh( *this->meshPointer, meshFile, meshFileFormat ) ) + if( ! Meshes::loadMesh( *meshPointer, meshFile, meshFileFormat ) ) return false; + problem->setMesh( meshPointer ); } - problem->setMesh( this->meshPointer ); - /**** * Set-up common data */ @@ -141,10 +138,16 @@ writeProlog( Logger& logger, logger.writeHeader( problem->getPrologHeader() ); problem->writeProlog( logger, parameters ); logger.writeSeparator(); - meshPointer->writeProlog( logger ); + if( Problem::CommunicatorType::isDistributed() ) + distributedMeshPointer->writeProlog( logger ); + else + meshPointer->writeProlog( logger ); logger.writeSeparator(); logger.writeParameter< String >( "Time discretisation:", "time-discretisation", parameters ); - logger.writeParameter< double >( "Initial time step:", this->getRefinedTimeStep( this->meshPointer.getData(), this->timeStep ) ); + if( Problem::CommunicatorType::isDistributed() ) + logger.writeParameter< double >( "Initial time step:", this->getRefinedTimeStep( distributedMeshPointer->getLocalMesh(), this->timeStep ) ); + else + logger.writeParameter< double >( "Initial time step:", this->getRefinedTimeStep( *meshPointer, this->timeStep ) ); logger.writeParameter< double >( "Initial time:", "initial-time", parameters ); logger.writeParameter< double >( "Final time:", "final-time", parameters ); logger.writeParameter< double >( "Snapshot period:", "snapshot-period", parameters ); @@ -300,8 +303,14 @@ solve() * Initialize the time stepper */ this->timeStepper.setProblem( * ( this->problem ) ); - this->timeStepper.init( this->meshPointer ); - this->timeStepper.setTimeStep( this->getRefinedTimeStep( this->meshPointer.getData(), this->timeStep ) ); + if( Problem::CommunicatorType::isDistributed() ) { + this->timeStepper.init( distributedMeshPointer->getLocalMesh() ); + this->timeStepper.setTimeStep( this->getRefinedTimeStep( distributedMeshPointer->getLocalMesh(), this->timeStep ) ); + } + else { + this->timeStepper.init( *meshPointer ); + this->timeStepper.setTimeStep( this->getRefinedTimeStep( *meshPointer, this->timeStep ) ); + } while( step < allSteps ) { RealType tau = min( this->snapshotPeriod, diff --git a/src/TNL/Solvers/PDE/TimeIndependentPDESolver.h b/src/TNL/Solvers/PDE/TimeIndependentPDESolver.h index 189584e79a8ed639ea07ecd3539bc7f69b440e46..15a5e7ba1b77bc2c0b6ca4bbfcdf77a406b384bc 100644 --- a/src/TNL/Solvers/PDE/TimeIndependentPDESolver.h +++ b/src/TNL/Solvers/PDE/TimeIndependentPDESolver.h @@ -71,7 +71,7 @@ class TimeIndependentPDESolver : public PDESolver< typename Problem::RealType, MeshPointer meshPointer; - Meshes::DistributedMeshes::DistributedMesh<MeshType> distributedMesh; + Pointers::SharedPointer< Meshes::DistributedMeshes::DistributedMesh<MeshType> > distributedMeshPointer; CommonDataPointer commonDataPointer; diff --git a/src/TNL/Solvers/PDE/TimeIndependentPDESolver_impl.h b/src/TNL/Solvers/PDE/TimeIndependentPDESolver_impl.h index b6e6c10c89f6bf2427b15247702e491f63a404dc..bd1ccf02b5589589db33253711e71cc2a796d223 100644 --- a/src/TNL/Solvers/PDE/TimeIndependentPDESolver_impl.h +++ b/src/TNL/Solvers/PDE/TimeIndependentPDESolver_impl.h @@ -52,20 +52,17 @@ setup( const Config::ParameterContainer& parameters, // const String& meshFile = parameters.getParameter< String >( "mesh" ); const String& meshFileFormat = parameters.getParameter< String >( "mesh-format" ); - this->distributedMesh.setup( parameters, prefix ); if( Problem::CommunicatorType::isDistributed() ) { - if( ! Meshes::loadDistributedMesh( *this->meshPointer, distributedMesh, meshFile, meshFileFormat ) ) - return false; - if( ! Meshes::decomposeMesh< Problem >( parameters, prefix, *this->meshPointer, distributedMesh, *problem ) ) + if( ! Meshes::loadDistributedMesh( *distributedMeshPointer, meshFile, meshFileFormat ) ) return false; + problem->setMesh( distributedMeshPointer ); } else { - if( ! Meshes::loadMesh( *this->meshPointer, meshFile, meshFileFormat ) ) + if( ! Meshes::loadMesh( *meshPointer, meshFile, meshFileFormat ) ) return false; + problem->setMesh( meshPointer ); } - problem->setMesh( this->meshPointer ); - /**** * Set-up common data */ @@ -115,7 +112,10 @@ writeProlog( Logger& logger, logger.writeHeader( problem->getPrologHeader() ); problem->writeProlog( logger, parameters ); logger.writeSeparator(); - meshPointer->writeProlog( logger ); + if( Problem::CommunicatorType::isDistributed() ) + distributedMeshPointer->writeProlog( logger ); + else + meshPointer->writeProlog( logger ); logger.writeSeparator(); const String& solverName = parameters. getParameter< String >( "discrete-solver" ); logger.writeParameter< String >( "Discrete solver:", "discrete-solver", parameters ); diff --git a/src/TNL/Solvers/SolverConfig_impl.h b/src/TNL/Solvers/SolverConfig_impl.h index d7e64b2fb0b9e1cd9b69032ae03d718d261929e2..aa8f6181aa428984495a6b126d58fee936723f3a 100644 --- a/src/TNL/Solvers/SolverConfig_impl.h +++ b/src/TNL/Solvers/SolverConfig_impl.h @@ -75,14 +75,9 @@ bool SolverConfig< ConfigTag, ProblemConfig >::configSetup( Config::ConfigDescri * Mesh file parameter */ config.addDelimiter( " === Space discretisation parameters ==== " ); - config.addEntry< String >( "mesh", "A file which contains the numerical mesh. You may create it with tools like tnl-grid-setup or tnl-mesh-convert.", "mesh.tnl" ); + config.addEntry< String >( "mesh", "A file which contains the numerical mesh. You may create it with tools like tnl-grid-setup or tnl-mesh-convert.", "mesh.vti" ); config.addEntry< String >( "mesh-format", "Mesh file format.", "auto" ); - /**** - * Domain decomposition - */ - Meshes::DistributedMeshes::DistributedMesh< Meshes::Grid< 3 > >::configSetup( config ); - /**** * Time discretisation */ diff --git a/src/Tools/CMakeLists.txt b/src/Tools/CMakeLists.txt index 66eb6ce7607e0b4522298de148edf797b51a53f6..17fe51d67e5d6f1bc98a65f2e699d7ea7bb689d3 100644 --- a/src/Tools/CMakeLists.txt +++ b/src/Tools/CMakeLists.txt @@ -1,5 +1,6 @@ add_subdirectory(tnl-quickstart) +ADD_EXECUTABLE(tnl-decompose-grid tnl-decompose-grid.cpp ) ADD_EXECUTABLE(tnl-grid-setup tnl-grid-setup.cpp ) ADD_EXECUTABLE(tnl-grid-to-mesh tnl-grid-to-mesh.cpp ) ADD_EXECUTABLE(tnl-mesh-converter tnl-mesh-converter.cpp ) @@ -10,9 +11,7 @@ else() ADD_EXECUTABLE(tnl-test-distributed-mesh tnl-test-distributed-mesh.cpp ) endif() ADD_EXECUTABLE(tnl-init tnl-init.cpp ) -ADD_EXECUTABLE(tnl-view tnl-view.cpp ) ADD_EXECUTABLE(tnl-diff tnl-diff.cpp ) -ADD_EXECUTABLE(tnl-lattice-init tnl-lattice-init.cpp ) ADD_EXECUTABLE(tnl-image-converter tnl-image-converter.cpp ) if( PNG_FOUND ) @@ -29,7 +28,7 @@ endif() find_package( ZLIB ) if( ZLIB_FOUND ) - foreach( target IN ITEMS tnl-view tnl-grid-to-mesh tnl-mesh-converter tnl-game-of-life tnl-test-distributed-mesh ) + foreach( target IN ITEMS tnl-init tnl-diff tnl-decompose-grid tnl-grid-to-mesh tnl-mesh-converter tnl-game-of-life tnl-test-distributed-mesh ) target_compile_definitions(${target} PUBLIC "-DHAVE_ZLIB") target_include_directories(${target} PUBLIC ${ZLIB_INCLUDE_DIRS}) target_link_libraries(${target} ${ZLIB_LIBRARIES}) @@ -38,7 +37,7 @@ endif() find_package( tinyxml2 QUIET ) if( tinyxml2_FOUND ) - foreach( target IN ITEMS tnl-mesh-converter tnl-game-of-life tnl-test-distributed-mesh ) + foreach( target IN ITEMS tnl-init tnl-diff tnl-decompose-grid tnl-grid-to-mesh tnl-mesh-converter tnl-game-of-life tnl-test-distributed-mesh ) target_compile_definitions(${target} PUBLIC "-DHAVE_TINYXML2") target_link_libraries(${target} tinyxml2::tinyxml2) endforeach() @@ -69,8 +68,8 @@ IF( BUILD_CUDA ) ENDIF() INSTALL( TARGETS tnl-init - tnl-view tnl-diff + tnl-decompose-grid tnl-grid-setup tnl-grid-to-mesh tnl-mesh-converter @@ -78,7 +77,6 @@ INSTALL( TARGETS tnl-init tnl-test-distributed-mesh tnl-dicom-reader tnl-image-converter - tnl-lattice-init DESTINATION bin ) INSTALL( FILES tnl-err2eoc diff --git a/src/Tools/tnl-decompose-grid.cpp b/src/Tools/tnl-decompose-grid.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b57558cc5b74f6bcf6097467c51ad6810129d216 --- /dev/null +++ b/src/Tools/tnl-decompose-grid.cpp @@ -0,0 +1,168 @@ +/*************************************************************************** + tnl-decompose-grid.cpp - description + ------------------- + begin : Jun 24, 2021 + copyright : (C) 2021 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/* See Copyright Notice in tnl/Copyright */ + +// Implemented by: Jakub Klinkovský + +#include <TNL/Config/parseCommandLine.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> +#include <TNL/Meshes/Writers/VTIWriter.h> +#include <TNL/Meshes/Writers/PVTIWriter.h> + +using namespace TNL; + +struct DecomposeGridConfigTag {}; + +namespace TNL { +namespace Meshes { +namespace BuildConfigTags { + +/**** + * Turn on all grids. + */ +template<> struct GridRealTag< DecomposeGridConfigTag, float > { enum { enabled = true }; }; +template<> struct GridRealTag< DecomposeGridConfigTag, double > { enum { enabled = true }; }; +template<> struct GridRealTag< DecomposeGridConfigTag, long double > { enum { enabled = true }; }; + +template<> struct GridIndexTag< DecomposeGridConfigTag, int > { enum { enabled = true }; }; +template<> struct GridIndexTag< DecomposeGridConfigTag, long int > { enum { enabled = true }; }; + +} // namespace BuildConfigTags +} // namespace Meshes +} // namespace TNL + + +void configSetup( Config::ConfigDescription& config ) +{ + config.addDelimiter( "General settings:" ); + config.addRequiredEntry< String >( "input-file", "Input file with the grid." ); + config.addEntry< String >( "input-file-format", "Input grid file format.", "auto" ); + config.addRequiredEntry< String >( "output-file", "Output mesh file (PVTI format)." ); + config.addEntry< unsigned >( "subdomains-x", "Number of grid subdomains along the x-axis.", 1 ); + config.addEntry< unsigned >( "subdomains-y", "Number of grid subdomains along the y-axis.", 1 ); + config.addEntry< unsigned >( "subdomains-z", "Number of grid subdomains along the z-axis.", 1 ); + config.addEntry< unsigned >( "ghost-levels", "Number of ghost levels by which the subdomains overlap.", 0 ); +// TODO: implement this in the distributed grid (it should configure communication over faces/edges/vertices in the grid synchronizer) +// config.addEntry< unsigned >( "min-common-vertices", +// "Specifies the number of common nodes that two elements must have in order to put an " +// "edge between them in the dual graph. By default it is equal to the mesh dimension." ); +} + +template< typename CoordinatesType > +CoordinatesType getRankCoordinates( typename CoordinatesType::ValueType rank, + CoordinatesType decomposition ) +{ + CoordinatesType coordinates; + using Index = typename CoordinatesType::ValueType; + Index size = TNL::product( decomposition ); + for( int i = decomposition.getSize() - 1; i >= 0; i-- ) + { + size = size / decomposition[ i ]; + coordinates[ i ] = rank / size; + rank = rank % size; + } + return coordinates; +} + +template< typename GridType > +void run( const GridType& globalGrid, const Config::ParameterContainer& parameters ) +{ + using CoordinatesType = typename GridType::CoordinatesType; + + // prepare the grid decomposition + CoordinatesType decomposition; + decomposition[ 0 ] = parameters.getParameter< unsigned >( "subdomains-x" ); + if( decomposition.getSize() > 1 ) + decomposition[ 1 ] = parameters.getParameter< unsigned >( "subdomains-y" ); + if( decomposition.getSize() > 2 ) + decomposition[ 2 ] = parameters.getParameter< unsigned >( "subdomains-z" ); + + // prepare the ghost levels + const unsigned ghost_levels = parameters.getParameter< unsigned >( "ghost-levels" ); + + // write a .pvti file + using PVTI = Meshes::Writers::PVTIWriter< GridType >; + const std::string pvtiFileName = parameters.template getParameter< String >( "output-file" ); + std::ofstream file( pvtiFileName ); + PVTI pvti( file ); + pvti.writeImageData( globalGrid, ghost_levels ); // TODO: ..., ncommon ); + // TODO +// if( ghost_levels > 0 ) { +// // the PointData and CellData from the individual files should be added here +// pvtu.template writePPointData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// pvtu.template writePCellData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// } + + std::cout << "Writing subdomains..." << std::endl; + const unsigned nproc = TNL::product( decomposition ); + for( unsigned p = 0; p < nproc; p++ ) { + // cartesian coordinates of the p-th rank in the decomposition + const CoordinatesType rank_coordinates = getRankCoordinates( p, decomposition ); + std::cout << p << "-th rank_coordinates: " << rank_coordinates << std::endl; + + // prepare local grid attributes + CoordinatesType globalBegin; + CoordinatesType localSize; + for( int i = 0; i < GridType::getMeshDimension(); i++ ) { + const auto numberOfLarger = globalGrid.getDimensions()[ i ] % decomposition[ i ]; + localSize[ i ] = globalGrid.getDimensions()[ i ] / decomposition[ i ]; + if( numberOfLarger > rank_coordinates[ i ] ) + ++localSize[ i ]; + + if( numberOfLarger > rank_coordinates[ i ] ) + globalBegin[ i ] = rank_coordinates[ i ] * localSize[ i ]; + else + globalBegin[ i ] = numberOfLarger * (localSize[ i ] + 1) + (rank_coordinates[ i ] - numberOfLarger) * localSize[ i ]; + } + + const std::string outputFileName = pvti.addPiece( pvtiFileName, p, globalBegin, globalBegin + localSize ); + std::cout << outputFileName << std::endl; + + // write the subdomain + using Writer = Meshes::Writers::VTIWriter< GridType >; + std::ofstream file( outputFileName ); + Writer writer( file ); + writer.writeImageData( globalGrid.getOrigin(), + globalBegin, + globalBegin + localSize, + globalGrid.getSpaceSteps() ); + // TODO +// if( ghost_levels > 0 ) { +// writer.writePointData( pointGhosts, Meshes::VTK::ghostArrayName() ); +// writer.writeCellData( cellGhosts, Meshes::VTK::ghostArrayName() ); +// } + } +} + +int main( int argc, char* argv[] ) +{ + Config::ParameterContainer parameters; + Config::ConfigDescription conf_desc; + + configSetup( conf_desc ); + + if( ! parseCommandLine( argc, argv, conf_desc, parameters ) ) + return EXIT_FAILURE; + + const String inputFileName = parameters.getParameter< String >( "input-file" ); + const String inputFileFormat = parameters.getParameter< String >( "input-file-format" ); + const String outputFile = parameters.template getParameter< String >( "output-file" ); + if( ! outputFile.endsWith( ".pvti" ) ) { + std::cerr << "Error: the output file must have a '.pvti' extension." << std::endl; + return EXIT_FAILURE; + } + + auto wrapper = [&] ( const auto& reader, auto&& grid ) + { + using GridType = std::decay_t< decltype(grid) >; + run( std::forward<GridType>(grid), parameters ); + return true; + }; + return ! Meshes::resolveAndLoadMesh< DecomposeGridConfigTag, Devices::Host >( wrapper, inputFileName, inputFileFormat ); +} diff --git a/src/Tools/tnl-dicom-reader.cpp b/src/Tools/tnl-dicom-reader.cpp index 52eb7f7786d1847eb7be452b21497210d94de2d7..bf016189b68c9d8a95ddc8d21cefc62772797d7f 100644 --- a/src/Tools/tnl-dicom-reader.cpp +++ b/src/Tools/tnl-dicom-reader.cpp @@ -9,8 +9,11 @@ /* See Copyright Notice in tnl/Copyright */ #include <TNL/Config/parseCommandLine.h> +#include <TNL/Containers/Vector.h> #include <TNL/Images/DicomSeries.h> #include <TNL/FileName.h> +#include <TNL/Meshes/Grid.h> +#include <TNL/Meshes/Writers/VTIWriter.h> using namespace TNL; @@ -19,7 +22,7 @@ void setupConfig( Config::ConfigDescription& config ) config.addDelimiter( "General parameters" ); config.addList < String >( "dicom-files", "Input DICOM files." ); config.addList < String >( "dicom-series", "Input DICOM series." ); - config.addEntry < String >( "mesh-file", "Mesh file.", "mesh.tnl" ); + config.addEntry < String >( "mesh-file", "Mesh file.", "mesh.vti" ); config.addEntry < bool > ( "one-mesh-file", "Generate only one mesh file. All the images dimensions must be the same.", true ); config.addEntry < int > ( "roi-top", "Top (smaller number) line of the region of interest.", -1 ); config.addEntry < int > ( "roi-bottom", "Bottom (larger number) line of the region of interest.", -1 ); @@ -60,7 +63,10 @@ bool processDicomSeries( const Config::ParameterContainer& parameters ) roi.setGrid( grid, verbose ); vector.setSize( grid.template getEntitiesCount< typename GridType::Cell >() ); std::cout << "Writing grid to file " << meshFile << std::endl; - grid.save( meshFile ); + using Writer = Meshes::Writers::VTIWriter< GridType >; + std::ofstream file( meshFile ); + Writer writer( file ); + writer.writeImageData( grid ); } std::cout << "The series consists of " << dicomSeries.getImagesCount() << " images." << std::endl; for( int imageIdx = 0; imageIdx < dicomSeries.getImagesCount(); imageIdx++ ) diff --git a/src/Tools/tnl-diff.cpp b/src/Tools/tnl-diff.cpp index b55013c9ebdc166d439583b3c0e7eed9c7808251..c946dc80b5481314b8fa7a2d304d83c2ecc1500b 100644 --- a/src/Tools/tnl-diff.cpp +++ b/src/Tools/tnl-diff.cpp @@ -11,13 +11,38 @@ #include "tnl-diff.h" #include <TNL/Config/parseCommandLine.h> #include <TNL/Meshes/Grid.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> + +struct TNLDiffBuildConfigTag {}; + +namespace TNL { +namespace Meshes { +namespace BuildConfigTags { + +/**** + * Turn off support for float and long double. + */ +//template<> struct GridRealTag< TNLDiffBuildConfigTag, float > { enum { enabled = false }; }; +template<> struct GridRealTag< TNLDiffBuildConfigTag, long double > { enum { enabled = false }; }; + +/**** + * Turn off support for short int and long int indexing. + */ +template<> struct GridIndexTag< TNLDiffBuildConfigTag, short int >{ enum { enabled = false }; }; +template<> struct GridIndexTag< TNLDiffBuildConfigTag, long int >{ enum { enabled = false }; }; + +} // namespace BuildConfigTags +} // namespace Meshes +} // namespace TNL void setupConfig( Config::ConfigDescription& config ) { - config.addEntry< String >( "mesh", "Input mesh file.", "mesh.tnl" ); - config.addRequiredList< String >( "input-files", "The first set of the input files." ); + config.addEntry< String >( "mesh", "Input mesh file.", "mesh.vti" ); + config.addEntry< String >( "mesh-format", "Mesh file format.", "auto" ); + config.addRequiredList< String >( "input-files", "Input files containing the mesh functions to be compared." ); + config.addEntry< String >( "mesh-function-name", "Name of the mesh function in the input files.", "f" ); config.addEntry< String >( "output-file", "File for the output data.", "tnl-diff.log" ); - config.addEntry< String >( "mode", "Mode 'couples' compares two subsequent files. Mode 'sequence' compares the input files against the first one. 'halves' compares the files from the and the second half of the intput files.", "couples" ); + config.addEntry< String >( "mode", "Mode 'couples' compares two subsequent files. Mode 'sequence' compares the input files against the first one. 'halves' compares the files from the first and the second half of the intput files.", "couples" ); config.addEntryEnum< String >( "couples" ); config.addEntryEnum< String >( "sequence" ); config.addEntryEnum< String >( "halves" ); @@ -39,29 +64,12 @@ int main( int argc, char* argv[] ) if( ! parseCommandLine( argc, argv, conf_desc, parameters ) ) return EXIT_FAILURE; - String meshFile = parameters.getParameter< String >( "mesh" ); - const String meshType = getObjectType( meshFile ); - std::cout << meshType << " detected in " << meshFile << " file." << std::endl; - const std::vector< String > parsedMeshType = parseObjectType( meshType ); - if( ! parsedMeshType.size() ) - { - std::cerr << "Unable to parse the mesh type " << meshType << "." << std::endl; - return EXIT_FAILURE; - } - if( parsedMeshType[ 0 ] == "Meshes::Grid" || - parsedMeshType[ 0 ] == "tnlGrid" ) // TODO: remove deprecated type name + const String meshFile = parameters.getParameter< String >( "mesh" ); + const String meshFileFormat = parameters.getParameter< String >( "mesh-format" ); + auto wrapper = [&] ( const auto& reader, auto&& mesh ) { - const int dimensions = atoi( parsedMeshType[ 1 ].getString() ); - if( dimensions == 1 ) - if( ! resolveGridRealType< 1 >( parsedMeshType, parameters ) ) - return EXIT_FAILURE; - if( dimensions == 2 ) - if( ! resolveGridRealType< 2 >( parsedMeshType, parameters ) ) - return EXIT_FAILURE; - if( dimensions == 3 ) - if( ! resolveGridRealType< 3 >( parsedMeshType, parameters ) ) - return EXIT_FAILURE; - return EXIT_SUCCESS; - } - return EXIT_FAILURE; + using MeshType = std::decay_t< decltype(mesh) >; + return processFiles< MeshType >( parameters ); + }; + return ! TNL::Meshes::resolveMeshType< TNLDiffBuildConfigTag, Devices::Host >( wrapper, meshFile, meshFileFormat ); } diff --git a/src/Tools/tnl-diff.h b/src/Tools/tnl-diff.h index 81a0620de91e188e9d1fff4ab62deb2059f43b87..f5ce069b14135209c02ae0c0c8598d7c60403a10 100644 --- a/src/Tools/tnl-diff.h +++ b/src/Tools/tnl-diff.h @@ -8,14 +8,14 @@ /* See Copyright Notice in tnl/Copyright */ -#ifndef TNL_DIFF_H_ -#define TNL_DIFF_H_ +#pragma once #include <iomanip> #include <TNL/Config/ParameterContainer.h> #include <TNL/FileName.h> #include <TNL/Containers/Vector.h> #include <TNL/Containers/StaticVector.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> #include <TNL/Functions/MeshFunction.h> #include <TNL/Exceptions/NotImplementedError.h> @@ -74,7 +74,7 @@ class ExactMatchTest< MeshFunction, Meshes::Grid< 1, Real, Device, Index >, 1 > outputFile << f1Name << " and " << f2Name << " differs at " << entity.getCoordinates() << " " << f1.getValue( entity ) << " != " << f2.getValue( entity ) <<std::endl; if( verbose ) - std::cout << f1Name << " and " << f2Name << " differs at " << entity.getCoordinates() + std::cout << f1Name << " and " << f2Name << " differs at " << entity.getCoordinates() << " " << f1.getValue( entity ) << " != " << f2.getValue( entity ) <<std::endl; } } @@ -166,10 +166,10 @@ class ExactMatchTest< MeshFunction, Meshes::Grid< 3, Real, Device, Index >, 3 > entity.refresh(); if( f1.getValue( entity ) != f2.getValue( entity ) ) { - outputFile << f1Name << " and " << f2Name << " differs at " << entity.getCoordinates() + outputFile << f1Name << " and " << f2Name << " differs at " << entity.getCoordinates() << " " << f1.getValue( entity ) << " != " << f2.getValue( entity ) <<std::endl; if( verbose ) - std::cout << f1Name << " and " << f2Name << " differs at " << entity.getCoordinates() + std::cout << f1Name << " and " << f2Name << " differs at " << entity.getCoordinates() << " " << f1.getValue( entity ) << " != " << f2.getValue( entity ) <<std::endl; } } @@ -183,6 +183,7 @@ bool computeDifferenceOfMeshFunctions( const MeshPointer& meshPointer, const Con { bool verbose = parameters. getParameter< bool >( "verbose" ); std::vector< String > inputFiles = parameters. getParameter< std::vector< String > >( "input-files" ); + const String meshFunctionName = parameters.getParameter< String >( "mesh-function-name" ); String mode = parameters. getParameter< String >( "mode" ); String outputFileName = parameters. getParameter< String >( "output-file" ); double snapshotPeriod = parameters. getParameter< double >( "snapshot-period" ); @@ -210,7 +211,7 @@ bool computeDifferenceOfMeshFunctions( const MeshPointer& meshPointer, const Con } if( verbose ) std::cout << std::endl; - + typedef typename MeshPointer::ObjectType Mesh; using MeshFunctionType = Functions::MeshFunction< Mesh, Mesh::getMeshDimension(), Real >; MeshFunctionType v1( meshPointer ), v2( meshPointer ), diff( meshPointer ); @@ -230,8 +231,8 @@ bool computeDifferenceOfMeshFunctions( const MeshPointer& meshPointer, const Con std::cout << "Processing files " << inputFiles[ i ] << " and " << inputFiles[ i + 1 ] << "... \r" << std::flush; try { - v1.load( inputFiles[ i ] ); - v2.load( inputFiles[ i + 1 ] ); + Functions::readMeshFunction( v1, meshFunctionName, inputFiles[ i ], "auto" ); + Functions::readMeshFunction( v2, meshFunctionName, inputFiles[ i + 1 ], "auto" ); } catch(...) { @@ -251,12 +252,12 @@ bool computeDifferenceOfMeshFunctions( const MeshPointer& meshPointer, const Con { if( verbose ) std::cout << "Reading the file " << inputFiles[ 0 ] << "... \r" << std::flush; - v1.load( inputFiles[ 0 ] ); + Functions::readMeshFunction( v1, meshFunctionName, inputFiles[ 0 ], "auto" ); file1 = inputFiles[ 0 ]; } if( verbose ) std::cout << "Processing the files " << inputFiles[ 0 ] << " and " << inputFiles[ i ] << "... \r" << std::flush; - v2.load( inputFiles[ i ] ); + Functions::readMeshFunction( v2, meshFunctionName, inputFiles[ i ], "auto" ); if( ! exactMatch ) outputFile << std::setw( 6 ) << ( i - 1 ) * snapshotPeriod << " "; file2 = inputFiles[ i ]; @@ -268,8 +269,8 @@ bool computeDifferenceOfMeshFunctions( const MeshPointer& meshPointer, const Con i = half; if( verbose ) std::cout << "Processing files " << inputFiles[ i - half ] << " and " << inputFiles[ i ] << "... \r" << std::flush; - v1.load( inputFiles[ i - half ] ); - v2.load( inputFiles[ i ] ); + Functions::readMeshFunction( v1, meshFunctionName, inputFiles[ i - half ], "auto" ); + Functions::readMeshFunction( v2, meshFunctionName, inputFiles[ i ], "auto" ); //if( snapshotPeriod != 0.0 ) if( ! exactMatch ) outputFile << std::setw( 6 ) << ( i - half ) * snapshotPeriod << " "; @@ -305,11 +306,11 @@ bool computeDifferenceOfMeshFunctions( const MeshPointer& meshPointer, const Con if( writeDifference ) { - String differenceFileName = removeFileNameExtension( inputFiles[ i ] ) + ".diff.tnl"; + String differenceFileName = removeFileNameExtension( inputFiles[ i ] ) + ".diff.vti"; //diff.setLike( v1 ); diff = v1; diff -= v2; - diff.save( differenceFileName ); + diff.write( "diff", differenceFileName ); } } } @@ -558,29 +559,16 @@ bool setValueType( const MeshPointer& meshPointer, template< typename Mesh > bool processFiles( const Config::ParameterContainer& parameters ) { - int verbose = parameters. getParameter< bool >( "verbose"); - std::vector< String > inputFiles = parameters. getParameter< std::vector< String > >( "input-files" ); - - /**** - * Reading the mesh - */ - String meshFile = parameters. getParameter< String >( "mesh" ); - - typedef Pointers::SharedPointer< Mesh > MeshPointer; + int verbose = parameters.getParameter< int >( "verbose"); + const String meshFile = parameters.getParameter< String >( "mesh" ); + const String meshFileFormat = parameters.getParameter< String >( "mesh-format" ); + typedef Pointers::SharedPointer< Mesh > MeshPointer; MeshPointer meshPointer; - if( meshFile != "" ) - { - try - { - meshPointer->load( meshFile ); - } - catch(...) - { - std::cerr << "I am not able to load mesh from the file " << meshFile << "." << std::endl; - return false; - } - } + if( ! Meshes::loadMesh( *meshPointer, meshFile, meshFileFormat ) ) + return false; + + std::vector< String > inputFiles = parameters.getParameter< std::vector< String > >( "input-files" ); String objectType; try @@ -604,31 +592,3 @@ bool processFiles( const Config::ParameterContainer& parameters ) setValueType< MeshPointer >( meshPointer, inputFiles[ 0 ], parsedObjectType, parameters ); return true; } - -template< int Dim, typename Real > -bool resolveGridIndexType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - if( parsedMeshType[ 4 ] == "int" ) - return processFiles< Meshes::Grid< Dim, Real, Devices::Host, int > >( parameters ); - if( parsedMeshType[ 4 ] == "long int" ) - return processFiles< Meshes::Grid< Dim, Real, Devices::Host, long int > >( parameters ); - std::cerr << "Unknown index type " << parsedMeshType[ 4 ] << "." << std::endl; - return false; -} - -template< int Dim > -bool resolveGridRealType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - if( parsedMeshType[ 2 ] == "float" ) - return resolveGridIndexType< Dim, float >( parsedMeshType, parameters ); - if( parsedMeshType[ 2 ] == "double" ) - return resolveGridIndexType< Dim, double >( parsedMeshType, parameters ); -// if( parsedMeshType[ 2 ] == "long double" ) -// return resolveGridIndexType< Dim, long double >( parsedMeshType, parameters ); - std::cerr << "Unknown real type " << parsedMeshType[ 2 ] << "." << std::endl; - return false; -} - -#endif /* TNL_DIFF_H_ */ diff --git a/src/Tools/tnl-grid-setup.cpp b/src/Tools/tnl-grid-setup.cpp index 115f02065920e50507acef551b68128d5be90dd4..45a7fca17ecd347b7fff6f28cdd018037bbb48b9 100644 --- a/src/Tools/tnl-grid-setup.cpp +++ b/src/Tools/tnl-grid-setup.cpp @@ -14,11 +14,10 @@ void configSetup( Config::ConfigDescription& config ) { config.addDelimiter( "General parameters" ); - config.addEntry < String >( "output-file", "Output file.", "mesh.tnl" ); + config.addEntry < String >( "output-file", "Output file.", "mesh.vti" ); config.addEntry < int > ( "verbose", "Set the verbosity of the program.", 1 ); config.addDelimiter ( "Grid parameters" ); - config.addEntry < String >( "grid-name", "The grid name.", "tnl-grid" ); config.addRequiredEntry< int > ( "dimension", "The grid dimension." ); config.addEntryEnum< int >( 1 ); config.addEntryEnum< int >( 2 ); diff --git a/src/Tools/tnl-grid-setup.h b/src/Tools/tnl-grid-setup.h index 867cfdb73bdb75f6ba073724b0ebd2db3769f6b4..ca9177fe2cfabbaf014fd5ef270c0ade18b1d8dd 100644 --- a/src/Tools/tnl-grid-setup.h +++ b/src/Tools/tnl-grid-setup.h @@ -8,18 +8,17 @@ /* See Copyright Notice in tnl/Copyright */ -#ifndef TNL_GRID_SETUP_H_ -#define TNL_GRID_SETUP_H_ +#pragma once #include <TNL/Config/ParameterContainer.h> #include <TNL/Meshes/Grid.h> +#include <TNL/Meshes/Writers/VTIWriter.h> using namespace TNL; template< typename RealType, typename IndexType > bool setupGrid( const Config::ParameterContainer& parameters ) { - const String gridName = parameters.getParameter< String >( "grid-name" ); const String outputFile = parameters.getParameter< String >( "output-file" ); const int dimension = parameters.getParameter< int >( "dimension" ); if( dimension == 1 ) @@ -39,16 +38,11 @@ bool setupGrid( const Config::ParameterContainer& parameters ) grid.setDomain( PointType( originX ), PointType( proportionsX ) ); grid.setDimensions( CoordinatesType( sizeX ) ); std::cout << "Setting dimensions to ... " << sizeX << std::endl; - std::cout << "Writing the grid to the file " << outputFile << " .... "; - try - { - grid.save( outputFile ); - } - catch(...) - { - std::cerr << "[ FAILED ] " << std::endl; - return false; - } + std::cout << "Writing the grid to the file " << outputFile << std::endl; + + std::ofstream file( outputFile ); + Meshes::Writers::VTIWriter< GridType > writer( file ); + writer.writeImageData( grid ); } if( dimension == 2 ) { @@ -74,23 +68,17 @@ bool setupGrid( const Config::ParameterContainer& parameters ) { double h = min( grid.getSpaceSteps().x(), grid.getSpaceSteps().y() ); grid.setSpaceSteps( PointType( h, h ) ); - std::cout << "Adjusting grid space steps to " << grid.getSpaceSteps() + std::cout << "Adjusting grid space steps to " << grid.getSpaceSteps() << " and grid proportions to " << grid.getProportions() << "." << std::endl; } } std::cout << "Setting dimensions to ... " << grid.getDimensions() << std::endl; - std::cout << "Writing the grid to the file " << outputFile << " .... "; + std::cout << "Writing the grid to the file " << outputFile << std::endl; - try - { - grid.save( outputFile ); - } - catch(...) - { - std::cerr << "[ FAILED ] " << std::endl; - return false; - } + std::ofstream file( outputFile ); + Meshes::Writers::VTIWriter< GridType > writer( file ); + writer.writeImageData( grid ); } if( dimension == 3 ) { @@ -121,22 +109,16 @@ bool setupGrid( const Config::ParameterContainer& parameters ) { double h = min( grid.getSpaceSteps().x(), min( grid.getSpaceSteps().y(), grid.getSpaceSteps().z() ) ); grid.setSpaceSteps( PointType( h, h, h ) ); - std::cout << "Adjusting grid space steps to " << grid.getSpaceSteps() + std::cout << "Adjusting grid space steps to " << grid.getSpaceSteps() << " and grid proportions to " << grid.getProportions() << "." << std::endl; } } std::cout << "Setting dimensions to ... " << grid.getDimensions() << std::endl; - std::cout << "Writing the grid to the file " << outputFile << " .... "; + std::cout << "Writing the grid to the file " << outputFile << std::endl; - try - { - grid.save( outputFile ); - } - catch(...) - { - std::cerr << "[ FAILED ] " << std::endl; - return false; - } + std::ofstream file( outputFile ); + Meshes::Writers::VTIWriter< GridType > writer( file ); + writer.writeImageData( grid ); } std::cout << "[ OK ] " << std::endl; return true; @@ -155,7 +137,7 @@ bool resolveIndexType( const Config::ParameterContainer& parameters ) return false; } -bool resolveRealType( const Config::ParameterContainer& parameters ) +inline bool resolveRealType( const Config::ParameterContainer& parameters ) { String realType = parameters.getParameter< String >( "real-type" ); std::cout << "Setting real type to ... " << realType << std::endl; @@ -168,5 +150,3 @@ bool resolveRealType( const Config::ParameterContainer& parameters ) std::cerr << "The real type '" << realType << "' is not supported." << std::endl; return false; } - -#endif /* TNL_GRID_SETUP_H_ */ diff --git a/src/Tools/tnl-grid-to-mesh.cpp b/src/Tools/tnl-grid-to-mesh.cpp index fc0bb42484a4cedf2dfb4609b4cc82d6141f8732..e2d255eb06376a4e397569b24bfbb84810d78152 100644 --- a/src/Tools/tnl-grid-to-mesh.cpp +++ b/src/Tools/tnl-grid-to-mesh.cpp @@ -178,13 +178,11 @@ struct MeshCreator< Meshes::Grid< 3, Real, Device, Index > > }; template< typename Grid > -bool convertGrid( Grid& grid, const String& fileName, const String& outputFileName, const String& outputFormat ) +bool convertGrid( Grid& grid, const String& outputFileName, const String& outputFormat ) { using MeshCreator = MeshCreator< Grid >; using Mesh = typename MeshCreator::MeshType; - grid.load( fileName ); - Mesh mesh; if( ! MeshCreator::run( grid, mesh ) ) { std::cerr << "Unable to build mesh from grid." << std::endl; @@ -241,7 +239,7 @@ main( int argc, char* argv[] ) auto wrapper = [&] ( const auto& reader, auto&& grid ) { - return convertGrid( grid, inputFileName, outputFileName, outputFileFormat ); + return convertGrid( grid, outputFileName, outputFileFormat ); }; - return ! Meshes::resolveMeshType< GridToMeshConfigTag, Devices::Host >( wrapper, inputFileName ); + return ! Meshes::resolveAndLoadMesh< GridToMeshConfigTag, Devices::Host >( wrapper, inputFileName ); } diff --git a/src/Tools/tnl-image-converter.cpp b/src/Tools/tnl-image-converter.cpp index d1ef8fa92b4dfceac9a8d8426c66b823020cc87e..b707b70c0f2c81fe1edf2c62b51ed99b6091316f 100644 --- a/src/Tools/tnl-image-converter.cpp +++ b/src/Tools/tnl-image-converter.cpp @@ -23,62 +23,48 @@ using namespace TNL; void configSetup( Config::ConfigDescription& config ) { config.addDelimiter( "General parameters" ); - config.addList < String >( "input-images", "Input images for conversion to .tnl files." ); - config.addList < String >( "input-files", "Input .tnl files for conversion to images." ); - config.addEntry < String >( "image-format", "Output images file format.", "pgm" ); - config.addEntry < String >( "mesh-file", "Mesh file.", "mesh.tnl" ); - config.addEntry < String >( "real-type", "Output mesh function real type.", "double" ); - config.addEntryEnum < String >( "float" ); - config.addEntryEnum < String >( "double" ); - config.addEntryEnum < String >( "long-double" ); - config.addEntry < bool > ( "one-mesh-file", "Generate only one mesh file. All the images dimensions must be the same.", true ); - config.addEntry < int > ( "roi-top", "Top (smaller number) line of the region of interest.", -1 ); - config.addEntry < int > ( "roi-bottom", "Bottom (larger number) line of the region of interest.", -1 ); - config.addEntry < int > ( "roi-left", "Left (smaller number) column of the region of interest.", -1 ); - config.addEntry < int > ( "roi-right", "Right (larger number) column of the region of interest.", -1 ); - config.addEntry < bool > ( "verbose", "Set the verbosity of the program.", true ); + config.addList< String >( "input-images", "Input images for conversion to VTI files." ); + config.addList< String >( "input-files", "Input VTI files for conversion to images." ); + config.addEntry< String >( "image-format", "Output images file format.", "pgm" ); + config.addEntry< String >( "mesh-function-name", "Name of the mesh function in the VTI files.", "image" ); + config.addEntry< String >( "real-type", "Output mesh function real type.", "double" ); + config.addEntryEnum< String >( "float" ); + config.addEntryEnum< String >( "double" ); + config.addEntryEnum< String >( "long-double" ); + config.addEntry< int >( "roi-top", "Top (smaller number) line of the region of interest.", -1 ); + config.addEntry< int >( "roi-bottom", "Bottom (larger number) line of the region of interest.", -1 ); + config.addEntry< int >( "roi-left", "Left (smaller number) column of the region of interest.", -1 ); + config.addEntry< int >( "roi-right", "Right (larger number) column of the region of interest.", -1 ); } template< typename Real > bool processImages( const Config::ParameterContainer& parameters ) { - const std::vector< String >& inputImages = parameters.getParameter< std::vector< String > >( "input-images" ); - String meshFile = parameters.getParameter< String >( "mesh-file" ); - bool verbose = parameters.getParameter< bool >( "verbose" ); - - using GridType = Meshes::Grid< 2, Real, Devices::Host, int >; - using GridPointer = Pointers::SharedPointer< GridType >; - using MeshFunctionType = Functions::MeshFunction< GridType >; - GridPointer grid; - MeshFunctionType meshFunction; + const std::vector< std::string > inputImages = parameters.getParameter< std::vector< std::string > >( "input-images" ); + const std::string meshFunctionName = parameters.getParameter< std::string >( "mesh-function-name" ); - Images::RegionOfInterest< int > roi; - for( int i = 0; i < (int) inputImages.size(); i++ ) - { - const String& fileName = inputImages[ i ]; + using GridType = Meshes::Grid< 2, Real, Devices::Host, int >; + using GridPointer = Pointers::SharedPointer< GridType >; + using MeshFunctionType = Functions::MeshFunction< GridType >; + GridPointer grid; + MeshFunctionType meshFunction; + + Images::RegionOfInterest< int > roi; + for( auto fileName : inputImages ) + { + const String outputFileName = removeFileNameExtension( fileName ) + ".vti"; std::cout << "Processing image file " << fileName << "... "; Images::PGMImage< int > pgmImage; if( pgmImage.openForRead( fileName ) ) { std::cout << "PGM format detected ..."; - if( i == 0 ) - { - if( ! roi.setup( parameters, &pgmImage ) ) - return false; - roi.setGrid( *grid, verbose ); - //vector.setSize( grid->template getEntitiesCount< typename GridType::Cell >() ); - std::cout << "Writing grid to file " << meshFile << std::endl; - grid->save( meshFile ); - } - else - if( ! roi.check( &pgmImage ) ) - return false; + if( ! roi.check( &pgmImage ) ) + return false; meshFunction.setMesh( grid ); if( ! pgmImage.read( roi, meshFunction ) ) return false; - String outputFileName = removeFileNameExtension( fileName ) + ".tnl"; std::cout << "Writing image data to " << outputFileName << std::endl; - meshFunction.save( outputFileName ); + meshFunction.write( meshFunctionName, outputFileName ); pgmImage.close(); continue; } @@ -86,50 +72,28 @@ bool processImages( const Config::ParameterContainer& parameters ) if( pngImage.openForRead( fileName ) ) { std::cout << "PNG format detected ..."; - if( i == 0 ) - { - if( ! roi.setup( parameters, &pngImage ) ) - return false; - roi.setGrid( *grid, verbose ); - //vector.setSize( grid->template getEntitiesCount< typename GridType::Cell >() ); - std::cout << "Writing grid to file " << meshFile << std::endl; - grid->save( meshFile ); - } - else - if( ! roi.check( &pgmImage ) ) - return false; + if( ! roi.check( &pngImage ) ) + return false; meshFunction.setMesh( grid ); if( ! pngImage.read( roi, meshFunction ) ) return false; - String outputFileName = removeFileNameExtension( fileName ) + ".tnl"; std::cout << "Writing image data to " << outputFileName << std::endl; - meshFunction.save( outputFileName ); - pgmImage.close(); + meshFunction.write( meshFunctionName, outputFileName ); + pngImage.close(); continue; } Images::JPEGImage< int > jpegImage; if( jpegImage.openForRead( fileName ) ) { std::cout << "JPEG format detected ..."; - if( i == 0 ) - { - if( ! roi.setup( parameters, &jpegImage ) ) - return false; - roi.setGrid( *grid, verbose ); - //vector.setSize( grid->template getEntitiesCount< typename GridType::Cell >() ); - std::cout << "Writing grid to file " << meshFile << std::endl; - grid->save( meshFile ); - } - else - if( ! roi.check( &jpegImage ) ) - return false; + if( ! roi.check( &jpegImage ) ) + return false; meshFunction.setMesh( grid ); if( ! jpegImage.read( roi, meshFunction ) ) return false; - String outputFileName = removeFileNameExtension( fileName ) + ".tnl"; std::cout << "Writing image data to " << outputFileName << std::endl; - meshFunction.save( outputFileName ); - pgmImage.close(); + meshFunction.write( meshFunctionName, outputFileName ); + jpegImage.close(); continue; } } @@ -138,63 +102,50 @@ bool processImages( const Config::ParameterContainer& parameters ) bool processFiles( const Config::ParameterContainer& parameters ) { - const std::vector< String >& inputFiles = parameters.getParameter< std::vector< String > >( "input-files" ); - const String& imageFormat = parameters.getParameter< String >( "image-format" ); - String meshFile = parameters.getParameter< String >( "mesh-file" ); - - Meshes::Grid< 2, double, Devices::Host, int > grid; - try - { - grid.load( meshFile ); - } - catch(...) - { - std::cerr << "I am not able to load the mesh file " << meshFile << "." << std::endl; - return false; - } - Containers::Vector< double, Devices::Host, int > vector; - for( int i = 0; i < (int) inputFiles.size(); i++ ) + const std::vector< std::string > inputFiles = parameters.getParameter< std::vector< std::string > >( "input-files" ); + const std::string imageFormat = parameters.getParameter< std::string >( "image-format" ); + const std::string meshFunctionName = parameters.getParameter< std::string >( "mesh-function-name" ); + + for( auto fileName : inputFiles ) { - const String& fileName = inputFiles[ i ]; std::cout << "Processing file " << fileName << "... "; - try - { - File( fileName, std::ios_base::in ) >> vector; - } - catch(...) - { - std::cerr << "I am not able to load data from a file " << fileName << "." << std::endl; + using Real = double; + using GridType = Meshes::Grid< 2, Real, Devices::Host, int >; + using GridPointer = Pointers::SharedPointer< GridType >; + using MeshFunctionType = Functions::MeshFunction< GridType >; + GridPointer grid; + MeshFunctionType meshFunction; + if( ! Functions::readMeshFunction( meshFunction, meshFunctionName, fileName ) ) return false; - } + if( imageFormat == "pgm" || imageFormat == "pgm-binary" || imageFormat == "pgm-ascii" ) { Images::PGMImage< int > image; - String outputFileName = removeFileNameExtension( fileName ) + ".pgm"; - if ( imageFormat == "pgm" || imageFormat == "pgm-binary") - image.openForWrite( outputFileName, grid, true ); - if ( imageFormat == "pgm-ascii" ) - image.openForWrite( outputFileName, grid, false ); - image.write( grid, vector ); + const String outputFileName = removeFileNameExtension( fileName ) + ".pgm"; + if ( imageFormat == "pgm" || imageFormat == "pgm-binary") + image.openForWrite( outputFileName, *grid, true ); + if ( imageFormat == "pgm-ascii" ) + image.openForWrite( outputFileName, *grid, false ); + image.write( *grid, meshFunction.getData() ); image.close(); continue; } if( imageFormat == "png" ) { Images::PNGImage< int > image; - String outputFileName = removeFileNameExtension( fileName ) + ".png"; - image.openForWrite( outputFileName, grid ); - image.write( grid, vector ); + const String outputFileName = removeFileNameExtension( fileName ) + ".png"; + image.openForWrite( outputFileName, *grid ); + image.write( *grid, meshFunction.getData() ); image.close(); } if( imageFormat == "jpg" ) { Images::JPEGImage< int > image; - String outputFileName = removeFileNameExtension( fileName ) + ".jpg"; - image.openForWrite( outputFileName, grid ); - image.write( grid, vector ); + const String outputFileName = removeFileNameExtension( fileName ) + ".jpg"; + image.openForWrite( outputFileName, *grid ); + image.write( *grid, meshFunction.getData() ); image.close(); } - } return true; } @@ -220,8 +171,6 @@ int main( int argc, char* argv[] ) return EXIT_FAILURE; if( realType == "double" && ! processImages< double >( parameters ) ) return EXIT_FAILURE; - if( realType == "long double" && ! processImages< long double >( parameters ) ) - return EXIT_FAILURE; } if( parameters.checkParameter( "input-files" ) && ! processFiles( parameters ) ) return EXIT_FAILURE; diff --git a/src/Tools/tnl-init.cpp b/src/Tools/tnl-init.cpp index a1b3a8ff33c259562bb23d779553d23b11368a1a..b1f2626d9c880587fb9db952f7aa25daf027ed09 100644 --- a/src/Tools/tnl-init.cpp +++ b/src/Tools/tnl-init.cpp @@ -13,18 +13,40 @@ #include <TNL/File.h> #include <TNL/Config/parseCommandLine.h> #include <TNL/Functions/TestFunction.h> -#include <TNL/Meshes/Grid.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> #include <TNL/MPI/ScopedInitializer.h> #include <TNL/MPI/Config.h> - using namespace TNL; +struct TnlInitConfigTag {}; + +namespace TNL { +namespace Meshes { +namespace BuildConfigTags { + +// Configure real types +template<> struct GridRealTag< TnlInitConfigTag, float > { enum { enabled = true }; }; +template<> struct GridRealTag< TnlInitConfigTag, double > { enum { enabled = true }; }; +template<> struct GridRealTag< TnlInitConfigTag, long double > { enum { enabled = false }; }; + +// Configure index types +template<> struct GridIndexTag< TnlInitConfigTag, short int >{ enum { enabled = false }; }; +template<> struct GridIndexTag< TnlInitConfigTag, int >{ enum { enabled = true }; }; +template<> struct GridIndexTag< TnlInitConfigTag, long int >{ enum { enabled = true }; }; + +// Unstructured meshes are disabled, only grids can be on input. + +} // namespace BuildConfigTags +} // namespace Meshes +} // namespace TNL + void setupConfig( Config::ConfigDescription& config ) { - config.addDelimiter ( "General settings:" ); - config.addEntry< String >( "mesh", "Mesh file. If none is given, a regular rectangular mesh is assumed.", "mesh.tnl" ); + config.addDelimiter( "General settings:" ); + config.addEntry< String >( "mesh", "Input mesh file.", "mesh.vti" ); + config.addEntry< String >( "mesh-function-name", "Name of the mesh function in the VTI files.", "f" ); config.addEntry< String >( "real-type", "Precision of the function evaluation.", "mesh-real-type" ); config.addEntryEnum< String >( "mesh-real-type" ); config.addEntryEnum< String >( "float" ); @@ -41,12 +63,10 @@ void setupConfig( Config::ConfigDescription& config ) config.addEntry< bool >( "check-output-file", "If the output file already exists, do not recreate it.", false ); config.addEntry< String >( "help", "Write help." ); - config.addDelimiter ( "Functions parameters:" ); + config.addDelimiter( "Functions parameters:" ); Functions::TestFunction< 1 >::configSetup( config ); } - - int main( int argc, char* argv[] ) { Config::ParameterContainer parameters; @@ -60,26 +80,13 @@ int main( int argc, char* argv[] ) if( ! parseCommandLine( argc, argv, configDescription, parameters ) ) return EXIT_FAILURE; - String meshFile = parameters. getParameter< String >( "mesh" ); - String meshType; - try - { - meshType = getObjectType( meshFile ); - } - catch(...) - { - std::cerr << "I am not able to detect the mesh type from the file " << meshFile << "." << std::endl; - return EXIT_FAILURE; - } - std::cout << meshType << " detected in " << meshFile << " file." << std::endl; - std::vector< String > parsedMeshType = parseObjectType( meshType ); - if( ! parsedMeshType.size() ) - { - std::cerr << "Unable to parse the mesh type " << meshType << "." << std::endl; - return EXIT_FAILURE; - } - if( ! resolveMeshType( parsedMeshType, parameters ) ) - return EXIT_FAILURE; + const String meshFileName = parameters.getParameter< String >( "mesh" ); + const String meshFileFormat = "auto"; - return EXIT_SUCCESS; + auto wrapper = [&] ( auto& reader, auto&& mesh ) -> bool + { + using MeshType = std::decay_t< decltype(mesh) >; + return resolveRealType< MeshType >( parameters ); + }; + return ! Meshes::resolveMeshType< TnlInitConfigTag, Devices::Host >( wrapper, meshFileName, meshFileFormat ); } diff --git a/src/Tools/tnl-init.h b/src/Tools/tnl-init.h index e78db1153b9bb52001bba79c182f1401f54307b8..1d8281c00973123688c0ef4961992b15a95b6e34 100644 --- a/src/Tools/tnl-init.h +++ b/src/Tools/tnl-init.h @@ -13,15 +13,16 @@ #include <TNL/MPI/Wrappers.h> #include <TNL/Config/ParameterContainer.h> #include <TNL/Meshes/Grid.h> +#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> +#include <TNL/Meshes/Readers/VTIReader.h> +#include <TNL/Meshes/Readers/PVTIReader.h> +#include <TNL/Meshes/Writers/VTIWriter.h> +#include <TNL/Meshes/Writers/PVTIWriter.h> #include <TNL/Functions/TestFunction.h> #include <TNL/Operators/FiniteDifferences.h> #include <TNL/FileName.h> #include <TNL/Functions/MeshFunction.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO.h> -#include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> - using namespace TNL; template< typename MeshType, @@ -35,28 +36,21 @@ bool renderFunction( const Config::ParameterContainer& parameters ) using DistributedGridType = Meshes::DistributedMeshes::DistributedMesh<MeshType>; DistributedGridType distributedMesh; Pointers::SharedPointer< MeshType > meshPointer; - MeshType globalMesh; - if(TNL::MPI::GetSize() > 1) - { - //suppose global mesh loaded from single file - String meshFile = parameters.getParameter< String >( "mesh" ); - std::cout << "+ -> Loading mesh from " << meshFile << " ... " << std::endl; - globalMesh.load( meshFile ); + const String meshFile = parameters.getParameter< String >( "mesh" ); + std::cout << "+ -> Loading mesh from " << meshFile << " ... " << std::endl; - // TODO: This should work with no overlaps - distributedMesh.setGlobalGrid(globalMesh); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; - SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedMesh, lowerOverlap, upperOverlap, 1 ); - distributedMesh.setOverlaps( lowerOverlap, upperOverlap ); - distributedMesh.setupGrid(*meshPointer); - } - else - { - String meshFile = parameters.getParameter< String >( "mesh" ); - std::cout << "+ -> Loading mesh from " << meshFile << " ... " << std::endl; - meshPointer->load( meshFile ); - } + if( TNL::MPI::GetSize() > 1 ) + { + Meshes::Readers::PVTIReader reader( meshFile ); + reader.loadMesh( distributedMesh ); + *meshPointer = distributedMesh.getLocalMesh(); + } + else + { + Meshes::Readers::VTIReader reader( meshFile ); + reader.loadMesh( *meshPointer ); + } typedef Functions::TestFunction< MeshType::getMeshDimension(), RealType > FunctionType; typedef Pointers::SharedPointer< FunctionType, typename MeshType::DeviceType > FunctionPointer; @@ -81,7 +75,6 @@ bool renderFunction( const Config::ParameterContainer& parameters ) while( step <= steps ) { - if( numericalDifferentiation ) { std::cout << "+ -> Computing the finite differences ... " << std::endl; @@ -107,22 +100,28 @@ bool renderFunction( const Config::ParameterContainer& parameters ) outputFileName.setExtension( extension.getString() ); outputFileName.setIndex( step ); outputFile = outputFileName.getFileName(); - std::cout << "+ -> Writing the function at the time " << time << " to " << outputFile << " ... " << std::endl; + std::cout << "+ -> Writing the function at the time " << time << " to " << outputFile << " ... " << std::endl; } else - std::cout << "+ -> Writing the function to " << outputFile << " ... " << std::endl; + std::cout << "+ -> Writing the function to " << outputFile << " ... " << std::endl; + + const std::string meshFunctionName = parameters.getParameter< std::string >( "mesh-function-name" ); - if(TNL::MPI::GetSize() > 1) + if( TNL::MPI::GetSize() > 1 ) { - if( ! Meshes::DistributedMeshes::DistributedGridIO<MeshFunctionType> ::save(outputFile, *meshFunction ) ) - return false; + // TODO: write metadata: step and time + Functions::writeDistributedMeshFunction( distributedMesh, *meshFunction, meshFunctionName, outputFile ); } else - meshFunction->save( outputFile); + { + // TODO: write metadata: step and time + meshFunction->write( meshFunctionName, outputFile, "auto" ); + } time += tau; step ++; } + return true; } @@ -228,64 +227,3 @@ bool resolveRealType( const Config::ParameterContainer& parameters ) // return resolveDerivatives< MeshType, long double >( parameters ); return false; } - - -template< int Dimension, typename RealType, typename IndexType > -bool resolveMesh( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - std::cout << "+ -> Setting mesh type to " << parsedMeshType[ 0 ] << " ... " << std::endl; - if( parsedMeshType[ 0 ] == "Meshes::Grid" ) - { - typedef Meshes::Grid< Dimension, RealType, Devices::Host, IndexType > MeshType; - return resolveRealType< MeshType >( parameters ); - } - std::cerr << "Unknown mesh type." << std::endl; - return false; -} - -template< int Dimension, typename RealType > -bool resolveIndexType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - std::cout << "+ -> Setting index type to " << parsedMeshType[ 4 ] << " ... " << std::endl; - - if( parsedMeshType[ 4 ] == "int" ) - return resolveMesh< Dimension, RealType, int >( parsedMeshType, parameters ); - if( parsedMeshType[ 4 ] == "long int" ) - return resolveMesh< Dimension, RealType, long int >( parsedMeshType, parameters ); - - return false; -} - -template< int Dimension > -bool resolveRealType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - std::cout << "+ -> Setting real type to " << parsedMeshType[ 2 ] << " ... " << std::endl; - - if( parsedMeshType[ 2 ] == "float" ) - return resolveIndexType< Dimension, float >( parsedMeshType, parameters ); - if( parsedMeshType[ 2 ] == "double" ) - return resolveIndexType< Dimension, double >( parsedMeshType, parameters ); -// if( parsedMeshType[ 2 ] == "long double" ) -// return resolveIndexType< Dimension, long double >( parsedMeshType, parameters ); - - return false; -} - -bool resolveMeshType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - std::cout << "+ -> Setting dimensions to " << parsedMeshType[ 1 ] << " ... " << std::endl; - int dimensions = atoi( parsedMeshType[ 1 ].getString() ); - - if( dimensions == 1 ) - return resolveRealType< 1 >( parsedMeshType, parameters ); - if( dimensions == 2 ) - return resolveRealType< 2 >( parsedMeshType, parameters ); - if( dimensions == 3 ) - return resolveRealType< 3 >( parsedMeshType, parameters ); - - return false; -} diff --git a/src/Tools/tnl-lattice-init.cpp b/src/Tools/tnl-lattice-init.cpp deleted file mode 100644 index a4aa1ba0cfdeb05dd97f168d62f0069edd9159a9..0000000000000000000000000000000000000000 --- a/src/Tools/tnl-lattice-init.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/*************************************************************************** - tnl-lattice-init.cpp - description - ------------------- - begin : Jun 13, 2018 - copyright : (C) 2018 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#include "tnl-lattice-init.h" - -#include <TNL/Config/parseCommandLine.h> - - -using namespace TNL; - -void setupConfig( Config::ConfigDescription& config ) -{ - config.addDelimiter ( "General settings:" ); - config.addEntry< String >( "mesh", "Mesh file of the 3D lattice.", "mesh.tnl" ); - config.addEntry< String >( "real-type", "Precision of the function evaluation.", "mesh-real-type" ); - config.addEntryEnum< String >( "mesh-real-type" ); - config.addEntryEnum< String >( "float" ); - config.addEntryEnum< String >( "double" ); -// config.addEntryEnum< String >( "long-double" ); - config.addEntry< String >( "profile-mesh", "Mesh file of the 2D mesh function with geometry profile", "profile-mesh.tnl" ); - config.addEntry< String >( "profile-file", "The profile mesh function file.", "profile.tnl" ); - config.addEntry< String >( "output-file", "Output 3D mesh function file.", "init.tnl" ); - config.addEntry< String >( "input-file", "Input 3D mesh function file to be modified." ); - config.addEntry< String >( "operation", "Operation to be done with the profile.", "extrude" ); - config.addEntryEnum< String >( "extrude" ); - config.addEntry< String >( "profile-orientation", "Axis the profile is orthogonal to.", "z" ); - config.addEntryEnum< String >( "x" ); - config.addEntryEnum< String >( "y" ); - config.addEntryEnum< String >( "z" ); - config.addEntry< double >( "profile-shift-x", "Shift of the profile along x axis", 0.0 ); - config.addEntry< double >( "profile-shift-y", "Shift of the profile along y axis", 0.0 ); - config.addEntry< double >( "profile-shift-z", "Shift of the profile along z axis", 0.0 ); - config.addEntry< double >( "profile-scale-x", "Scaling of the profile along x axis", 1.0 ); - config.addEntry< double >( "profile-scale-y", "Scaling of the profile along y axis", 1.0 ); - config.addEntry< double >( "profile-scale-z", "Scaling of the profile along z axis", 1.0 ); - config.addEntry< double >( "profile-rotation", "Profile rotation around its center.", 0.0 ); - config.addEntry< double >( "extrude-start", "Position where the extrude operation starts.", 0.0 ); - config.addEntry< double >( "extrude-stop", "Position where the extrude operation stops.", 1.0 ); -} - - - -int main( int argc, char* argv[] ) -{ - - Config::ParameterContainer parameters; - Config::ConfigDescription configDescription; - - setupConfig( configDescription ); - - if( ! Config::parseCommandLine( argc, argv, configDescription, parameters ) ) - return EXIT_FAILURE; - - if( ! resolveProfileMeshType( parameters ) ) - return EXIT_FAILURE; - - return EXIT_SUCCESS; -} diff --git a/src/Tools/tnl-lattice-init.h b/src/Tools/tnl-lattice-init.h deleted file mode 100644 index 71a09636c5c5bec19c10e71ce5869bd2a790f9a2..0000000000000000000000000000000000000000 --- a/src/Tools/tnl-lattice-init.h +++ /dev/null @@ -1,391 +0,0 @@ -/*************************************************************************** - tnl-lattice-init.cpp - description - ------------------- - begin : Jun 13, 2018 - copyright : (C) 2018 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#pragma once - -#include <TNL/Object.h> -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Meshes/Grid.h> -#include <TNL/Meshes/GridEntity.h> -#include <TNL/Functions/MeshFunction.h> - -using namespace TNL; - -template< typename MeshFunction, typename ProfileMeshFunction > -bool performExtrude( const Config::ParameterContainer& parameters, - MeshFunction& f, - const ProfileMeshFunction& profile ) -{ - using MeshPointer = Pointers::SharedPointer< typename MeshFunction::MeshType >; - using ProfileMeshPointer = Pointers::SharedPointer< typename ProfileMeshFunction::MeshType >; - using ProfileMeshType = typename ProfileMeshFunction::MeshType; - using MeshType = typename MeshFunction::MeshType; - using RealType = typename MeshFunction::RealType; - using IndexType = typename MeshType::IndexType; - using CellType = typename MeshType::Cell; - using PointType = typename MeshType::PointType; - using ProfilePointType = typename ProfileMeshType::PointType; - using ProfileCellType = typename ProfileMeshType::Cell; - String profileOrientation = parameters.getParameter< String >( "profile-orientation" ); - if( profileOrientation != "x" && - profileOrientation != "y" && - profileOrientation != "z" ) - { - std::cerr << "Wrong profile orientation " << profileOrientation << "." << std::endl; - return false; - } - double profileShiftX = parameters.getParameter< double >( "profile-shift-x" ); - double profileShiftY = parameters.getParameter< double >( "profile-shift-y" ); - double profileShiftZ = parameters.getParameter< double >( "profile-shift-z" ); - double profileScaleX = parameters.getParameter< double >( "profile-scale-x" ); - double profileScaleY = parameters.getParameter< double >( "profile-scale-y" ); - double profileScaleZ = parameters.getParameter< double >( "profile-scale-z" ); - double profileRotation = parameters.getParameter< double >( "profile-rotation" ); - double extrudeStart = parameters.getParameter< double >( "extrude-start" ); - double extrudeStop = parameters.getParameter< double >( "extrude-stop" ); - const MeshType mesh = f.getMesh(); - ProfileMeshType profileMesh = profile.getMesh(); - CellType cell( mesh ); - IndexType& i = cell.getCoordinates().x(); - IndexType& j = cell.getCoordinates().y(); - IndexType& k = cell.getCoordinates().z(); - ProfilePointType profileCenter( profileMesh.getOrigin() + 0.5 * profileMesh.getProportions() ); - const RealType rotationSin = sin( M_PI * profileRotation / 180.0 ); - const RealType rotationCos = cos( M_PI * profileRotation / 180.0 ); - for( i = 0; i < mesh.getDimensions().x(); i++ ) - for( j = 0; j < mesh.getDimensions().y(); j++ ) - for( k = 0; k < mesh.getDimensions().z(); k++ ) - { - cell.refresh(); - PointType p = cell.getCenter(); - p.x() /= profileScaleX; - p.y() /= profileScaleY; - p.z() /= profileScaleZ; - p.x() -= profileShiftX; - p.y() -= profileShiftY; - p.z() -= profileShiftZ; - if( profileOrientation == "x" ) - { - if( p.z() < profileMesh.getOrigin().x() || - p.z() > profileMesh.getOrigin().x() + profileMesh.getProportions().x() || - p.y() < profileMesh.getOrigin().y() || - p.y() > profileMesh.getOrigin().y() + profileMesh.getProportions().y() ) - continue; - if( p.x() < extrudeStart || p.x() > extrudeStop ) - f( cell ) = 0.0; - else - { - ProfileCellType profileCell( profileMesh ); - ProfilePointType aux1( ( p.z() - profileMesh.getOrigin().x() ), - ( p.y() - profileMesh.getOrigin().y() ) ); - aux1 -= profileCenter; - ProfilePointType aux2( rotationCos * aux1.x() - rotationSin * aux1.y(), - rotationSin * aux1.x() + rotationCos * aux1.y() ); - aux1 = profileCenter + aux2; - if( aux1.x() >= 0 && aux1.y() >= 0 && - aux1.x() <= profileMesh.getProportions().x() && - aux1.y() <= profileMesh.getProportions().y() ) - { - profileCell.getCoordinates().x() = aux1.x() / profileMesh.getSpaceSteps().x(); - profileCell.getCoordinates().y() = aux1.y() / profileMesh.getSpaceSteps().y(); - profileCell.refresh(); - RealType aux = profile( profileCell ); - if( aux ) f( cell ) = aux; - } - } - } - if( profileOrientation == "y" ) - { - if( p.x() < profileMesh.getOrigin().x() || - p.x() > profileMesh.getOrigin().x() + profileMesh.getProportions().x() || - p.z() < profileMesh.getOrigin().y() || - p.z() > profileMesh.getOrigin().y() + profileMesh.getProportions().y() ) - continue; - if( p.y() < extrudeStart || p.y() > extrudeStop ) - f( cell ) = 0.0; - else - { - ProfileCellType profileCell( profileMesh ); - ProfilePointType aux1( ( p.x() - profileMesh.getOrigin().x() ), - ( p.z() - profileMesh.getOrigin().y() ) ); - aux1 -= profileCenter; - ProfilePointType aux2( rotationCos * aux1.x() - rotationSin * aux1.y(), - rotationSin * aux1.x() + rotationCos * aux1.y() ); - aux1 = profileCenter + aux2; - if( aux1.x() >= 0 && aux1.y() >= 0 && - aux1.x() <= profileMesh.getProportions().x() && - aux1.y() <= profileMesh.getProportions().y() ) - { - profileCell.getCoordinates().x() = aux1.x() / profileMesh.getSpaceSteps().x(); - profileCell.getCoordinates().y() = aux1.y() / profileMesh.getSpaceSteps().y(); - profileCell.refresh(); - RealType aux = profile( profileCell ); - if( aux ) f( cell ) = aux; - } - } - } - if( profileOrientation == "z" ) - { - if( p.x() < profileMesh.getOrigin().x() || - p.x() > profileMesh.getOrigin().x() + profileMesh.getProportions().x() || - p.y() < profileMesh.getOrigin().y() || - p.y() > profileMesh.getOrigin().y() + profileMesh.getProportions().y() ) - continue; - if( p.z() < extrudeStart || p.z() > extrudeStop ) - f( cell ) = 0.0; - else - { - ProfileCellType profileCell( profileMesh ); - ProfilePointType aux1( ( p.x() - profileMesh.getOrigin().x() ), - ( p.y() - profileMesh.getOrigin().y() ) ); - aux1 -= profileCenter; - ProfilePointType aux2( rotationCos * aux1.x() - rotationSin * aux1.y(), - rotationSin * aux1.x() + rotationCos * aux1.y() ); - aux1 = profileCenter + aux2; - if( aux1.x() >= 0 && aux1.y() >= 0 && - aux1.x() <= profileMesh.getProportions().x() && - aux1.y() <= profileMesh.getProportions().y() ) - { - profileCell.getCoordinates().x() = aux1.x() / profileMesh.getSpaceSteps().x(); - profileCell.getCoordinates().y() = aux1.y() / profileMesh.getSpaceSteps().y(); - profileCell.refresh(); - RealType aux = profile( profileCell ); - if( aux ) f( cell ) = aux; - } - } - } - } - String outputFile = parameters.getParameter< String >( "output-file" ); - f.save( outputFile ); - return true; -} - - -template< typename Real, typename Mesh, typename ProfileMeshFunction > -bool -readProfileMeshFunction( const Config::ParameterContainer& parameters ) -{ - String profileMeshFile = parameters.getParameter< String >( "profile-mesh" ); - using ProfileMeshPointer = Pointers::SharedPointer< typename ProfileMeshFunction::MeshType >; - ProfileMeshPointer profileMesh; - try - { - profileMesh->load( profileMeshFile ); - } - catch(...) - { - std::cerr << "Unable to load the profile mesh file." << profileMeshFile << "." << std::endl; - return false; - } - String profileFile = parameters.getParameter< String >( "profile-file" ); - ProfileMeshFunction profileMeshFunction( profileMesh ); - try - { - profileMeshFunction.load( profileFile ); - } - catch(...) - { - std::cerr << "Unable to load profile mesh function from the file " << profileFile << "." << std::endl; - return false; - } - String meshFile = parameters.getParameter< String >( "mesh" ); - using MeshPointer = Pointers::SharedPointer< Mesh >; - MeshPointer mesh; - try - { - mesh->load( meshFile ); - } - catch(...) - { - std::cerr << "Unable to load 3D mesh from the file " << meshFile << "." << std::endl; - return false; - } - using MeshFunction = Functions::MeshFunction< Mesh, 3, Real >; - MeshFunction meshFunction( mesh ); - if( parameters.checkParameter( "input-file" ) ) - { - const String& inputFile = parameters.getParameter< String >( "input-file" ); - try - { - meshFunction.load( inputFile ); - } - catch(...) - { - std::cerr << "Unable to load " << inputFile << "." << std::endl; - return false; - } - } - else meshFunction.getData().setValue( 0.0 ); - if( parameters.getParameter< String >( "operation" ) == "extrude" ) - performExtrude( parameters, meshFunction, profileMeshFunction ); - return true; -} - -template< typename ProfileMesh, typename Real, typename Mesh > -bool resolveProfileReal( const Config::ParameterContainer& parameters ) -{ - String profileFile = parameters. getParameter< String >( "profile-file" ); - const String meshFunctionType = getObjectType( profileFile ); - //std::cout << meshFunctionType << " detected in " << profileFile << " file." << std::endl; - const std::vector< String > parsedMeshFunctionType = parseObjectType( meshFunctionType ); - if( ! parsedMeshFunctionType.size() ) - { - std::cerr << "Unable to parse the mesh function type " << meshFunctionType << "." << std::endl; - return EXIT_FAILURE; - } - //std::cout << parsedMeshFunctionType << std::endl; - if( parsedMeshFunctionType[ 0 ] != "Functions::MeshFunction" ) - { - std::cerr << "MeshFunction is required in profile file " << profileFile << "." << std::endl; - return false; - } - if( parsedMeshFunctionType[ 1 ] != getType< ProfileMesh >() ) - { - std::cerr << "The mesh function in the profile file must be defined on " << getType< ProfileMesh >() - << " but it is defined on " << parsedMeshFunctionType[ 1 ] << "." << std::endl; - return false; - } - if( parsedMeshFunctionType[ 2 ] != "2" ) - { - std::cerr << "The mesh function must be defined on cells but it is defined on mesh entities with " << parsedMeshFunctionType[ 2 ] << " dimensions." << std::endl; - return false; - } - if( parsedMeshFunctionType[ 3 ] == "float" ) - return readProfileMeshFunction< Real, Mesh, Functions::MeshFunction< ProfileMesh, 2, float > >( parameters ); - if( parsedMeshFunctionType[ 3 ] == "double" ) - return readProfileMeshFunction< Real, Mesh, Functions::MeshFunction< ProfileMesh, 2, double > >( parameters ); - std::cerr << "Unknown real type " << parsedMeshFunctionType[ 3 ] << " of mesh function in the file " << profileFile << "." << std::endl; - return false; -} - -template< typename ProfileMesh, typename Real, typename MeshReal > -bool resolveMeshIndexType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - if( parsedMeshType[ 4 ] == "int" ) - return resolveProfileReal< ProfileMesh, Real, Meshes::Grid< 3, MeshReal, Devices::Host, int > >( parameters ); - - if( parsedMeshType[ 4 ] == "long int" ) - return resolveProfileReal< ProfileMesh, Real, Meshes::Grid< 3, MeshReal, Devices::Host, long int > >( parameters ); - - std::cerr << "Unknown index type " << parsedMeshType[ 4 ] << "." << std::endl; - return false; -} - -template< typename ProfileMesh, typename Real > -bool resolveMesh( const Config::ParameterContainer& parameters ) -{ - String meshFile = parameters.getParameter< String >( "mesh" ); - const String meshType = getObjectType( meshFile ); - std::cout << meshType << " detected in " << meshFile << " file." << std::endl; - const std::vector< String > parsedMeshType = parseObjectType( meshType ); - if( ! parsedMeshType.size() ) - { - std::cerr << "Unable to parse the mesh type " << meshType << "." << std::endl; - return EXIT_FAILURE; - } - - int dimensions = atoi( parsedMeshType[ 1 ].getString() ); - if( dimensions != 3 ) - { - std::cerr << "The main mesh '" << meshFile << "' must be a 3D grid." << std::endl; - return false; - } - - std::cout << "+ -> Setting real type to " << parsedMeshType[ 2 ] << " ... " << std::endl; - - if( parsedMeshType[ 2 ] == "float" ) - return resolveMeshIndexType< ProfileMesh, Real, float >( parsedMeshType, parameters ); - if( parsedMeshType[ 2 ] == "double" ) - return resolveMeshIndexType< ProfileMesh, Real, double >( parsedMeshType, parameters ); -// if( parsedMeshType[ 2 ] == "long double" ) -// return resolveMeshIndexType< ProfileMesh, Real, long double >( parsedMeshType, parameters ); - - return false; -} - -template< typename ProfileMesh > -bool resolveRealType( const Config::ParameterContainer& parameters ) -{ - String realType = parameters.getParameter< String >( "real-type" ); - if( realType == "mesh-real-type" ) - return resolveMesh< ProfileMesh, typename ProfileMesh::RealType >( parameters ); - if( realType == "float" ) - return resolveMesh< ProfileMesh, float >( parameters ); - if( realType == "double" ) - return resolveMesh< ProfileMesh, double >( parameters ); -// if( realType == "long-double" ) -// return resolveMesh< ProfileMesh, long double >( parameters ); - return false; -} - -template< typename RealType, typename IndexType > -bool resolveProfileMesh( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - std::cout << "+ -> Setting mesh type to " << parsedMeshType[ 0 ] << " ... " << std::endl; - if( parsedMeshType[ 0 ] == "Meshes::Grid" ) - { - typedef Meshes::Grid< 2, RealType, Devices::Host, IndexType > MeshType; - return resolveRealType< MeshType >( parameters ); - } - std::cerr << "Unknown mesh type." << std::endl; - return false; -} - -template< typename RealType > -bool resolveProfileMeshIndexType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - std::cout << "+ -> Setting index type to " << parsedMeshType[ 4 ] << " ... " << std::endl; - if( parsedMeshType[ 4 ] == "int" ) - return resolveProfileMesh< RealType, int >( parsedMeshType, parameters ); - - if( parsedMeshType[ 4 ] == "long int" ) - return resolveProfileMesh< RealType, long int >( parsedMeshType, parameters ); - - return false; -} - -bool resolveProfileMeshRealType( const std::vector< String >& parsedMeshType, - const Config::ParameterContainer& parameters ) -{ - std::cout << "+ -> Setting real type to " << parsedMeshType[ 2 ] << " ... " << std::endl; - - if( parsedMeshType[ 2 ] == "float" ) - return resolveProfileMeshIndexType< float >( parsedMeshType, parameters ); - if( parsedMeshType[ 2 ] == "double" ) - return resolveProfileMeshIndexType< double >( parsedMeshType, parameters ); -// if( parsedMeshType[ 2 ] == "long double" ) -// return resolveProfileMeshIndexType< long double >( parsedMeshType, parameters ); - - return false; -} - -bool resolveProfileMeshType( const Config::ParameterContainer& parameters ) -{ - String meshFile = parameters. getParameter< String >( "profile-mesh" ); - const String meshType = getObjectType( meshFile ); - std::cout << meshType << " detected in " << meshFile << " file." << std::endl; - const std::vector< String > parsedMeshType = parseObjectType( meshType ); - if( ! parsedMeshType.size() ) - { - std::cerr << "Unable to parse the mesh type " << meshType << "." << std::endl; - return EXIT_FAILURE; - } - - int dimensions = atoi( parsedMeshType[ 1 ].getString() ); - if( dimensions != 2 ) - { - std::cerr << "The profile mesh '" << meshFile << "' must be 2D grid." << std::endl; - return false; - } - return resolveProfileMeshRealType( parsedMeshType, parameters ); -} diff --git a/src/Tools/tnl-mesh-converter.cpp b/src/Tools/tnl-mesh-converter.cpp index 28ba0de1171db847bcb8e826ae681d7cd53b9d4c..5298ea8f4aa5d0791883aa5ce6befffabd25f855 100644 --- a/src/Tools/tnl-mesh-converter.cpp +++ b/src/Tools/tnl-mesh-converter.cpp @@ -12,7 +12,8 @@ #include <TNL/Meshes/TypeResolver/resolveMeshType.h> #include <TNL/Meshes/Writers/VTKWriter.h> #include <TNL/Meshes/Writers/VTUWriter.h> -#include <TNL/Meshes/Writers/NetgenWriter.h> +//#include <TNL/Meshes/Writers/VTIWriter.h> +//#include <TNL/Meshes/Writers/NetgenWriter.h> using namespace TNL; @@ -107,34 +108,29 @@ struct MeshConfigTemplateTag< MeshConverterConfigTag > template< typename Mesh > bool convertMesh( const Mesh& mesh, const String& inputFileName, const String& outputFileName, const String& outputFormat ) { - if( outputFormat == "tnl" ) - { - try - { - mesh.save( outputFileName ); - } - catch(...) - { - std::cerr << "Failed to save the mesh to file '" << outputFileName << "'." << std::endl; - return false; - } - } - else if( outputFormat == "vtk" ) { - using VTKWriter = Meshes::Writers::VTKWriter< Mesh >; - std::ofstream file( outputFileName.getString() ); - VTKWriter writer( file ); + if( outputFormat == "vtk" ) { + using Writer = Meshes::Writers::VTKWriter< Mesh >; + std::ofstream file( outputFileName ); + Writer writer( file ); writer.template writeEntities< Mesh::getMeshDimension() >( mesh ); } else if( outputFormat == "vtu" ) { - using VTKWriter = Meshes::Writers::VTUWriter< Mesh >; - std::ofstream file( outputFileName.getString() ); - VTKWriter writer( file ); + using Writer = Meshes::Writers::VTUWriter< Mesh >; + std::ofstream file( outputFileName ); + Writer writer( file ); writer.template writeEntities< Mesh::getMeshDimension() >( mesh ); } + // FIXME: VTIWriter is not specialized for meshes +// else if( outputFormat == "vti" ) { +// using Writer = Meshes::Writers::VTIWriter< Mesh >; +// std::ofstream file( outputFileName ); +// Writer writer( file ); +// writer.writeImageData( mesh ); +// } // FIXME: NetgenWriter is not specialized for grids // else if( outputFormat == "netgen" ) { // using NetgenWriter = Meshes::Writers::NetgenWriter< Mesh >; -// std::fstream file( outputFileName.getString() ); +// std::fstream file( outputFileName ); // NetgenWriter::writeMesh( mesh, file ); // } @@ -148,9 +144,9 @@ void configSetup( Config::ConfigDescription& config ) config.addEntry< String >( "input-file-format", "Input mesh file format.", "auto" ); config.addRequiredEntry< String >( "output-file", "Output mesh file path." ); config.addRequiredEntry< String >( "output-file-format", "Output mesh file format." ); - config.addEntryEnum( "tnl" ); config.addEntryEnum( "vtk" ); config.addEntryEnum( "vtu" ); +// config.addEntryEnum( "vti" ); // config.addEntryEnum( "netgen" ); } diff --git a/src/Tools/tnl-test-distributed-mesh.h b/src/Tools/tnl-test-distributed-mesh.h index d8cff89a00ce8194d7f5b66ab53d09f8452b2c45..833a5d8ac8e4168061534db283209ca4e7155956 100644 --- a/src/Tools/tnl-test-distributed-mesh.h +++ b/src/Tools/tnl-test-distributed-mesh.h @@ -28,21 +28,12 @@ namespace TNL { namespace Meshes { namespace BuildConfigTags { -/**** - * Turn off support for float and long double. - */ -template<> struct GridRealTag< MyConfigTag, float > { enum { enabled = false }; }; -template<> struct GridRealTag< MyConfigTag, long double > { enum { enabled = false }; }; - -/**** - * Turn off support for short int and long int indexing. - */ -template<> struct GridIndexTag< MyConfigTag, short int >{ enum { enabled = false }; }; -template<> struct GridIndexTag< MyConfigTag, long int >{ enum { enabled = false }; }; - -/**** - * Unstructured meshes. - */ +// disable all grids +template< int Dimension, typename Real, typename Device, typename Index > +struct GridTag< MyConfigTag, Grid< Dimension, Real, Device, Index > > +{ enum { enabled = false }; }; + +// Meshes are enabled only for topologies explicitly listed below. //template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Edge > { enum { enabled = true }; }; template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Triangle > { enum { enabled = true }; }; //template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Quadrangle > { enum { enabled = true }; }; diff --git a/src/Tools/tnl-view.cpp b/src/Tools/tnl-view.cpp deleted file mode 100644 index 3d9eb4c80b6d1dd29f448ecf01f9992a21f006e4..0000000000000000000000000000000000000000 --- a/src/Tools/tnl-view.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/*************************************************************************** - tnl-view.cpp - description - ------------------- - begin : Jan 21, 2013 - copyright : (C) 2013 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#include "tnl-view.h" -#include <cstdlib> -#include <TNL/File.h> -#include <TNL/Config/parseCommandLine.h> -#include <TNL/Meshes/Grid.h> -#include <TNL/Meshes/TypeResolver/resolveMeshType.h> - -struct TNLViewBuildConfigTag {}; - -namespace TNL { -namespace Meshes { -namespace BuildConfigTags { - -/**** - * Turn off support for float and long double. - */ -//template<> struct GridRealTag< TNLViewBuildConfigTag, float > { enum { enabled = false }; }; -template<> struct GridRealTag< TNLViewBuildConfigTag, long double > { enum { enabled = false }; }; - -/**** - * Turn off support for short int and long int indexing. - */ -template<> struct GridIndexTag< TNLViewBuildConfigTag, short int >{ enum { enabled = false }; }; -template<> struct GridIndexTag< TNLViewBuildConfigTag, long int >{ enum { enabled = false }; }; - -/**** - * Unstructured meshes. - */ -template<> struct MeshCellTopologyTag< TNLViewBuildConfigTag, Topologies::Edge > { enum { enabled = true }; }; -template<> struct MeshCellTopologyTag< TNLViewBuildConfigTag, Topologies::Triangle > { enum { enabled = true }; }; -template<> struct MeshCellTopologyTag< TNLViewBuildConfigTag, Topologies::Tetrahedron > { enum { enabled = true }; }; - -// Meshes are enabled only for the world dimension equal to the cell dimension. -template< typename CellTopology, int WorldDimension > -struct MeshWorldDimensionTag< TNLViewBuildConfigTag, CellTopology, WorldDimension > -{ enum { enabled = ( WorldDimension == CellTopology::dimension ) }; }; - -// Meshes are enabled only for types explicitly listed below. -template<> struct MeshRealTag< TNLViewBuildConfigTag, float > { enum { enabled = false }; }; -template<> struct MeshRealTag< TNLViewBuildConfigTag, double > { enum { enabled = true }; }; -template<> struct MeshGlobalIndexTag< TNLViewBuildConfigTag, int > { enum { enabled = true }; }; -template<> struct MeshGlobalIndexTag< TNLViewBuildConfigTag, long int > { enum { enabled = false }; }; -template<> struct MeshLocalIndexTag< TNLViewBuildConfigTag, short int > { enum { enabled = true }; }; - -} // namespace BuildConfigTags -} // namespace Meshes -} // namespace TNL - -void setupConfig( Config::ConfigDescription& config ) -{ - config.addDelimiter( "General settings:" ); - config.addEntry < String >( "mesh", "Mesh file.", "mesh.tnl" ); - config.addEntry < String >( "mesh-format", "Mesh file format.", "auto" ); - config.addRequiredList < String >( "input-files", "Input files." ); -// config.addList < String >( "output-files", "Output files." ); - config.addEntry < bool > ( "check-output-file", "If the output file already exists, do not recreate it.", false ); - - config.addDelimiter( "Grid settings:"); -// config.addList < double >( "level-lines", "List of level sets which will be drawn." ); -// config.addEntry < int > ( "output-x-size", "X size of the output." ); -// config.addEntry < int > ( "output-y-size", "Y size of the output." ); -// config.addEntry < int > ( "output-z-size", "Z size of the output." ); - config.addEntry < String >( "output-format", "Output file format.", "gnuplot" ); - config.addEntryEnum< String > ( "gnuplot" ); - config.addEntryEnum< String > ( "vtk" ); - config.addEntryEnum< String > ( "vtu" ); - config.addEntry < int > ( "verbose", "Set the verbosity of the program.", 1 ); -} - -int main( int argc, char* argv[] ) -{ - Config::ParameterContainer parameters; - Config::ConfigDescription conf_desc; - setupConfig( conf_desc ); - if( ! parseCommandLine( argc, argv, conf_desc, parameters ) ) - return EXIT_FAILURE; - - const String meshFile = parameters.getParameter< String >( "mesh" ); - const String meshFileFormat = parameters.getParameter< String >( "mesh-format" ); - auto wrapper = [&] ( const auto& reader, auto&& mesh ) - { - using MeshType = std::decay_t< decltype(mesh) >; - return processFiles< MeshType >( parameters ); - }; - return ! TNL::Meshes::resolveMeshType< TNLViewBuildConfigTag, Devices::Host >( wrapper, meshFile, meshFileFormat ); -} diff --git a/src/Tools/tnl-view.h b/src/Tools/tnl-view.h deleted file mode 100644 index 7be2cd4b135e425f243bcbae28408b35c8a8c2a9..0000000000000000000000000000000000000000 --- a/src/Tools/tnl-view.h +++ /dev/null @@ -1,379 +0,0 @@ -/*************************************************************************** - tnl-view.h - description - ------------------- - begin : Jan 21, 2013 - copyright : (C) 2013 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/* See Copyright Notice in tnl/Copyright */ - -#pragma once - -#include <cstdlib> -#include <TNL/FileName.h> -#include <TNL/Config/ParameterContainer.h> -#include <TNL/String.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Meshes/Grid.h> -#include <TNL/Meshes/TypeResolver/resolveMeshType.h> -#include <TNL/Functions/MeshFunction.h> -#include <TNL/Functions/MeshFunctionView.h> -#include <TNL/Functions/VectorField.h> - -using namespace TNL; - -String getOutputFileName( const String& inputFileName, - const String& outputFormat ) -{ - String outputFileName = removeFileNameExtension( inputFileName ); - if( outputFormat == "gnuplot" ) - return outputFileName + ".gplt"; - return outputFileName + "." + outputFormat; -} - - -template< typename MeshFunction > -bool writeMeshFunction( const typename MeshFunction::MeshPointer& meshPointer, - const String& inputFileName, - const Config::ParameterContainer& parameters ) -{ - - MeshFunction function( meshPointer ); - std::cout << "Mesh function: " << getType( function ) << std::endl; - try - { - function.load( inputFileName ); - } - catch(...) - { - std::cerr << "Unable to load mesh function from a file " << inputFileName << "." << std::endl; - return false; - } - - int verbose = parameters.getParameter< int >( "verbose"); - String outputFormat = parameters.getParameter< String >( "output-format" ); - String outputFileName = getOutputFileName( inputFileName, outputFormat ); - if( verbose ) - std::cout << " writing to " << outputFileName << " ... " << std::flush; - - return function.write( outputFileName, outputFormat ); -} - -template< typename VectorField > -bool writeVectorField( const typename VectorField::FunctionType::MeshPointer& meshPointer, - const String& inputFileName, - const Config::ParameterContainer& parameters ) -{ - - VectorField field( meshPointer ); - std::cout << "VectorField: " << getType( field ) << std::endl; - try - { - field.load( inputFileName ); - } - catch(...) - { - std::cerr << "Unable to load vector field from a file " << inputFileName << "." << std::endl; - return false; - } - - int verbose = parameters.getParameter< int >( "verbose"); - String outputFormat = parameters.getParameter< String >( "output-format" ); - String outputFileName = getOutputFileName( inputFileName, outputFormat ); - if( verbose ) - std::cout << " writing to " << outputFileName << " ... " << std::flush; - - return field.write( outputFileName, outputFormat ); -} - - -template< typename MeshPointer, - int EntityDimension, - typename Real, - int VectorFieldSize > -bool setMeshFunctionRealType( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - if( VectorFieldSize == 0 ) - return writeMeshFunction< Functions::MeshFunction< typename MeshPointer::ObjectType, EntityDimension, Real > >( meshPointer, inputFileName, parameters ); - return writeVectorField< Functions::VectorField< VectorFieldSize, Functions::MeshFunction< typename MeshPointer::ObjectType, EntityDimension, Real > > >( meshPointer, inputFileName, parameters ); -} - -template< typename MeshPointer, - int EntityDimension, - int VectorFieldSize, - typename = typename std::enable_if< EntityDimension <= MeshPointer::ObjectType::getMeshDimension() >::type > -bool setMeshEntityType( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - if( parsedObjectType[ 3 ] == "float" ) - return setMeshFunctionRealType< MeshPointer, EntityDimension, float, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( parsedObjectType[ 3 ] == "double" ) - return setMeshFunctionRealType< MeshPointer, EntityDimension, double, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); -// if( parsedObjectType[ 3 ] == "long double" ) -// return setMeshFunctionRealType< MeshPointer, EntityDimension, long double, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( parsedObjectType[ 3 ] == "int" ) - return setMeshFunctionRealType< MeshPointer, EntityDimension, int, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( parsedObjectType[ 3 ] == "long int" ) - return setMeshFunctionRealType< MeshPointer, EntityDimension, long int, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( parsedObjectType[ 3 ] == "bool" ) - return setMeshFunctionRealType< MeshPointer, EntityDimension, bool, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - - std::cerr << "Unsupported arithmetics " << parsedObjectType[ 3 ] << " in mesh function " << inputFileName << std::endl; - return false; -} - -template< typename MeshPointer, - int EntityDimension, - int VectorFieldSize, - typename = typename std::enable_if< ( EntityDimension > MeshPointer::ObjectType::getMeshDimension() ) >::type, - typename = void > -bool setMeshEntityType( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - std::cerr << "Unsupported mesh functions entity dimension: " << EntityDimension << "." << std::endl; - return false; -} - -template< int VectorFieldSize, - typename MeshPointer > -bool setMeshEntityDimension( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - int meshEntityDimension = atoi( parsedObjectType[ 2 ].getString() ); - switch( meshEntityDimension ) - { - case 0: - return setMeshEntityType< MeshPointer, 0, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - break; - case 1: - return setMeshEntityType< MeshPointer, 1, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - break; - case 2: - return setMeshEntityType< MeshPointer, 2, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - break; - case 3: - return setMeshEntityType< MeshPointer, 3, VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); - break; - default: - std::cerr << "Unsupported mesh functions entity dimension: " << meshEntityDimension << "." << std::endl; - return false; - } -} - -template< typename MeshPointer, int VectorFieldSize = 0 > -bool setMeshFunction( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - std::cerr << parsedObjectType[ 1 ] << std::endl; - if( parsedObjectType[ 1 ] != meshPointer->getSerializationType() ) - { - std::cerr << "Incompatible mesh type for the mesh function " << inputFileName << "." << std::endl; - return false; - } - return setMeshEntityDimension< VectorFieldSize >( meshPointer, inputFileName, parsedObjectType, parameters ); -} - -template< typename MeshPointer > -bool setVectorFieldSize( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - int vectorFieldSize = atoi( parsedObjectType[ 1 ].getString() ); - const std::vector< String > parsedMeshFunctionType = parseObjectType( parsedObjectType[ 2 ] ); - if( ! parsedMeshFunctionType.size() ) - { - std::cerr << "Unable to parse mesh function type " << parsedObjectType[ 2 ] << " in a vector field." << std::endl; - return false; - } - switch( vectorFieldSize ) - { - case 1: - return setMeshFunction< MeshPointer, 1 >( meshPointer, inputFileName, parsedMeshFunctionType, parameters ); - case 2: - return setMeshFunction< MeshPointer, 2 >( meshPointer, inputFileName, parsedMeshFunctionType, parameters ); - case 3: - return setMeshFunction< MeshPointer, 3 >( meshPointer, inputFileName, parsedMeshFunctionType, parameters ); - } - std::cerr << "Unsupported vector field size " << vectorFieldSize << "." << std::endl; - return false; -} - -template< typename MeshPointer, typename Value, typename Real, typename Index, int Dimension > -bool convertObject( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - int verbose = parameters.getParameter< int >( "verbose"); - String outputFormat = parameters.getParameter< String >( "output-format" ); - String outputFileName = getOutputFileName( inputFileName, outputFormat ); - if( verbose ) - std::cout << " writing to " << outputFileName << " ... " << std::flush; - - - if( parsedObjectType[ 0 ] == "Containers::Array" || - parsedObjectType[ 0 ] == "Containers::Vector" ) // TODO: remove deprecated names (Vector is saved as Array) - { - using MeshType = typename MeshPointer::ObjectType; - // FIXME: why is MeshType::GlobalIndexType not the same as Index? -// Containers::Vector< Value, Devices::Host, Index > vector; - Containers::Vector< Value, Devices::Host, typename MeshType::GlobalIndexType > vector; - File( inputFileName, std::ios_base::in ) >> vector; - Functions::MeshFunctionView< MeshType, MeshType::getMeshDimension(), Value > mf; - mf.bind( meshPointer, vector ); - mf.write( outputFileName, outputFormat ); - } - return true; -} - -template< typename MeshPointer, typename Value, typename Real, typename Index > -bool setDimension( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - int dimensions( 0 ); - if( parsedObjectType[ 0 ] == "Containers::Array" || - parsedObjectType[ 0 ] == "Containers::Vector" ) // TODO: remove deprecated names (Vector is saved as Array) - dimensions = 1; - switch( dimensions ) - { - case 1: - return convertObject< MeshPointer, Value, Real, Index, 1 >( meshPointer, inputFileName, parsedObjectType, parameters ); - case 2: - return convertObject< MeshPointer, Value, Real, Index, 2 >( meshPointer, inputFileName, parsedObjectType, parameters ); - case 3: - return convertObject< MeshPointer, Value, Real, Index, 3 >( meshPointer, inputFileName, parsedObjectType, parameters ); - } - std::cerr << "Cannot convert objects with " << dimensions << " dimensions." << std::endl; - return false; -} - -template< typename MeshPointer, typename Value, typename Real > -bool setIndexType( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - String indexType; - if( parsedObjectType[ 0 ] == "Containers::Array" || - parsedObjectType[ 0 ] == "Containers::Vector" ) // TODO: remove deprecated names (Vector is saved as Array) - indexType = parsedObjectType[ 3 ]; - - if( indexType == "int" ) - return setDimension< MeshPointer, Value, Real, int >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( indexType == "long-int" ) - return setDimension< MeshPointer, Value, Real, long int >( meshPointer, inputFileName, parsedObjectType, parameters ); - std::cerr << "Unknown index type " << indexType << "." << std::endl; - return false; -} - -template< typename MeshPointer > -bool setValueType( const MeshPointer& meshPointer, - const String& inputFileName, - const std::vector< String >& parsedObjectType, - const Config::ParameterContainer& parameters ) -{ - String elementType; - - if( parsedObjectType[ 0 ] == "Containers::Array" || - parsedObjectType[ 0 ] == "Containers::Vector" ) // TODO: remove deprecated names (Vector is saved as Array) - elementType = parsedObjectType[ 1 ]; - - if( elementType == "float" ) - return setIndexType< MeshPointer, float, float >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( elementType == "double" ) - return setIndexType< MeshPointer, double, double >( meshPointer, inputFileName, parsedObjectType, parameters ); -// if( elementType == "long double" ) -// return setIndexType< MeshPointer, long double, long double >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( elementType == "int" ) - return setIndexType< MeshPointer, int, int >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( elementType == "long int" ) - return setIndexType< MeshPointer, long int, long int >( meshPointer, inputFileName, parsedObjectType, parameters ); - if( elementType == "bool" ) - return setIndexType< MeshPointer, bool, bool >( meshPointer, inputFileName, parsedObjectType, parameters ); - - std::cerr << "Unknown element type " << elementType << "." << std::endl; - return false; -} - -template< typename Mesh > -bool processFiles( const Config::ParameterContainer& parameters ) -{ - int verbose = parameters.getParameter< int >( "verbose"); - const String meshFile = parameters.getParameter< String >( "mesh" ); - const String meshFileFormat = parameters.getParameter< String >( "mesh-format" ); - - typedef Pointers::SharedPointer< Mesh > MeshPointer; - MeshPointer meshPointer; - if( ! Meshes::loadMesh( *meshPointer, meshFile, meshFileFormat ) ) - return false; - - bool checkOutputFile = parameters.getParameter< bool >( "check-output-file" ); - std::vector< String > inputFiles = parameters.getParameter< std::vector< String > >( "input-files" ); - bool error( false ); -//#ifdef HAVE_OPENMP -//#pragma omp parallel for -//#endif - for( int i = 0; i < (int) inputFiles.size(); i++ ) - { - if( verbose ) - std::cout << "Processing file " << inputFiles[ i ] << " ... " << std::flush; - - String outputFormat = parameters.getParameter< String >( "output-format" ); - String outputFileName = getOutputFileName( inputFiles[ i ], outputFormat ); - if( checkOutputFile && fileExists( outputFileName ) ) - { - if( verbose ) - std::cout << " file already exists. Skipping. \r" << std::flush; - continue; - } - - String objectType; - try - { - objectType = getObjectType( inputFiles[ i ] ); - } - catch(...) - { - std::cerr << "unknown object ... SKIPPING!" << std::endl; - continue; - } - - if( verbose ) - std::cout << objectType << " detected ... "; - - const std::vector< String > parsedObjectType = parseObjectType( objectType ); - if( ! parsedObjectType.size() ) - { - std::cerr << "Unable to parse object type " << objectType << "." << std::endl; - error = true; - continue; - } - if( parsedObjectType[ 0 ] == "Containers::Array" || - parsedObjectType[ 0 ] == "Containers::Vector" ) // TODO: remove deprecated names (Vector is saved as Array) - setValueType< MeshPointer >( meshPointer, inputFiles[ i ], parsedObjectType, parameters ); - if( parsedObjectType[ 0 ] == "Functions::MeshFunction" ) - setMeshFunction< MeshPointer >( meshPointer, inputFiles[ i ], parsedObjectType, parameters ); - if( parsedObjectType[ 0 ] == "Functions::VectorField" ) - setVectorFieldSize< MeshPointer >( meshPointer, inputFiles[ i ], parsedObjectType, parameters ); - if( verbose ) - std::cout << "[ OK ]. " << std::endl; - } - if( verbose ) - std::cout << std::endl; - return ! error; -} diff --git a/src/UnitTests/Functions/CMakeLists.txt b/src/UnitTests/Functions/CMakeLists.txt index c04cd70914c3cc7b07305d02f7a82c7d5ec42d2d..36f46f70e82b9f84f411f1f92b13eb18a3ce0361 100644 --- a/src/UnitTests/Functions/CMakeLists.txt +++ b/src/UnitTests/Functions/CMakeLists.txt @@ -6,10 +6,22 @@ else() set( CPP_TESTS ${CPP_TESTS} BoundaryMeshFunctionTest MeshFunctionTest ) endif() +# special tests needing external libraries +find_package( ZLIB ) +find_package( tinyxml2 QUIET ) + foreach( target IN ITEMS ${CPP_TESTS} ) add_executable( ${target} ${target}.cpp ) target_compile_options( ${target} PRIVATE ${CXX_TESTS_FLAGS} ) target_link_libraries( ${target} ${GTEST_BOTH_LIBRARIES} ) + + target_compile_definitions(${target} PUBLIC "-DHAVE_ZLIB") + target_include_directories(${target} PUBLIC ${ZLIB_INCLUDE_DIRS}) + target_link_libraries(${target} ${ZLIB_LIBRARIES}) + + target_compile_definitions(${target} PUBLIC "-DHAVE_TINYXML2") + target_link_libraries(${target} tinyxml2::tinyxml2) + add_test( ${target} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${target}${CMAKE_EXECUTABLE_SUFFIX} ) endforeach() diff --git a/src/UnitTests/Functions/SaveAndLoadMeshfunctionTest.cpp b/src/UnitTests/Functions/SaveAndLoadMeshfunctionTest.cpp index f7ea9190729b312cb09a0f89b1a8105802198cde..76da1c43b1d322a0af2fe2297a41eaa466b0d145 100644 --- a/src/UnitTests/Functions/SaveAndLoadMeshfunctionTest.cpp +++ b/src/UnitTests/Functions/SaveAndLoadMeshfunctionTest.cpp @@ -20,7 +20,7 @@ using namespace TNL::Meshes; using namespace TNL::Functions; using namespace TNL::Devices; -static const char* TEST_FILE_NAME = "test_SaveAndLoadMeshFunctionTest.tnl"; +static const char* TEST_FILE_NAME = "test_SaveAndLoadMeshFunctionTest.vti"; //=====================================TEST CLASS============================================== @@ -30,25 +30,20 @@ class TestSaveAndLoadMeshfunction public: static void Test() { - typedef Grid<dim,double,Host,int> MeshType; typedef MeshFunctionView<MeshType> MeshFunctionType; typedef Vector<double,Host,int> DofType; typedef typename MeshType::Cell Cell; - typedef typename MeshType::IndexType IndexType; typedef typename MeshType::PointType PointType; - typedef typename MeshType::CoordinatesType CoordinatesType; typedef LinearFunction<double,dim> LinearFunctionType; Pointers::SharedPointer< LinearFunctionType, Host > linearFunctionPtr; MeshFunctionEvaluator< MeshFunctionType, LinearFunctionType > linearFunctionEvaluator; - PointType localOrigin; - localOrigin.setValue(-0.5); - PointType localProportions; - localProportions.setValue(10); + PointType localOrigin = -0.5; + PointType localProportions = 10; Pointers::SharedPointer<MeshType> localGridptr; localGridptr->setDimensions(localProportions); @@ -60,10 +55,7 @@ class TestSaveAndLoadMeshfunction localMeshFunctionptr->bind(localGridptr,localDof); linearFunctionEvaluator.evaluateAllEntities(localMeshFunctionptr, linearFunctionPtr); - File file; - ASSERT_NO_THROW( file.open( TEST_FILE_NAME, std::ios_base::out ) ); - ASSERT_NO_THROW( localMeshFunctionptr->save(file) ); - ASSERT_NO_THROW( file.close() ); + ASSERT_TRUE( localMeshFunctionptr->write( "funcName", TEST_FILE_NAME ) ); //load other meshfunction on same localgrid from created file Pointers::SharedPointer<MeshType> loadGridptr; @@ -71,17 +63,11 @@ class TestSaveAndLoadMeshfunction loadGridptr->setDomain(localOrigin,localProportions); DofType loadDof(loadGridptr->template getEntitiesCount< Cell >()); + loadDof.setValue(-1); Pointers::SharedPointer<MeshFunctionType> loadMeshFunctionptr; loadMeshFunctionptr->bind(loadGridptr,loadDof); - for(int i=0;i<loadDof.getSize();i++) - { - loadDof[i]=-1; - } - - ASSERT_NO_THROW( file.open( TEST_FILE_NAME, std::ios_base::in ) ); - ASSERT_NO_THROW( loadMeshFunctionptr->boundLoad(file) ); - ASSERT_NO_THROW( file.close() ); + ASSERT_TRUE( Functions::readMeshFunction( *loadMeshFunctionptr, "funcName", TEST_FILE_NAME ) ); for(int i=0;i<localDof.getSize();i++) { diff --git a/src/UnitTests/Meshes/CMakeLists.txt b/src/UnitTests/Meshes/CMakeLists.txt index 90763f547d953ebded72f9599e7b617b5106da2c..b9af39b545de6b6333fbc3fac643449c7b02f7fb 100644 --- a/src/UnitTests/Meshes/CMakeLists.txt +++ b/src/UnitTests/Meshes/CMakeLists.txt @@ -35,3 +35,28 @@ ADD_TEST( EntityTagsTest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/EntityTagsTest${CMAKE ADD_TEST( MeshTest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/MeshTest${CMAKE_EXECUTABLE_SUFFIX} ) ADD_TEST( MeshTraverserTest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/MeshTraverserTest${CMAKE_EXECUTABLE_SUFFIX} ) ADD_TEST( MeshOrderingTest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/MeshOrderingTest${CMAKE_EXECUTABLE_SUFFIX} ) + + +# special tests needing external libraries +find_package( ZLIB ) +find_package( tinyxml2 QUIET ) + +if( ZLIB_FOUND AND tinyxml2_FOUND ) + foreach( target IN ITEMS NetgenReaderTest VTKReaderTest VTUReaderTest VTIReaderTest ) + add_executable(${target} ${target}.cpp) + target_compile_options(${target} PRIVATE ${CXX_TESTS_FLAGS} ) + target_link_libraries(${target} ${GTEST_BOTH_LIBRARIES}) + + target_compile_definitions(${target} PUBLIC "-DHAVE_ZLIB") + target_include_directories(${target} PUBLIC ${ZLIB_INCLUDE_DIRS}) + target_link_libraries(${target} ${ZLIB_LIBRARIES}) + + target_compile_definitions(${target} PUBLIC "-DHAVE_TINYXML2") + target_link_libraries(${target} tinyxml2::tinyxml2) + + # configure path to the data directory + target_compile_definitions(${target} PUBLIC "-DTNL_MESH_TESTS_DATA_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/data\"") + + add_test(${target} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${target}${CMAKE_EXECUTABLE_SUFFIX}) + endforeach() +endif() diff --git a/src/UnitTests/Meshes/DistributedMeshes/CMakeLists.txt b/src/UnitTests/Meshes/DistributedMeshes/CMakeLists.txt index 87de162ffeddfc8d5a472401fbfba052bbe0999c..a48177c586254e0c3c91e7a76df9659b5d6a5491 100644 --- a/src/UnitTests/Meshes/DistributedMeshes/CMakeLists.txt +++ b/src/UnitTests/Meshes/DistributedMeshes/CMakeLists.txt @@ -6,23 +6,20 @@ ADD_EXECUTABLE( CopyEntitesTest CopyEntitiesTest.cpp ) TARGET_COMPILE_OPTIONS( CopyEntitesTest PRIVATE ${CXX_TESTS_FLAGS} ) TARGET_LINK_LIBRARIES( CopyEntitesTest ${GTEST_BOTH_LIBRARIES} ) -ADD_EXECUTABLE( CutMeshFunctionTest CutMeshFunctionTest.cpp ) - TARGET_COMPILE_OPTIONS( CutMeshFunctionTest PRIVATE ${CXX_TESTS_FLAGS} ) - TARGET_LINK_LIBRARIES( CutMeshFunctionTest ${GTEST_BOTH_LIBRARIES} ) +# FIXME: DistributedGrid refucktoring +#ADD_EXECUTABLE( CutMeshFunctionTest CutMeshFunctionTest.cpp ) +# TARGET_COMPILE_OPTIONS( CutMeshFunctionTest PRIVATE ${CXX_TESTS_FLAGS} ) +# TARGET_LINK_LIBRARIES( CutMeshFunctionTest ${GTEST_BOTH_LIBRARIES} ) ADD_TEST( NAME DirectionsTest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DirectionsTest${CMAKE_EXECUTABLE_SUFFIX} ) ADD_TEST( NAME CopyEntitesTest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CopyEntitesTest${CMAKE_EXECUTABLE_SUFFIX} ) -ADD_TEST( NAME CutMeshFunctionTest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CutMeshFunctionTest${CMAKE_EXECUTABLE_SUFFIX} ) +#ADD_TEST( NAME CutMeshFunctionTest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CutMeshFunctionTest${CMAKE_EXECUTABLE_SUFFIX} ) if( BUILD_MPI ) ADD_EXECUTABLE( DistributedGridTest_1D DistributedGridTest_1D.cpp ) TARGET_COMPILE_OPTIONS( DistributedGridTest_1D PRIVATE ${CXX_TESTS_FLAGS} ) TARGET_LINK_LIBRARIES( DistributedGridTest_1D ${GTEST_BOTH_LIBRARIES} ) -ADD_EXECUTABLE( DistributedVectorFieldIO_MPIIOTest DistributedVectorFieldIO_MPIIOTest.cpp ) - TARGET_COMPILE_OPTIONS( DistributedVectorFieldIO_MPIIOTest PRIVATE ${CXX_TESTS_FLAGS} ) - TARGET_LINK_LIBRARIES( DistributedVectorFieldIO_MPIIOTest ${GTEST_BOTH_LIBRARIES} ) - ADD_EXECUTABLE( DistributedGridTest_2D DistributedGridTest_2D.cpp ) TARGET_COMPILE_OPTIONS( DistributedGridTest_2D PRIVATE ${CXX_TESTS_FLAGS} ) TARGET_LINK_LIBRARIES( DistributedGridTest_2D ${GTEST_BOTH_LIBRARIES} ) @@ -35,26 +32,9 @@ ADD_EXECUTABLE( CutDistributedGridTest CutDistributedGridTest.cpp ) TARGET_COMPILE_OPTIONS( CutDistributedGridTest PRIVATE ${CXX_TESTS_FLAGS} ) TARGET_LINK_LIBRARIES( CutDistributedGridTest ${GTEST_BOTH_LIBRARIES} ) -ADD_EXECUTABLE( CutDistributedMeshFunctionTest CutDistributedMeshFunctionTest.cpp ) - TARGET_COMPILE_OPTIONS( CutDistributedMeshFunctionTest PRIVATE ${CXX_TESTS_FLAGS} ) - TARGET_LINK_LIBRARIES( CutDistributedMeshFunctionTest ${GTEST_BOTH_LIBRARIES} ) - -IF( BUILD_CUDA ) - CUDA_ADD_EXECUTABLE( DistributedGridIOTest DistributedGridIOTest.cu OPTIONS ${CXX_TESTS_FLAGS}) - TARGET_LINK_LIBRARIES( DistributedGridIOTest ${GTEST_BOTH_LIBRARIES} ) - - CUDA_ADD_EXECUTABLE( DistributedGridIO_MPIIOTest DistributedGridIO_MPIIOTest.cu OPTIONS ${CXX_TESTS_FLAGS}) - TARGET_LINK_LIBRARIES( DistributedGridIO_MPIIOTest ${GTEST_BOTH_LIBRARIES} ) -ELSE( BUILD_CUDA ) - - ADD_EXECUTABLE( DistributedGridIO_MPIIOTest DistributedGridIO_MPIIOTest.cpp ) - TARGET_COMPILE_OPTIONS( DistributedGridIO_MPIIOTest PRIVATE ${CXX_TESTS_FLAGS} ) - TARGET_LINK_LIBRARIES( DistributedGridIO_MPIIOTest ${GTEST_BOTH_LIBRARIES} ) - - ADD_EXECUTABLE( DistributedGridIOTest DistributedGridIOTest.cpp ) - TARGET_COMPILE_OPTIONS( DistributedGridIOTest PRIVATE ${CXX_TESTS_FLAGS} ) - TARGET_LINK_LIBRARIES( DistributedGridIOTest ${GTEST_BOTH_LIBRARIES} ) -ENDIF( BUILD_CUDA ) +#ADD_EXECUTABLE( CutDistributedMeshFunctionTest CutDistributedMeshFunctionTest.cpp ) +# TARGET_COMPILE_OPTIONS( CutDistributedMeshFunctionTest PRIVATE ${CXX_TESTS_FLAGS} ) +# TARGET_LINK_LIBRARIES( CutDistributedMeshFunctionTest ${GTEST_BOTH_LIBRARIES} ) if( BUILD_CUDA ) cuda_add_executable( DistributedMeshTest DistributedMeshTest.cu OPTIONS ${CXX_TESTS_FLAGS}) @@ -65,40 +45,38 @@ else() target_link_libraries( DistributedMeshTest ${GTEST_BOTH_LIBRARIES} ) endif() + +# external libraries for tests which use mesh readers +find_package( ZLIB ) find_package( tinyxml2 QUIET ) -if( tinyxml2_FOUND ) - target_compile_definitions(DistributedMeshTest PUBLIC "-DHAVE_TINYXML2") - target_link_libraries(DistributedMeshTest tinyxml2::tinyxml2) + +if( ZLIB_FOUND AND tinyxml2_FOUND ) + foreach( target IN ITEMS DistributedGridTest_1D DistributedGridTest_2D DistributedGridTest_3D DistributedMeshTest ) + target_compile_definitions(${target} PUBLIC "-DHAVE_ZLIB") + target_include_directories(${target} PUBLIC ${ZLIB_INCLUDE_DIRS}) + target_link_libraries(${target} ${ZLIB_LIBRARIES}) + + target_compile_definitions(${target} PUBLIC "-DHAVE_TINYXML2") + target_link_libraries(${target} tinyxml2::tinyxml2) + endforeach() endif() SET (mpi_test_parameters_1d -np 4 -H localhost:4 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedGridTest_1D${CMAKE_EXECUTABLE_SUFFIX}") ADD_TEST( NAME DistributedGridTest_1D COMMAND "mpirun" ${mpi_test_parameters_1d}) -# TODO: Fix this test -#SET (mpi_test_parameters_2d -np 9 -H localhost:9 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedGridTest_2D${CMAKE_EXECUTABLE_SUFFIX}") -#ADD_TEST( NAME DistributedGridTest_2D COMMAND "mpirun" ${mpi_test_parameters_2d}) +SET (mpi_test_parameters_2d -np 9 -H localhost:9 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedGridTest_2D${CMAKE_EXECUTABLE_SUFFIX}") +ADD_TEST( NAME DistributedGridTest_2D COMMAND "mpirun" ${mpi_test_parameters_2d}) SET (mpi_test_parameters_3d -np 27 -H localhost:27 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedGridTest_3D${CMAKE_EXECUTABLE_SUFFIX}") ADD_TEST( NAME DistributedGridTest_3D COMMAND "mpirun" ${mpi_test_parameters_3d}) -# TODO: Fix -#SET (mpi_test_parameters_IO -np 4 -H localhost:4 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedGridIOTest${CMAKE_EXECUTABLE_SUFFIX}") -#ADD_TEST( NAME DistributedGridIOTest COMMAND "mpirun" ${mpi_test_parameters_IO}) - -# TODO: Fix -#SET (mpi_test_parameters_IOMPIIO -np 4 -H localhost:4 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedGridIO_MPIIOTest${CMAKE_EXECUTABLE_SUFFIX}") -#ADD_TEST( NAME DistributedGridIO_MPIIOTest COMMAND "mpirun" ${mpi_test_parameters_IOMPIIO}) - SET (mpi_test_parameters_CutDistributedGridTest -np 12 -H localhost:12 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CutDistributedGridTest${CMAKE_EXECUTABLE_SUFFIX}") -#ADD_TEST( NAME CutDistributedGridTest COMMAND "mpirun" ${mpi_test_parameters_CutDistributedGridTest}) - -SET (mpi_test_parameters_CutDistributedMeshFunctionTest -np 12 -H localhost:12 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CutDistributedMeshFunctionTest${CMAKE_EXECUTABLE_SUFFIX}") -#ADD_TEST( NAME CutDistributedMeshFunctionTest COMMAND "mpirun" ${mpi_test_parameters_CutDistributedMeshFunctionTest}) +ADD_TEST( NAME CutDistributedGridTest COMMAND "mpirun" ${mpi_test_parameters_CutDistributedGridTest}) # TODO: Fix -#SET (mpi_test_parameters_DistributedVectorFieldIO_MPIIOTest -np 4 -H localhost:4 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedVectorFieldIO_MPIIOTest ${CMAKE_EXECUTABLE_SUFFIX}") -#ADD_TEST( NAME DistributedVectorFieldIO_MPIIOTest COMMAND "mpirun" ${mpi_test_parameters_IOMPIIO}) +#SET (mpi_test_parameters_CutDistributedMeshFunctionTest -np 12 -H localhost:12 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CutDistributedMeshFunctionTest${CMAKE_EXECUTABLE_SUFFIX}") +#ADD_TEST( NAME CutDistributedMeshFunctionTest COMMAND "mpirun" ${mpi_test_parameters_CutDistributedMeshFunctionTest}) add_test( NAME DistributedMeshTest_2x2 COMMAND mpirun -np 4 -H localhost:4 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedMeshTest${CMAKE_EXECUTABLE_SUFFIX} ) add_test( NAME DistributedMeshTest_3x3 COMMAND mpirun -np 9 -H localhost:9 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DistributedMeshTest${CMAKE_EXECUTABLE_SUFFIX} ) diff --git a/src/UnitTests/Meshes/DistributedMeshes/CutDistributedGridTest.cpp b/src/UnitTests/Meshes/DistributedMeshes/CutDistributedGridTest.cpp index dccd68f23b4b8cf678d6a1f156e8f359bd15762b..a0f79550ea3a0461a5259091f4b8439eea50399d 100644 --- a/src/UnitTests/Meshes/DistributedMeshes/CutDistributedGridTest.cpp +++ b/src/UnitTests/Meshes/DistributedMeshes/CutDistributedGridTest.cpp @@ -14,7 +14,10 @@ using namespace TNL::Devices; template< typename MeshType > -void SetUpDistributedGrid(DistributedMesh<MeshType> &distributedGrid, MeshType &globalGrid,int size,typename MeshType::CoordinatesType distribution ) +void SetUpDistributedGrid( DistributedMesh<MeshType> &distributedGrid, + MeshType &globalGrid, + int size, + typename MeshType::CoordinatesType distribution ) { typename MeshType::PointType globalOrigin; typename MeshType::PointType globalProportions; @@ -24,7 +27,7 @@ void SetUpDistributedGrid(DistributedMesh<MeshType> &distributedGrid, MeshType & globalProportions.setValue( size ); globalGrid.setDimensions( size ); - globalGrid.setDomain( globalOrigin,globalProportions ); + globalGrid.setDomain( globalOrigin, globalProportions ); distributedGrid.setDomainDecomposition( distribution ); distributedGrid.setGlobalGrid(globalGrid); @@ -35,7 +38,7 @@ void SetUpDistributedGrid(DistributedMesh<MeshType> &distributedGrid, MeshType & //===============================================2D================================================================ -TEST(CutDistributedGirdTest_2D, IsInCut) +TEST(CutDistributedGridTest_2D, IsInCut) { typedef Grid<2,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -65,7 +68,7 @@ TEST(CutDistributedGirdTest_2D, IsInCut) } } -TEST(CutDistributedGirdTest_2D, GloblaGridDimesion) +TEST(CutDistributedGridTest_2D, GloblaGridDimesion) { typedef Grid<2,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -90,7 +93,7 @@ TEST(CutDistributedGirdTest_2D, GloblaGridDimesion) } } -TEST(CutDistributedGirdTest_2D, IsDistributed) +TEST(CutDistributedGridTest_2D, IsDistributed) { typedef Grid<2,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -114,7 +117,7 @@ TEST(CutDistributedGirdTest_2D, IsDistributed) } } -TEST(CutDistributedGirdTest_2D, IsNotDistributed) +TEST(CutDistributedGridTest_2D, IsNotDistributed) { typedef Grid<2,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -140,7 +143,7 @@ TEST(CutDistributedGirdTest_2D, IsNotDistributed) //===============================================3D - 1D cut================================================================ -TEST(CutDistributedGirdTest_3D, IsInCut_1D) +TEST(CutDistributedGridTest_3D, IsInCut_1D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -170,7 +173,7 @@ TEST(CutDistributedGirdTest_3D, IsInCut_1D) } } -TEST(CutDistributedGirdTest_3D, GloblaGridDimesion_1D) +TEST(CutDistributedGridTest_3D, GloblaGridDimesion_1D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -195,7 +198,7 @@ TEST(CutDistributedGirdTest_3D, GloblaGridDimesion_1D) } } -TEST(CutDistributedGirdTest_3D, IsDistributed_1D) +TEST(CutDistributedGridTest_3D, IsDistributed_1D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -219,7 +222,7 @@ TEST(CutDistributedGirdTest_3D, IsDistributed_1D) } } -TEST(CutDistributedGirdTest_3D, IsNotDistributed_1D) +TEST(CutDistributedGridTest_3D, IsNotDistributed_1D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -245,7 +248,7 @@ TEST(CutDistributedGirdTest_3D, IsNotDistributed_1D) //===================================3D-2D cut========================================================================= -TEST(CutDistributedGirdTest_3D, IsInCut_2D) +TEST(CutDistributedGridTest_3D, IsInCut_2D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -276,7 +279,7 @@ TEST(CutDistributedGirdTest_3D, IsInCut_2D) } } -TEST(CutDistributedGirdTest_3D, GloblaGridDimesion_2D) +TEST(CutDistributedGridTest_3D, GloblaGridDimesion_2D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -302,7 +305,7 @@ TEST(CutDistributedGirdTest_3D, GloblaGridDimesion_2D) } } -TEST(CutDistributedGirdTest_3D, IsDistributed_2D) +TEST(CutDistributedGridTest_3D, IsDistributed_2D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; @@ -326,7 +329,7 @@ TEST(CutDistributedGirdTest_3D, IsDistributed_2D) } } -TEST(CutDistributedGirdTest_3D, IsNotDistributed_2D) +TEST(CutDistributedGridTest_3D, IsNotDistributed_2D) { typedef Grid<3,double,Host,int> MeshType; typedef typename MeshType::CoordinatesType CoordinatesType; diff --git a/src/UnitTests/Meshes/DistributedMeshes/CutDistributedMeshFunctionTest.cpp b/src/UnitTests/Meshes/DistributedMeshes/CutDistributedMeshFunctionTest.cpp index 9ad46b41221a4cb230ab67fdda50b3ef2636199d..205b53482e7347b5b07a536dd1124ce2c5b7d927 100644 --- a/src/UnitTests/Meshes/DistributedMeshes/CutDistributedMeshFunctionTest.cpp +++ b/src/UnitTests/Meshes/DistributedMeshes/CutDistributedMeshFunctionTest.cpp @@ -7,7 +7,6 @@ #include <TNL/Functions/CutMeshFunction.h> #include <TNL/Functions/MeshFunctionView.h> #include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO.h> #include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> #include "../../Functions/Functions.h" @@ -53,9 +52,10 @@ TEST(CutDistributedMeshFunction, 2D_Data) SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); - + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) Pointers::SharedPointer<MeshType> originalGrid; - distributedGrid.setupGrid(*originalGrid); + *originalGrid = globalOriginalGrid->getLocalMesh(); DofType dof(originalGrid->template getEntitiesCount< Cell >()); dof.setValue(0); @@ -135,8 +135,10 @@ TEST(CutDistributedMeshFunction, 3D_1_Data) SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) Pointers::SharedPointer<MeshType> originalGrid; - distributedGrid.setupGrid(*originalGrid); + *originalGrid = globalOriginalGrid->getLocalMesh(); DofType dof(originalGrid->template getEntitiesCount< Cell >()); dof.setValue(0); @@ -216,8 +218,10 @@ TEST(CutDistributedMeshFunction, 3D_2_Data) SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) Pointers::SharedPointer<MeshType> originalGrid; - distributedGrid.setupGrid(*originalGrid); + *originalGrid = globalOriginalGrid->getLocalMesh(); DofType dof(originalGrid->template getEntitiesCount< Cell >()); dof.setValue(0); @@ -303,8 +307,10 @@ TEST(CutDistributedMeshFunction, 2D_Synchronization) SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) Pointers::SharedPointer<MeshType> originalGrid; - distributedGrid.setupGrid(*originalGrid); + *originalGrid = globalOriginalGrid->getLocalMesh(); DofType dof(originalGrid->template getEntitiesCount< Cell >()); dof.setValue(0); @@ -388,8 +394,10 @@ TEST(CutDistributedMeshFunction, 3D_1_Synchronization) SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) Pointers::SharedPointer<MeshType> originalGrid; - distributedGrid.setupGrid(*originalGrid); + *originalGrid = globalOriginalGrid->getLocalMesh(); DofType dof(originalGrid->template getEntitiesCount< Cell >()); dof.setValue(0); @@ -477,8 +485,10 @@ TEST(CutDistributedMeshFunction, 3D_2_Synchronization) SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) Pointers::SharedPointer<MeshType> originalGrid; - distributedGrid.setupGrid(*originalGrid); + *originalGrid = globalOriginalGrid->getLocalMesh(); DofType dof(originalGrid->template getEntitiesCount< Cell >()); dof.setValue(0); @@ -513,8 +523,8 @@ TEST(CutDistributedMeshFunction, 3D_2_Synchronization) typename MeshType::Cell fromEntity(meshFunctionptr->getMesh()); typename CutMeshType::Cell outEntity(*cutGrid); - for(int i=0;i<distributedGrid.getLocalGridSize().x();i++) - for(int j=0;j<distributedGrid.getLocalGridSize().z();j++) + for(int i=0;i<distributedGrid.getLocalMeshSize().x();i++) + for(int j=0;j<distributedGrid.getLocalMeshSize().z();j++) { fromEntity.getCoordinates().x()=i; fromEntity.getCoordinates().z()=j; @@ -564,8 +574,10 @@ TEST(CutDistributedMeshFunction, 3D_2_Save) SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) Pointers::SharedPointer<MeshType> originalGrid; - distributedGrid.setupGrid(*originalGrid); + *originalGrid = globalOriginalGrid->getLocalMesh(); DofType dof(originalGrid->template getEntitiesCount< Cell >()); dof.setValue(0); @@ -593,16 +605,18 @@ TEST(CutDistributedMeshFunction, 3D_2_Save) MeshFunctionView<CutMeshType> cutMeshFunction; cutMeshFunction.bind(cutGrid,cutDof); - DistributedGridIO<MeshFunctionView<CutMeshType>,MpiIO> ::save(TEST_FILE_NAME, cutMeshFunction ); + // FIXME: DistributedGridIO was removed +// DistributedGridIO<MeshFunctionView<CutMeshType>,MpiIO> ::save(TEST_FILE_NAME, cutMeshFunction ); //save globalgrid for debug render MPI_Comm group=cutDistributedGrid.getCommunicationGroup(); if(TNL::MPI::GetRank(group)==0) { - File meshFile; - meshFile.open( TEST_FILE_NAME+String("-mesh.tnl"),std::ios_base::out); - cutDistributedGrid.getGlobalGrid().save( meshFile ); - meshFile.close(); + // FIXME: save was removed from Grid (but this is just for debugging...) +// File meshFile; +// meshFile.open( TEST_FILE_NAME+String("-mesh.tnl"),std::ios_base::out); +// cutDistributedGrid.getGlobalGrid().save( meshFile ); +// meshFile.close(); } } diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.cpp b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.cpp deleted file mode 100644 index 2b110b5f716ec5bfb6dc5ee93818d9e343fadf7c..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "DistributedGridIOTestBase.h" - diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.cu b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.cu deleted file mode 100644 index 2b110b5f716ec5bfb6dc5ee93818d9e343fadf7c..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.cu +++ /dev/null @@ -1,2 +0,0 @@ -#include "DistributedGridIOTestBase.h" - diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.h b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.h deleted file mode 100644 index 11a85b68ded774ea4cbd8edc7ba49a5a18a64b88..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTest.h +++ /dev/null @@ -1,376 +0,0 @@ -/*************************************************************************** - DistributedGridIO.h - description - ------------------- - begin : Nov 1, 2017 - copyright : (C) 2017 by Tomas Oberhuber et al. - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> -#include <TNL/Functions/MeshFunctionView.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO.h> -#include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> - -#include "../../Functions/Functions.h" - -using namespace TNL::Containers; -using namespace TNL::Meshes; -using namespace TNL::Functions; -using namespace TNL::Meshes::DistributedMeshes; - - -//================Parameters=================================== -template <int dim, typename Device> -class ParameterProvider -{ - public: - - typedef Grid<dim,double,Device,int> MeshType; - typedef typename MeshType::CoordinatesType CoordinatesType; - typedef typename MeshType::PointType PointType; - - PointType getOrigin(int rank) - { - }; - - PointType getProportions(int rank) - { - }; - - int* getDistr(void) - { - return NULL; - }; -}; - -template<typename Device> -class ParameterProvider<1,Device> -{ - public: - - typedef Grid<1,double,Device,int> MeshType; - typedef typename MeshType::CoordinatesType CoordinatesType; - typedef typename MeshType::PointType PointType; - - PointType getOrigin(int rank) - { - if(rank==0) - return PointType(-0.5); - if(rank==1) - return PointType(4.5); - if(rank==2) - return PointType(9.5); - if(rank==3) - return PointType(14.5); - - return PointType(0); - }; - - PointType getProportions(int rank) - { - if(rank==0) - return PointType(5); - if(rank==1) - return PointType(5); - if(rank==2) - return PointType(5); - if(rank==3) - return PointType(5); - return PointType(0); - }; - - const CoordinatesType& getDistr() - { - distr[0]=4; - return distr; - }; - - CoordinatesType distr; -}; - -template<typename Device> -class ParameterProvider<2,Device> -{ - public: - - typedef Grid<2,double,Device,int> MeshType; - typedef typename MeshType::CoordinatesType CoordinatesType; - typedef typename MeshType::PointType PointType; - - PointType getOrigin(int rank) - { - if(rank==0) - return PointType(-0.5,-0.5); - if(rank==1) - return PointType(9.5,-0.5); - if(rank==2) - return PointType(-0.5,9.5); - if(rank==3) - return PointType(9.5,9.5); - - return PointType(0,0); - }; - - PointType getProportions(int rank) - { - if(rank==0) - return PointType(10,10); - if(rank==1) - return PointType(10,10); - if(rank==2) - return PointType(10,10); - if(rank==3) - return PointType(10,10); - return PointType(0,0); - }; - - const CoordinatesType& getDistr() - { - distr[0]=2; - distr[1]=2; - return distr; - }; - - CoordinatesType distr; -}; - -template<typename Device> -class ParameterProvider<3,Device> -{ - public: - - typedef Grid<3,double,Device,int> MeshType; - typedef typename MeshType::CoordinatesType CoordinatesType; - typedef typename MeshType::PointType PointType; - - PointType getOrigin(int rank) - { - if(rank==0) - return PointType(-0.5,-0.5,-0.5); - if(rank==1) - return PointType(9.5,-0.5,-0.5); - if(rank==2) - return PointType(-0.5,9.5,-0.5); - if(rank==3) - return PointType(9.5,9.5,-0.5); - - return PointType(0,0,0); - }; - - PointType getProportions(int rank) - { - if(rank==0) - return PointType(10,10,20); - if(rank==1) - return PointType(10,10,20); - if(rank==2) - return PointType(10,10,20); - if(rank==3) - return PointType(10,10,20); - return PointType(0,0,0); - }; - - const CoordinatesType& getDistr() - { - distr[0]=2; - distr[1]=2; - distr[2]=1; - return distr; - }; - - CoordinatesType distr; -}; - -//------------------------------------------------------------------------------ - -template <int dim, typename Device> -class TestDistributedGridIO -{ - public: - - typedef Grid<dim,double,Device,int> MeshType; - typedef MeshFunctionView<MeshType> MeshFunctionType; - typedef Vector<double,Device,int> DofType; - typedef typename MeshType::Cell Cell; - typedef typename MeshType::IndexType IndexType; - typedef typename MeshType::PointType PointType; - typedef DistributedMesh<MeshType> DistributedGridType; - - typedef typename DistributedGridType::CoordinatesType CoordinatesType; - typedef LinearFunction<double,dim> LinearFunctionType; - - static void TestSave() - { - Pointers::SharedPointer< LinearFunctionType, Device > linearFunctionPtr; - MeshFunctionEvaluator< MeshFunctionType, LinearFunctionType > linearFunctionEvaluator; - - ParameterProvider<dim,Device> parameters; - - //save distributed meshfunction into files - PointType globalOrigin; - globalOrigin.setValue(-0.5); - - PointType globalProportions; - globalProportions.setValue(20); - - - MeshType globalGrid; - globalGrid.setDimensions(globalProportions); - globalGrid.setDomain(globalOrigin,globalProportions); - - CoordinatesType overlap; - overlap.setValue(1); - DistributedGridType distributedGrid; - distributedGrid.setDomainDecomposition( parameters.getDistr() ); - distributedGrid.setGlobalGrid( globalGrid ); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; - SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); - distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); - - //std::cout << distributedGrid.printProcessDistr() <<std::endl; - - Pointers::SharedPointer<MeshType> gridptr; - Pointers::SharedPointer<MeshFunctionType> meshFunctionptr; - distributedGrid.setupGrid(*gridptr); - - DofType dof(gridptr->template getEntitiesCount< Cell >()); - dof.setValue(0); - meshFunctionptr->bind(gridptr,dof); - - linearFunctionEvaluator.evaluateAllEntities(meshFunctionptr , linearFunctionPtr); - - String fileName=String("test-file-distriburtegrid-io-save.tnl"); - DistributedGridIO<MeshFunctionType> ::save(fileName, *meshFunctionptr ); - - - //create similar local mesh function and evaluate linear function on it - PointType localOrigin=parameters.getOrigin(TNL::MPI::GetRank()); - PointType localProportions=parameters.getProportions(TNL::MPI::GetRank()); - - Pointers::SharedPointer<MeshType> localGridptr; - localGridptr->setDimensions(localProportions); - localGridptr->setDomain(localOrigin,localProportions); - - DofType localDof(localGridptr->template getEntitiesCount< Cell >()); - - Pointers::SharedPointer<MeshFunctionType> localMeshFunctionptr; - localMeshFunctionptr->bind(localGridptr,localDof); - linearFunctionEvaluator.evaluateAllEntities(localMeshFunctionptr , linearFunctionPtr); - - //load other meshfunction on same localgrid from created file - Pointers::SharedPointer<MeshType> loadGridptr; - loadGridptr->setDimensions(localProportions); - loadGridptr->setDomain(localOrigin,localProportions); - - DofType loadDof(localGridptr->template getEntitiesCount< Cell >()); - Pointers::SharedPointer<MeshFunctionType> loadMeshFunctionptr; - loadMeshFunctionptr->bind(loadGridptr,loadDof); - - loadDof.setValue(-1); - - String localFileName= fileName+String("-")+distributedGrid.printProcessCoords()+String(".tnl"); - - File file; - file.open(localFileName, std::ios_base::in ); - loadMeshFunctionptr->boundLoad(file); - file.close(); - - for(int i=0;i<localDof.getSize();i++) - { - EXPECT_EQ( localDof.getElement(i), loadDof.getElement(i)) << "Compare Loaded and evaluated Dof Failed for: "<< i; - } - - EXPECT_EQ( std::remove( localFileName.getString()) , 0 ); - - //remove meshfile - EXPECT_EQ( std::remove( (fileName+String("-mesh-")+distributedGrid.printProcessCoords()+String(".tnl")).getString()) , 0 ); - } - - static void TestLoad() - { - Pointers::SharedPointer< LinearFunctionType, Device > linearFunctionPtr; - MeshFunctionEvaluator< MeshFunctionType, LinearFunctionType > linearFunctionEvaluator; - - ParameterProvider<dim,Device> parameters; - - //Crete distributed grid - PointType globalOrigin; - globalOrigin.setValue(-0.5); - - PointType globalProportions; - globalProportions.setValue(20); - - MeshType globalGrid; - globalGrid.setDimensions(globalProportions); - globalGrid.setDomain(globalOrigin,globalProportions); - - CoordinatesType overlap; - overlap.setValue(1); - DistributedGridType distributedGrid; - distributedGrid.setDomainDecomposition( parameters.getDistr() ); - distributedGrid.setGlobalGrid( globalGrid ); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; - SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); - distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); - - //save files from local mesh - PointType localOrigin=parameters.getOrigin(TNL::MPI::GetRank()); - PointType localProportions=parameters.getProportions(TNL::MPI::GetRank()); - - Pointers::SharedPointer<MeshType> localGridptr; - localGridptr->setDimensions(localProportions); - localGridptr->setDomain(localOrigin,localProportions); - - DofType localDof(localGridptr->template getEntitiesCount< Cell >()); - - Pointers::SharedPointer<MeshFunctionType> localMeshFunctionptr; - localMeshFunctionptr->bind(localGridptr,localDof); - linearFunctionEvaluator.evaluateAllEntities(localMeshFunctionptr , linearFunctionPtr); - - - String fileName=String("test-file-distributedgrid-io-load.tnl"); - String localFileName=fileName+String("-")+distributedGrid.printProcessCoords()+String(".tnl"); - File file; - file.open( localFileName, std::ios_base::out ); - localMeshFunctionptr->save(file); - file.close(); - - - - //Crete "distributedgrid driven" grid filed by load - Pointers::SharedPointer<MeshType> loadGridptr; - Pointers::SharedPointer<MeshFunctionType> loadMeshFunctionptr; - distributedGrid.setupGrid(*loadGridptr); - - DofType loadDof(loadGridptr->template getEntitiesCount< Cell >()); - loadDof.setValue(0); - loadMeshFunctionptr->bind(loadGridptr,loadDof); - - DistributedGridIO<MeshFunctionType> ::load(fileName, *loadMeshFunctionptr ); - - DistributedMeshSynchronizer< DistributedGridType > synchronizer; - synchronizer.setDistributedGrid( &distributedGrid ); - synchronizer.synchronize( *loadMeshFunctionptr ); //need synchronization for overlaps to be filled corectly in loadDof - - //Crete "distributedgrid driven" grid filed by evaluated linear function - Pointers::SharedPointer<MeshType> gridptr; - Pointers::SharedPointer<MeshFunctionType> meshFunctionptr; - distributedGrid.setupGrid(*gridptr); - - DofType dof(gridptr->template getEntitiesCount< Cell >()); - dof.setValue(-1); - meshFunctionptr->bind(gridptr,dof); - - linearFunctionEvaluator.evaluateAllEntities(meshFunctionptr , linearFunctionPtr); - synchronizer.synchronize( *meshFunctionptr ); - - for(int i=0;i<dof.getSize();i++) - { - EXPECT_EQ( dof.getElement(i), loadDof.getElement(i)) << "Compare Loaded and evaluated Dof Failed for: "<< i; - } - - EXPECT_EQ( std::remove( localFileName.getString()) , 0 ); - } -}; - diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTestBase.h b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTestBase.h deleted file mode 100644 index a0bef62f04bd2d9a5197788cacba09a25279e7cc..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIOTestBase.h +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - DistributedGridIO.h - description - ------------------- - begin : Nov 1, 2017 - copyright : (C) 2017 by Tomas Oberhuber et al. - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ -#ifdef HAVE_GTEST - -#include <gtest/gtest.h> - -#ifdef HAVE_MPI - -#include "DistributedGridIOTest.h" - -TEST( DistributedGridIO, Save_1D ) -{ - TestDistributedGridIO<1,Devices::Host>::TestSave(); -} - -TEST( DistributedGridIO, Save_2D ) -{ - TestDistributedGridIO<2,Devices::Host>::TestSave(); -} - -TEST( DistributedGridIO, Save_3D ) -{ - TestDistributedGridIO<3,Devices::Host>::TestSave(); -} - -TEST( DistributedGridIO, Load_1D ) -{ - TestDistributedGridIO<1,Devices::Host>::TestLoad(); -} - -TEST( DistributedGridIO, Load_2D ) -{ - TestDistributedGridIO<2,Devices::Host>::TestLoad(); -} - -TEST( DistributedGridIO, Load_3D ) -{ - TestDistributedGridIO<3,Devices::Host>::TestLoad(); -} - -#ifdef HAVE_CUDA -TEST( DistributedGridIO, Save_1D_GPU ) -{ - TestDistributedGridIO<1,Devices::Cuda>::TestSave(); -} - -TEST( DistributedGridIO, Save_2D_GPU ) -{ - TestDistributedGridIO<2,Devices::Cuda>::TestSave(); -} - -TEST( DistributedGridIO, Save_3D_GPU ) -{ - TestDistributedGridIO<3,Devices::Cuda>::TestSave(); -} - -TEST( DistributedGridIO, Load_1D_GPU ) -{ - TestDistributedGridIO<1,Devices::Cuda>::TestLoad(); -} - -TEST( DistributedGridIO, Load_2D_GPU ) -{ - TestDistributedGridIO<2,Devices::Cuda>::TestLoad(); -} - -TEST( DistributedGridIO, Load_3D_GPU ) -{ - TestDistributedGridIO<3,Devices::Cuda>::TestLoad(); -} -#endif - -#endif - -#endif - -#include "../../main_mpi.h" diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.cpp b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.cpp deleted file mode 100644 index 5c4877846f7ca0d483aa12f854716ab82fb93b62..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "DistributedGridIO_MPIIOTestBase.h" diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.cu b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.cu deleted file mode 100644 index 5c4877846f7ca0d483aa12f854716ab82fb93b62..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.cu +++ /dev/null @@ -1 +0,0 @@ -#include "DistributedGridIO_MPIIOTestBase.h" diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.h b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.h deleted file mode 100644 index 00705c31ffc50de1447f6a50e22a3d9616e500a5..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTest.h +++ /dev/null @@ -1,188 +0,0 @@ -/*************************************************************************** - DistributedGridIO_MPIIO - description - ------------------- - begin : Nov 1, 2017 - copyright : (C) 2017 by Tomas Oberhuber et al. - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - - -#ifdef HAVE_MPI - #define MPIIO -#endif - -#include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO.h> -#include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> -#include <TNL/Functions/MeshFunctionView.h> - - -#include "../../Functions/Functions.h" - -using namespace TNL::Containers; -using namespace TNL::Meshes; -using namespace TNL::Functions; -using namespace TNL::Meshes::DistributedMeshes; - -//------------------------------------------------------------------------------ - -template <int dim, typename Device> -class TestDistributedGridMPIIO{ - public: - - typedef Grid<dim,double,Device,int> MeshType; - typedef MeshFunctionView<MeshType> MeshFunctionType; - typedef Vector<double,Device,int> DofType; - typedef typename MeshType::Cell Cell; - typedef typename MeshType::IndexType IndexType; - typedef typename MeshType::PointType PointType; - typedef DistributedMesh<MeshType> DistributedGridType; - - typedef typename DistributedGridType::CoordinatesType CoordinatesType; - typedef LinearFunction<double,dim> LinearFunctionType; - - static void TestSave() - { - Pointers::SharedPointer< LinearFunctionType, Device > linearFunctionPtr; - MeshFunctionEvaluator< MeshFunctionType, LinearFunctionType > linearFunctionEvaluator; - - //save distributed meshfunction into file - PointType globalOrigin; - globalOrigin.setValue(-0.5); - - PointType globalProportions; - globalProportions.setValue(50); - - Pointers::SharedPointer<MeshType> globalGrid; - globalGrid->setDimensions(globalProportions); - globalGrid->setDomain(globalOrigin,globalProportions); - - DistributedGridType distributedGrid; - distributedGrid.setGlobalGrid( *globalGrid ); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; - SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); - distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); - - ///std::cout << distributedGrid.printProcessDistr() <<std::endl; - - Pointers::SharedPointer<MeshType> gridptr; - Pointers::SharedPointer<MeshFunctionType> meshFunctionptr; - distributedGrid.setupGrid(*gridptr); - - DofType dof(gridptr->template getEntitiesCount< Cell >()); - dof.setValue(0); - meshFunctionptr->bind(gridptr,dof); - - linearFunctionEvaluator.evaluateAllEntities(meshFunctionptr , linearFunctionPtr); - - String FileName=String("test-file-mpiio-save.tnl"); - DistributedGridIO<MeshFunctionType,MpiIO> ::save(FileName, *meshFunctionptr ); - - //first process compare results - if(TNL::MPI::GetRank()==0) - { - DofType globalEvaluatedDof(globalGrid->template getEntitiesCount< Cell >()); - - Pointers::SharedPointer<MeshFunctionType> globalEvaluatedMeshFunctionptr; - globalEvaluatedMeshFunctionptr->bind(globalGrid,globalEvaluatedDof); - linearFunctionEvaluator.evaluateAllEntities(globalEvaluatedMeshFunctionptr , linearFunctionPtr); - - - DofType loadDof(globalGrid->template getEntitiesCount< Cell >()); - Pointers::SharedPointer<MeshFunctionType> loadMeshFunctionptr; - loadMeshFunctionptr->bind(globalGrid,loadDof); - - loadDof.setValue(-1); - - File file; - file.open( FileName, std::ios_base::in ); - loadMeshFunctionptr->boundLoad(file); - file.close(); - - for(int i=0;i<loadDof.getSize();i++) - { - EXPECT_EQ( globalEvaluatedDof.getElement(i), loadDof.getElement(i)) << "Compare Loaded and evaluated Dof Failed for: "<< i; - } - EXPECT_EQ( std::remove( FileName.getString()) , 0 ); - } - } - - static void TestLoad() - { - Pointers::SharedPointer< LinearFunctionType, Device > linearFunctionPtr; - MeshFunctionEvaluator< MeshFunctionType, LinearFunctionType > linearFunctionEvaluator; - - //Crete distributed grid - PointType globalOrigin; - globalOrigin.setValue(-0.5); - - PointType globalProportions; - globalProportions.setValue(50); - - Pointers::SharedPointer<MeshType> globalGrid; - globalGrid->setDimensions(globalProportions); - globalGrid->setDomain(globalOrigin,globalProportions); - - CoordinatesType overlap; - overlap.setValue(1); - DistributedGridType distributedGrid; - distributedGrid.setGlobalGrid( *globalGrid ); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; - SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); - distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); - - String FileName=String("test-file-mpiio-load.tnl"); - - //Prepare file - if(TNL::MPI::GetRank()==0) - { - DofType saveDof(globalGrid->template getEntitiesCount< Cell >()); - - Pointers::SharedPointer<MeshFunctionType> saveMeshFunctionptr; - saveMeshFunctionptr->bind(globalGrid,saveDof); - linearFunctionEvaluator.evaluateAllEntities(saveMeshFunctionptr , linearFunctionPtr); - - File file; - file.open( FileName, std::ios_base::out ); - saveMeshFunctionptr->save(file); - file.close(); - } - - Pointers::SharedPointer<MeshType> loadGridptr; - Pointers::SharedPointer<MeshFunctionType> loadMeshFunctionptr; - distributedGrid.setupGrid(*loadGridptr); - - DofType loadDof(loadGridptr->template getEntitiesCount< Cell >()); - loadDof.setValue(0); - loadMeshFunctionptr->bind(loadGridptr,loadDof); - - DistributedGridIO<MeshFunctionType,MpiIO> ::load(FileName, *loadMeshFunctionptr ); - - DistributedMeshSynchronizer< DistributedGridType > synchronizer; - synchronizer.setDistributedGrid( &distributedGrid ); - synchronizer.synchronize( *loadMeshFunctionptr ); //need synchronization for overlaps to be filled corectly in loadDof - - Pointers::SharedPointer<MeshType> evalGridPtr; - Pointers::SharedPointer<MeshFunctionType> evalMeshFunctionptr; - distributedGrid.setupGrid(*evalGridPtr); - - DofType evalDof(evalGridPtr->template getEntitiesCount< Cell >()); - evalDof.setValue(-1); - evalMeshFunctionptr->bind(evalGridPtr,evalDof); - - linearFunctionEvaluator.evaluateAllEntities(evalMeshFunctionptr , linearFunctionPtr); - synchronizer.synchronize( *evalMeshFunctionptr ); - - for(int i=0;i<evalDof.getSize();i++) - { - EXPECT_EQ( evalDof.getElement(i), loadDof.getElement(i)) << "Compare Loaded and evaluated Dof Failed for: "<< i; - } - - if(TNL::MPI::GetRank()==0) - { - EXPECT_EQ( std::remove( FileName.getString()) , 0 ); - } - - } -}; diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTestBase.h b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTestBase.h deleted file mode 100644 index 3786a36fb0a9aa891c85198fbc3faec3d1ed1f46..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridIO_MPIIOTestBase.h +++ /dev/null @@ -1,80 +0,0 @@ -/*************************************************************************** - DistributedGridIO_MPIIO - description - ------------------- - begin : Nov 1, 2017 - copyright : (C) 2017 by Tomas Oberhuber et al. - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ -#ifdef HAVE_GTEST - #include <gtest/gtest.h> -#ifdef HAVE_MPI - -#include "DistributedGridIO_MPIIOTest.h" - -TEST( DistributedGridMPIIO, Save_1D ) -{ - TestDistributedGridMPIIO<1,Devices::Host>::TestSave(); -} - -TEST( DistributedGridMPIIO, Save_2D ) -{ - TestDistributedGridMPIIO<2,Devices::Host>::TestSave(); -} - -TEST( DistributedGridMPIIO, Save_3D ) -{ - TestDistributedGridMPIIO<3,Devices::Host>::TestSave(); -} - -TEST( DistributedGridMPIIO, Load_1D ) -{ - TestDistributedGridMPIIO<1,Devices::Host>::TestLoad(); -} - -TEST( DistributedGridMPIIO, Load_2D ) -{ - TestDistributedGridMPIIO<2,Devices::Host>::TestLoad(); -} - -TEST( DistributedGridMPIIO, Load_3D ) -{ - TestDistributedGridMPIIO<3,Devices::Host>::TestLoad(); -} - -#ifdef HAVE_CUDA - TEST( DistributedGridMPIIO, Save_1D_GPU ) - { - TestDistributedGridMPIIO<1,Devices::Cuda>::TestSave(); - } - - TEST( DistributedGridMPIIO, Save_2D_GPU ) - { - TestDistributedGridMPIIO<2,Devices::Cuda>::TestSave(); - } - - TEST( DistributedGridMPIIO, Save_3D_GPU ) - { - TestDistributedGridMPIIO<3,Devices::Cuda>::TestSave(); - } - - TEST( DistributedGridMPIIO, Load_1D_GPU ) - { - TestDistributedGridMPIIO<1,Devices::Cuda>::TestLoad(); - } - - TEST( DistributedGridMPIIO, Load_2D_GPU ) - { - TestDistributedGridMPIIO<2,Devices::Cuda>::TestLoad(); - } - - TEST( DistributedGridMPIIO, Load_3D_GPU ) - { - TestDistributedGridMPIIO<3,Devices::Cuda>::TestLoad(); - } -#endif - -#endif - -#endif - -#include "../../main_mpi.h" diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_1D.cpp b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_1D.cpp index 9a3952bc3f9f09e970dd9c016810e39d5929dadb..68b03cebbff288fe5561f8f8b904abc17fc147fe 100644 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_1D.cpp +++ b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_1D.cpp @@ -12,13 +12,19 @@ #ifdef HAVE_MPI +#include <experimental/filesystem> + #include <TNL/Functions/MeshFunctionView.h> #include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> #include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> #include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> +#include <TNL/Meshes/Writers/PVTIWriter.h> +#include <TNL/Meshes/Readers/PVTIReader.h> #include "../../Functions/Functions.h" +namespace fs = std::experimental::filesystem; + using namespace TNL; using namespace TNL::Containers; using namespace TNL::Meshes; @@ -48,8 +54,7 @@ void check_Boundary_1D(int rank, int nproc, const DofType& dof, typename DofType EXPECT_EQ( dof[dof.getSize()-1], expectedValue) << "Right boundary test failed"; return; } - -}; +} template<typename DofType> void check_Overlap_1D(int rank, int nproc, const DofType& dof, typename DofType::RealType expectedValue) @@ -68,14 +73,14 @@ void check_Overlap_1D(int rank, int nproc, const DofType& dof, typename DofType: EXPECT_EQ( dof[0], expectedValue) << "left overlap test failed"; EXPECT_EQ( dof[dof.getSize()-1], expectedValue)<< "right overlap test failed"; -}; +} template<typename DofType> void check_Inner_1D(int rank, int nproc, const DofType& dof, typename DofType::RealType expectedValue) { for( int i = 1; i < ( dof.getSize()-2 ); i++ ) - EXPECT_EQ( dof[i], expectedValue) << " " << i; -}; + EXPECT_EQ( dof[i], expectedValue) << "i = " << i; +} /* * Light check of 1D distributed grid and its synchronization. @@ -104,7 +109,7 @@ class DistributedGridTest_1D : public ::testing::Test DofType dof; MaskDofType maskDofs; - Pointers::SharedPointer< GridType > gridptr; + Pointers::SharedPointer< GridType > localGrid; Pointers::SharedPointer< MeshFunctionType > meshFunctionPtr; Pointers::SharedPointer< MaskType > maskPointer; @@ -130,25 +135,23 @@ class DistributedGridTest_1D : public ::testing::Test globalOrigin.x()=-0.5; globalProportions.x()=size; - globalGrid.setDimensions(size); globalGrid.setDomain(globalOrigin,globalProportions); - typename DistributedGridType::CoordinatesType overlap; - overlap.setValue(1); distributedGrid=new DistributedGridType(); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; distributedGrid->setGlobalGrid( globalGrid ); - //distributedGrid->setupGrid(*gridptr); SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); - dof.setSize( gridptr->template getEntitiesCount< Cell >() ); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); - meshFunctionPtr->bind(gridptr,dof); + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); + + meshFunctionPtr->bind( localGrid, dof ); constFunctionPtr->Number=rank; } @@ -159,7 +162,10 @@ class DistributedGridTest_1D : public ::testing::Test SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); } void TearDown() @@ -179,10 +185,9 @@ TEST_F( DistributedGridTest_1D, isBoundaryDomainTest ) TEST_F(DistributedGridTest_1D, evaluateAllEntities) { //Check Traversars - //All entities, witout overlap + //All entities, without overlap setDof_1D( dof,-1); constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , constFunctionPtr ); - //Printer<GridType,DofType>::print_dof(rank,*gridptr,dof); check_Boundary_1D(rank, nproc, dof, rank); check_Overlap_1D(rank, nproc, dof, -1); check_Inner_1D(rank, nproc, dof, rank); @@ -190,7 +195,7 @@ TEST_F(DistributedGridTest_1D, evaluateAllEntities) TEST_F(DistributedGridTest_1D, evaluateBoundaryEntities) { - //Boundary entities, witout overlap + //Boundary entities, without overlap setDof_1D(dof,-1); constFunctionEvaluator.evaluateBoundaryEntities( meshFunctionPtr , constFunctionPtr ); check_Boundary_1D(rank, nproc, dof, rank); @@ -200,7 +205,7 @@ TEST_F(DistributedGridTest_1D, evaluateBoundaryEntities) TEST_F(DistributedGridTest_1D, evaluateInteriorEntities) { - //Inner entities, witout overlap + //Inner entities, without overlap setDof_1D(dof,-1); constFunctionEvaluator.evaluateInteriorEntities( meshFunctionPtr , constFunctionPtr ); check_Boundary_1D(rank, nproc, dof, -1); @@ -213,7 +218,7 @@ TEST_F(DistributedGridTest_1D, SynchronizerNeighborsTest ) setDof_1D(dof,-1); constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , constFunctionPtr ); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionPtr->getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( distributedGrid ); synchronizer.synchronize( *meshFunctionPtr ); if(rank!=0) { @@ -230,14 +235,14 @@ TEST_F(DistributedGridTest_1D, EvaluateLinearFunction ) setDof_1D(dof,-1); linearFunctionEvaluator.evaluateAllEntities(meshFunctionPtr, linearFunctionPtr); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionPtr->getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( distributedGrid ); synchronizer.synchronize( *meshFunctionPtr ); - auto entity = gridptr->template getEntity< Cell >(0); + auto entity = localGrid->template getEntity< Cell >(0); entity.refresh(); EXPECT_EQ(meshFunctionPtr->getValue(entity), (*linearFunctionPtr)(entity)) << "Linear function Overlap error on left Edge."; - auto entity2= gridptr->template getEntity< Cell >((dof).getSize()-1); + auto entity2= localGrid->template getEntity< Cell >((dof).getSize()-1); entity2.refresh(); EXPECT_EQ(meshFunctionPtr->getValue(entity), (*linearFunctionPtr)(entity)) << "Linear function Overlap error on right Edge."; } @@ -250,17 +255,18 @@ TEST_F(DistributedGridTest_1D, SynchronizePeriodicNeighborsWithoutMask ) SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); - dof.setSize( gridptr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridptr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridptr, dof ); - maskPointer->bind( gridptr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); setDof_1D( dof, -rank-1 ); - maskDofs.setValue( true ); //meshFunctionPtr->getSynchronizer().setPeriodicBoundariesCopyDirection( Synchronizer::OverlapToBoundary ); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionPtr->getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( distributedGrid ); synchronizer.synchronize( *meshFunctionPtr, true ); if( rank == 0 ) { @@ -279,18 +285,22 @@ TEST_F(DistributedGridTest_1D, SynchronizePeriodicNeighborsWithActiveMask ) SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); - dof.setSize( gridptr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridptr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridptr, dof ); - maskPointer->bind( gridptr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); setDof_1D( dof, -rank-1 ); maskDofs.setValue( true ); //constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr, constFunctionPtr ); //meshFunctionPtr->getSynchronizer().setPeriodicBoundariesCopyDirection( Synchronizer::OverlapToBoundary ); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionPtr->getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( distributedGrid ); synchronizer.synchronize( *meshFunctionPtr, true, maskPointer ); if( rank == 0 ) { EXPECT_EQ( dof[ 0 ], -nproc ) << "Left Overlap was filled by wrong process."; @@ -310,11 +320,15 @@ TEST_F(DistributedGridTest_1D, SynchronizePeriodicNeighborsWithInactiveMaskOnLef SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); - dof.setSize( gridptr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridptr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridptr, dof ); - maskPointer->bind( gridptr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); setDof_1D( dof, -rank-1 ); maskDofs.setValue( true ); @@ -339,11 +353,15 @@ TEST_F(DistributedGridTest_1D, SynchronizePeriodicNeighborsWithInactiveMask ) SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); - dof.setSize( gridptr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridptr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridptr, dof ); - maskPointer->bind( gridptr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); setDof_1D( dof, -rank-1 ); maskDofs.setValue( true ); @@ -370,19 +388,23 @@ TEST_F(DistributedGridTest_1D, SynchronizePeriodicBoundariesLinearTest ) SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); - dof.setSize( gridptr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridptr, dof ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); setDof_1D(dof, -rank-1 ); linearFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , linearFunctionPtr ); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionPtr->getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( distributedGrid ); synchronizer.synchronize( *meshFunctionPtr, true ); - auto entity = gridptr->template getEntity< Cell >( 0 ); - auto entity2= gridptr->template getEntity< Cell >( (dof).getSize() - 1 ); + auto entity = localGrid->template getEntity< Cell >( 0 ); + auto entity2= localGrid->template getEntity< Cell >( (dof).getSize() - 1 ); entity.refresh(); entity2.refresh(); @@ -393,6 +415,93 @@ TEST_F(DistributedGridTest_1D, SynchronizePeriodicBoundariesLinearTest ) EXPECT_EQ( meshFunctionPtr->getValue(entity2), 0 ) << "Linear function Overlap error on right Edge."; } } + +TEST_F(DistributedGridTest_1D, PVTIWriterReader) +{ + // create a .pvti file (only rank 0 actually writes to the file) + const std::string baseName = "DistributedGridTest_1D_" + std::to_string(nproc) + "proc"; + const std::string mainFilePath = baseName + ".pvti"; + std::string subfilePath; + { + std::ofstream file; + if( TNL::MPI::GetRank() == 0 ) + file.open( mainFilePath ); + using PVTI = Meshes::Writers::PVTIWriter< GridType >; + PVTI pvti( file ); + pvti.writeImageData( *distributedGrid ); + // TODO +// if( mesh.getGhostLevels() > 0 ) { +// pvti.template writePPointData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// pvti.template writePCellData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// } + subfilePath = pvti.addPiece( mainFilePath, *distributedGrid ); + + // create a .vti file for local data + using Writer = Meshes::Writers::VTIWriter< GridType >; + std::ofstream subfile( subfilePath ); + Writer writer( subfile ); + writer.writeImageData( *localGrid ); + // TODO +// if( mesh.getGhostLevels() > 0 ) { +// writer.writePointData( mesh.vtkPointGhostTypes(), Meshes::VTK::ghostArrayName() ); +// writer.writeCellData( mesh.vtkCellGhostTypes(), Meshes::VTK::ghostArrayName() ); +// } + + // end of scope closes the files + } + + // load and test + TNL::MPI::Barrier(); + Readers::PVTIReader reader( mainFilePath ); + reader.detectMesh(); + EXPECT_EQ( reader.getMeshType(), "Meshes::DistributedGrid" ); + DistributedMesh< GridType > loadedGrid; + reader.loadMesh( loadedGrid ); + EXPECT_EQ( loadedGrid, *distributedGrid ); + + // cleanup + EXPECT_EQ( fs::remove( subfilePath ), true ); + TNL::MPI::Barrier(); + if( TNL::MPI::GetRank() == 0 ) { + EXPECT_EQ( fs::remove( mainFilePath ), true ); + EXPECT_EQ( fs::remove( baseName ), true ); + } +} + +TEST_F(DistributedGridTest_1D, readDistributedMeshFunction) +{ + const std::string baseName = "DistributedGridTest_MeshFunction_1D_" + std::to_string(nproc) + "proc.pvti"; + const std::string mainFilePath = baseName + ".pvti"; + + // evaluate a function + dof.setValue( -1 ); + constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr, constFunctionPtr ); + + // write the mesh function into a .pvti file + EXPECT_TRUE( writeDistributedMeshFunction( *distributedGrid, *meshFunctionPtr, "foo", mainFilePath ) ); + + // wait for rank 0 to write the main .pvti file + TNL::MPI::Barrier(); + + // load the mesh function from the .pvti file + DofType loadedDof; + loadedDof.setLike( dof ); + loadedDof.setValue( -2 ); + MeshFunctionType loadedMeshFunction; + loadedMeshFunction.bind( localGrid, loadedDof ); + EXPECT_TRUE( readDistributedMeshFunction( *distributedGrid, loadedMeshFunction, "foo", mainFilePath ) ); + + // compare the dofs (MeshFunction and MeshFunctionView do not have operator==) +// EXPECT_EQ( loadedMeshFunction, *meshFunctionPtr ); + EXPECT_EQ( loadedDof, dof ); + + // cleanup + TNL::MPI::Barrier(); + if( TNL::MPI::GetRank() == 0 ) { + EXPECT_TRUE( fs::remove( mainFilePath ) ); + EXPECT_GT( fs::remove_all( baseName ), 1 ); + } +} #endif #endif diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_2D.cpp b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_2D.cpp index 1f02dd2364e25a3fa40cf457f9e3f7ad353199ac..7b6b455dea0ee07a82817ef021d30a70a029d754 100644 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_2D.cpp +++ b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_2D.cpp @@ -12,20 +12,25 @@ #ifdef HAVE_MPI -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> +#include <experimental/filesystem> + #include <TNL/Functions/MeshFunctionView.h> +#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> #include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> #include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> +#include <TNL/Meshes/Writers/PVTIWriter.h> +#include <TNL/Meshes/Readers/PVTIReader.h> #include "../../Functions/Functions.h" +namespace fs = std::experimental::filesystem; + using namespace TNL; using namespace TNL::Containers; using namespace TNL::Meshes; +using namespace TNL::Meshes::DistributedMeshes; using namespace TNL::Functions; using namespace TNL::Devices; -using namespace TNL::Meshes::DistributedMeshes; - template<typename DofType> @@ -175,16 +180,15 @@ void checkCorner(const GridType &grid, const DofType &dof, bool up, bool left, t template<typename DofType,typename GridType> void check_Boundary_2D(int rank, const GridType &grid, const DofType &dof, typename DofType::RealType expectedValue) { - if(rank==0)//Up Left { checkUpEdge(grid,dof,true,false,expectedValue);//posledni je overlap - checkLeftEdge(grid,dof,true,false, expectedValue);//posledni je overlap + checkLeftEdge(grid,dof,true,false,expectedValue);//posledni je overlap } if(rank==1)//Up Center { - checkUpEdge(grid,dof,false,false, expectedValue);//prvni a posledni je overlap + checkUpEdge(grid,dof,false,false,expectedValue);//prvni a posledni je overlap } if(rank==2)//Up Right @@ -221,10 +225,10 @@ void check_Boundary_2D(int rank, const GridType &grid, const DofType &dof, typen if(rank==8) //Down Right { - checkDownEdge(grid,dof,false,true,expectedValue); - checkRightEdge(grid,dof,false,true,expectedValue); + checkDownEdge(grid,dof,false,true,expectedValue); + checkRightEdge(grid,dof,false,true,expectedValue); } -}; +} /*expecting 9 processes * Known BUG of Traversars: Process boundary is writing over overlap. @@ -324,16 +328,15 @@ using Synchronizer = DistributedMeshSynchronizer< DistributedGridType >; class DistributedGridTest_2D : public ::testing::Test { - public: using CoordinatesType = typename GridType::CoordinatesType; DistributedGridType *distributedGrid; - DofType *dof; + DofType dof; MaskDofType maskDofs; - Pointers::SharedPointer<GridType> gridPtr; + Pointers::SharedPointer<GridType> localGrid; Pointers::SharedPointer<MeshFunctionType> meshFunctionPtr; Pointers::SharedPointer< MaskType > maskPointer; @@ -371,18 +374,20 @@ class DistributedGridTest_2D : public ::testing::Test SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridPtr); - dof=new DofType(gridPtr->template getEntitiesCount< Cell >()); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); - meshFunctionPtr->bind(gridPtr,*dof); + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); + + meshFunctionPtr->bind(localGrid,dof); constFunctionPtr->Number=rank; } void TearDown() { - delete dof; delete distributedGrid; } }; @@ -391,139 +396,137 @@ TEST_F(DistributedGridTest_2D, evaluateAllEntities) { //Check Traversars //All entities, without overlap - setDof_2D(*dof,-1); + setDof_2D(dof,-1); constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , constFunctionPtr ); - //Printer<GridType,DofType>::print_dof(rank,*gridPtr,*dof); - check_Boundary_2D(rank, *gridPtr, *dof, rank); - check_Overlap_2D(rank, *gridPtr, *dof, -1); - check_Inner_2D(rank, *gridPtr, *dof, rank); + check_Boundary_2D(rank, *localGrid, dof, rank); + check_Overlap_2D(rank, *localGrid, dof, -1); + check_Inner_2D(rank, *localGrid, dof, rank); } TEST_F(DistributedGridTest_2D, evaluateBoundaryEntities) { //Boundary entities, without overlap - setDof_2D(*dof,-1); + setDof_2D(dof,-1); constFunctionEvaluator.evaluateBoundaryEntities( meshFunctionPtr , constFunctionPtr ); - //print_dof_2D(rank,*gridPtr,dof); - check_Boundary_2D(rank, *gridPtr, *dof, rank); - check_Overlap_2D(rank, *gridPtr, *dof, -1); - check_Inner_2D(rank, *gridPtr, *dof, -1); + check_Boundary_2D(rank, *localGrid, dof, rank); + check_Overlap_2D(rank, *localGrid, dof, -1); + check_Inner_2D(rank, *localGrid, dof, -1); } TEST_F(DistributedGridTest_2D, evaluateInteriorEntities) { //Inner entities, without overlap - setDof_2D(*dof,-1); + setDof_2D(dof,-1); constFunctionEvaluator.evaluateInteriorEntities( meshFunctionPtr , constFunctionPtr ); - check_Boundary_2D(rank, *gridPtr, *dof, -1); - check_Overlap_2D(rank, *gridPtr, *dof, -1); - check_Inner_2D(rank, *gridPtr, *dof, rank); + check_Boundary_2D(rank, *localGrid, dof, -1); + check_Overlap_2D(rank, *localGrid, dof, -1); + check_Inner_2D(rank, *localGrid, dof, rank); } TEST_F(DistributedGridTest_2D, LinearFunctionTest) { //fill meshfunction with linear function (physical center of cell corresponds with its coordinates in grid) - setDof_2D(*dof,-1); + setDof_2D(dof,-1); linearFunctionEvaluator.evaluateAllEntities(meshFunctionPtr, linearFunctionPtr); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionPtr->getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( distributedGrid ); synchronizer.synchronize( *meshFunctionPtr ); - int count =gridPtr->template getEntitiesCount< Cell >(); + int count =localGrid->template getEntitiesCount< Cell >(); for(int i=0;i<count;i++) { - auto entity= gridPtr->template getEntity< Cell >(i); + auto entity= localGrid->template getEntity< Cell >(i); entity.refresh(); - EXPECT_EQ(meshFunctionPtr->getValue(entity), (*linearFunctionPtr)(entity)) << "Linear function doesnt fit recievd data. " << entity.getCoordinates().x() << " "<<entity.getCoordinates().y() << " "<< gridPtr->getDimensions().x() <<" "<<gridPtr->getDimensions().y(); + EXPECT_EQ(meshFunctionPtr->getValue(entity), (*linearFunctionPtr)(entity)) << "Linear function doesnt fit recievd data. " << entity.getCoordinates().x() << " "<<entity.getCoordinates().y() << " "<< localGrid->getDimensions().x() <<" "<<localGrid->getDimensions().y(); } } TEST_F(DistributedGridTest_2D, SynchronizerNeighborTest ) { //Expect 9 processes - setDof_2D(*dof,-1); + setDof_2D(dof,-1); constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , constFunctionPtr ); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionPtr->getMesh().getDistributedMesh() ); + synchronizer.setDistributedGrid( distributedGrid ); synchronizer.synchronize( *meshFunctionPtr ); - // checkNeighbor_2D(rank, *gridPtr, *dof); + // checkNeighbor_2D(rank, *localGrid, dof); if(rank==0)//Up Left { - checkRightEdge(*gridPtr, *dof, true, false, 1 ); - checkDownEdge( *gridPtr, *dof, true, false, 3 ); - checkCorner( *gridPtr, *dof, false, false, 4 ); + checkRightEdge(*localGrid, dof, true, false, 1 ); + checkDownEdge( *localGrid, dof, true, false, 3 ); + checkCorner( *localGrid, dof, false, false, 4 ); } if(rank==1)//Up Center { - checkLeftEdge( *gridPtr, *dof, true, false, 0 ); - checkRightEdge(*gridPtr, *dof, true, false, 2 ); - checkCorner( *gridPtr, *dof, false, true, 3 ); - checkDownEdge( *gridPtr, *dof, false, false, 4 ); - checkCorner( *gridPtr, *dof, false, false, 5 ); + checkLeftEdge( *localGrid, dof, true, false, 0 ); + checkRightEdge(*localGrid, dof, true, false, 2 ); + checkCorner( *localGrid, dof, false, true, 3 ); + checkDownEdge( *localGrid, dof, false, false, 4 ); + checkCorner( *localGrid, dof, false, false, 5 ); } if(rank==2)//Up Right { - checkLeftEdge( *gridPtr, *dof, true, false, 1 ); - checkCorner( *gridPtr, *dof, false, true, 4 ); - checkDownEdge( *gridPtr, *dof, false, true, 5 ); + checkLeftEdge( *localGrid, dof, true, false, 1 ); + checkCorner( *localGrid, dof, false, true, 4 ); + checkDownEdge( *localGrid, dof, false, true, 5 ); } if(rank==3)//Center Left { - checkUpEdge( *gridPtr, *dof, true, false, 0 ); - checkCorner( *gridPtr, *dof, true, false, 1 ); - checkRightEdge( *gridPtr, *dof, false, false, 4 ); - checkDownEdge( *gridPtr, *dof, true, false, 6 ); - checkCorner( *gridPtr, *dof, false, false, 7 ); + checkUpEdge( *localGrid, dof, true, false, 0 ); + checkCorner( *localGrid, dof, true, false, 1 ); + checkRightEdge( *localGrid, dof, false, false, 4 ); + checkDownEdge( *localGrid, dof, true, false, 6 ); + checkCorner( *localGrid, dof, false, false, 7 ); } if(rank==4)//Center Center { - checkCorner( *gridPtr, *dof, true, true, 0 ); - checkUpEdge( *gridPtr, *dof, false, false, 1 ); - checkCorner( *gridPtr, *dof, true, false, 2 ); - checkLeftEdge( *gridPtr, *dof, false, false, 3 ); - checkRightEdge( *gridPtr, *dof, false, false, 5 ); - checkCorner( *gridPtr, *dof, false, true, 6 ); - checkDownEdge( *gridPtr, *dof, false, false, 7 ); - checkCorner( *gridPtr, *dof, false, false, 8 ); + checkCorner( *localGrid, dof, true, true, 0 ); + checkUpEdge( *localGrid, dof, false, false, 1 ); + checkCorner( *localGrid, dof, true, false, 2 ); + checkLeftEdge( *localGrid, dof, false, false, 3 ); + checkRightEdge( *localGrid, dof, false, false, 5 ); + checkCorner( *localGrid, dof, false, true, 6 ); + checkDownEdge( *localGrid, dof, false, false, 7 ); + checkCorner( *localGrid, dof, false, false, 8 ); } if(rank==5)//Center Right { - checkCorner( *gridPtr, *dof, true, true, 1 ); - checkUpEdge( *gridPtr, *dof, false, true, 2 ); - checkLeftEdge( *gridPtr, *dof, false, false, 4 ); - checkCorner( *gridPtr, *dof, false, true, 7 ); - checkDownEdge( *gridPtr, *dof, false, true, 8 ); + checkCorner( *localGrid, dof, true, true, 1 ); + checkUpEdge( *localGrid, dof, false, true, 2 ); + checkLeftEdge( *localGrid, dof, false, false, 4 ); + checkCorner( *localGrid, dof, false, true, 7 ); + checkDownEdge( *localGrid, dof, false, true, 8 ); } if(rank==6)//Down Left { - checkUpEdge( *gridPtr, *dof, true, false, 3 ); - checkCorner( *gridPtr, *dof, true, false, 4 ); - checkRightEdge( *gridPtr, *dof, false, true, 7 ); + checkUpEdge( *localGrid, dof, true, false, 3 ); + checkCorner( *localGrid, dof, true, false, 4 ); + checkRightEdge( *localGrid, dof, false, true, 7 ); } if(rank==7) //Down Center { - checkCorner( *gridPtr, *dof, true, true, 3 ); - checkUpEdge( *gridPtr, *dof, false, false, 4 ); - checkCorner( *gridPtr, *dof, true, false, 5 ); - checkLeftEdge( *gridPtr, *dof, false, true, 6 ); - checkRightEdge( *gridPtr, *dof, false, true, 8 ); + checkCorner( *localGrid, dof, true, true, 3 ); + checkUpEdge( *localGrid, dof, false, false, 4 ); + checkCorner( *localGrid, dof, true, false, 5 ); + checkLeftEdge( *localGrid, dof, false, true, 6 ); + checkRightEdge( *localGrid, dof, false, true, 8 ); } if(rank==8) //Down Right { - checkCorner( *gridPtr, *dof, true, true, 4 ); - checkUpEdge( *gridPtr, *dof, false, true, 5 ); - checkLeftEdge( *gridPtr, *dof, false, true, 7 ); + checkCorner( *localGrid, dof, true, true, 4 ); + checkUpEdge( *localGrid, dof, false, true, 5 ); + checkLeftEdge( *localGrid, dof, false, true, 7 ); } } @@ -540,12 +543,16 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithoutMask SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridPtr); - dof->setSize( gridPtr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridPtr, *dof ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof->setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); //Expecting 9 processes - setDof_2D(*dof, -rank-1 ); + setDof_2D(dof, -rank-1 ); constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , constFunctionPtr ); //meshFunctionPtr->getSynchronizer().setPeriodicBoundariesCopyDirection( Synchronizer::OverlapToBoundary ); meshFunctionPtr->synchronize( true ); @@ -553,53 +560,53 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithoutMask if( rank == 0 ) { SCOPED_TRACE( "Up Left" ); - checkLeftBoundary( *gridPtr, *dof, false, true, -3 ); - checkUpBoundary( *gridPtr, *dof, false, true, -7 ); + checkLeftBoundary( *localGrid, dof, false, true, -3 ); + checkUpBoundary( *localGrid, dof, false, true, -7 ); } if( rank == 1 ) { SCOPED_TRACE( "Up Center" ); - checkUpBoundary( *gridPtr, *dof, true, true, -8 ); + checkUpBoundary( *localGrid, dof, true, true, -8 ); } if( rank == 2 ) { SCOPED_TRACE( "Up Right" ); - checkRightBoundary( *gridPtr, *dof, false, true, -1 ); - checkUpBoundary( *gridPtr, *dof, true, false, -9 ); + checkRightBoundary( *localGrid, dof, false, true, -1 ); + checkUpBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 3 ) { SCOPED_TRACE( "Center Left" ); - checkLeftBoundary( *gridPtr, *dof, true, true, -6 ); + checkLeftBoundary( *localGrid, dof, true, true, -6 ); } if( rank == 5 ) { SCOPED_TRACE( "Center Right" ); - checkRightBoundary( *gridPtr, *dof, true, true, -4 ); + checkRightBoundary( *localGrid, dof, true, true, -4 ); } if( rank == 6 ) { SCOPED_TRACE( "Down Left" ); - checkDownBoundary( *gridPtr, *dof, false, true, -1 ); - checkLeftBoundary( *gridPtr, *dof, true, false, -9 ); + checkDownBoundary( *localGrid, dof, false, true, -1 ); + checkLeftBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 7 ) { SCOPED_TRACE( "Down Center" ); - checkDownBoundary( *gridPtr, *dof, true, true, -2 ); + checkDownBoundary( *localGrid, dof, true, true, -2 ); } if( rank == 8 ) { SCOPED_TRACE( "Down Right" ); - checkDownBoundary( *gridPtr, *dof, true, false, -3 ); - checkRightBoundary( *gridPtr, *dof, true, false, -7 ); + checkDownBoundary( *localGrid, dof, true, false, -3 ); + checkRightBoundary( *localGrid, dof, true, false, -7 ); } } @@ -612,14 +619,18 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithActiveM SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridPtr); - dof->setSize( gridPtr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridPtr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridPtr, *dof ); - maskPointer->bind( gridPtr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof->setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); //Expecting 9 processes - setDof_2D(*dof, -rank-1 ); + setDof_2D(dof, -rank-1 ); maskDofs.setValue( true ); constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , constFunctionPtr ); meshFunctionPtr->getSynchronizer().setPeriodicBoundariesCopyDirection( Synchronizer::OverlapToBoundary ); @@ -628,53 +639,53 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithActiveM if( rank == 0 ) { SCOPED_TRACE( "Up Left" ); - checkLeftBoundary( *gridPtr, *dof, false, true, -3 ); - checkUpBoundary( *gridPtr, *dof, false, true, -7 ); + checkLeftBoundary( *localGrid, dof, false, true, -3 ); + checkUpBoundary( *localGrid, dof, false, true, -7 ); } if( rank == 1 ) { SCOPED_TRACE( "Up Center" ); - checkUpBoundary( *gridPtr, *dof, true, true, -8 ); + checkUpBoundary( *localGrid, dof, true, true, -8 ); } if( rank == 2 ) { SCOPED_TRACE( "Up Right" ); - checkRightBoundary( *gridPtr, *dof, false, true, -1 ); - checkUpBoundary( *gridPtr, *dof, true, false, -9 ); + checkRightBoundary( *localGrid, dof, false, true, -1 ); + checkUpBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 3 ) { SCOPED_TRACE( "Center Left" ); - checkLeftBoundary( *gridPtr, *dof, true, true, -6 ); + checkLeftBoundary( *localGrid, dof, true, true, -6 ); } if( rank == 5 ) { SCOPED_TRACE( "Center Right" ); - checkRightBoundary( *gridPtr, *dof, true, true, -4 ); + checkRightBoundary( *localGrid, dof, true, true, -4 ); } if( rank == 6 ) { SCOPED_TRACE( "Down Left" ); - checkDownBoundary( *gridPtr, *dof, false, true, -1 ); - checkLeftBoundary( *gridPtr, *dof, true, false, -9 ); + checkDownBoundary( *localGrid, dof, false, true, -1 ); + checkLeftBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 7 ) { SCOPED_TRACE( "Down Center" ); - checkDownBoundary( *gridPtr, *dof, true, true, -2 ); + checkDownBoundary( *localGrid, dof, true, true, -2 ); } if( rank == 8 ) { SCOPED_TRACE( "Down Right" ); - checkDownBoundary( *gridPtr, *dof, true, false, -3 ); - checkRightBoundary( *gridPtr, *dof, true, false, -7 ); + checkDownBoundary( *localGrid, dof, true, false, -3 ); + checkRightBoundary( *localGrid, dof, true, false, -7 ); } } @@ -687,20 +698,24 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInactiv SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridPtr); - dof->setSize( gridPtr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridPtr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridPtr, *dof ); - maskPointer->bind( gridPtr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof->setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); //Expecting 9 processes - setDof_2D(*dof, -rank-1 ); + setDof_2D(dof, -rank-1 ); maskDofs.setValue( true ); if( distributedGrid->getNeighbors()[ ZzYzXm ] == -1 ) { - for( IndexType i = 0; i < gridPtr->getDimensions().y(); i++ ) + for( IndexType i = 0; i < localGrid->getDimensions().y(); i++ ) { - typename GridType::Cell cell( *gridPtr ); + typename GridType::Cell cell( *localGrid ); cell.getCoordinates() = CoordinatesType( 1, i ); cell.refresh(); maskPointer->getData().setElement( cell.getIndex(), false ); @@ -713,53 +728,53 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInactiv if( rank == 0 ) { SCOPED_TRACE( "Up Left" ); - checkLeftBoundary( *gridPtr, *dof, false, true, 0 ); - checkUpBoundary( *gridPtr, *dof, false, true, -7 ); + checkLeftBoundary( *localGrid, dof, false, true, 0 ); + checkUpBoundary( *localGrid, dof, false, true, -7 ); } if( rank == 1 ) { SCOPED_TRACE( "Up Center" ); - checkUpBoundary( *gridPtr, *dof, true, true, -8 ); + checkUpBoundary( *localGrid, dof, true, true, -8 ); } if( rank == 2 ) { SCOPED_TRACE( "Up Right" ); - checkRightBoundary( *gridPtr, *dof, false, true, -1 ); - checkUpBoundary( *gridPtr, *dof, true, false, -9 ); + checkRightBoundary( *localGrid, dof, false, true, -1 ); + checkUpBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 3 ) { SCOPED_TRACE( "Center Left" ); - checkLeftBoundary( *gridPtr, *dof, true, true, 3 ); + checkLeftBoundary( *localGrid, dof, true, true, 3 ); } if( rank == 5 ) { SCOPED_TRACE( "Center Right" ); - checkRightBoundary( *gridPtr, *dof, true, true, -4 ); + checkRightBoundary( *localGrid, dof, true, true, -4 ); } if( rank == 6 ) { SCOPED_TRACE( "Down Left" ); - checkDownBoundary( *gridPtr, *dof, false, true, -1 ); - checkLeftBoundary( *gridPtr, *dof, true, false, 6 ); + checkDownBoundary( *localGrid, dof, false, true, -1 ); + checkLeftBoundary( *localGrid, dof, true, false, 6 ); } if( rank == 7 ) { SCOPED_TRACE( "Down Center" ); - checkDownBoundary( *gridPtr, *dof, true, true, -2 ); + checkDownBoundary( *localGrid, dof, true, true, -2 ); } if( rank == 8 ) { SCOPED_TRACE( "Down Right" ); - checkDownBoundary( *gridPtr, *dof, true, false, -3 ); - checkRightBoundary( *gridPtr, *dof, true, false, -7 ); + checkDownBoundary( *localGrid, dof, true, false, -3 ); + checkRightBoundary( *localGrid, dof, true, false, -7 ); } } @@ -772,21 +787,25 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInActiv SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridPtr); - dof->setSize( gridPtr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridPtr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridPtr, *dof ); - maskPointer->bind( gridPtr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof->setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); //Expecting 9 processes - setDof_2D(*dof, -rank-1 ); + setDof_2D(dof, -rank-1 ); maskDofs.setValue( true ); if( distributedGrid->getNeighbors()[ ZzYzXp ] == -1 ) { - for( IndexType i = 0; i < gridPtr->getDimensions().y(); i++ ) + for( IndexType i = 0; i < localGrid->getDimensions().y(); i++ ) { - typename GridType::Cell cell( *gridPtr ); - cell.getCoordinates() = CoordinatesType( gridPtr->getDimensions().x() - 2, i ); + typename GridType::Cell cell( *localGrid ); + cell.getCoordinates() = CoordinatesType( localGrid->getDimensions().x() - 2, i ); cell.refresh(); maskPointer->getData().setElement( cell.getIndex(), false ); } @@ -798,53 +817,53 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInActiv if( rank == 0 ) { SCOPED_TRACE( "Up Left" ); - checkLeftBoundary( *gridPtr, *dof, false, true, -3 ); - checkUpBoundary( *gridPtr, *dof, false, true, -7 ); + checkLeftBoundary( *localGrid, dof, false, true, -3 ); + checkUpBoundary( *localGrid, dof, false, true, -7 ); } if( rank == 1 ) { SCOPED_TRACE( "Up Center" ); - checkUpBoundary( *gridPtr, *dof, true, true, -8 ); + checkUpBoundary( *localGrid, dof, true, true, -8 ); } if( rank == 2 ) { SCOPED_TRACE( "Up Right" ); - checkRightBoundary( *gridPtr, *dof, false, true, 2 ); - checkUpBoundary( *gridPtr, *dof, true, false, -9 ); + checkRightBoundary( *localGrid, dof, false, true, 2 ); + checkUpBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 3 ) { SCOPED_TRACE( "Center Left" ); - checkLeftBoundary( *gridPtr, *dof, true, true, -6 ); + checkLeftBoundary( *localGrid, dof, true, true, -6 ); } if( rank == 5 ) { SCOPED_TRACE( "Center Right" ); - checkRightBoundary( *gridPtr, *dof, true, true, 5 ); + checkRightBoundary( *localGrid, dof, true, true, 5 ); } if( rank == 6 ) { SCOPED_TRACE( "Down Left" ); - checkDownBoundary( *gridPtr, *dof, false, true, -1 ); - checkLeftBoundary( *gridPtr, *dof, true, false, -9 ); + checkDownBoundary( *localGrid, dof, false, true, -1 ); + checkLeftBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 7 ) { SCOPED_TRACE( "Down Center" ); - checkDownBoundary( *gridPtr, *dof, true, true, -2 ); + checkDownBoundary( *localGrid, dof, true, true, -2 ); } if( rank == 8 ) { SCOPED_TRACE( "Down Right" ); - checkDownBoundary( *gridPtr, *dof, true, false, -3 ); - checkRightBoundary( *gridPtr, *dof, true, false, 8 ); + checkDownBoundary( *localGrid, dof, true, false, -3 ); + checkRightBoundary( *localGrid, dof, true, false, 8 ); } } @@ -857,20 +876,24 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInActiv SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridPtr); - dof->setSize( gridPtr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridPtr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridPtr, *dof ); - maskPointer->bind( gridPtr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof->setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); //Expecting 9 processes - setDof_2D(*dof, -rank-1 ); + setDof_2D(dof, -rank-1 ); maskDofs.setValue( true ); if( distributedGrid->getNeighbors()[ ZzYmXz ] == -1 ) { - for( IndexType i = 0; i < gridPtr->getDimensions().x(); i++ ) + for( IndexType i = 0; i < localGrid->getDimensions().x(); i++ ) { - typename GridType::Cell cell( *gridPtr ); + typename GridType::Cell cell( *localGrid ); cell.getCoordinates() = CoordinatesType( i, 1 ); cell.refresh(); maskPointer->getData().setElement( cell.getIndex(), false ); @@ -883,53 +906,53 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInActiv if( rank == 0 ) { SCOPED_TRACE( "Up Left" ); - checkLeftBoundary( *gridPtr, *dof, false, true, -3 ); - checkUpBoundary( *gridPtr, *dof, false, true, 0 ); + checkLeftBoundary( *localGrid, dof, false, true, -3 ); + checkUpBoundary( *localGrid, dof, false, true, 0 ); } if( rank == 1 ) { SCOPED_TRACE( "Up Center" ); - checkUpBoundary( *gridPtr, *dof, true, true, 1 ); + checkUpBoundary( *localGrid, dof, true, true, 1 ); } if( rank == 2 ) { SCOPED_TRACE( "Up Right" ); - checkRightBoundary( *gridPtr, *dof, false, true, -1 ); - checkUpBoundary( *gridPtr, *dof, true, false, 2 ); + checkRightBoundary( *localGrid, dof, false, true, -1 ); + checkUpBoundary( *localGrid, dof, true, false, 2 ); } if( rank == 3 ) { SCOPED_TRACE( "Center Left" ); - checkLeftBoundary( *gridPtr, *dof, true, true, -6 ); + checkLeftBoundary( *localGrid, dof, true, true, -6 ); } if( rank == 5 ) { SCOPED_TRACE( "Center Right" ); - checkRightBoundary( *gridPtr, *dof, true, true, -4 ); + checkRightBoundary( *localGrid, dof, true, true, -4 ); } if( rank == 6 ) { SCOPED_TRACE( "Down Left" ); - checkDownBoundary( *gridPtr, *dof, false, true, -1 ); - checkLeftBoundary( *gridPtr, *dof, true, false, -9 ); + checkDownBoundary( *localGrid, dof, false, true, -1 ); + checkLeftBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 7 ) { SCOPED_TRACE( "Down Center" ); - checkDownBoundary( *gridPtr, *dof, true, true, -2 ); + checkDownBoundary( *localGrid, dof, true, true, -2 ); } if( rank == 8 ) { SCOPED_TRACE( "Down Right" ); - checkDownBoundary( *gridPtr, *dof, true, false, -3 ); - checkRightBoundary( *gridPtr, *dof, true, false, -7 ); + checkDownBoundary( *localGrid, dof, true, false, -3 ); + checkRightBoundary( *localGrid, dof, true, false, -7 ); } } @@ -942,21 +965,25 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInActiv SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1, 1, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridPtr); - dof->setSize( gridPtr->template getEntitiesCount< Cell >() ); - maskDofs.setSize( gridPtr->template getEntitiesCount< Cell >() ); - meshFunctionPtr->bind( gridPtr, *dof ); - maskPointer->bind( gridPtr, maskDofs ); + + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof->setSize( localGrid->template getEntitiesCount< Cell >() ); + maskDofs.setSize( localGrid->template getEntitiesCount< Cell >() ); + meshFunctionPtr->bind( localGrid, dof ); + maskPointer->bind( localGrid, maskDofs ); //Expecting 9 processes - setDof_2D(*dof, -rank-1 ); + setDof_2D(dof, -rank-1 ); maskDofs.setValue( true ); if( distributedGrid->getNeighbors()[ ZzYpXz ] == -1 ) { - for( IndexType i = 0; i < gridPtr->getDimensions().x(); i++ ) + for( IndexType i = 0; i < localGrid->getDimensions().x(); i++ ) { - typename GridType::Cell cell( *gridPtr ); - cell.getCoordinates() = CoordinatesType( i, gridPtr->getDimensions().y() - 2 ); + typename GridType::Cell cell( *localGrid ); + cell.getCoordinates() = CoordinatesType( i, localGrid->getDimensions().y() - 2 ); cell.refresh(); maskPointer->getData().setElement( cell.getIndex(), false ); } @@ -968,56 +995,143 @@ TEST_F(DistributedGridTest_2D, SynchronizerNeighborPeriodicBoundariesWithInActiv if( rank == 0 ) { SCOPED_TRACE( "Up Left" ); - checkLeftBoundary( *gridPtr, *dof, false, true, -3 ); - checkUpBoundary( *gridPtr, *dof, false, true, -7 ); + checkLeftBoundary( *localGrid, dof, false, true, -3 ); + checkUpBoundary( *localGrid, dof, false, true, -7 ); } if( rank == 1 ) { SCOPED_TRACE( "Up Center" ); - checkUpBoundary( *gridPtr, *dof, true, true, -8 ); + checkUpBoundary( *localGrid, dof, true, true, -8 ); } if( rank == 2 ) { SCOPED_TRACE( "Up Right" ); - checkRightBoundary( *gridPtr, *dof, false, true, -1 ); - checkUpBoundary( *gridPtr, *dof, true, false, -9 ); + checkRightBoundary( *localGrid, dof, false, true, -1 ); + checkUpBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 3 ) { SCOPED_TRACE( "Center Left" ); - checkLeftBoundary( *gridPtr, *dof, true, true, -6 ); + checkLeftBoundary( *localGrid, dof, true, true, -6 ); } if( rank == 5 ) { SCOPED_TRACE( "Center Right" ); - checkRightBoundary( *gridPtr, *dof, true, true, -4 ); + checkRightBoundary( *localGrid, dof, true, true, -4 ); } if( rank == 6 ) { SCOPED_TRACE( "Down Left" ); - checkDownBoundary( *gridPtr, *dof, false, true, 6 ); - checkLeftBoundary( *gridPtr, *dof, true, false, -9 ); + checkDownBoundary( *localGrid, dof, false, true, 6 ); + checkLeftBoundary( *localGrid, dof, true, false, -9 ); } if( rank == 7 ) { SCOPED_TRACE( "Down Center" ); - checkDownBoundary( *gridPtr, *dof, true, true, 7 ); + checkDownBoundary( *localGrid, dof, true, true, 7 ); } if( rank == 8 ) { SCOPED_TRACE( "Down Right" ); - checkDownBoundary( *gridPtr, *dof, true, false, 8 ); - checkRightBoundary( *gridPtr, *dof, true, false, -7 ); + checkDownBoundary( *localGrid, dof, true, false, 8 ); + checkRightBoundary( *localGrid, dof, true, false, -7 ); } } */ + +TEST_F(DistributedGridTest_2D, PVTIWriterReader) +{ + // create a .pvti file (only rank 0 actually writes to the file) + const std::string baseName = "DistributedGridTest_2D_" + std::to_string(nproc) + "proc"; + const std::string mainFilePath = baseName + ".pvti"; + std::string subfilePath; + { + std::ofstream file; + if( TNL::MPI::GetRank() == 0 ) + file.open( mainFilePath ); + using PVTI = Meshes::Writers::PVTIWriter< GridType >; + PVTI pvti( file ); + pvti.writeImageData( *distributedGrid ); + // TODO +// if( mesh.getGhostLevels() > 0 ) { +// pvti.template writePPointData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// pvti.template writePCellData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// } + subfilePath = pvti.addPiece( mainFilePath, *distributedGrid ); + + // create a .vti file for local data + using Writer = Meshes::Writers::VTIWriter< GridType >; + std::ofstream subfile( subfilePath ); + Writer writer( subfile ); + writer.writeImageData( *localGrid ); + // TODO +// if( mesh.getGhostLevels() > 0 ) { +// writer.writePointData( mesh.vtkPointGhostTypes(), Meshes::VTK::ghostArrayName() ); +// writer.writeCellData( mesh.vtkCellGhostTypes(), Meshes::VTK::ghostArrayName() ); +// } + + // end of scope closes the files + } + + // load and test + TNL::MPI::Barrier(); + Readers::PVTIReader reader( mainFilePath ); + reader.detectMesh(); + EXPECT_EQ( reader.getMeshType(), "Meshes::DistributedGrid" ); + DistributedMesh< GridType > loadedGrid; + reader.loadMesh( loadedGrid ); + EXPECT_EQ( loadedGrid, *distributedGrid ); + + // cleanup + EXPECT_EQ( fs::remove( subfilePath ), true ); + TNL::MPI::Barrier(); + if( TNL::MPI::GetRank() == 0 ) { + EXPECT_EQ( fs::remove( mainFilePath ), true ); + EXPECT_EQ( fs::remove( baseName ), true ); + } +} + +TEST_F(DistributedGridTest_2D, readDistributedMeshFunction) +{ + const std::string baseName = "DistributedGridTest_MeshFunction_2D_" + std::to_string(nproc) + "proc.pvti"; + const std::string mainFilePath = baseName + ".pvti"; + + // evaluate a function + dof.setValue( -1 ); + constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr, constFunctionPtr ); + + // write the mesh function into a .pvti file + EXPECT_TRUE( writeDistributedMeshFunction( *distributedGrid, *meshFunctionPtr, "foo", mainFilePath ) ); + + // wait for rank 0 to write the main .pvti file + TNL::MPI::Barrier(); + + // load the mesh function from the .pvti file + DofType loadedDof; + loadedDof.setLike( dof ); + loadedDof.setValue( -2 ); + MeshFunctionType loadedMeshFunction; + loadedMeshFunction.bind( localGrid, loadedDof ); + EXPECT_TRUE( readDistributedMeshFunction( *distributedGrid, loadedMeshFunction, "foo", mainFilePath ) ); + + // compare the dofs (MeshFunction and MeshFunctionView do not have operator==) +// EXPECT_EQ( loadedMeshFunction, *meshFunctionPtr ); + EXPECT_EQ( loadedDof, dof ); + + // cleanup + TNL::MPI::Barrier(); + if( TNL::MPI::GetRank() == 0 ) { + EXPECT_TRUE( fs::remove( mainFilePath ) ); + EXPECT_GT( fs::remove_all( baseName ), 1 ); + } +} #endif #endif diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_3D.cpp b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_3D.cpp index 4f552dee5455c576111c60d783aee34d45aeb213..e60471ce43471b8a24c5813109740ac493108fa4 100644 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_3D.cpp +++ b/src/UnitTests/Meshes/DistributedMeshes/DistributedGridTest_3D.cpp @@ -3,13 +3,19 @@ #ifdef HAVE_MPI +#include <experimental/filesystem> + #include <TNL/Functions/MeshFunctionView.h> #include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> #include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> #include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> +#include <TNL/Meshes/Writers/PVTIWriter.h> +#include <TNL/Meshes/Readers/PVTIReader.h> #include "../../Functions/Functions.h" +namespace fs = std::experimental::filesystem; + using namespace TNL; using namespace TNL::Containers; using namespace TNL::Meshes; @@ -600,15 +606,15 @@ typedef typename GridType::PointType PointType; typedef DistributedMesh<GridType> DistributedGridType; using Synchronizer = DistributedMeshSynchronizer< DistributedGridType >; -class DistributedGirdTest_3D : public ::testing::Test +class DistributedGridTest_3D : public ::testing::Test { protected: DistributedGridType *distributedGrid; - DofType *dof; + DofType dof; - Pointers::SharedPointer<GridType> gridptr; - Pointers::SharedPointer<MeshFunctionType> meshFunctionptr; + Pointers::SharedPointer<GridType> localGrid; + Pointers::SharedPointer<MeshFunctionType> meshFunctionPtr; MeshFunctionEvaluator< MeshFunctionType, ConstFunction<double,3> > constFunctionEvaluator; Pointers::SharedPointer< ConstFunction<double,3>, Host > constFunctionPtr; @@ -643,83 +649,170 @@ class DistributedGirdTest_3D : public ::testing::Test distributedGrid=new DistributedGridType(); distributedGrid->setDomainDecomposition( typename DistributedGridType::CoordinatesType( 3, 3, 3 ) ); distributedGrid->setGlobalGrid( globalGrid ); - distributedGrid->setupGrid(*gridptr); typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; SubdomainOverlapsGetter< GridType >:: getOverlaps( distributedGrid, lowerOverlap, upperOverlap, 1 ); distributedGrid->setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid->setupGrid(*gridptr); - dof=new DofType(gridptr->template getEntitiesCount< Cell >()); + // FIXME: DistributedGrid does not have a SharedPointer of the local grid, + // the MeshFunction interface is fucked up (it should not require us to put SharedPointer everywhere) + *localGrid = distributedGrid->getLocalMesh(); + + dof.setSize( localGrid->template getEntitiesCount< Cell >() ); - meshFunctionptr->bind(gridptr,*dof); + meshFunctionPtr->bind(localGrid,dof); constFunctionPtr->Number=rank; } void TearDown() { - delete dof; delete distributedGrid; } }; -TEST_F(DistributedGirdTest_3D, evaluateAllEntities) +TEST_F(DistributedGridTest_3D, evaluateAllEntities) { //Check Traversars //All entities, witout overlap - setDof_3D(*dof,-1); - constFunctionEvaluator.evaluateAllEntities( meshFunctionptr , constFunctionPtr ); - //Printer<GridType,DofType>::print_dof(rank,*gridptr,*dof); - check_Boundary_3D(rank, *gridptr, *dof, rank); - check_Overlap_3D(rank, *gridptr, *dof, -1); - check_Inner_3D(rank, *gridptr, *dof, rank); + setDof_3D(dof,-1); + constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr , constFunctionPtr ); + check_Boundary_3D(rank, *localGrid, dof, rank); + check_Overlap_3D(rank, *localGrid, dof, -1); + check_Inner_3D(rank, *localGrid, dof, rank); } -TEST_F(DistributedGirdTest_3D, evaluateBoundaryEntities) +TEST_F(DistributedGridTest_3D, evaluateBoundaryEntities) { //Boundary entities, witout overlap - setDof_3D(*dof,-1); - constFunctionEvaluator.evaluateBoundaryEntities( meshFunctionptr , constFunctionPtr ); - check_Boundary_3D(rank, *gridptr, *dof, rank); - check_Overlap_3D(rank, *gridptr, *dof, -1); - check_Inner_3D(rank, *gridptr, *dof, -1); + setDof_3D(dof,-1); + constFunctionEvaluator.evaluateBoundaryEntities( meshFunctionPtr , constFunctionPtr ); + check_Boundary_3D(rank, *localGrid, dof, rank); + check_Overlap_3D(rank, *localGrid, dof, -1); + check_Inner_3D(rank, *localGrid, dof, -1); } -TEST_F(DistributedGirdTest_3D, evaluateInteriorEntities) +TEST_F(DistributedGridTest_3D, evaluateInteriorEntities) { //Inner entities, witout overlap - setDof_3D(*dof,-1); - constFunctionEvaluator.evaluateInteriorEntities( meshFunctionptr , constFunctionPtr ); - check_Boundary_3D(rank, *gridptr, *dof, -1); - check_Overlap_3D(rank, *gridptr, *dof, -1); - check_Inner_3D(rank, *gridptr, *dof, rank); + setDof_3D(dof,-1); + constFunctionEvaluator.evaluateInteriorEntities( meshFunctionPtr , constFunctionPtr ); + check_Boundary_3D(rank, *localGrid, dof, -1); + check_Overlap_3D(rank, *localGrid, dof, -1); + check_Inner_3D(rank, *localGrid, dof, rank); } -TEST_F(DistributedGirdTest_3D, LinearFunctionTest) +TEST_F(DistributedGridTest_3D, LinearFunctionTest) { //fill meshfunction with linear function (physical center of cell corresponds with its coordinates in grid) - setDof_3D(*dof,-1); - linearFunctionEvaluator.evaluateAllEntities(meshFunctionptr, linearFunctionPtr); + setDof_3D(dof,-1); + linearFunctionEvaluator.evaluateAllEntities(meshFunctionPtr, linearFunctionPtr); Synchronizer synchronizer; - synchronizer.setDistributedGrid( meshFunctionptr->getMesh().getDistributedMesh() ); - synchronizer.synchronize( *meshFunctionptr ); + synchronizer.setDistributedGrid( distributedGrid ); + synchronizer.synchronize( *meshFunctionPtr ); - int count =gridptr->template getEntitiesCount< Cell >(); + int count =localGrid->template getEntitiesCount< Cell >(); for(int i=0;i<count;i++) { - auto entity= gridptr->template getEntity< Cell >(i); + auto entity= localGrid->template getEntity< Cell >(i); entity.refresh(); - EXPECT_EQ(meshFunctionptr->getValue(entity), (*linearFunctionPtr)(entity)) << "Linear function doesnt fit recievd data. " << entity.getCoordinates().x() << " "<<entity.getCoordinates().y() << " "<< gridptr->getDimensions().x() <<" "<<gridptr->getDimensions().y(); + EXPECT_EQ(meshFunctionPtr->getValue(entity), (*linearFunctionPtr)(entity)) << "Linear function doesnt fit recievd data. " << entity.getCoordinates().x() << " "<<entity.getCoordinates().y() << " "<< localGrid->getDimensions().x() <<" "<<localGrid->getDimensions().y(); } } /* not implemented -TEST_F(DistributedGirdTest_3D, SynchronizerNeighborTest) +TEST_F(DistributedGridTest_3D, SynchronizerNeighborTest) { } */ + +TEST_F(DistributedGridTest_3D, PVTIWriterReader) +{ + // create a .pvti file (only rank 0 actually writes to the file) + const std::string baseName = "DistributedGridTest_3D_" + std::to_string(nproc) + "proc"; + const std::string mainFilePath = baseName + ".pvti"; + std::string subfilePath; + { + std::ofstream file; + if( TNL::MPI::GetRank() == 0 ) + file.open( mainFilePath ); + using PVTI = Meshes::Writers::PVTIWriter< GridType >; + PVTI pvti( file ); + pvti.writeImageData( *distributedGrid ); + // TODO +// if( mesh.getGhostLevels() > 0 ) { +// pvti.template writePPointData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// pvti.template writePCellData< std::uint8_t >( Meshes::VTK::ghostArrayName() ); +// } + subfilePath = pvti.addPiece( mainFilePath, *distributedGrid ); + + // create a .vti file for local data + using Writer = Meshes::Writers::VTIWriter< GridType >; + std::ofstream subfile( subfilePath ); + Writer writer( subfile ); + writer.writeImageData( *localGrid ); + // TODO +// if( mesh.getGhostLevels() > 0 ) { +// writer.writePointData( mesh.vtkPointGhostTypes(), Meshes::VTK::ghostArrayName() ); +// writer.writeCellData( mesh.vtkCellGhostTypes(), Meshes::VTK::ghostArrayName() ); +// } + + // end of scope closes the files + } + + // load and test + TNL::MPI::Barrier(); + Readers::PVTIReader reader( mainFilePath ); + reader.detectMesh(); + EXPECT_EQ( reader.getMeshType(), "Meshes::DistributedGrid" ); + DistributedMesh< GridType > loadedGrid; + reader.loadMesh( loadedGrid ); + EXPECT_EQ( loadedGrid, *distributedGrid ); + + // cleanup + EXPECT_EQ( fs::remove( subfilePath ), true ); + TNL::MPI::Barrier(); + if( TNL::MPI::GetRank() == 0 ) { + EXPECT_EQ( fs::remove( mainFilePath ), true ); + EXPECT_EQ( fs::remove( baseName ), true ); + } +} + +TEST_F(DistributedGridTest_3D, readDistributedMeshFunction) +{ + const std::string baseName = "DistributedGridTest_MeshFunction_3D_" + std::to_string(nproc) + "proc.pvti"; + const std::string mainFilePath = baseName + ".pvti"; + + // evaluate a function + dof.setValue( -1 ); + constFunctionEvaluator.evaluateAllEntities( meshFunctionPtr, constFunctionPtr ); + + // write the mesh function into a .pvti file + EXPECT_TRUE( writeDistributedMeshFunction( *distributedGrid, *meshFunctionPtr, "foo", mainFilePath ) ); + + // wait for rank 0 to write the main .pvti file + TNL::MPI::Barrier(); + + // load the mesh function from the .pvti file + DofType loadedDof; + loadedDof.setLike( dof ); + loadedDof.setValue( -2 ); + MeshFunctionType loadedMeshFunction; + loadedMeshFunction.bind( localGrid, loadedDof ); + EXPECT_TRUE( readDistributedMeshFunction( *distributedGrid, loadedMeshFunction, "foo", mainFilePath ) ); + + // compare the dofs (MeshFunction and MeshFunctionView do not have operator==) +// EXPECT_EQ( loadedMeshFunction, *meshFunctionPtr ); + EXPECT_EQ( loadedDof, dof ); + + // cleanup + TNL::MPI::Barrier(); + if( TNL::MPI::GetRank() == 0 ) { + EXPECT_TRUE( fs::remove( mainFilePath ) ); + EXPECT_GT( fs::remove_all( baseName ), 1 ); + } +} #endif #endif diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedVectorFieldIO_MPIIOTest.cpp b/src/UnitTests/Meshes/DistributedMeshes/DistributedVectorFieldIO_MPIIOTest.cpp deleted file mode 100644 index 9bdccbcdb7006c8f45f00865b2c3e6e60456095f..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedVectorFieldIO_MPIIOTest.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#ifdef HAVE_GTEST - #include <gtest/gtest.h> -#ifdef HAVE_MPI - -#include "DistributedVectorFieldIO_MPIIOTestBase.h" - -TEST( DistributedVectorFieldIO_MPIIO, Save_1D ) -{ - TestDistributedVectorFieldMPIIO<1,2,Host>::TestSave(); -} - -TEST( DistributedVectorFieldIO_MPIIO, Save_2D ) -{ - TestDistributedVectorFieldMPIIO<2,3,Host>::TestSave(); -} - -TEST( DistributedVectorFieldIO_MPIIO, Save_3D ) -{ - TestDistributedVectorFieldMPIIO<3,2,Host>::TestSave(); -} - - -TEST( DistributedVectorFieldIO_MPIIO, Load_1D ) -{ - TestDistributedVectorFieldMPIIO<1,2,Host>::TestLoad(); -} - -TEST( DistributedVectorFieldIO_MPIIO, Load_2D ) -{ - TestDistributedVectorFieldMPIIO<2,3,Host>::TestLoad(); -} - -TEST( DistributedVectorFieldIO_MPIIO, Load_3D ) -{ - TestDistributedVectorFieldMPIIO<3,2,Host>::TestLoad(); -} -#endif - -#endif - -#include "../../main_mpi.h" diff --git a/src/UnitTests/Meshes/DistributedMeshes/DistributedVectorFieldIO_MPIIOTestBase.h b/src/UnitTests/Meshes/DistributedMeshes/DistributedVectorFieldIO_MPIIOTestBase.h deleted file mode 100644 index d6791e1df9d27d9d89ef206c0d3be45288d80c3f..0000000000000000000000000000000000000000 --- a/src/UnitTests/Meshes/DistributedMeshes/DistributedVectorFieldIO_MPIIOTestBase.h +++ /dev/null @@ -1,190 +0,0 @@ -#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h> -#include <TNL/Functions/MeshFunctionView.h> -#include <TNL/Functions/VectorField.h> - -#ifdef HAVE_MPI - #define MPIIO -#endif -#include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h> -#include <TNL/Meshes/DistributedMeshes/DistributedGridIO.h> -#include <TNL/Meshes/DistributedMeshes/SubdomainOverlapsGetter.h> - - -#include "../../Functions/Functions.h" - -using namespace TNL::Containers; -using namespace TNL::Meshes; -using namespace TNL::Functions; -using namespace TNL::Devices; -using namespace TNL::Meshes::DistributedMeshes; - -//------------------------------------------------------------------------------ - -template <int dim, int vctdim, typename Device> -class TestDistributedVectorFieldMPIIO{ - public: - - typedef Grid<dim,double,Device,int> MeshType; - typedef MeshFunctionView<MeshType> MeshFunctionType; - typedef VectorField<vctdim,MeshFunctionType> VectorFieldType; - typedef Vector<double,Device,int> DofType; - typedef typename MeshType::Cell Cell; - typedef typename MeshType::IndexType IndexType; - typedef typename MeshType::PointType PointType; - typedef DistributedMesh<MeshType> DistributedGridType; - - typedef typename DistributedGridType::CoordinatesType CoordinatesType; - typedef LinearFunction<double,dim> LinearFunctionType; - - static void TestSave() - { - Pointers::SharedPointer< LinearFunctionType, Device > linearFunctionPtr; - MeshFunctionEvaluator< MeshFunctionType, LinearFunctionType > linearFunctionEvaluator; - - //save distributed meshfunction into file - PointType globalOrigin; - globalOrigin.setValue(-0.5); - - PointType globalProportions; - globalProportions.setValue(10); - - Pointers::SharedPointer<MeshType> globalGrid; - globalGrid->setDimensions(globalProportions); - globalGrid->setDomain(globalOrigin,globalProportions); - - DistributedGridType distributedGrid; - distributedGrid.setGlobalGrid( *globalGrid ); - - Pointers::SharedPointer<MeshType> gridptr; - distributedGrid.setupGrid(*gridptr); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; - SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); - distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); - distributedGrid.setupGrid(*gridptr); - - - ///std::cout << distributedGrid.printProcessDistr() <<std::endl; - - VectorFieldType vectorField; - - DofType dof(vctdim*(gridptr->template getEntitiesCount< Cell >())); - dof.setValue(0); - vectorField.bind(gridptr,dof); - - for(int i=0;i<vctdim;i++) - linearFunctionEvaluator.evaluateAllEntities(vectorField [ i ], linearFunctionPtr); - - String FileName=String("/tmp/test-file.tnl"); - DistributedGridIO_VectorField<VectorFieldType,MpiIO> ::save(FileName, vectorField ); - /*File file; - file.open( FileName, std::ios_base::out ); - vectorField.save(file); - file.close(); */ - - //first process compare results - if(TNL::MPI::GetRank()==0) - { - DofType globalEvaluatedDof(vctdim*(globalGrid->template getEntitiesCount< Cell >())); - - VectorFieldType globalEvaluatedvct; - globalEvaluatedvct.bind(globalGrid,globalEvaluatedDof); - for(int i=0;i<vctdim;i++) - linearFunctionEvaluator.evaluateAllEntities(globalEvaluatedvct[i] , linearFunctionPtr); - - - DofType loadDof(vctdim*(globalGrid->template getEntitiesCount< Cell >())); - VectorFieldType loadvct; - loadvct.bind(globalGrid,loadDof); - - loadDof.setValue(-1); - - File file; - file.open( FileName, std::ios_base::in ); - loadvct.boundLoad(file); - for(int i=0;i<loadDof.getSize();i++) - { - EXPECT_EQ( globalEvaluatedDof.getElement(i), loadDof.getElement(i)) << "Compare Loaded and evaluated Dof Failed for: "<< i; - } - } - }; - - static void TestLoad() - { - Pointers::SharedPointer< LinearFunctionType, Device > linearFunctionPtr; - MeshFunctionEvaluator< MeshFunctionType, LinearFunctionType > linearFunctionEvaluator; - - //Crete distributed grid - PointType globalOrigin; - globalOrigin.setValue(-0.5); - - PointType globalProportions; - globalProportions.setValue(50); - - Pointers::SharedPointer<MeshType> globalGrid; - globalGrid->setDimensions(globalProportions); - globalGrid->setDomain(globalOrigin,globalProportions); - - CoordinatesType overlap; - overlap.setValue(1); - DistributedGridType distributedGrid; - distributedGrid.setGlobalGrid(*globalGrid); - typename DistributedGridType::SubdomainOverlapsType lowerOverlap, upperOverlap; - SubdomainOverlapsGetter< MeshType >::getOverlaps( &distributedGrid, lowerOverlap, upperOverlap, 1 ); - distributedGrid.setOverlaps( lowerOverlap, upperOverlap ); - - - String FileName=String("/tmp/test-file.tnl"); - - //Prepare file - if(TNL::MPI::GetRank()==0) - { - DofType saveDof(vctdim*(globalGrid->template getEntitiesCount< Cell >())); - - VectorFieldType saveVectorField; - saveVectorField.bind(globalGrid,saveDof); - for(int i=0;i<vctdim;i++) - linearFunctionEvaluator.evaluateAllEntities(saveVectorField[i] , linearFunctionPtr); - - File file; - file.open( FileName, std::ios_base::out ); - saveVectorField.save(file); - file.close(); - } - - Pointers::SharedPointer<MeshType> loadGridptr; - VectorFieldType loadVectorField; - distributedGrid.setupGrid(*loadGridptr); - - DofType loadDof(vctdim*(loadGridptr->template getEntitiesCount< Cell >())); - loadDof.setValue(0); - loadVectorField.bind(loadGridptr,loadDof); - - DistributedGridIO_VectorField<VectorFieldType,MpiIO> ::load(FileName, loadVectorField ); - - DistributedMeshSynchronizer< DistributedGridType > synchronizer; - synchronizer.setDistributedGrid( &distributedGrid ); - - for(int i=0;i<vctdim;i++) - synchronizer.synchronize(*loadVectorField[i]); //need synchronization for overlaps to be filled corectly in loadDof - - Pointers::SharedPointer<MeshType> evalGridPtr; - VectorFieldType evalVectorField; - distributedGrid.setupGrid(*evalGridPtr); - - DofType evalDof(vctdim*(evalGridPtr->template getEntitiesCount< Cell >())); - evalDof.setValue(-1); - evalVectorField.bind(evalGridPtr,evalDof); - - for(int i=0;i<vctdim;i++) - { - linearFunctionEvaluator.evaluateAllEntities(evalVectorField[i] , linearFunctionPtr); - synchronizer.synchronize(*evalVectorField[i]); - } - - for(int i=0;i<evalDof.getSize();i++) - { - EXPECT_EQ( evalDof.getElement(i), loadDof.getElement(i)) << "Compare Loaded and evaluated Dof Failed for: "<< i; - } - - } -}; diff --git a/src/UnitTests/Meshes/MeshReaderTest.h b/src/UnitTests/Meshes/MeshReaderTest.h new file mode 100644 index 0000000000000000000000000000000000000000..9290057ddc490d3645e3d6c270aff4dfff5f83df --- /dev/null +++ b/src/UnitTests/Meshes/MeshReaderTest.h @@ -0,0 +1,130 @@ +#pragma once + +#include <gtest/gtest.h> + +#include <string> +#include <fstream> + +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> + +template< typename ReaderType, template<typename> class WriterType, typename MeshType > +void test_reader( const MeshType& mesh, std::string outputFileName ) +{ + // write the mesh into the file (new scope is needed to properly close the file) + { + std::ofstream file( outputFileName ); + WriterType< MeshType > writer( file ); + writer.writeEntities( mesh ); + } + + MeshType mesh_in; + ReaderType reader( outputFileName ); + reader.loadMesh( mesh_in ); + + EXPECT_EQ( mesh_in, mesh ); + + EXPECT_EQ( std::remove( outputFileName.c_str() ), 0 ); +} + +// Test that: +// 1. resolveMeshType resolves the mesh type correctly +// 2. resolveAndLoadMesh loads the mesh +template< template<typename> class WriterType, typename ConfigTag, typename MeshType > +void test_resolveAndLoadMesh( const MeshType& mesh, std::string outputFileName ) +{ + // write the mesh into the file (new scope is needed to properly close the file) + { + std::ofstream file( outputFileName ); + WriterType< MeshType > writer( file ); + writer.writeEntities( mesh ); + } + + auto wrapper = [&] ( TNL::Meshes::Readers::MeshReader& reader, auto&& mesh2 ) + { + using MeshType2 = std::decay_t< decltype(mesh2) >; + + // static_assert does not work, the wrapper is actually instantiated for all resolved types +// static_assert( std::is_same< MeshType2, MeshType >::value, "mesh type was not resolved as expected" ); + EXPECT_EQ( std::string( TNL::getType< MeshType2 >() ), std::string( TNL::getType< MeshType >() ) ); + + // operator== does not work for instantiations of the wrapper with MeshType2 != MeshType +// EXPECT_EQ( mesh2, mesh ); + std::stringstream str1, str2; + str1 << mesh; + str2 << mesh2; + EXPECT_EQ( str2.str(), str1.str() ); + + return true; + }; + + const bool status = TNL::Meshes::resolveAndLoadMesh< ConfigTag, TNL::Devices::Host >( wrapper, outputFileName ); + EXPECT_TRUE( status ); + + EXPECT_EQ( std::remove( outputFileName.c_str() ), 0 ); +} + +template< typename ReaderType, template<typename> class WriterType, typename MeshType > +void test_meshfunction( const MeshType& mesh, std::string outputFileName, std::string type = "PointData" ) +{ + using ArrayType = TNL::Containers::Array< std::int32_t >; + ArrayType array_scalars, array_vectors; + if( type == "PointData" ) { + array_scalars.setSize( 1 * mesh.template getEntitiesCount< 0 >() ); + array_vectors.setSize( 3 * mesh.template getEntitiesCount< 0 >() ); + } + else { + array_scalars.setSize( 1 * mesh.template getEntitiesCount< MeshType::getMeshDimension() >() ); + array_vectors.setSize( 3 * mesh.template getEntitiesCount< MeshType::getMeshDimension() >() ); + } + for( int i = 0; i < array_scalars.getSize(); i++ ) + array_scalars[i] = i; + for( int i = 0; i < array_vectors.getSize(); i++ ) + array_vectors[i] = i; + + // write the mesh into the file (new scope is needed to properly close the file) + { + std::ofstream file( outputFileName ); + WriterType< MeshType > writer( file ); + writer.writeMetadata( 42, 3.14 ); // cycle, time + writer.writeEntities( mesh ); + if( type == "PointData" ) { + writer.writePointData( array_scalars, "foo" ); + writer.writePointData( array_vectors, "bar", 3 ); + } + else { + writer.writeCellData( array_scalars, "foo" ); + writer.writeCellData( array_vectors, "bar", 3 ); + } + } + + MeshType mesh_in; + ReaderType reader( outputFileName ); + reader.loadMesh( mesh_in ); + EXPECT_EQ( mesh_in, mesh ); + + ArrayType array_scalars_in, array_vectors_in; + typename ReaderType::VariantVector variant_scalars, variant_vectors; + if( type == "PointData" ) { + variant_scalars = reader.readPointData( "foo" ); + variant_vectors = reader.readPointData( "bar" ); + } + else { + variant_scalars = reader.readCellData( "foo" ); + variant_vectors = reader.readCellData( "bar" ); + } + using mpark::visit; + visit( [&array_scalars_in](auto&& vector) { + array_scalars_in = vector; + }, + variant_scalars + ); + visit( [&array_vectors_in](auto&& vector) { + array_vectors_in = vector; + }, + variant_vectors + ); + EXPECT_EQ( array_scalars_in, array_scalars ); + EXPECT_EQ( array_vectors_in, array_vectors ); + + EXPECT_EQ( std::remove( outputFileName.c_str() ), 0 ); +} diff --git a/src/UnitTests/Meshes/MeshTest.h b/src/UnitTests/Meshes/MeshTest.h index 788c2172a1c16c8dccbd75f6f2ee561cc3ea3522..aa5d4cfda423a32ae8ec040305c491daef9a04c3 100644 --- a/src/UnitTests/Meshes/MeshTest.h +++ b/src/UnitTests/Meshes/MeshTest.h @@ -27,8 +27,6 @@ using RealType = double; using Device = Devices::Host; using IndexType = int; -static const char* TEST_FILE_NAME = "test_MeshTest.tnl"; - class TestTriangleMeshConfig : public DefaultConfig< Topologies::Triangle > { public: @@ -81,6 +79,8 @@ void testCopyAssignment( const Object& obj ) Object new_obj_2; new_obj_2 = obj; EXPECT_EQ( new_obj_2, obj ); + + compareStringRepresentation( obj, new_obj_1 ); } template< typename Mesh > @@ -106,30 +106,12 @@ void testMeshOnCuda( const Mesh& mesh ) Mesh mesh3; mesh3 = dmesh1; EXPECT_EQ( mesh2, mesh ); - - // test load from file to CUDA - ASSERT_NO_THROW( mesh.save( TEST_FILE_NAME ) ); - ASSERT_NO_THROW( dmesh1.load( TEST_FILE_NAME ) ); - EXPECT_EQ( dmesh1, mesh ); - - // test save into file from CUDA - ASSERT_NO_THROW( dmesh1.save( TEST_FILE_NAME ) ); - ASSERT_NO_THROW( mesh2.load( TEST_FILE_NAME ) ); - EXPECT_EQ( mesh2, mesh ); - - EXPECT_EQ( std::remove( TEST_FILE_NAME ), 0 ); #endif } template< typename Mesh > void testFinishedMesh( const Mesh& mesh ) { - Mesh mesh2; - ASSERT_NO_THROW( mesh.save( TEST_FILE_NAME ) ); - ASSERT_NO_THROW( mesh2.load( TEST_FILE_NAME ) ); - EXPECT_EQ( std::remove( TEST_FILE_NAME ), 0 ); - ASSERT_EQ( mesh, mesh2 ); - compareStringRepresentation( mesh, mesh2 ); testCopyAssignment( mesh ); testMeshOnCuda( mesh ); testEntities( mesh ); diff --git a/src/UnitTests/Meshes/NetgenReaderTest.cpp b/src/UnitTests/Meshes/NetgenReaderTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d7caa9957b0c908109e3d055ee66a72652848686 --- /dev/null +++ b/src/UnitTests/Meshes/NetgenReaderTest.cpp @@ -0,0 +1,122 @@ +#ifdef HAVE_GTEST +#include <gtest/gtest.h> + +#include <TNL/Meshes/Readers/NetgenReader.h> +#include <TNL/Meshes/Writers/NetgenWriter.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> + +#include "data/loader.h" + +using namespace TNL::Meshes; + +static const char* TEST_FILE_NAME = "test_NetgenReaderTest.ng"; + +struct MyConfigTag {}; + +namespace TNL { +namespace Meshes { +namespace BuildConfigTags { + +// disable all grids +template< int Dimension, typename Real, typename Device, typename Index > +struct GridTag< MyConfigTag, Grid< Dimension, Real, Device, Index > >{ enum { enabled = false }; }; + +// enable meshes used in the tests +//template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Edge > { enum { enabled = true }; }; +template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Triangle > { enum { enabled = true }; }; +template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Tetrahedron > { enum { enabled = true }; }; + +} // namespace BuildConfigTags +} // namespace Meshes +} // namespace TNL + +template< typename MeshType > +void test_NetgenReader( const MeshType& mesh ) +{ + // write the mesh into the file (new scope is needed to properly close the file) + { + std::ofstream file( TEST_FILE_NAME ); + Writers::NetgenWriter< MeshType > writer; + writer.writeMesh( mesh, file ); + } + + MeshType mesh_in; + Readers::NetgenReader reader( TEST_FILE_NAME ); + reader.loadMesh( mesh_in ); + + EXPECT_EQ( mesh_in, mesh ); + + EXPECT_EQ( std::remove( TEST_FILE_NAME ), 0 ); +} + +// Test that: +// 1. resolveMeshType resolves the mesh type correctly +// 2. resolveAndLoadMesh loads the mesh +template< typename ConfigTag, typename MeshType > +void test_resolveAndLoadMesh( const MeshType& mesh ) +{ + // write the mesh into the file (new scope is needed to properly close the file) + { + std::ofstream file( TEST_FILE_NAME ); + Writers::NetgenWriter< MeshType > writer; + writer.writeMesh( mesh, file ); + } + + auto wrapper = [&] ( Readers::MeshReader& reader, auto&& mesh2 ) + { + using MeshType2 = std::decay_t< decltype(mesh2) >; + + // static_assert does not work, the wrapper is actually instantiated for all resolved types +// static_assert( std::is_same< MeshType2, MeshType >::value, "mesh type was not resolved as expected" ); + EXPECT_EQ( std::string( TNL::getType< MeshType2 >() ), std::string( TNL::getType< MeshType >() ) ); + + // operator== does not work for instantiations of the wrapper with MeshType2 != MeshType +// EXPECT_EQ( mesh2, mesh ); + std::stringstream str1, str2; + str1 << mesh; + str2 << mesh2; + EXPECT_EQ( str2.str(), str1.str() ); + + return true; + }; + + const bool status = resolveAndLoadMesh< ConfigTag, TNL::Devices::Host >( wrapper, TEST_FILE_NAME ); + EXPECT_TRUE( status ); + + EXPECT_EQ( std::remove( TEST_FILE_NAME ), 0 ); +} + +// TODO: test case for 1D mesh of edges + +TEST( NetgenReaderTest, triangles ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::NetgenReader >( "triangles/netgen_square.ng" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 289 ); + EXPECT_EQ( cells, 512 ); + + test_NetgenReader( mesh ); + test_resolveAndLoadMesh< MyConfigTag >( mesh ); +} + +TEST( NetgenReaderTest, tetrahedrons ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Tetrahedron > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::NetgenReader >( "tetrahedrons/netgen_cube.ng" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 4913 ); + EXPECT_EQ( cells, 24576 ); + + test_NetgenReader( mesh ); + test_resolveAndLoadMesh< MyConfigTag >( mesh ); +} +#endif + +#include "../main.h" diff --git a/src/UnitTests/Meshes/VTIReaderTest.cpp b/src/UnitTests/Meshes/VTIReaderTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3b41a3b7020c5c42b437fa42e7162f7151614a9d --- /dev/null +++ b/src/UnitTests/Meshes/VTIReaderTest.cpp @@ -0,0 +1,82 @@ +#ifdef HAVE_GTEST +#include <gtest/gtest.h> + +#include <TNL/Meshes/Readers/VTIReader.h> +#include <TNL/Meshes/Writers/VTIWriter.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> + +#include "MeshReaderTest.h" + +using namespace TNL::Meshes; + +static const char* TEST_FILE_NAME = "test_VTIReaderTest.vti"; + +struct MyConfigTag {}; + +namespace TNL { +namespace Meshes { +namespace BuildConfigTags { + +// enable all index types in the GridTypeResolver +template<> struct GridIndexTag< MyConfigTag, short int >{ enum { enabled = true }; }; +template<> struct GridIndexTag< MyConfigTag, int >{ enum { enabled = true }; }; +template<> struct GridIndexTag< MyConfigTag, long int >{ enum { enabled = true }; }; + +// disable float and long double (RealType is not stored in VTI and double is the default) +template<> struct GridRealTag< MyConfigTag, float > { enum { enabled = false }; }; +template<> struct GridRealTag< MyConfigTag, long double > { enum { enabled = false }; }; + +} // namespace BuildConfigTags +} // namespace Meshes +} // namespace TNL + +TEST( VTIReaderTest, Grid1D ) +{ + using GridType = Grid< 1, double, TNL::Devices::Host, short int >; + using PointType = GridType::PointType; + using CoordinatesType = GridType::CoordinatesType; + + GridType grid; + grid.setDomain( PointType( 1 ), PointType( 2 ) ); + grid.setDimensions( CoordinatesType( 10 ) ); + + test_reader< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTIWriter, MyConfigTag >( grid, TEST_FILE_NAME ); + test_meshfunction< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME, "CellData" ); +} + +TEST( VTIReaderTest, Grid2D ) +{ + using GridType = Grid< 2, double, TNL::Devices::Host, int >; + using PointType = GridType::PointType; + using CoordinatesType = GridType::CoordinatesType; + + GridType grid; + grid.setDomain( PointType( 1, 2 ), PointType( 3, 4 ) ); + grid.setDimensions( CoordinatesType( 10, 20 ) ); + + test_reader< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTIWriter, MyConfigTag >( grid, TEST_FILE_NAME ); + test_meshfunction< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME, "CellData" ); +} + +TEST( VTIReaderTest, Grid3D ) +{ + using GridType = Grid< 3, double, TNL::Devices::Host, long int >; + using PointType = GridType::PointType; + using CoordinatesType = GridType::CoordinatesType; + + GridType grid; + grid.setDomain( PointType( 1, 2, 3 ), PointType( 4, 5, 6 ) ); + grid.setDimensions( CoordinatesType( 10, 20, 30 ) ); + + test_reader< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTIWriter, MyConfigTag >( grid, TEST_FILE_NAME ); + test_meshfunction< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTIReader, Writers::VTIWriter >( grid, TEST_FILE_NAME, "CellData" ); +} +#endif + +#include "../main.h" diff --git a/src/UnitTests/Meshes/VTKReaderTest.cpp b/src/UnitTests/Meshes/VTKReaderTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5bb27c5901c3fd9fec59e6c9bb7aff65126d48ac --- /dev/null +++ b/src/UnitTests/Meshes/VTKReaderTest.cpp @@ -0,0 +1,129 @@ +#ifdef HAVE_GTEST +#include <gtest/gtest.h> + +#include <TNL/Meshes/Readers/VTKReader.h> +#include <TNL/Meshes/Writers/VTKWriter.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> + +#include "data/loader.h" +#include "MeshReaderTest.h" + +using namespace TNL::Meshes; + +static const char* TEST_FILE_NAME = "test_VTKReaderTest.vtk"; + +struct MyConfigTag {}; + +namespace TNL { +namespace Meshes { +namespace BuildConfigTags { + +// disable all grids +template< int Dimension, typename Real, typename Device, typename Index > +struct GridTag< MyConfigTag, Grid< Dimension, Real, Device, Index > >{ enum { enabled = false }; }; + +// enable meshes used in the tests +//template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Edge > { enum { enabled = true }; }; +template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Triangle > { enum { enabled = true }; }; +template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Tetrahedron > { enum { enabled = true }; }; + +} // namespace BuildConfigTags +} // namespace Meshes +} // namespace TNL + +// TODO: test case for 1D mesh of edges + +// ASCII data, produced by Gmsh +TEST( VTKReaderTest, mrizka_1 ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTKReader >( "triangles/mrizka_1.vtk" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 142 ); + EXPECT_EQ( cells, 242 ); + + test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// ASCII data, produced by Gmsh +TEST( VTKReaderTest, tetrahedrons ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Tetrahedron > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTKReader >( "tetrahedrons/cube1m_1.vtk" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 395 ); + EXPECT_EQ( cells, 1312 ); + + test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// binary data, produced by RF writer +TEST( VTKReaderTest, triangles_2x2x2_original_with_metadata_and_cell_data ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTKReader >( "triangles_2x2x2/original_with_metadata_and_cell_data.vtk" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// ASCII data, produced by TNL writer +TEST( VTKReaderTest, triangles_2x2x2_minimized_ascii ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTKReader >( "triangles_2x2x2/minimized_ascii.vtk" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// binary data, produced by TNL writer +TEST( VTKReaderTest, triangles_2x2x2_minimized_binary ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTKReader >( "triangles_2x2x2/minimized_binary.vtk" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// TODO: test case for DataFile version 5.1: triangles_2x2x2/DataFile_version_5.1_exported_from_paraview.vtk +#endif + +#include "../main.h" diff --git a/src/UnitTests/Meshes/VTUReaderTest.cpp b/src/UnitTests/Meshes/VTUReaderTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d3d4391e8e40a7d1bd3e9318543366ba803d11d9 --- /dev/null +++ b/src/UnitTests/Meshes/VTUReaderTest.cpp @@ -0,0 +1,182 @@ +#ifdef HAVE_GTEST +#include <gtest/gtest.h> + +#include <TNL/Meshes/Readers/VTUReader.h> +#include <TNL/Meshes/Writers/VTUWriter.h> +#include <TNL/Meshes/TypeResolver/resolveMeshType.h> + +#include "data/loader.h" +#include "MeshReaderTest.h" + +using namespace TNL::Meshes; + +static const char* TEST_FILE_NAME = "test_VTUReaderTest.vtu"; + +struct MyConfigTag {}; + +namespace TNL { +namespace Meshes { +namespace BuildConfigTags { + +// disable all grids +template< int Dimension, typename Real, typename Device, typename Index > +struct GridTag< MyConfigTag, Grid< Dimension, Real, Device, Index > >{ enum { enabled = false }; }; + +// enable meshes used in the tests +//template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Edge > { enum { enabled = true }; }; +template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Triangle > { enum { enabled = true }; }; +template<> struct MeshCellTopologyTag< MyConfigTag, Topologies::Tetrahedron > { enum { enabled = true }; }; + +} // namespace BuildConfigTags +} // namespace Meshes +} // namespace TNL + +TEST( VTUReaderTest, empty ) +{ + // the cell topology does not matter for an empty mesh + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "empty.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 0 ); + EXPECT_EQ( cells, 0 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + // resolveAndLoadMesh cannot be tested since the empty mesh has Topologies::Vertex as cell topology +// test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// TODO: test case for 1D mesh of edges + +TEST( VTUReaderTest, mrizka_1 ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "triangles/mrizka_1.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 142 ); + EXPECT_EQ( cells, 242 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +TEST( VTUReaderTest, tetrahedrons ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Tetrahedron > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "tetrahedrons/cube1m_1.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 395 ); + EXPECT_EQ( cells, 1312 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// ASCII data, produced by TNL writer +TEST( VTUReaderTest, triangles_2x2x2_minimized_ascii ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "triangles_2x2x2/minimized_ascii.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// encoded data, produced by TNL writer +TEST( VTUReaderTest, triangles_2x2x2_minimized_encoded_tnl ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "triangles_2x2x2/minimized_encoded_tnl.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// encoded data, produced by Paraview +TEST( VTUReaderTest, triangles_2x2x2_minimized_encoded_paraview ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "triangles_2x2x2/minimized_encoded_paraview.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// compressed data, produced by TNL +TEST( VTUReaderTest, triangles_2x2x2_minimized_compressed_tnl ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "triangles_2x2x2/minimized_compressed_tnl.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// compressed data, produced by Paraview +TEST( VTUReaderTest, triangles_2x2x2_minimized_compressed_paraview ) +{ + using MeshType = Mesh< DefaultConfig< Topologies::Triangle > >; + const MeshType mesh = loadMeshFromFile< MeshType, Readers::VTUReader >( "triangles_2x2x2/minimized_compressed_paraview.vtu" ); + + // test that the mesh was actually loaded + const auto vertices = mesh.template getEntitiesCount< 0 >(); + const auto cells = mesh.template getEntitiesCount< MeshType::getMeshDimension() >(); + EXPECT_EQ( vertices, 9 ); + EXPECT_EQ( cells, 8 ); + + test_reader< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME ); + test_resolveAndLoadMesh< Writers::VTUWriter, MyConfigTag >( mesh, TEST_FILE_NAME ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "PointData" ); + test_meshfunction< Readers::VTUReader, Writers::VTUWriter >( mesh, TEST_FILE_NAME, "CellData" ); +} + +// TODO: test cases for the appended data block: minimized_appended_binary_compressed.vtu, minimized_appended_binary.vtu, minimized_appended_encoded_compressed.vtu, minimized_appended_encoded.vtu +#endif + +#include "../main.h" diff --git a/src/UnitTests/Meshes/data/empty.vtu b/src/UnitTests/Meshes/data/empty.vtu new file mode 100644 index 0000000000000000000000000000000000000000..8f8cce72adabb58690376b0b0793216c24f1262e --- /dev/null +++ b/src/UnitTests/Meshes/data/empty.vtu @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64" compressor="vtkZLibDataCompressor"> +<UnstructuredGrid> +<Piece NumberOfPoints="0" NumberOfCells="0"> +<Points> +<DataArray type="Float64" Name="Points" NumberOfComponents="3" format="binary"> +</DataArray> +</Points> +<Cells> +<DataArray type="Int32" Name="connectivity" format="binary"> +</DataArray> +<DataArray type="Int32" Name="offsets" format="binary"> +</DataArray> +<DataArray type="UInt8" Name="types" format="binary"> +</DataArray> +</Cells> +<PointData> +<DataArray type="UInt8" Name="vtkGhostType" NumberOfComponents="1" format="binary"> +</DataArray> +<DataArray type="Int32" Name="GlobalIndex" NumberOfComponents="1" format="binary"> +</DataArray> +</PointData> +<CellData> +<DataArray type="UInt8" Name="vtkGhostType" NumberOfComponents="1" format="binary"> +</DataArray> +<DataArray type="Int32" Name="GlobalIndex" NumberOfComponents="1" format="binary"> +</DataArray> +</CellData> +</Piece> +</UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/loader.h b/src/UnitTests/Meshes/data/loader.h new file mode 100644 index 0000000000000000000000000000000000000000..451ce8690a6df0c835f8f4357d12add3279e5f60 --- /dev/null +++ b/src/UnitTests/Meshes/data/loader.h @@ -0,0 +1,22 @@ +#pragma once + +#include <iostream> +#include <string> +#include <experimental/filesystem> + +#ifndef TNL_MESH_TESTS_DATA_DIR + #error "The TNL_MESH_TESTS_DATA_DIR macro is not defined." +#endif + +template< typename MeshType, typename ReaderType > +MeshType loadMeshFromFile( std::string relative_path ) +{ + namespace fs = std::experimental::filesystem; + const fs::path full_path = fs::path( TNL_MESH_TESTS_DATA_DIR ) / fs::path( relative_path ); + std::cout << "Reading a mesh from file " << full_path << std::endl; + + MeshType mesh; + ReaderType reader( full_path ); + reader.loadMesh( mesh ); + return mesh; +} diff --git a/src/UnitTests/Meshes/data/tetrahedrons/cube1m_1.vtk b/src/UnitTests/Meshes/data/tetrahedrons/cube1m_1.vtk new file mode 100644 index 0000000000000000000000000000000000000000..56e55057864f6cc8809264883c4419f166353d28 --- /dev/null +++ b/src/UnitTests/Meshes/data/tetrahedrons/cube1m_1.vtk @@ -0,0 +1,3028 @@ +# vtk DataFile Version 2.0 +TNL DATA +ASCII +DATASET UNSTRUCTURED_GRID +POINTS 395 double +0 0 0.166666666666667 +0 0 0 +0 0 1 +0 0 0.833333333333333 +0 0.0833333333333333 0.916666666666667 +0 0 0.333333333333333 +0 0 0.666666666666667 +0 0.114583333333333 0.760416666666667 +0 1 0 +0 0.166666666666667 0 +0 0.0833333333333333 0.0833333333333333 +0 0.270833333333333 0.104166666666667 +0 0.333333333333333 0 +0 0.104166666666667 0.270833333333333 +0 0.5 0 +0 0.666666666666667 0 +0 0.166666666666667 1 +0 1 1 +0 0.229166666666667 0.854166666666667 +0 0.291666666666667 0.708333333333333 +0 0.125 0.583333333333333 +0 0.125 0.416666666666667 +0 0 0.5 +0 0.25 0.5 +0 0.371527666666667 0.586805666666667 +0 0.361111 0.395833333333333 +0 0.71875 0.0729166666666667 +0 0.916666666666667 0.0833333333333333 +0 0.833333333333333 0 +0 1 0.333333333333333 +0 1 0.166666666666667 +0 0.2951389 0.2818287 +0 0.347222333333333 0.180555566666667 +0 0.208333333333333 0.208333333333333 +0 0.458333333333333 0.125 +0 0.604166666666667 0.145833333333333 +0 1 0.833333333333333 +0 1 0.5 +0 1 0.666666666666667 +0 0.895833333333333 0.729166666666667 +0 0.916666666666667 0.916666666666667 +0 0.791666666666667 0.791666666666667 +0 0.729166666666667 0.895833333333333 +0 0.833333333333333 1 +0 0.333333333333333 1 +0 0.5 1 +0 0.666666666666667 1 +0 0.395833333333333 0.854166666666667 +0 0.430555666666667 0.75 +0 0.494213 0.621527666666667 +0 0.5 0.5 +0 0.569444333333333 0.25 +0 0.416666666666667 0.25 +0 0.483121 0.403067 +0 0.708333333333333 0.291666666666667 +0 0.854166666666667 0.229166666666667 +0 0.875 0.583333333333333 +0 0.875 0.416666666666667 +0 0.598379666666667 0.371527666666667 +0 0.75 0.5 +0 0.693287 0.706597333333333 +0 0.583333333333333 0.75 +0 0.598862 0.489872666666667 +0 0.638889 0.604166666666667 +0 0.625 0.875 +0 0.508680666666667 0.887152666666667 +0.166666666666667 0 0 +0.166666666666667 0 1 +0.135416666666667 0 0.84375 +0.0677083333333333 0 0.755208333333333 +0.5 0 0 +0.0677083333333333 0 0.244791666666667 +0.270833333333333 0 0.145833333333333 +0.135416666666667 0 0.15625 +0.333333333333333 0 0 +0.270833333333333 0 0.854166666666667 +0.333333333333333 0 1 +0.104166666666667 0 0.395833333333333 +0.104166666666667 0 0.604166666666667 +0.208333333333333 0 0.291666666666667 +0.5 0 1 +0.666666666666667 0 1 +0.208333333333333 0 0.708333333333333 +0.25 0 0.5 +0.361111 0 0.395833333333333 +0.361111 0 0.604166666666667 +1 0 1 +0.559027666666667 0 0.0902777666666667 +0.666666666666667 0 0 +0.729166666666667 0 0.104166666666667 +0.833333333333333 0 0 +0.916666666666667 0 0.0833333333333333 +1 0 0.166666666666667 +1 0 0 +1 0 0.333333333333333 +0.416666666666667 0 0.25 +0.458333333333333 0 0.125 +0.618055666666667 0 0.180555566666667 +0.416666666666667 0 0.75 +0.375 0 0.875 +0.491319333333333 0 0.887152666666667 +1 0 0.5 +1 0 0.833333333333333 +1 0 0.666666666666667 +0.569444333333333 0 0.361111 +0.645833333333333 0 0.476852 +0.916666666666667 0 0.916666666666667 +0.833333333333333 0 1 +0.770833333333333 0 0.854166666666667 +0.604166666666667 0 0.854166666666667 +0.569444333333333 0 0.75 +0.5 0 0.5 +0.483121 0 0.596933 +0.701967666666667 0 0.2835648 +0.791666666666667 0 0.208333333333333 +0.895833333333333 0 0.270833333333333 +0.875 0 0.375 +0.75 0 0.416666666666667 +0.598379666666667 0 0.628472333333333 +0.927083333333333 0 0.71875 +0.708333333333333 0 0.708333333333333 +0.75 0 0.569444333333333 +0.887152666666667 0 0.491319333333333 +0.854166666666667 0 0.604166666666667 +0.0833333333333333 0.0833333333333333 0 +0.078125 0.253472233333333 0 +0.270833333333333 0.104166666666667 0 +0.0833333333333333 0.916666666666667 0 +0.166666666666667 1 0 +0.755208333333333 0.0677083333333333 0 +0.604166666666667 0.104166666666667 0 +0.15625 0.340277666666667 0 +0.1171875 0.468171333333333 0 +0.114583333333333 0.760416666666667 0 +0.458333333333333 0.125 0 +0.208333333333333 0.208333333333333 0 +0.347222333333333 0.180555566666667 0 +0.125 0.583333333333333 0 +0.25 0.5 0 +0.3125 0.347222333333333 0 +0.416666666666667 0.25 0 +0.530382 0.2097801 0 +0.333333333333333 1 0 +0.84375 0.135416666666667 0 +1 0.166666666666667 0 +0.229166666666667 0.854166666666667 0 +1 0.333333333333333 0 +0.395833333333333 0.854166666666667 0 +0.708333333333333 0.208333333333333 0 +0.854166666666667 0.270833333333333 0 +0.875 0.375 0 +0.291666666666667 0.708333333333333 0 +0.364583333333333 0.474537 0 +0.339409666666667 0.614294 0 +0.477430666666667 0.368634333333333 0 +0.572916666666667 0.336805666666667 0 +0.447916666666667 0.690972333333333 0 +0.5 1 0 +1 0.5 0 +0.75 0.416666666666667 0 +0.868345 0.495659666666667 0 +0.508680666666667 0.887152666666667 0 +0.5 0.5 0 +0.627941666666667 0.480179333333333 0 +0.666666666666667 1 0 +0.934172333333333 0.581163333333333 0 +1 0.666666666666667 0 +0.642650333333333 0.589409666666667 0 +0.809027666666667 0.614583333333333 0 +0.583333333333333 0.75 0 +0.729166666666667 0.895833333333333 0 +0.625 0.875 0 +1 0.833333333333333 0 +0.916666666666667 0.916666666666667 0 +0.833333333333333 1 0 +0.895833333333333 0.729166666666667 0 +0.73247 0.677879 0 +0.791666666666667 0.791666666666667 0 +1 1 0 +0.0833333333333333 0.0833333333333333 1 +0.0694444333333333 0.25 1 +0.253472233333333 0.078125 1 +0.208333333333333 0.208333333333333 1 +0.5 0.125 1 +0.1388889 0.333333333333333 1 +0.0833333333333333 0.916666666666667 1 +0.166666666666667 1 1 +0.340277666666667 0.15625 1 +0.347222333333333 0.3125 1 +0.755208333333333 0.0677083333333333 1 +0.604166666666667 0.104166666666667 1 +0.84375 0.135416666666667 1 +1 0.166666666666667 1 +0.5 0.25 1 +0.0729166666666667 0.71875 1 +0.125 0.458333333333333 1 +0.145833333333333 0.604166666666667 1 +0.25 0.416666666666667 1 +0.474537 0.364583333333333 1 +0.229166666666667 0.854166666666667 1 +0.333333333333333 1 1 +0.708333333333333 0.208333333333333 1 +0.409818666666667 0.465277666666667 1 +0.854166666666667 0.270833333333333 1 +0.875 0.375 1 +1 0.333333333333333 1 +0.604166666666667 0.361111 1 +0.291666666666667 0.708333333333333 1 +0.309027766666667 0.552083333333333 1 +0.5 0.5 1 +0.395833333333333 0.854166666666667 1 +0.5 1 1 +0.75 0.416666666666667 1 +0.676745666666667 0.534561333333333 1 +0.887152666666667 0.491319333333333 1 +1 0.5 1 +0.5 0.673611 1 +0.586805666666667 0.615740666666667 1 +0.718460666666667 0.626350333333333 1 +0.604166666666667 0.854166666666667 1 +0.666666666666667 1 1 +0.854166666666667 0.604166666666667 1 +1 0.666666666666667 1 +0.708333333333333 0.708333333333333 1 +0.71875 0.927083333333333 1 +0.854166666666667 0.770833333333333 1 +1 0.833333333333333 1 +0.916666666666667 0.916666666666667 1 +0.833333333333333 1 1 +1 1 1 +0.0833333333333333 1 0.0833333333333333 +0.0833333333333333 1 0.916666666666667 +0.145833333333333 1 0.395833333333333 +0.145833333333333 1 0.229166666666667 +0.28125 1 0.0729166666666667 +0.395833333333333 1 0.145833333333333 +0.0729166666666667 1 0.71875 +0.145833333333333 1 0.604166666666667 +0.229166666666667 1 0.854166666666667 +0.3263889 1 0.5 +0.291666666666667 1 0.291666666666667 +0.447916666666667 1 0.309027766666667 +0.522569333333333 1 0.1545139 +0.625 1 0.125 +0.291666666666667 1 0.708333333333333 +0.398727 1 0.604166666666667 +0.395833333333333 1 0.854166666666667 +0.430555666666667 1 0.75 +0.5 1 0.5 +0.515673333333333 1 0.586805666666667 +0.534722333333333 1 0.410783333333333 +0.583333333333333 1 0.25 +0.729166666666667 1 0.145833333333333 +0.864583333333333 1 0.15625 +0.522569333333333 1 0.845486 +0.625 1 0.875 +0.583333333333333 1 0.75 +0.638889 1 0.604166666666667 +0.635416666666667 1 0.476852 +0.6875 1 0.361111 +0.791666666666667 1 0.291666666666667 +1 1 0.166666666666667 +0.932291666666667 1 0.244791666666667 +0.729166666666667 1 0.895833333333333 +0.791666666666667 1 0.791666666666667 +0.741898 1 0.678819333333333 +0.75 1 0.5 +0.895833333333333 1 0.395833333333333 +1 1 0.333333333333333 +0.916666666666667 1 0.916666666666667 +0.895833333333333 1 0.729166666666667 +0.875 1 0.583333333333333 +1 1 0.5 +1 1 0.833333333333333 +1 1 0.666666666666667 +1 0.0833333333333333 0.916666666666667 +1 0.104166666666667 0.270833333333333 +1 0.0833333333333333 0.0833333333333333 +1 0.253472233333333 0.078125 +1 0.125 0.375 +1 0.208333333333333 0.208333333333333 +1 0.340277666666667 0.15625 +1 0.1545139 0.477430666666667 +1 0.25 0.416666666666667 +1 0.145833333333333 0.604166666666667 +1 0.145833333333333 0.770833333333333 +1 0.28125 0.927083333333333 +1 0.347222333333333 0.3125 +1 0.356770666666667 0.443576333333333 +1 0.5 0.125 +1 0.5 0.25 +1 0.604166666666667 0.104166666666667 +1 0.309027766666667 0.552083333333333 +1 0.291666666666667 0.708333333333333 +1 0.395833333333333 0.854166666666667 +1 0.5 0.5 +1 0.521219 0.384838 +1 0.755208333333333 0.0677083333333333 +1 0.638889 0.3125 +1 0.708333333333333 0.208333333333333 +1 0.84375 0.135416666666667 +1 0.627314666666667 0.434027666666667 +1 0.604166666666667 0.854166666666667 +1 0.5 0.673611 +1 0.586805666666667 0.615740666666667 +1 0.75 0.416666666666667 +1 0.854166666666667 0.270833333333333 +1 0.71875 0.927083333333333 +1 0.725405 0.577739333333333 +1 0.708333333333333 0.708333333333333 +1 0.875 0.375 +1 0.845486 0.477430666666667 +1 0.916666666666667 0.916666666666667 +1 0.854166666666667 0.770833333333333 +1 0.854166666666667 0.604166666666667 +0.132864766666667 0.112200366666667 0.878546666666667 +0.123392733333333 0.163346166666667 0.709829 +0.0868652 0.192312133333333 0.114902166666667 +0.100911466666667 0.233411233333333 0.380201666666667 +0.205595833333333 0.142992966666667 0.2431486 +0.388151333333333 0.142189233333333 0.132247733333333 +0.1779755 0.301700533333333 0.840829333333333 +0.291647233333333 0.1447536 0.780925333333333 +0.107773233333333 0.335158666666667 0.622668666666667 +0.2018229 0.1716836 0.478574333333333 +0.409432333333333 0.136330866666667 0.432055333333333 +0.373363 0.118840233333333 0.606035666666667 +0.2903716 0.303210966666667 0.652455333333333 +0.643310333333333 0.113920266666667 0.118851933333333 +0.849582333333333 0.0886763333333333 0.130624166666667 +0.123732066666667 0.363109666666667 0.431841 +0.1203092 0.779615666666667 0.147680933333333 +0.180559766666667 0.385068333333333 0.1780962 +0.309365366666667 0.290209066666667 0.316490533333333 +0.195329933333333 0.606946666666667 0.158016733333333 +0.527498 0.180663266666667 0.2546999 +0.570604333333333 0.254398 0.1261457 +0.375705 0.293853033333333 0.1134835 +0.134893166666667 0.868629333333333 0.666142 +0.484375 0.193678866666667 0.775408666666667 +0.15625 0.771804 0.848325333333333 +0.158717866666667 0.498777 0.766031666666667 +0.356025333333333 0.374283333333333 0.830094333333333 +0.174166966666667 0.514377666666667 0.542005 +0.411872666666667 0.326619433333333 0.464318666666667 +0.645008 0.1382743 0.452308666666667 +0.843244 0.141799433333333 0.875397666666667 +0.655639333333333 0.218935166666667 0.815813333333333 +0.547950666666667 0.246778866666667 0.622002 +0.398239666666667 0.428765333333333 0.676145 +0.813367 0.1588801 0.287602233333333 +0.837024333333333 0.240235133333333 0.149298966666667 +0.846354 0.2101207 0.456136 +0.812067333333333 0.168045433333333 0.638021333333333 +0.187291266666667 0.557798333333333 0.36734 +0.157973033333333 0.799432333333333 0.400078666666667 +0.256881133333333 0.835627666666667 0.2191763 +0.446220666666667 0.861604666666667 0.151009 +0.783999666666667 0.391594 0.1299483 +0.412921666666667 0.474322 0.221943566666667 +0.663047666666667 0.350418 0.3002855 +0.416932333333333 0.684056333333333 0.1562433 +0.544085666666667 0.393211 0.1190117 +0.197916666666667 0.689441 0.623734 +0.3107894 0.891481666666667 0.5804 +0.3111994 0.824736 0.797229333333333 +0.547907 0.389798333333333 0.833311666666667 +0.248205766666667 0.602548 0.884484333333333 +0.435137 0.580310666666667 0.80398 +0.511132333333333 0.533772 0.510939 +0.695389 0.360219 0.530862333333333 +0.805197666666667 0.377927 0.797785666666667 +0.656520666666667 0.504088666666667 0.680343333333333 +0.843305666666667 0.429385666666667 0.354581 +0.879087666666667 0.43099 0.572886333333333 +0.452722 0.814224333333333 0.37721 +0.808117666666667 0.556827333333333 0.1862341 +0.645067666666667 0.858356 0.166249266666667 +0.637155666666667 0.592231333333333 0.220526633333333 +0.864432333333333 0.866542 0.0941157333333333 +0.492135666666667 0.829032 0.639440333333333 +0.493253666666667 0.797820666666667 0.856291666666667 +0.623358333333333 0.560652666666667 0.874013333333333 +0.796717333333333 0.564745333333333 0.875899666666667 +0.673172666666667 0.689957666666667 0.737854 +0.661144666666667 0.875461666666667 0.504337 +0.754635333333333 0.634669 0.517259 +0.874577333333333 0.60858 0.701975666666667 +0.921646666666667 0.617999 0.434912666666667 +0.847472 0.799295333333333 0.252498266666667 +0.680431333333333 0.888693 0.801821333333333 +0.876199666666667 0.745632333333333 0.858019 +0.848459666666667 0.833562 0.685681 +0.880153 0.838135 0.512566 +0.859583333333333 0.899597333333333 0.886078666666667 + +CELLS 1312 6560 +4 179 3 2 4 +4 2 67 68 179 +4 179 2 3 68 +4 6 7 3 69 +4 0 13 5 71 +4 0 10 13 71 +4 0 73 10 71 +4 1 10 0 73 +4 1 9 10 124 +4 1 10 73 124 +4 1 73 66 124 +4 9 12 11 125 +4 66 124 73 126 +4 66 73 72 126 +4 66 72 74 126 +4 2 4 16 179 +4 179 315 3 4 +4 16 4 18 315 +4 3 4 315 7 +4 16 179 4 315 +4 179 3 315 68 +4 4 7 18 315 +4 3 315 69 7 +4 16 18 180 315 +4 3 69 315 68 +4 16 180 179 315 +4 67 68 179 315 +4 67 315 75 68 +4 76 75 67 181 +4 67 179 181 315 +4 67 75 315 181 +4 179 180 182 315 +4 182 181 179 315 +4 5 13 77 71 +4 6 20 7 78 +4 6 78 7 69 +4 5 13 21 77 +4 6 22 20 78 +4 5 21 22 77 +4 82 69 68 315 +4 75 82 68 315 +4 19 7 20 316 +4 7 69 316 315 +4 18 7 19 316 +4 18 7 316 315 +4 82 316 69 315 +4 7 78 20 316 +4 78 7 69 316 +4 78 69 82 316 +4 8 27 28 127 +4 8 30 27 230 +4 8 27 127 230 +4 8 127 128 230 +4 88 89 90 129 +4 70 87 88 130 +4 9 10 124 317 +4 317 71 10 73 +4 9 11 10 317 +4 317 10 71 13 +4 9 125 11 317 +4 9 124 125 317 +4 10 73 124 317 +4 11 125 131 317 +4 12 131 11 125 +4 32 11 12 131 +4 32 11 131 317 +4 32 33 11 317 +4 33 13 10 317 +4 10 11 33 317 +4 13 31 21 318 +4 23 31 25 318 +4 21 31 23 318 +4 13 21 77 318 +4 12 14 34 132 +4 34 32 12 131 +4 34 12 132 131 +4 28 26 15 133 +4 70 134 87 130 +4 70 96 87 134 +4 74 96 70 134 +4 317 319 71 73 +4 77 319 71 13 +4 73 71 79 319 +4 79 84 95 319 +4 77 71 319 79 +4 73 79 72 319 +4 73 72 126 319 +4 317 71 319 13 +4 72 79 95 319 +4 33 319 13 317 +4 13 77 319 318 +4 31 319 13 33 +4 31 13 319 318 +4 95 96 72 320 +4 74 320 72 96 +4 72 126 319 320 +4 134 320 74 96 +4 74 72 320 126 +4 95 72 319 320 +4 73 135 319 126 +4 73 124 135 126 +4 131 125 135 317 +4 73 319 135 317 +4 135 125 124 317 +4 135 126 320 319 +4 73 135 124 317 +4 134 74 320 136 +4 135 320 126 136 +4 74 320 136 126 +4 15 26 137 133 +4 14 35 34 137 +4 14 137 34 132 +4 15 26 35 137 +4 14 15 35 137 +4 140 136 134 320 +4 80 99 76 183 +4 80 100 99 183 +4 44 16 18 180 +4 36 40 39 231 +4 36 17 40 231 +4 43 40 17 185 +4 17 185 40 231 +4 186 185 17 231 +4 44 18 47 180 +4 44 47 184 180 +4 18 19 321 316 +4 182 180 184 321 +4 18 321 180 315 +4 18 316 321 315 +4 182 180 321 315 +4 184 180 47 321 +4 47 19 48 321 +4 47 18 19 321 +4 18 47 180 321 +4 316 322 321 315 +4 75 322 82 315 +4 99 98 75 322 +4 82 322 316 315 +4 75 98 82 322 +4 99 75 187 322 +4 321 315 187 182 +4 99 187 76 183 +4 76 75 187 99 +4 76 187 75 181 +4 321 187 315 322 +4 75 187 315 181 +4 187 181 182 315 +4 75 315 187 322 +4 182 184 188 321 +4 188 187 182 321 +4 19 20 23 323 +4 19 316 20 323 +4 321 316 19 323 +4 24 19 23 323 +4 19 24 48 323 +4 19 48 321 323 +4 48 24 49 323 +4 323 49 50 24 +4 84 79 83 324 +4 20 316 324 323 +4 23 20 21 324 +4 22 78 77 324 +4 21 23 324 318 +4 77 324 319 318 +4 20 316 78 324 +4 22 77 21 324 +4 82 324 316 322 +4 21 324 77 318 +4 77 78 83 324 +4 79 77 83 324 +4 78 316 82 324 +4 84 319 79 324 +4 22 21 20 324 +4 22 20 78 324 +4 79 319 77 324 +4 78 82 83 324 +4 20 324 23 323 +4 100 80 190 183 +4 81 107 108 189 +4 108 190 81 189 +4 80 81 109 190 +4 109 100 80 190 +4 108 81 190 109 +4 86 106 107 191 +4 95 325 319 84 +4 104 95 84 325 +4 95 319 325 320 +4 84 83 85 325 +4 84 83 325 324 +4 84 325 319 324 +4 83 325 324 326 +4 83 85 325 326 +4 82 98 326 322 +4 82 326 98 85 +4 83 324 82 326 +4 324 322 82 326 +4 83 82 85 326 +4 104 84 111 325 +4 84 85 111 325 +4 85 111 325 326 +4 85 112 111 326 +4 98 112 85 326 +4 327 316 321 323 +4 321 316 327 322 +4 327 324 316 323 +4 324 322 327 316 +4 324 327 322 326 +4 86 102 106 275 +4 86 106 191 275 +4 86 191 192 275 +4 94 92 115 276 +4 87 134 96 328 +4 130 141 134 328 +4 113 114 97 328 +4 89 87 97 328 +4 88 129 130 328 +4 87 130 134 328 +4 88 87 89 328 +4 134 320 96 328 +4 97 114 89 328 +4 97 87 96 328 +4 88 89 129 328 +4 88 130 87 328 +4 89 328 114 329 +4 91 114 115 329 +4 91 89 114 329 +4 90 129 89 329 +4 90 89 91 329 +4 92 115 329 91 +4 89 129 328 329 +4 92 329 115 276 +4 93 90 91 143 +4 90 91 143 329 +4 90 143 129 329 +4 92 329 277 91 +4 91 277 143 329 +4 93 91 92 277 +4 93 143 91 277 +4 92 277 329 276 +4 93 144 143 277 +4 94 115 116 276 +4 94 116 279 276 +4 101 94 116 279 +4 277 276 280 329 +4 23 25 24 330 +4 330 23 324 323 +4 327 330 324 323 +4 23 25 330 318 +4 323 50 330 24 +4 25 50 24 330 +4 24 23 330 323 +4 330 324 23 318 +4 31 330 25 318 +4 52 25 31 330 +4 53 50 25 330 +4 53 25 52 330 +4 55 30 230 27 +4 54 26 55 331 +4 35 331 137 26 +4 26 137 133 331 +4 55 230 331 27 +4 55 26 27 331 +4 28 26 133 331 +4 54 35 26 331 +4 28 27 26 331 +4 28 127 27 331 +4 28 133 127 331 +4 27 127 230 331 +4 127 145 128 230 +4 127 133 145 331 +4 145 230 127 331 +4 29 37 57 232 +4 29 57 55 232 +4 55 331 230 233 +4 30 29 55 233 +4 29 232 55 233 +4 55 230 30 233 +4 331 232 233 55 +4 145 233 230 331 +4 128 230 145 234 +4 128 145 142 234 +4 230 145 234 233 +4 142 145 147 234 +4 142 147 235 234 +4 148 129 143 329 +4 130 129 148 328 +4 129 148 328 329 +4 130 148 141 328 +4 144 146 149 278 +4 135 139 131 332 +4 135 319 332 317 +4 32 131 332 317 +4 332 330 31 318 +4 34 131 132 332 +4 31 319 332 318 +4 32 131 34 332 +4 139 138 131 332 +4 332 33 319 31 +4 137 332 34 132 +4 51 52 34 332 +4 52 31 32 332 +4 138 132 131 332 +4 137 138 332 132 +4 34 52 32 332 +4 52 31 332 330 +4 332 32 33 31 +4 131 135 332 317 +4 332 319 33 317 +4 332 33 32 317 +4 332 319 333 318 +4 330 333 324 318 +4 319 324 333 318 +4 325 319 333 320 +4 333 330 332 318 +4 325 333 319 324 +4 34 137 35 334 +4 35 137 331 334 +4 34 35 51 334 +4 51 35 54 334 +4 54 334 35 331 +4 51 34 334 332 +4 137 34 332 334 +4 137 332 138 334 +4 145 133 151 331 +4 137 151 331 334 +4 137 331 151 133 +4 95 335 96 320 +4 97 96 335 328 +4 104 113 97 335 +4 95 97 96 335 +4 104 97 95 335 +4 104 335 95 325 +4 95 325 335 320 +4 335 325 333 320 +4 113 97 335 328 +4 96 320 335 328 +4 141 336 134 328 +4 148 336 141 328 +4 141 140 134 336 +4 140 320 134 336 +4 134 336 320 328 +4 320 336 335 328 +4 140 337 136 320 +4 140 139 136 337 +4 332 319 135 337 +4 140 337 320 336 +4 333 319 332 337 +4 135 337 320 136 +4 139 332 135 337 +4 136 139 135 337 +4 135 320 337 319 +4 335 333 337 320 +4 319 337 333 320 +4 335 320 337 336 +4 138 152 334 332 +4 139 152 138 332 +4 139 152 332 337 +4 137 153 151 334 +4 137 138 153 334 +4 138 152 153 334 +4 154 139 140 337 +4 140 154 337 336 +4 139 154 152 337 +4 140 141 154 336 +4 141 148 155 336 +4 155 154 141 336 +4 142 147 157 235 +4 146 149 281 150 +4 146 281 149 278 +4 38 36 39 236 +4 36 231 39 236 +4 37 56 57 237 +4 37 38 56 237 +4 37 57 232 237 +4 56 60 59 338 +4 38 56 237 338 +4 39 60 56 338 +4 38 237 236 338 +4 38 236 39 338 +4 38 39 56 338 +4 98 112 339 110 +4 99 183 100 339 +4 98 322 339 326 +4 99 187 339 322 +4 99 187 183 339 +4 339 322 327 326 +4 98 339 112 326 +4 99 100 98 339 +4 100 339 190 109 +4 98 100 110 339 +4 100 190 339 183 +4 110 100 109 339 +4 118 112 110 339 +4 99 339 98 322 +4 193 339 190 183 +4 193 183 187 339 +4 43 40 185 340 +4 39 236 340 338 +4 39 60 340 41 +4 39 340 60 338 +4 42 64 60 340 +4 185 40 231 340 +4 42 60 41 340 +4 39 231 40 340 +4 39 40 41 340 +4 43 42 40 340 +4 61 60 64 340 +4 42 41 40 340 +4 231 39 236 340 +4 42 43 194 340 +4 64 42 194 340 +4 46 42 43 194 +4 46 64 42 194 +4 185 194 43 340 +4 45 44 47 195 +4 195 184 47 321 +4 45 47 65 195 +4 44 47 195 184 +4 45 195 65 196 +4 46 45 64 196 +4 45 65 64 196 +4 64 194 196 340 +4 46 196 64 194 +4 195 197 184 321 +4 184 197 188 321 +4 231 236 238 340 +4 238 340 236 338 +4 199 340 231 238 +4 199 231 186 238 +4 199 231 340 185 +4 199 194 185 340 +4 199 186 231 185 +4 200 199 186 238 +4 116 101 282 122 +4 116 282 101 279 +4 123 119 103 284 +4 101 122 123 284 +4 103 101 123 284 +4 101 122 284 282 +4 103 284 119 285 +4 102 106 275 285 +4 106 119 285 102 +4 102 103 119 285 +4 64 65 61 341 +4 48 65 47 341 +4 61 64 341 340 +4 61 65 48 341 +4 61 48 49 341 +4 65 195 47 341 +4 327 321 341 323 +4 195 47 341 321 +4 195 341 197 321 +4 47 48 341 321 +4 48 49 341 323 +4 341 321 48 323 +4 188 342 187 321 +4 187 193 342 188 +4 187 342 193 339 +4 197 342 188 321 +4 197 341 342 321 +4 193 188 198 342 +4 327 342 341 321 +4 187 342 339 322 +4 187 321 342 322 +4 342 321 327 322 +4 339 342 327 322 +4 202 198 188 342 +4 188 197 202 342 +4 62 50 53 343 +4 61 343 49 63 +4 323 50 49 343 +4 49 343 341 323 +4 62 63 49 343 +4 61 49 343 341 +4 53 50 330 343 +4 49 50 62 343 +4 323 330 50 343 +4 341 343 327 323 +4 327 343 330 323 +4 324 326 344 327 +4 333 325 335 344 +4 344 330 327 343 +4 324 344 326 325 +4 325 344 333 324 +4 333 344 330 324 +4 327 330 344 324 +4 113 335 104 345 +4 335 344 325 345 +4 104 105 117 345 +4 113 104 117 345 +4 118 121 105 345 +4 105 121 117 345 +4 104 335 325 345 +4 111 118 105 345 +4 104 111 105 345 +4 104 325 111 345 +4 346 275 192 191 +4 191 189 201 346 +4 107 106 346 191 +4 107 346 189 191 +4 107 346 106 108 +4 106 285 119 346 +4 107 189 346 108 +4 106 119 108 346 +4 108 119 120 346 +4 106 191 275 346 +4 106 275 285 346 +4 201 189 190 346 +4 108 346 190 189 +4 347 190 108 346 +4 193 190 339 347 +4 347 120 108 109 +4 110 109 120 347 +4 347 108 120 346 +4 110 120 118 347 +4 110 347 118 339 +4 201 190 193 347 +4 110 109 347 339 +4 109 190 347 339 +4 201 190 347 346 +4 347 108 190 109 +4 346 192 203 191 +4 201 347 203 346 +4 191 201 203 346 +4 111 112 118 348 +4 118 347 348 339 +4 111 325 348 345 +4 112 348 339 118 +4 112 348 111 326 +4 348 325 111 326 +4 348 339 327 326 +4 348 327 344 326 +4 111 348 118 345 +4 325 344 348 345 +4 112 339 348 326 +4 348 344 325 326 +4 327 342 339 349 +4 327 341 342 349 +4 348 327 339 349 +4 327 348 344 349 +4 327 341 349 343 +4 344 327 349 343 +4 275 286 285 346 +4 346 192 275 286 +4 346 203 192 286 +4 192 203 205 286 +4 286 205 204 203 +4 116 114 113 350 +4 279 283 280 350 +4 117 116 113 350 +4 350 114 328 329 +4 113 335 350 328 +4 280 350 329 276 +4 280 276 279 350 +4 115 114 350 329 +4 113 350 335 345 +4 279 276 116 350 +4 115 114 116 350 +4 115 116 276 350 +4 335 336 350 328 +4 113 117 350 345 +4 113 350 114 328 +4 115 350 276 329 +4 278 277 280 351 +4 336 351 350 328 +4 148 143 351 329 +4 281 149 278 351 +4 144 277 351 143 +4 350 328 351 329 +4 148 351 336 328 +4 143 149 148 351 +4 144 351 149 143 +4 144 351 277 278 +4 280 329 350 351 +4 144 149 351 278 +4 281 278 280 351 +4 277 351 143 329 +4 351 328 148 329 +4 277 280 351 329 +4 116 282 352 122 +4 116 352 282 279 +4 279 282 283 352 +4 279 283 350 352 +4 121 117 352 122 +4 284 282 122 352 +4 117 350 345 352 +4 279 350 116 352 +4 117 116 350 352 +4 121 352 117 345 +4 117 122 116 352 +4 120 121 118 353 +4 119 285 284 353 +4 120 119 123 353 +4 348 347 118 353 +4 120 118 347 353 +4 285 353 119 346 +4 118 348 353 345 +4 119 284 123 353 +4 120 353 347 346 +4 123 121 120 353 +4 119 353 120 346 +4 121 345 353 352 +4 118 353 121 345 +4 122 353 121 123 +4 122 284 353 123 +4 122 121 353 352 +4 122 353 284 352 +4 287 352 350 283 +4 280 350 287 351 +4 280 283 287 350 +4 280 287 281 351 +4 287 288 352 283 +4 354 53 62 58 +4 354 62 53 343 +4 53 330 354 343 +4 354 330 344 343 +4 52 51 53 354 +4 354 332 333 330 +4 51 354 52 332 +4 51 58 53 354 +4 52 332 354 330 +4 51 334 354 332 +4 53 52 354 330 +4 59 58 354 62 +4 54 51 354 58 +4 54 354 51 334 +4 333 344 354 330 +4 54 55 355 331 +4 56 59 355 338 +4 331 355 232 55 +4 54 355 354 334 +4 54 355 334 331 +4 59 354 58 355 +4 237 355 57 232 +4 55 232 57 355 +4 54 354 355 58 +4 57 59 54 355 +4 56 237 355 57 +4 59 58 54 355 +4 55 57 54 355 +4 56 355 59 57 +4 56 355 237 338 +4 151 334 356 331 +4 145 147 234 356 +4 235 234 147 356 +4 151 356 145 331 +4 234 233 145 356 +4 147 145 151 356 +4 331 232 355 356 +4 355 356 334 331 +4 331 233 232 356 +4 145 356 233 331 +4 239 355 237 232 +4 356 239 232 355 +4 240 234 235 356 +4 356 232 239 240 +4 232 233 240 356 +4 240 233 234 356 +4 158 150 146 289 +4 150 281 146 289 +4 158 160 150 289 +4 151 356 357 147 +4 240 356 235 357 +4 151 357 156 147 +4 241 240 235 357 +4 147 235 356 357 +4 157 147 161 235 +4 161 235 147 357 +4 156 161 147 357 +4 157 235 161 242 +4 235 242 241 357 +4 161 242 235 357 +4 149 358 281 150 +4 150 160 159 358 +4 148 149 159 358 +4 148 358 155 336 +4 149 281 358 351 +4 149 150 159 358 +4 358 336 148 351 +4 287 358 281 351 +4 150 289 160 358 +4 149 358 148 351 +4 155 148 159 358 +4 150 281 289 358 +4 333 359 354 344 +4 153 359 334 152 +4 359 335 333 337 +4 354 359 333 332 +4 359 332 152 337 +4 354 334 359 332 +4 333 335 359 344 +4 359 334 152 332 +4 333 332 359 337 +4 360 336 358 351 +4 335 350 360 345 +4 360 350 335 336 +4 360 345 350 352 +4 360 350 336 351 +4 360 344 335 345 +4 360 359 335 344 +4 153 361 151 334 +4 361 359 354 334 +4 153 334 359 361 +4 355 361 354 334 +4 361 334 355 356 +4 153 156 151 361 +4 151 357 356 361 +4 151 334 361 356 +4 151 156 357 361 +4 360 362 358 336 +4 360 335 362 336 +4 335 337 359 362 +4 152 337 154 362 +4 358 362 155 336 +4 360 335 359 362 +4 359 337 152 362 +4 154 362 337 336 +4 155 362 154 336 +4 335 337 362 336 +4 153 162 359 152 +4 162 154 155 362 +4 153 359 162 361 +4 162 156 153 361 +4 162 359 152 362 +4 162 152 154 362 +4 155 163 162 362 +4 159 163 155 358 +4 163 155 358 362 +4 165 160 158 289 +4 361 167 162 156 +4 361 169 167 156 +4 156 169 161 357 +4 156 361 169 357 +4 157 242 171 243 +4 157 171 242 161 +4 164 157 171 243 +4 171 170 164 243 +4 287 358 290 281 +4 281 290 289 358 +4 158 166 165 291 +4 165 158 291 289 +4 59 63 62 363 +4 61 340 363 60 +4 61 363 340 341 +4 61 363 343 63 +4 61 63 60 363 +4 60 340 363 338 +4 60 63 59 363 +4 363 338 355 59 +4 59 354 363 62 +4 60 363 59 338 +4 62 354 363 343 +4 59 363 354 355 +4 363 349 341 343 +4 61 343 363 341 +4 62 363 63 343 +4 236 237 244 338 +4 238 236 244 338 +4 237 355 364 338 +4 363 355 338 364 +4 237 364 244 338 +4 239 237 355 364 +4 244 237 239 364 +4 245 244 239 364 +4 238 365 199 340 +4 365 363 340 338 +4 365 364 363 338 +4 244 364 365 338 +4 238 244 365 338 +4 238 365 340 338 +4 246 238 244 365 +4 193 198 366 342 +4 202 366 198 342 +4 339 342 366 349 +4 348 347 366 339 +4 366 347 193 339 +4 348 339 366 349 +4 193 366 339 342 +4 193 198 206 366 +4 206 201 193 347 +4 206 193 366 347 +4 363 340 341 367 +4 196 64 340 367 +4 341 340 64 367 +4 363 365 340 367 +4 197 342 341 367 +4 64 196 65 367 +4 64 65 341 367 +4 195 197 341 367 +4 65 196 195 367 +4 65 195 341 367 +4 207 340 365 367 +4 207 194 199 340 +4 207 196 194 340 +4 207 199 365 340 +4 207 196 340 367 +4 202 197 208 342 +4 195 196 208 367 +4 207 208 196 367 +4 197 208 342 367 +4 195 208 197 367 +4 209 206 198 366 +4 198 202 209 366 +4 200 246 210 238 +4 246 210 238 365 +4 200 210 199 238 +4 199 210 207 365 +4 199 238 210 365 +4 211 210 200 246 +4 206 212 201 347 +4 212 206 366 347 +4 201 212 203 347 +4 292 288 283 352 +4 292 283 282 352 +4 292 282 284 352 +4 292 284 353 352 +4 285 293 353 346 +4 292 284 293 353 +4 293 285 286 346 +4 284 285 293 353 +4 363 341 368 367 +4 209 202 208 368 +4 202 366 368 209 +4 202 368 366 342 +4 363 341 349 368 +4 366 342 368 349 +4 208 368 342 367 +4 368 342 341 349 +4 202 208 368 342 +4 341 342 368 367 +4 363 368 365 367 +4 244 247 246 365 +4 245 239 248 364 +4 368 363 369 349 +4 369 354 359 344 +4 369 349 363 343 +4 369 363 354 343 +4 369 344 348 349 +4 369 359 360 344 +4 369 354 344 343 +4 369 344 349 343 +4 370 353 345 352 +4 370 345 360 352 +4 370 353 348 345 +4 348 369 370 344 +4 348 344 370 345 +4 360 370 369 344 +4 370 344 360 345 +4 371 214 212 204 +4 203 371 286 346 +4 348 370 371 353 +4 347 353 371 346 +4 212 371 203 347 +4 293 286 371 346 +4 203 212 204 371 +4 371 366 348 347 +4 286 204 371 203 +4 371 347 348 353 +4 203 347 371 346 +4 212 366 371 347 +4 371 353 293 346 +4 372 366 368 349 +4 348 371 370 372 +4 369 348 370 372 +4 348 366 371 372 +4 369 372 368 349 +4 369 348 372 349 +4 366 372 348 349 +4 286 371 204 294 +4 371 294 214 204 +4 205 204 215 294 +4 215 204 214 294 +4 286 204 205 294 +4 293 286 294 371 +4 287 350 352 373 +4 350 373 360 352 +4 373 351 360 358 +4 360 369 370 373 +4 287 290 358 373 +4 287 352 288 373 +4 373 360 351 350 +4 370 360 373 352 +4 287 373 358 351 +4 287 350 373 351 +4 373 352 374 370 +4 370 374 353 352 +4 371 353 370 374 +4 293 353 374 292 +4 293 374 353 371 +4 292 353 374 352 +4 292 374 288 352 +4 373 374 352 288 +4 370 372 371 374 +4 292 295 288 374 +4 295 373 288 374 +4 295 296 288 373 +4 296 290 287 373 +4 287 288 296 373 +4 356 239 375 240 +4 248 239 241 375 +4 375 239 355 364 +4 375 363 355 354 +4 240 375 357 241 +4 239 240 241 375 +4 240 357 375 356 +4 356 375 239 355 +4 369 375 354 363 +4 354 355 375 361 +4 375 361 355 356 +4 375 355 363 364 +4 354 375 369 359 +4 354 361 375 359 +4 361 356 375 357 +4 239 375 248 364 +4 241 250 248 375 +4 251 250 241 375 +4 251 375 241 357 +4 242 251 241 357 +4 289 376 160 358 +4 168 160 165 376 +4 163 159 376 358 +4 167 163 159 376 +4 376 373 360 358 +4 165 160 289 376 +4 159 160 168 376 +4 165 289 291 376 +4 168 167 159 376 +4 289 290 291 376 +4 160 376 159 358 +4 290 373 376 358 +4 290 376 289 358 +4 243 251 242 377 +4 171 170 243 377 +4 161 169 171 377 +4 242 161 377 357 +4 243 242 171 377 +4 375 377 361 357 +4 169 377 161 357 +4 161 171 242 377 +4 251 377 375 357 +4 242 377 251 357 +4 169 361 377 357 +4 163 378 162 362 +4 378 361 375 377 +4 163 358 378 362 +4 163 167 162 378 +4 167 378 163 376 +4 378 369 375 359 +4 378 375 361 359 +4 361 167 169 378 +4 361 162 167 378 +4 169 361 378 377 +4 360 369 378 359 +4 378 358 360 362 +4 163 376 378 358 +4 378 376 360 358 +4 360 359 378 362 +4 378 360 376 373 +4 360 378 369 373 +4 162 359 378 361 +4 162 378 359 362 +4 174 170 173 379 +4 165 376 175 168 +4 172 173 175 379 +4 174 252 170 379 +4 252 251 243 377 +4 174 164 170 252 +4 170 252 164 243 +4 252 377 170 379 +4 252 243 170 377 +4 165 297 166 175 +4 166 172 175 297 +4 165 376 297 175 +4 165 297 376 291 +4 165 166 297 291 +4 172 175 297 379 +4 176 378 169 167 +4 176 169 378 377 +4 176 378 167 376 +4 168 176 167 376 +4 175 376 176 168 +4 171 177 170 377 +4 170 177 173 379 +4 177 170 377 379 +4 171 169 177 377 +4 176 177 169 377 +4 173 177 175 379 +4 291 290 298 376 +4 298 376 290 373 +4 298 290 296 373 +4 291 298 299 376 +4 376 291 297 299 +4 172 300 173 379 +4 172 297 300 379 +4 178 173 172 300 +4 178 300 253 173 +4 174 173 253 379 +4 178 174 173 253 +4 173 300 253 379 +4 174 253 252 379 +4 244 380 247 365 +4 244 245 247 380 +4 380 365 244 364 +4 369 363 368 380 +4 363 365 380 364 +4 248 249 245 380 +4 248 380 364 375 +4 245 249 247 380 +4 368 380 363 365 +4 245 380 244 364 +4 375 380 363 369 +4 375 363 380 364 +4 248 364 380 245 +4 211 210 246 254 +4 247 254 246 381 +4 207 365 210 381 +4 380 365 368 381 +4 207 365 381 367 +4 247 365 380 381 +4 368 381 365 367 +4 247 246 365 381 +4 210 246 254 381 +4 210 365 246 381 +4 209 206 366 382 +4 371 372 366 382 +4 372 368 366 382 +4 209 366 368 382 +4 209 213 206 382 +4 213 212 206 382 +4 212 366 206 382 +4 371 366 212 382 +4 216 381 368 367 +4 216 209 368 382 +4 216 368 381 382 +4 216 208 207 367 +4 216 209 208 368 +4 216 207 381 367 +4 216 368 208 367 +4 207 210 216 381 +4 217 213 209 382 +4 216 217 209 382 +4 217 218 213 382 +4 211 219 210 254 +4 210 219 216 381 +4 210 254 219 381 +4 220 219 211 255 +4 219 254 211 255 +4 218 383 213 382 +4 213 214 212 383 +4 371 212 214 383 +4 371 214 294 383 +4 371 383 372 382 +4 213 383 212 382 +4 371 212 383 382 +4 221 213 218 383 +4 221 214 213 383 +4 214 302 294 383 +4 221 302 214 383 +4 222 215 221 302 +4 215 214 221 302 +4 215 294 214 302 +4 293 294 303 371 +4 303 292 293 374 +4 292 303 295 374 +4 303 293 371 374 +4 303 304 295 374 +4 368 384 369 380 +4 384 380 368 381 +4 368 384 381 382 +4 369 384 368 372 +4 372 383 384 382 +4 368 372 384 382 +4 256 381 247 380 +4 249 256 247 380 +4 256 247 381 254 +4 257 256 249 380 +4 375 385 378 377 +4 250 385 248 375 +4 248 385 380 375 +4 250 248 385 258 +4 257 249 258 385 +4 257 380 249 385 +4 248 380 385 249 +4 258 249 248 385 +4 369 386 378 375 +4 374 386 373 370 +4 386 370 369 373 +4 384 386 369 380 +4 386 376 373 378 +4 369 370 386 372 +4 386 380 384 385 +4 386 375 369 380 +4 369 386 384 372 +4 378 375 386 385 +4 375 380 386 385 +4 378 386 369 373 +4 386 372 370 374 +4 384 383 372 387 +4 303 387 304 374 +4 304 386 374 387 +4 384 372 386 387 +4 303 371 387 374 +4 294 303 371 387 +4 294 371 383 387 +4 372 383 371 387 +4 294 302 303 387 +4 294 383 302 387 +4 372 387 371 374 +4 386 387 372 374 +4 295 301 296 388 +4 295 304 301 388 +4 295 373 374 388 +4 295 296 373 388 +4 296 298 373 388 +4 304 374 386 388 +4 296 301 298 388 +4 304 295 374 388 +4 374 373 386 388 +4 298 376 373 388 +4 386 373 376 388 +4 250 375 259 385 +4 259 250 251 375 +4 259 385 375 377 +4 258 250 259 385 +4 259 375 251 377 +4 260 251 252 377 +4 259 251 260 377 +4 177 377 389 379 +4 253 252 389 260 +4 389 377 252 379 +4 260 252 389 377 +4 378 386 389 385 +4 176 378 389 377 +4 300 297 299 389 +4 389 377 259 260 +4 389 259 377 385 +4 376 389 297 175 +4 175 177 176 389 +4 175 176 376 389 +4 378 385 389 377 +4 253 389 252 379 +4 175 177 389 379 +4 253 300 389 379 +4 298 389 299 376 +4 376 297 389 299 +4 176 389 378 376 +4 176 389 177 377 +4 298 389 376 388 +4 386 389 376 378 +4 386 376 389 388 +4 300 297 389 379 +4 175 389 297 379 +4 299 298 305 389 +4 298 305 389 388 +4 298 301 305 388 +4 305 306 299 389 +4 306 260 253 389 +4 253 389 300 306 +4 299 306 300 389 +4 261 306 253 300 +4 178 253 300 261 +4 261 253 306 262 +4 306 253 260 262 +4 257 256 380 390 +4 256 390 381 380 +4 256 255 254 390 +4 254 255 219 390 +4 256 381 390 254 +4 384 390 380 381 +4 257 380 385 390 +4 384 385 380 390 +4 254 390 219 381 +4 381 223 384 390 +4 216 223 382 381 +4 217 223 218 382 +4 216 382 223 217 +4 381 384 223 382 +4 223 221 218 383 +4 223 383 218 382 +4 223 384 383 382 +4 219 223 216 381 +4 219 390 223 381 +4 219 255 224 390 +4 220 224 219 255 +4 219 224 223 390 +4 224 255 220 263 +4 255 263 224 390 +4 228 224 220 263 +4 264 255 256 390 +4 264 263 255 390 +4 302 387 383 391 +4 383 387 384 391 +4 223 391 221 383 +4 221 391 302 383 +4 223 384 391 383 +4 223 221 391 225 +4 223 391 384 390 +4 221 302 391 307 +4 225 226 307 391 +4 226 222 225 307 +4 222 221 225 307 +4 222 302 221 307 +4 221 225 307 391 +4 308 304 386 388 +4 308 386 304 387 +4 308 305 301 388 +4 308 301 304 388 +4 303 302 309 387 +4 302 309 387 391 +4 309 308 304 387 +4 302 307 309 391 +4 309 304 303 387 +4 309 392 387 391 +4 392 384 387 391 +4 386 385 384 392 +4 386 392 384 387 +4 384 392 385 390 +4 309 392 308 387 +4 384 392 390 391 +4 265 385 390 257 +4 265 392 264 390 +4 256 265 264 390 +4 265 390 385 392 +4 256 257 265 390 +4 257 258 266 385 +4 259 266 258 385 +4 266 385 265 257 +4 259 389 393 385 +4 385 392 386 393 +4 259 393 266 385 +4 308 393 305 388 +4 308 386 393 388 +4 308 386 387 393 +4 308 387 392 393 +4 392 387 386 393 +4 265 392 385 393 +4 266 265 385 393 +4 389 386 393 385 +4 389 393 386 388 +4 305 393 389 388 +4 306 267 260 389 +4 389 259 267 260 +4 259 393 389 267 +4 306 260 267 262 +4 259 266 393 267 +4 305 310 306 389 +4 305 310 389 393 +4 267 393 389 310 +4 306 267 389 310 +4 305 311 310 393 +4 305 308 311 393 +4 268 262 261 306 +4 268 306 267 262 +4 268 267 306 310 +4 223 224 225 394 +4 223 390 224 394 +4 392 394 390 391 +4 225 227 226 394 +4 225 394 226 391 +4 228 227 224 394 +4 225 224 227 394 +4 228 224 263 394 +4 263 224 390 394 +4 264 263 390 394 +4 264 390 392 394 +4 223 394 225 391 +4 223 390 394 391 +4 227 312 226 394 +4 312 307 226 391 +4 312 226 394 391 +4 228 263 269 394 +4 269 312 227 394 +4 228 269 227 394 +4 263 264 269 394 +4 229 227 228 269 +4 229 226 227 312 +4 229 227 269 312 +4 264 265 270 392 +4 264 392 270 394 +4 269 264 270 394 +4 313 312 394 391 +4 309 313 392 391 +4 270 392 313 394 +4 313 394 392 391 +4 309 307 313 391 +4 313 307 312 391 +4 308 392 314 393 +4 314 308 309 392 +4 270 314 313 392 +4 313 314 309 392 +4 311 308 314 393 +4 270 265 271 392 +4 270 271 314 392 +4 271 314 392 393 +4 266 267 271 393 +4 271 265 266 393 +4 271 392 265 393 +4 272 267 268 310 +4 272 393 310 311 +4 272 311 314 393 +4 272 310 393 267 +4 272 314 271 393 +4 272 271 267 393 +4 270 313 273 394 +4 229 269 273 312 +4 273 312 269 394 +4 269 270 273 394 +4 273 313 312 394 +4 273 270 274 313 +4 274 271 272 314 +4 270 271 274 314 +4 270 274 313 314 + +CELL_TYPES 1312 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 diff --git a/src/UnitTests/Meshes/data/tetrahedrons/cube1m_1.vtu b/src/UnitTests/Meshes/data/tetrahedrons/cube1m_1.vtu new file mode 100644 index 0000000000000000000000000000000000000000..a4a47f0304c71c3a7e77f980c9094697332d2099 --- /dev/null +++ b/src/UnitTests/Meshes/data/tetrahedrons/cube1m_1.vtu @@ -0,0 +1,23 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64" compressor="vtkZLibDataCompressor"> +<UnstructuredGrid> +<Piece NumberOfPoints="395" NumberOfCells="1312"> +<Points> +<DataArray type="Float64" Name="Points" NumberOfComponents="3" format="binary"> +AQAAAAAAAAAIJQAAAAAAAAglAAAAAAAALA4AAAAAAAA=eJyVWXdcVFcWxgRxjR0RC1iIgNhiQkDQ6H4LmkBwbRFUFCsSsRFIwAZYk4AY0LAaE2NWQYzokqhI1Kjg0IuENnQGHJjGFNwRjGJEWWTmzvu9++Ztdu8/7/cOd8499TvffZiYsNcGn1crFyb/19Jy9idffrVUBvmyXr2/YGXvs42zf3GvvIoj1+2XGeRze9/T9Xpaqf1cO/j8IfaQJ9uOcmT32n+bknPtI/vI79h/Ff+pP8btpP3QcuS6/b/p46A2yK/12lMBXfzllB6BXt7Cket+V8+Td9qPMtDyseP3/GGVX4M3rYJ+ss5n9O8ILVkcYl2jj08dpUeBn3rPTTXISX3QeaHrib20MJ4fLej8O2SWz4+TVOCHe5v+Gt6/wiCXiL/sK3WtRmpNZ1OIdb5Bfrb33CKQJ5HrzmvUvwso+yX6/Vkce4z7oeXEk8jpetH9XqOXKzhxo/tL964EebLlChB9bP0qTr2x40vXp5gjZ9tN66nj1O38maJVs+Ia9O9MX4sODz0+I+EBjh2b8yJWIuE5l4lbk/TrjySupP7KDHJ2fTPymdcEK0LVTdjvmBdVd7+OioMcpJ/YfqlB+o9tj4anvzSc/vrg1JqxbXYSkL5h72/l+GWe8dQlcIYcIcHZr316Rk7Z2cKJm7X9mCTxZAmyAxNbzFc9MMiLcketzA+RgtQp+1wpiL1E0tvPHmJd/P01nH4iy7ic9F8mJVfr+/sa248pXL/Jovfr9JZycJf0nfFzc3hwgsF98k7yzIcrxudDHUfOxoMiqh4rePzl9j2R03rYOF9G7ReD4C9tJy1n1wN3/uj6r9kgH/ij/6kQ65s8djL4Qt5JXPhwnMYtNv7Tc49vTjL2sv2t4plvZWDjOFkC/Rxj+oPMBeN6SN3Wcvr+buHEC3khTP+RPjJuPxdH+fCYxJ2Nd8y81f1OapB/MsT9bxmfN/HMhzbeuaSTt1L71Rz8IHLaHnZ86DoXg+AvkWTKrecMHyOBU12A7POdDM6FvYx/prGr4Mwx0g/0HGP3s4Y6l+SJ8YvkleAykffirbVUr5/mrQoOz2K/M/pJXNj5NzEh9UHPQxJfPp6qW2nYbTnptMS1jOM3jUN8/Juvnwge07hL7KL161aOfp7ReJmBqa/y+YTpMz4ez8er+HgYH28jvzc+j7n8VbcqQfQRCR9vkG0cmCLpFONonx1mw+tpXsjHk9Q8c4nLU/n4PdlPzyU+XkXqkY4be77R9xZSn7VUHLj3Ct3va2Ab8e9PytYyfax4Ve+3qvB0gql0QTLTTzqe14R+a3aGpZ2i508LdH+vos4V6XiPNX2f4eIl+53ObysHv4VJFqHhhWro7GVwmuY9xs9l9C+zmT9+9CgpjgW5jna/00T5xeXB/pXH1qdL2yBNKKyVfEvXJ3f+K7Jjg04dlyK03fNSiIjZr5vLSn1eJFTeubyQj/frFpf/EXvo+cB33+CbV3z3lrxEpWZTsAK+Fx7/fcY1GaWfe29h62X0G8dJLVKXDHa3zif4VWaQs3EzzSA3jjN0PQkM8qWHzh+xzs8E3ffG8Zbuc8YPNm7mGORsPKo0yI3jsxbG8ZmcQ+OP9k/sEnPixr6vK6j9AopPaQ33YOP8sozqR60BRwiusO2j8ZDGQS07Phzc02Kg6qL57tn1+ng3UnGj8ZDoo/FQy3s+8ZPNr7Uwjp9aRCtrA6zzhXp5M0/8xdR5NM7T++n+oHFPiyvr3aLkF2WwfXh07QQr5lyCd2zeSuujz+nhcbMVF13jGJwj34Eiy+fn2qUxeV+803dWwgs5Hk29Wj9kgJQTN9ov4/jJ5Mt4XXF/R+JOx1/3VFD8jtHP5r90famo/TQecvf92ZPGLz5cI+ewvzMx9UHL2d8rKgxy0s/s73NM37L7nYkXrZ/kgX0OE0fdd7dKSo+Y+r7C9AmZ+0RO+qSXR99i6k+Hv9n6dymlX8DRT/Kvuw/Vceyn40DsZ3+fYvqK+EH75SnI8gs4wMhJP+h4DNNv/nanp3/gVU/xVAYf2fOSyYtuP93/OZz49PblYDVPfOjvVYxf5DsRHR/dk5GTe6Xunekrgn/s+a3l5IM8yfzp3V9Fz8tSThzYfEJJ2amEZ2fTg3PpzH5dXGRU3ph8sfmQllMHbHkVp8/Z92gNJVcY4s22n447P47z4QiNc3y8w/j/KfjxhY8f6Z6E/zDzkI838fEa0rfkPsDWz+UFfDyC3Q90Xis4uM7Hp7x91yd6V1Xjy975J+LJh4BHXkblg8u/+OY8Hy/43+Y8Uydtt5p3CX8SQ/e9nMkLH09k9zfFK43wJt2Tyx8TFjo5PzGX6vPcwIkDn/3/K1/QPbn85b/zNe48n75affTzmQrceVTgWBPRwvHXOC/g8j6Cp3Td8s1/Ph5B85dtD0pDbvTJhMOdoMLJv96F+fMp8kFjNRg19L2Yy9/cw+Glzb9/2ZqD6OHfLlLfkGOv5eRZxXNuYK7ThdFXfijAa8k9tHZrOuY8HL/Hp+pXXM+pWb5N/BumPR60bpZPLZR2b9U/WVKE+pGpj04tzMKi29Fe+8aXYv/bSVd319Si84OD6W7vZmHvofJN+9oE+Pnsy+vy/DyMiXsiGLJYiBhpX7V5qwpFKZ4Ovj31WurywunDqCzYWynHr3jR45dpbJnZqTu4uGf48rmfVUG1u71arpEg6m7MOz5VhShyTdh2+1kuAgtPzX1yrglrGgNSJjrVo8K/xdHrs0wkJ/+85f6PDZjik6iZLqtB1Zkf5i3ZnoF164YpkzZJ8PyPbdmfnqyAvHhzZ8lmIRRxtX1UYimiB6+O7T4pRfmKK2rx5HT4Jt+Js9iRAcvEsV75M9Twi/m2O/L6Dez5oKPN65YAQZnF3ytS7iFmV/Gyt+fW4LvTpp94nm9A8o7AT04WZ6DqjWexZ9pbodkcGuasyEKR++YxJ63zkWXx3Y+/J9Viqt/7zg3386BcYBmQVCyE98GTAwvjKyBwizm0wa0SHauK58abFOLvXbu2Wm2XQPPNoyDprBykxS+PmNcsxvHu3z96Nj4fp2sdS00WlkGlFppucm/B2vSYrwZ7luF65+uVMXYCuAV0Pf9qQC1aSrs7IkoqcOfmm++4DUrH2uwk2fT5mTDfuj6j9L4atzOG9Ou/lPTRA0ybazNyd1EBxhYOqLYrI/WWA9mBNQv/mdqKHeM2TA23UyNWvvhp45Ic3Cq5t+aJ+gEmWhys8T7cisa03/aOK6zGxatmI9wf1+Dh2oIXNsdVqJujDRyzIA/O/U0nFYSJ4X8quWnMymZ05vlNG+9XD6l8tKOPohJ3/YYmBdxsxKphzuWK81LYLHhb3pmaiZdPMgeeaxdh0NGlNfXPVRhqtkEUbp+F5fsvP3V7XYOMLZXLu/+QovaIv9cws2Isrf7wuK2VCl932FaXRjdj5LXqaZ99U4orkX3SgxUSiAOHz86KqINtmcUkaXADliy7X/1HogymlyzeG9NPBV+rDPFby3Nga/m94/DAChx5+K6bokCFsw6H/MwEJYjdfeLgbOtsfNRjjfcINda6rJ4xR1aE9pKEgT7vNCLOpj4htKuHV3g7zT98KBfXbcfc/NdWKX7+9ITp5Gf58M5qk4TXNWNU6bmE/YdqUPxFa12Yaw4mv948tuOEEqc9vGIlp+vwy7Dk4+nBZYhU7XtvZ7oK4jCPoZ2DirEuMnpCc5wIFu7TO+bF9+Rxy7uL5nln4/2hg3Z/aamEQ6XQQzykDv8S+fjaJQqwYvKR7kU76tEeGXLJa3UTXn/D8cSFwGI03jyQfsVFhssHwv+JHdXQJESmiF2EqH00/LHplXqMmH3EqkgiQ9+Bovv53dl4r2DYSvstzQhevXr32il1OOG/ovurXRl6XC/E9qvB8fIhcsQotvdJ+F2CqxvmzHomEcLadusx06gePLJf1vd8fAuiZ2+UXFUJ0fHzXsGcTSrsOuw+UnFIiZ+e57uH9uTLum37L6HttchM2Tk7soe3LIpya3bKLcXRC54Z5p4SHLhxxTJ1oQZvSYeJPOsaMHVRQ4ri6xZM2lY5z+m2ErK/dLzjuFqM/snBPSltxt1+rRlnfMUo1p4NOvc3OTrCRr8UDqpBbP8BfYRdYvi86oscJczOLb39eEYtWs+FlIRFKTE4cEiCy2syuGS/G7fPRgx0VW9YlytDTMrqKX5dKnxs2WY6OLwBHtapB0OvVcOm1DsswkaDwPu/Wqw42YCEDNwa4dOCzQcGpAY8E2FKbuDbEwarcH5l0BZn21rckqedGC1SYrj2/bio8ma8dPxM9Hl1Pi57HWzflCRF+JYYk4u71Gj6IbntokcuhNvqPE74SzHi0hsTjnW0IMnuL+Eus4vx12sO3TsuqXEpWvjhjdtqLLyc1vV05C2UV2z41n7/A8QXq8YGRamQOa4tfsFOKUIK04W7vn4AU5M2p3s9fo7d2bcg/eOee9ZG9bTYdgmUHbtEjdpmrGhdU6p6qkaXzyrfX/Yp8WnUpJJN5i14OLHx7tp+Gnx4NmJzQowMPj9mjH7TQo6BNooX+88oUO7uIBrlIIPZF5tnFPT053xnO9+oiWJkLkvs7rRrhXpcnZ/zYikmPRt2b2OsGCGXj50+0tXDD16czY7YI4Fqz5qUkzvluH12j73NvjZYZmRUX8iTwDen69/fVzUgsSL6u8hxarzceLxE+A8lPD4KjHzoUIZh0r0PR+bJsF4asHBasAYbGyJmfpGsxMm3JrYI+/fMY9ey5a4iBY6OHDBPGtpzXlN/yQl7NZ6b2bvEpKiwNbHUY/QjGQRzS8/OnKKBs1tlpEmFCvO8m0u1H4uxf5FVa9pBNfoeyV95oFCDSdHiC5mrNPgP0grqxw== +</DataArray> +</Points> +<Cells> +<DataArray type="Int32" Name="connectivity" format="binary"> +AQAAAAAAAAAAUgAAAAAAAABSAAAAAAAAeBcAAAAAAAA=eJxtmAe4mEWVhmcIxRBCNSbUNDokhCQEEiAF0isJgZDkpgPphdz0npsesLCAoKAoqyKigqKIIiiiywZ0RZe1IQZdFVhFQLBS3P/zf7+dc++z//PMM+c7bc7U/8w8kFJqVZUDqnIg9aVVGVyVBygHoCPewVU5BDwk1V/bqhxUlWHgQ+EZj4AnnKHNF24Nb0OQjwhY9CVg6R5WlTZV2Rj40tkEFj08YNEjwe7nkaF/F+a6P+arProFX/Qhwc68BxgL0YPhH9LCXvWQVOwl+1KQDwn2RyJzXHEujFWPgj861bT4X6Z+ANr6o6C/jEz+H4T3YCp84YOYuzHMl+b73cQ+FjwWPCQV/XbYSP4ebMYibwdP8gnYDQ79mBDwMfiW/UW5tCNa8qORHwPP2PIJ0B5Tx21/MXbjIanYvauqj6/KCVXZnGp8ErzfpiLfHLDoLeCrqjK5KlOqsrUqQ6syCX5Tar7WL851GZbKmpe8Ddhy7522yDeiI1lrfG1MRXdE8O99sg18GLT5naDNN7a+cOfQXmfiODS01wYdYck6Muf9K9wefCy4Hbg9OK6d/sR3eFW6VGU7dacQXxfo7WDN03FVOaIqOxjvnYx5E3gmWPyRYOsp5gHMwQjiMG4LT/Q4+KonVmUG2PvEshHoDocXz6IBYb4H0Pfh6Ntf5yDzeDomjU/HIO/MWLYN8hn0T34H5rq/qocHvmMRf2fQm8n42HYTcQ0P+urPLvCmsNZ24Xcb62oX8Y9A13gX8g0Bb6K9AcG/5Z4zyXcjc2y7W8g2sQ60HvawHrSWurJu9oD3hPVl/a5BfkTAN9COx+myqp6T6nP3K6nGV8MTPjs1P+NPrsrpVTmtKi+Aj4InfBa0eF8NteVfC/wX8C/f5+D/bOiHwJLpbByU6/PsQfgPwTua2v8fYekNyuV/8KVUsP2eA+8c/PcIOLYZY3MMlwT/Ou8v4ZwW1rjNTs35l+Ryno9Cbv4cdB9Ozf0KP8g8PBzmZ3TQ97w9DO/LxPgwsVySi67/lw+j5/+l/6Vu/0HG9uv4+noqsQzif6Z/j867S3P5b70b7DE6BtyBsYz6HRhvY4+9cA/k5yJXEd0Tvs4qnS+XV2VwLv/Bwei2J752yPWf1j9xDLgdsQzmfDHf5038r9p+TPA3gdrrwHyf92Noz/GNw954LP7tR/3xWev22tEHY+ce9jcgxD2WtRTHY3Au4629rD39KOtnfFUWVmVRVR6hfhT+I+iKXgxfdfSxCLllV1ZlAT6/kerzdQjjqb7NgzcRvv8LQzh/JxL7FciNh+QyPvYnHGVDc3PboYyr9tfQXPaf6NnoeZzMH9xC73LG8wrwPGJfGuK7IuBIDwUvg+d2lwV/w3I5n+J+GUYcw3JZX5eG+Gw3OOjKn8b/WubgmFzm4xsBi/4meHpVN1SlUesqlzxiZlWG5zrHeC884euqenlVZoGVC04KWHng1lTbDc8lT9kZ5OJNBvu/4/Zm4X9ywJNCPM4/twbchI7jUS0fI6p6Kv4aA56citx57OSARU8FN/w/tm7bctUev2mp9iHd97eg7f/9+Ij27fCvItr60+A1wJ+GvfXMl67b/wA67ZhfxbaC+KZDt0f/mtSc1w5+B3zq3FBuq7N2ZK6Lz8tLWXsjc/Pz9lh0+8PrCe6ArGfwp7o99KXBl/PnjsicX/fGh/nn4e/YgEX3Bp+f6vuN7i661/RJdT4k/qhc50Gq98CPudUo7H8LfTx2x+FLPOfn1pf/rvAsP74F3tzCfgc8t7E5tCn6xlTuX5vRvxH5jYEvfGJVn1KVvlV5MdW4L3G/GPotm5cYmxPhvwT9YsDu/0lg2b4YZDdCO17HKf7/ELfo94Gj7CX4wjfBex/078A3p3qveD80gcXXHoy05cLvhae98C9VuaUq78l1fn19qvP40bnk+qJ9H7TsYvgjWYdaf12Qb0enY7DvH+y7IFdbe4NPlc7YdGStjc4lX++V6rVre9HS6wTem8rdcDTrdi+075O9g77t3Y/Rudx5O+JnV4v++p52cYi3U2ouH0N/R0I7f/J/2fIhQX8gteOwfEyw8z1Ge2hsLvcUra2xyLsyTsK9wH3AfYLdKORd4Hm8PLZjcxn/vehoLWp/3ZrKuXBraN+x3Iqe8pdxuf4/qX+zUk2Lp/WnfEH/zFnwZqTmOvPAMwK23pBQj2P8xoUxE46+h4c4jLUPLsvl/3sz2PtDte6AO+HfkMq9+bJQD8TfP++Iwb/0x+f6DjkQrDW/G77Xyy6w9e3Hcy+98UHPd97rwz4dH3jGvi+Px884fNrHAGiPl8dxPO1r3m8L6+N6sPeUsePT/H+INeH1sBfe2ODP+MPEe0Po/4dTaf968G1B/l54nifN2e3g25F5Xn1efiTVZ6bPumMr2QfBon3+nZrqO7ru67+HfiFg/TsuSPU/42XwqfCM/W95Gf5FVbmwKhNyc13h05BfEOQv05bx72nf+LSg73z58opekso7xNXwJFfuK1r5r+/HwpcE/BV45g/LJR8XT23YXr7Ndzu+38xGviTIH4X+Cvyr0RVvFfFbf06LuB8L/mX/GLX74PcTvZFMzGWeRMfxFT6DsRN9EeN3ZlUPDDrx7WUicsnOCP5fQMf49CBXPGcG+cXYDwz+zgjyuLYsl49vgQfiz7h7aq7TPTXX+Sr1Weh3S+WN6HHKQ6m853QzjSzqSq8btOTfpr1utPlt6EEBD6T9b4d4I1++vpPKe9RDYL+fvMBY/AF7194PT4Rxk+yJVN7JIvZcPhHGZSL2X0NHvH9PhSd75fnK+Y+rdNeBRYun/H99Va+uytyqnABfeuvBc7Ff30Iu+rhc7OTjxNz8Liq8IDWXXUtb5g1kvLWursi8BTFnV7DeBkJ7/UneI8hFnwv2vNte+17zIFr3jSgbBBb9nVTe/3oEefR9aW7OF9Y8X5nr/eu3t8fg+e3syrDvvxNkg8DyeSV+H2Pt/Bt6w5C5XfvzueZ2rwTbj98ILs/Fj/CT+P56iEMxPAnun+r7le5Vkxhf1RqDAanc784N/ElhfPujd26wjzq+vykntL1wf3R8J+wZbCYRv++fk3K5P/od6Cpk+u87f7qKMjLYDYY3FL0hYOe0Y4KN31pGwhNW/uW8bXJoR34mw59flZXIpT8vYP0f1qIjPB9sufNB+9M70qqgL/nSFngIesJTcr33vpnqdx8VvevtS7VsIftTtGQLoR9JzbF0FqGrfbo62D8CbflqdM0TXhP8+C3K2GeD8D78PRrsVT8Kf2ou745T2B/+/06lrEGuf/AS6jWpyBeFeJZAr0K+hHoVPvfh/7EgXwwtud9FjfcFPCW05/xhCnPxFOOwD92nwhzsSwVrHpcRX0MucTbQnt8aG1gfy1KROfdoyOX9sSGX9TE0+HE+1ADtPbE0tDs57I/Y3uVg23v9+33T59M0sM+3aaG9KLePqC96Ui772lhr56Swfjy+5k9hbMU7KYz998Aqor8LX/9DvQ1qn07P9T/x+Fy/hwmvRMdyFen7/cHngfjDg53f5zpQt4ffSHvTg73ocYyv3+lWpOb6Ef/f2x52l4X2r+MsmZ7L+RNjbgS/m/Z1R2hHnDPwNSP4011EbzEz0I93C/H03tIO+v2p2Fn/5lT8DkdH9uZ/gPoW2jFuR2x+l5we2rsFnfcQj/Vs51hGQLsffnftEOJzPjQzl/xI9HHMRXvo49Hx+pgO9tlte+dF6+DFubD99Fza8fqK/syfTB3j0tm1lvNhVi55lNqdhVy89ci1t3y+We4zRfjEXPxMyeXcmUXMq+nT+mA/K5fzbj3xrAnxWG8K/ZmMv5khDvPXBbw+lTGclQtem4q99U8Ad6Senpvv247McQf4HeF3gD4WuehO+JDe7FznKMpH+qUai3Y+pHokepOonR8I6/2tF/qzkestwe9gveBLbzS4X9A3f3bQHxv8SK93KvILW8TZJ5U2+oFnBz/Ob2wvud515+T6nUv38AvBE+CJ9htxH2Sy9/vbHOhRxOO2xX+Z2m8IfpfuC9/xzcGmL+3br98W7MP9tfx8bKL+HOIQ/4IQh/rjd5yrc3lP91u0eH6Hvgl8K7Xf3/2OfSP8m6Ct5/fyObTh2uOj8hJjYL9X5/LW/kqI1zqvpOLzVeL7HbKraU86r6byVv8q8lfB7t9HU3kn6pxrWnvBWPKPodM59P8a+mq/av8a5KrvYMxeQ8fym0Kswh9B7+PwXd8U/Hw84I8EvT9C/5F2JI98Yf0brs3lPeyD9OdO+PoP3NICq/Z7m9/Srs3lv/TBoK9yWS7/r465tDcjl3H7GPq3hHZm0M7NwZ/HvzN+tD/nsr+0T/WuOJf1cxt0fPOcjf4Yzoe51H5f9D41fwz2c/EffY9u4Uf28+ivx8O5jviTqWMeYr7/Z5Y7r5hHu+OCvfvk/s7PZZ/OD+MxNpd31rnI5lBbPp/a+076d7A/7fcaZC3b8X6/A535xLcgzPs8Yl2Qy7v4eOJZEMZdb7a2WxDWl+2t73G+DX3b+b349sCP7bl99e8u1sVt0NK1ndfPXfT/Lvr3oYDnhvaFb0slDvn5V/wK3wm+nfUback/yX77KPtAbdydSrvC96SadwflHva39791vP+1v++tyuupxvfCk80nAu916s/AF/b+7JLrfXYstPeb4vxUquPuSvwfhZaO/iN6z9C/dWGu3zP0DiVa76AXwxfP71HCygUGIFd9USo2tp8AlvxC5Ob7H+b/qfj9gx+/v/cP8km5+PE/VfS0XN5R/J6zEJ77NQC+3iX173kD/3pD/H3A/hcvIs6FueQKi5Crtv4rqbnNG+BX0PsTvo3V3uJc3kUX5zK+E8CLwji9gd3iXOJ9IzXHi4P9n1NzncdS/R62JNd31Ceh/f7m97Mludxfp4Ivp56ay/teQ+BPg78k+HF7/wFfte7/4k8F22Zqbr62luby9jwR7HdR8Zai7/4K+73R9tKTj0GpYNGW+z3beBD6j6eCHw/y74d5Mtb7tOfv+9h/K+AnwpxY7nifpP2niftx5E+n4v9peO6fdR3/0/gQ/gFj7TlWrTZ+ANZ7udbED1kXkV6M/IfE7Pd44e+HdfoHeML/CW2/avuZVN59nglzL7wP+VPIT871fcT3zZOhjwtY9AkB+74krPvcKeApQW7eKej4reSEFjY+F5blMn5PMqbLwv5YFmTLctk/tp+Wm/OXwbMfz5dp28S2zL8yxLMQ2utN+/gvjLV4f+Is+SvnwjJsrsO/audMVwW+z8/rcjk/jf3+ZXvZzgv2ztWivt+rludyl54Jdt4zM8j9vtaAj+Wh3ata2C0P7VjPeVdjVX7EmvIbV2OY7wZsGnO5x88CS/4M+l6Pp2Br+VPBdyP8Jbmci9L9bvDRmMv75azgN7a3JBc9x3UK8hW5rDefv430YQXj0BBwQy7+LF8R7K2/Arwk2E0LfVUfToU+lTEVz2+HP0b+Y/CPwO7/98AeP/vyO8Q/33igV4b1INp58rXUXg8rse+CzFh2ncD25Te85eCVubyXrMwln3c8btd6q7BdDu3zxfNjvs8N0SeDrd8Iz3KfV6tyeXNZGWSdwjw2Bp+nIVsFvbIFPj30/3TGx/30+87pYN+nV+f6nvpXzovX4K3O5Q6+COwcZzY24ik3fS2Ve/drwec12Pl+Hn1eB3bO5jxNvPmhnhNsncctQn91LufQ7GDnO5Htrgl99XmoOP9Ov8V/E/xawKtzuV8rz34zFayceE0u99tPp5pW3iy+7gN3QkuuPD/y1uSyRiX3fcF+7wR/Gv1PIuuKXPy7g7/OzHfXEJf9OO9fmUs8XXKxE36d/qmfa3O5P7wO/niq7yL3gn3vWMv4vp7K/WQt476WeZD8nuDH7xX3hvbeDHYeb/NtPz+X9jSW63K5j60L878W+bXwF4B9/1rHfKyDvwY9r8m5YK9Br6e7GQO3dVcqfhzfOtr3ebUu+PM5tqBFu45zTW5+3tnO/ZvXYt045pW53F9jbG5b9p9nPj9XlfW5rNP7WGOfRXYfcum/hY3wW6wPrwfJP4H8rVD7vvkWetH+dfTW0v4Zub5zqs1PEcN98B3fGcRo/TW53E8/BU842qq9+8O8aI7uD3O3NsjvTmU/3Z8Kvo/6fsZHa/ULIf7PgD2eUbae/XMPOm7vC6nsg8+BPd5d2ZNn0kfX3rdnQvv87grvrFzOk66M11mMx9m5xPdZxuZs4vsisVvvi9Rvw/889dup6Efe54K+18vbzLuw8tENuc5JF4OVk/4Fvor5i3LJN5ch8/1NtOQ6p/+Gjw1gy7RP/4Tc/lv6sZ3bWx3k3vcLW7S3CCxb32eUX79DO++AN+ZyD/oh2P1THFEuemkYlw3wrLc4yP8cbGLbxpK5fd/vlMdtyiXvM3buZ+x737KA/wsfwqKfCdj5qbHz3WfAP0mlH0vB8mn/P0mlj8a632hcor7vPD9BtjH4Ez/efzUGbvenxP+DEM9PAxb9M3SENZ/P4uMd6meDP/OfBf8cWnb/gH4nYPnenIt/1b5/bGa8noFn7FzZeDPzZPvNYXxtvxn5c/TF7T6Hb9uJ7p6L/+fAbv8Xqc7Zzf8x9hGfGvycgq9ziEV1zHNPhnca+BxkjQH3CHLN5Rb23gZo79uNQe71ch14GWO0gn5tQW6+ccLW54HOhhSwaeloHjO8vyHXebA1l/+FckNh54t/BVvXuaR4B+Tan3wdgJ+cSxz2swGZ9f4WfKi/TbnkIavAOvuXQ/v+u5J+N4XxFO1cwXmC7VZQe9y3glcHe7e/BX3H0YT+6tCOx8ntrwzt+H60JZf1vY31sI01sYq6CXpbaLcp6DdCS+fUFjzfKzeDvT6ivHto1/uie9Dflst6bQp836+65fr/ux3cA56x73DG/ldvhz4z4B6hHcu7oWP5acHfqjCu23PJD+zPa2MN+O+s01bMTyt4b7bgO18+AHnU9z1I8gOhnde1Ah+IvfOcHbn+/zsX2IHtDvScHxyYi1x8r58dtO/8zHLlGs5tdgR+q+C/FbytjMOOXPJHFcV4P23eB229ddjZ79voOV7bx/6dHfp7JnTMx84IPLfrPN/Y42Z7z19TwB4bx7o9jIfbvy+V/q6nTfk8F51Ie/10g7edumcY356Mq8fB9dlBr2cuY3AQ2OOifNH0QRRh6RwcdA8E+/zVmbITWrVzKeF/8M8V/53wH7b+xlxkW6CdX/n83Qrf596GYKPa/3uV/cGP8oL9/Iudb+zn/+t8YxM2P8XHllxs9vNv9f96P/XPgtxn5Cbi2B/yEfdzf8Dq//Pwfw5t/rPg/cifhy+9QxjLQ3Kx/zX6lr8LHc+DsO2EfW4q3l25nLtbwGpX9XOp5B+7sNsc+rsrYOv8MhV7j7/zEvF6ofOrVNPiiVZO80t4v8BfxN3x0ys3l8m+dy7/oO3gJnjbwNoj3YK8G3Lhc+jbeehHehd07+CvO/04L8h75PJ/Et4d7HczFsb+725B1tRCx3yvd/vr3UK+E3+tg24G72bevb9aB9yaeit6KdjZh/4ph+byPzk0l3zI/NboSq5zZA98+22C14radr3BPr96B92It8Fzv3eDPba2cX+3hnZaB7wj6Po/sSeX9XJu0BPW+dYml3+T/0/mtQr6bXI5b0UfHMZrDzz574PejoB3BB376xPaN5b++dAet97whA+jXZ/jhwUfB4Mdp3zs57z4ZVX25ubnzF7Gcm8u60t6/82e3ZuL3a/Y579G/nyQPw9vby7n0yH4jWeXsM+niHeGOPYHv7tCvHuJT+1ckEt8onuF+KLM8aq9tvhoi06Mt23APlOt/xv6Zr3fMDaOw3L7la3W4+G57MvdYLf/roD7Yud4z4O3G2w/fYP+3iA/j/73BfcFX5DLeSndfqyffvB8zhwOr29op1+Qn4++7Q+nf0cE+yOQ725Be3+2gb+HunUue8Z+WoOPRF/ruA94D/T54PNDPEfmslfagPuF9o6E9r47nD4eFea3LfiCUMf1cnjQP6rFnB2F/Gj4R9Oe4/D4HB2wdYX/F+t5l+M= +</DataArray> +<DataArray type="Int32" Name="offsets" format="binary"> +AQAAAAAAAACAFAAAAAAAAIAUAAAAAAAARAYAAAAAAAA=eJwl2KH7OewVwOHvtt8222yzTRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRCE3e/1Xtdz/wGf9Jxzfv38/AQIEiJMhCgx4iRIkiJNhiw58hQoUqJMhSo16jRo0qJNhy49+gwYMmLMhCkz5ixYsmLNhi079hw4cuLMhSs37jx48uLNhy8/f/j5+UWAICHCRIgSI06CJCnSZMiSI0+BIiXKVKhSo06DJi3adOjSo8+AISPGTJgyY86CJSvWbNiyY8+BIyfOXLhy486DJy/efPjy80f9BAgSIkyEKDHiJEiSIk2GLDnyFChSokyFKjXqNGjSok2HLj36DBgyYsyEKTPmLFiyYs2GLTv2HDhy4syFKzfuPHjy4s2HLz9/0k+AICHCRIgSI06CJCnSZMiSI0+BIiXKVKhSo06DJi3adOjSo8+AISPGTJgyY86CJSvWbNiyY8+BIyfOXLhy486DJy/efPjy88sjQJAQYSJEiREnQZIUaTJkyZGnQJESZSpUqVGnQZMWbTp06dFnwJARYyZMmTFnwZIVazZs2bHnwJETZy5cuXHnwZMXbz58+fmzfgIECREmQpQYcRIkSZEmQ5YceQoUKVGmQpUadRo0adGmQ5cefQYMGTFmwpQZcxYsWbFmw5Ydew4cOXHmwpUbdx48efHmw5efv+gnQJAQYSJEiREnQZIUaTJkyZGnQJESZSpUqVGnQZMWbTp06dFnwJARYyZMmTFnwZIVazZs2bHnwJETZy5cuXHnwZMXbz58+fmrfgIECREmQpQYcRIkSZEmQ5YceQoUKVGmQpUadRo0adGmQ5cefQYMGTFmwpQZcxYsWbFmw5Ydew4cOXHmwpUbdx48efHmw/evv3/8vwgQJESYCFFixEmQJEWaDFly5ClQpESZClVq1GnQpEWbDl169BkwZMSYCVNmzFmwZMWaDVt27Dlw5MSZC1du3Hnw5MWbD9/fhp6/6SdAkBBhIkSJESdBkhRpMmTJkadAkRJlKlSpUadBkxZtOnTp0WfAkBFjJkyZMWfBkhVrNmzZsefAkRNnLly5cefBkxdvPnz5+bt+AgQJESZClBhxEiRJkSZDlhx5ChQpUaZClRp1GjRp0aZDlx59BgwZMWbClBlzFixZsWbDlh17Dhw5cebClRt3Hjx58ebDl59/6CdAkBBhIkSJESdBkhRpMmTJkadAkRJlKlSpUadBkxZtOnTp0WfAkBFjJkyZMWfBkhVrNmzZsefAkRNnLly5cefBkxdvPnz/8fvQ/4sAQUKEiRAlRpwESVKkyZAlR54CRUqUqVClRp0GTVq06dClR58BQ0aMmTBlxpwFS1as2bBlx54DR06cuXDlxp0HT168+fD9beH5p34CBAkRJkKUGHESJEmRJkOWHHkKFClRpkKVGnUaNGnRpkOXHn0GDBkxZsKUGXMWLFmxZsOWHXsOHDlx5sKVG3cePHnx5sOXn3/pJ0CQEGEiRIkRJ0GSFGkyZMmRp0CREmUqVKlRp0GTFm06dOnRZ8CQEWMmTJkxZ8GSFWs2bNmx58CRE2cuXLlx58GTF28+fPn5t34CBAkRJkKUGHESJEmRJkOWHHkKFClRpkKVGnUaNGnRpkOXHn0GDBkxZsKUGXMWLFmxZsOWHXsOHDlx5sKVG3cePHnx5sP3378v/L8IECREmAhRYsRJkCRFmgxZcuQpUKREmQpVatRp0KRFmw5devQZMGTEmAlTZsxZsGTFmg1bduw5cOTEmQtXbtx58OTFmw/f344d/9FPgCAhwkSIEiNOgiQp0mTIkiNPgSIlylSoUqNOgyYt2nTo0qPPgCEjxkyYMmPOgiUr1mzYsmPPgSMnzly4cuPOgycv3nz48vNf/QQIEiJMhCgx4iRIkiJNhiw58hQoUqJMhSo16jRo0qJNhy49+gwYMmLMhCkz5ixYsmLNhi079hw4cuLMhSs37jx48uLNhy8//9NPgCAhwkSIEiNOgiQp0mTIkiNPgSIlylSoUqNOgyYt2nTo0qPPgCEjxkyYMmPOgiUr1mzYsmPPgSMnzly4cuPOgycv3nz4/u/3Y98vAgQJESZClBhxEiRJkSZDlhx5ChQpUaZClRp1GjRp0aZDlx7/B1awsHM= +</DataArray> +<DataArray type="UInt8" Name="types" format="binary"> +AQAAAAAAAAAgBQAAAAAAACAFAAAAAAAAFAAAAAAAAAA=eJzj4hoFo2AUjIJRgA0AAHptM0E= +</DataArray> +</Cells> +</Piece> +</UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/tetrahedrons/netgen_cube.geo b/src/UnitTests/Meshes/data/tetrahedrons/netgen_cube.geo new file mode 100644 index 0000000000000000000000000000000000000000..8fb3e84d74cbad14a0a247fdfdf4693f4cd57ddd --- /dev/null +++ b/src/UnitTests/Meshes/data/tetrahedrons/netgen_cube.geo @@ -0,0 +1,4 @@ +# A cube +algebraic3d +solid cube = orthobrick (0, 0, 0; 1, 1, 1); +tlo cube; diff --git a/src/UnitTests/Meshes/data/tetrahedrons/netgen_cube.ng b/src/UnitTests/Meshes/data/tetrahedrons/netgen_cube.ng new file mode 100644 index 0000000000000000000000000000000000000000..206ee5f23cbe2d716fe1d1f8baa8a2de80e17660 --- /dev/null +++ b/src/UnitTests/Meshes/data/tetrahedrons/netgen_cube.ng @@ -0,0 +1,32564 @@ +4913 + 0.000000 0.000000 0.000000 + 0.000000 0.000000 1.000000 + 1.000000 0.000000 0.000000 + 0.000000 1.000000 0.000000 + 1.000000 0.000000 1.000000 + 0.000000 1.000000 1.000000 + 1.000000 1.000000 0.000000 + 1.000000 1.000000 1.000000 + 0.000000 0.000000 0.500000 + 0.500000 0.000000 0.000000 + 0.000000 0.500000 0.000000 + 0.500000 0.500000 0.000000 + 0.500000 0.000000 0.500000 + 0.000000 0.500000 0.500000 + 0.500000 0.000000 1.000000 + 0.000000 0.500000 1.000000 + 0.500000 0.500000 0.500000 + 0.500000 0.500000 1.000000 + 1.000000 0.000000 0.500000 + 1.000000 0.500000 0.000000 + 0.000000 1.000000 0.500000 + 0.500000 1.000000 0.000000 + 0.500000 1.000000 0.500000 + 1.000000 0.500000 0.500000 + 1.000000 0.500000 1.000000 + 0.500000 1.000000 1.000000 + 1.000000 1.000000 0.500000 + 0.000000 0.000000 0.250000 + 0.250000 0.000000 0.000000 + 0.000000 0.250000 0.000000 + 0.250000 0.250000 0.000000 + 0.000000 0.000000 0.750000 + 0.250000 0.000000 0.750000 + 0.000000 0.250000 0.750000 + 0.250000 0.000000 1.000000 + 0.000000 0.250000 1.000000 + 0.250000 0.250000 0.750000 + 0.250000 0.250000 1.000000 + 0.750000 0.000000 0.000000 + 0.750000 0.000000 0.250000 + 1.000000 0.000000 0.250000 + 1.000000 0.250000 0.000000 + 0.000000 0.750000 0.000000 + 0.000000 0.750000 0.250000 + 0.000000 1.000000 0.250000 + 0.250000 1.000000 0.000000 + 0.250000 1.000000 0.250000 + 0.750000 0.000000 1.000000 + 1.000000 0.000000 0.750000 + 1.000000 0.250000 0.750000 + 1.000000 0.250000 1.000000 + 0.000000 0.750000 1.000000 + 0.000000 1.000000 0.750000 + 0.250000 1.000000 1.000000 + 0.750000 0.750000 0.000000 + 0.750000 0.750000 0.250000 + 1.000000 0.750000 0.000000 + 0.750000 1.000000 0.000000 + 1.000000 0.750000 0.250000 + 1.000000 1.000000 0.250000 + 0.750000 0.750000 1.000000 + 0.750000 1.000000 0.750000 + 1.000000 0.750000 1.000000 + 0.750000 1.000000 1.000000 + 1.000000 1.000000 0.750000 + 0.250000 0.000000 0.250000 + 0.000000 0.250000 0.250000 + 0.250000 0.250000 0.250000 + 0.250000 0.000000 0.500000 + 0.000000 0.250000 0.500000 + 0.250000 0.250000 0.500000 + 0.500000 0.250000 0.000000 + 0.500000 0.000000 0.250000 + 0.750000 0.250000 0.000000 + 0.250000 0.500000 0.000000 + 0.000000 0.500000 0.250000 + 0.250000 0.500000 0.250000 + 0.250000 0.750000 0.000000 + 0.500000 0.250000 0.250000 + 0.500000 0.500000 0.250000 + 0.750000 0.500000 0.000000 + 0.500000 0.750000 0.000000 + 0.500000 0.000000 0.750000 + 0.500000 0.250000 0.500000 + 0.750000 0.000000 0.500000 + 0.750000 0.250000 0.250000 + 0.000000 0.500000 0.750000 + 0.250000 0.500000 0.500000 + 0.250000 0.500000 0.750000 + 0.000000 0.750000 0.500000 + 0.250000 0.750000 0.250000 + 0.250000 0.750000 0.500000 + 0.500000 0.250000 0.750000 + 0.500000 0.250000 1.000000 + 0.750000 0.000000 0.750000 + 0.750000 0.250000 0.500000 + 0.750000 0.250000 0.750000 + 0.750000 0.250000 1.000000 + 0.250000 0.500000 1.000000 + 0.000000 0.750000 0.750000 + 0.250000 0.750000 1.000000 + 0.500000 0.500000 0.750000 + 0.750000 0.500000 0.250000 + 0.500000 0.750000 0.250000 + 0.500000 0.750000 0.500000 + 0.750000 0.500000 0.500000 + 0.750000 0.750000 0.500000 + 0.250000 0.750000 0.750000 + 0.500000 0.750000 0.750000 + 0.750000 0.500000 0.750000 + 0.750000 0.500000 1.000000 + 0.500000 0.750000 1.000000 + 0.750000 0.750000 0.750000 + 1.000000 0.250000 0.250000 + 1.000000 0.250000 0.500000 + 1.000000 0.500000 0.250000 + 0.250000 1.000000 0.500000 + 0.250000 1.000000 0.750000 + 0.500000 1.000000 0.250000 + 0.750000 1.000000 0.250000 + 0.500000 1.000000 0.750000 + 0.750000 1.000000 0.500000 + 1.000000 0.500000 0.750000 + 1.000000 0.750000 0.500000 + 1.000000 0.750000 0.750000 + 0.000000 0.000000 0.125000 + 0.125000 0.000000 0.000000 + 0.000000 0.125000 0.000000 + 0.125000 0.125000 0.000000 + 0.000000 0.000000 0.875000 + 0.125000 0.000000 0.875000 + 0.000000 0.125000 0.875000 + 0.125000 0.000000 1.000000 + 0.000000 0.125000 1.000000 + 0.125000 0.125000 0.875000 + 0.125000 0.125000 1.000000 + 0.875000 0.000000 0.000000 + 0.875000 0.000000 0.125000 + 1.000000 0.000000 0.125000 + 1.000000 0.125000 0.000000 + 0.000000 0.875000 0.000000 + 0.000000 0.875000 0.125000 + 0.000000 1.000000 0.125000 + 0.125000 1.000000 0.000000 + 0.125000 1.000000 0.125000 + 0.875000 0.000000 1.000000 + 1.000000 0.000000 0.875000 + 1.000000 0.125000 0.875000 + 1.000000 0.125000 1.000000 + 0.000000 0.875000 1.000000 + 0.000000 1.000000 0.875000 + 0.125000 1.000000 1.000000 + 0.875000 0.875000 0.000000 + 0.875000 0.875000 0.125000 + 1.000000 0.875000 0.000000 + 0.875000 1.000000 0.000000 + 1.000000 0.875000 0.125000 + 1.000000 1.000000 0.125000 + 0.875000 0.875000 1.000000 + 0.875000 1.000000 0.875000 + 1.000000 0.875000 1.000000 + 0.875000 1.000000 1.000000 + 1.000000 1.000000 0.875000 + 0.000000 0.000000 0.375000 + 0.000000 0.000000 0.625000 + 0.125000 0.000000 0.375000 + 0.000000 0.125000 0.375000 + 0.125000 0.125000 0.375000 + 0.125000 0.000000 0.500000 + 0.000000 0.125000 0.500000 + 0.125000 0.125000 0.500000 + 0.375000 0.000000 0.000000 + 0.625000 0.000000 0.000000 + 0.375000 0.000000 0.125000 + 0.500000 0.125000 0.000000 + 0.500000 0.000000 0.125000 + 0.625000 0.125000 0.000000 + 0.000000 0.375000 0.000000 + 0.000000 0.625000 0.000000 + 0.000000 0.375000 0.125000 + 0.125000 0.500000 0.000000 + 0.000000 0.500000 0.125000 + 0.125000 0.500000 0.125000 + 0.125000 0.625000 0.000000 + 0.375000 0.375000 0.000000 + 0.625000 0.625000 0.000000 + 0.375000 0.375000 0.125000 + 0.500000 0.375000 0.000000 + 0.375000 0.500000 0.000000 + 0.500000 0.375000 0.125000 + 0.500000 0.500000 0.125000 + 0.625000 0.500000 0.000000 + 0.500000 0.625000 0.000000 + 0.375000 0.000000 0.625000 + 0.625000 0.000000 0.375000 + 0.375000 0.000000 0.500000 + 0.500000 0.000000 0.375000 + 0.500000 0.125000 0.375000 + 0.500000 0.000000 0.625000 + 0.500000 0.125000 0.500000 + 0.625000 0.000000 0.500000 + 0.625000 0.125000 0.375000 + 0.000000 0.375000 0.625000 + 0.000000 0.625000 0.375000 + 0.000000 0.375000 0.500000 + 0.000000 0.500000 0.375000 + 0.000000 0.500000 0.625000 + 0.125000 0.500000 0.500000 + 0.125000 0.500000 0.625000 + 0.000000 0.625000 0.500000 + 0.125000 0.625000 0.375000 + 0.125000 0.625000 0.500000 + 0.375000 0.000000 1.000000 + 0.625000 0.000000 1.000000 + 0.500000 0.000000 0.875000 + 0.500000 0.125000 0.875000 + 0.500000 0.125000 1.000000 + 0.625000 0.000000 0.875000 + 0.625000 0.125000 0.750000 + 0.625000 0.125000 0.875000 + 0.625000 0.125000 1.000000 + 0.000000 0.375000 1.000000 + 0.000000 0.625000 1.000000 + 0.000000 0.500000 0.875000 + 0.125000 0.500000 1.000000 + 0.000000 0.625000 0.875000 + 0.125000 0.625000 1.000000 + 0.375000 0.375000 0.625000 + 0.625000 0.625000 0.375000 + 0.375000 0.375000 0.500000 + 0.375000 0.500000 0.375000 + 0.500000 0.500000 0.375000 + 0.500000 0.375000 0.500000 + 0.375000 0.500000 0.500000 + 0.500000 0.375000 0.625000 + 0.500000 0.500000 0.625000 + 0.625000 0.500000 0.375000 + 0.500000 0.625000 0.375000 + 0.500000 0.625000 0.500000 + 0.625000 0.500000 0.500000 + 0.625000 0.625000 0.500000 + 0.375000 0.375000 1.000000 + 0.625000 0.625000 1.000000 + 0.375000 0.500000 0.875000 + 0.500000 0.375000 1.000000 + 0.375000 0.500000 1.000000 + 0.500000 0.500000 0.875000 + 0.375000 0.625000 0.875000 + 0.500000 0.625000 0.875000 + 0.625000 0.500000 0.875000 + 0.625000 0.500000 1.000000 + 0.500000 0.625000 1.000000 + 0.625000 0.625000 0.875000 + 1.000000 0.000000 0.375000 + 1.000000 0.000000 0.625000 + 0.875000 0.000000 0.500000 + 0.875000 0.000000 0.625000 + 1.000000 0.125000 0.375000 + 1.000000 0.125000 0.500000 + 1.000000 0.375000 0.000000 + 1.000000 0.625000 0.000000 + 0.875000 0.375000 0.000000 + 0.875000 0.500000 0.000000 + 0.875000 0.375000 0.125000 + 0.875000 0.375000 0.250000 + 0.875000 0.500000 0.125000 + 1.000000 0.375000 0.125000 + 1.000000 0.500000 0.125000 + 0.000000 1.000000 0.375000 + 0.000000 1.000000 0.625000 + 0.000000 0.875000 0.500000 + 0.000000 0.875000 0.625000 + 0.125000 0.875000 0.625000 + 0.125000 1.000000 0.500000 + 0.125000 1.000000 0.625000 + 0.375000 1.000000 0.000000 + 0.625000 1.000000 0.000000 + 0.375000 0.875000 0.000000 + 0.500000 0.875000 0.000000 + 0.375000 0.875000 0.125000 + 0.500000 0.875000 0.125000 + 0.500000 1.000000 0.125000 + 0.625000 1.000000 0.125000 + 0.375000 1.000000 0.375000 + 0.625000 1.000000 0.625000 + 0.375000 0.875000 0.500000 + 0.500000 0.875000 0.500000 + 0.500000 0.875000 0.625000 + 0.375000 1.000000 0.500000 + 0.500000 1.000000 0.375000 + 0.500000 1.000000 0.625000 + 0.625000 1.000000 0.500000 + 1.000000 0.375000 0.625000 + 1.000000 0.625000 0.375000 + 0.875000 0.375000 0.625000 + 0.875000 0.500000 0.500000 + 0.875000 0.500000 0.625000 + 1.000000 0.375000 0.500000 + 1.000000 0.500000 0.375000 + 1.000000 0.500000 0.625000 + 1.000000 0.625000 0.500000 + 1.000000 0.375000 1.000000 + 1.000000 0.625000 1.000000 + 0.875000 0.375000 1.000000 + 0.875000 0.500000 1.000000 + 1.000000 0.500000 0.875000 + 1.000000 0.625000 0.875000 + 0.375000 1.000000 1.000000 + 0.625000 1.000000 1.000000 + 0.375000 0.875000 1.000000 + 0.500000 0.875000 1.000000 + 0.375000 1.000000 0.875000 + 0.500000 1.000000 0.875000 + 1.000000 1.000000 0.375000 + 1.000000 1.000000 0.625000 + 0.875000 0.875000 0.500000 + 0.875000 0.875000 0.625000 + 0.875000 1.000000 0.375000 + 0.875000 1.000000 0.500000 + 1.000000 0.875000 0.500000 + 1.000000 0.875000 0.625000 + 0.125000 0.000000 0.125000 + 0.000000 0.125000 0.125000 + 0.125000 0.125000 0.125000 + 0.125000 0.000000 0.250000 + 0.000000 0.125000 0.250000 + 0.125000 0.125000 0.250000 + 0.250000 0.125000 0.000000 + 0.250000 0.000000 0.125000 + 0.375000 0.125000 0.000000 + 0.125000 0.250000 0.000000 + 0.000000 0.250000 0.125000 + 0.125000 0.250000 0.125000 + 0.125000 0.375000 0.000000 + 0.250000 0.125000 0.125000 + 0.250000 0.250000 0.125000 + 0.375000 0.250000 0.000000 + 0.250000 0.375000 0.000000 + 0.125000 0.000000 0.750000 + 0.000000 0.125000 0.750000 + 0.125000 0.125000 0.750000 + 0.125000 0.000000 0.625000 + 0.000000 0.125000 0.625000 + 0.125000 0.125000 0.625000 + 0.250000 0.000000 0.875000 + 0.250000 0.125000 0.750000 + 0.250000 0.000000 0.625000 + 0.250000 0.125000 0.625000 + 0.375000 0.000000 0.750000 + 0.375000 0.125000 0.625000 + 0.000000 0.250000 0.875000 + 0.125000 0.250000 0.750000 + 0.125000 0.250000 0.875000 + 0.000000 0.250000 0.625000 + 0.000000 0.375000 0.750000 + 0.125000 0.375000 0.625000 + 0.125000 0.375000 0.750000 + 0.250000 0.125000 0.875000 + 0.250000 0.125000 1.000000 + 0.375000 0.000000 0.875000 + 0.375000 0.125000 0.750000 + 0.375000 0.125000 0.875000 + 0.375000 0.125000 1.000000 + 0.125000 0.250000 1.000000 + 0.000000 0.375000 0.875000 + 0.125000 0.375000 1.000000 + 0.250000 0.250000 0.875000 + 0.125000 0.250000 0.625000 + 0.250000 0.250000 0.625000 + 0.375000 0.250000 0.625000 + 0.250000 0.375000 0.625000 + 0.250000 0.375000 0.750000 + 0.375000 0.250000 0.750000 + 0.375000 0.375000 0.750000 + 0.125000 0.375000 0.875000 + 0.250000 0.375000 0.875000 + 0.375000 0.250000 0.875000 + 0.375000 0.250000 1.000000 + 0.250000 0.375000 1.000000 + 0.375000 0.375000 0.875000 + 0.750000 0.000000 0.125000 + 0.875000 0.125000 0.000000 + 0.625000 0.000000 0.125000 + 0.750000 0.125000 0.000000 + 0.875000 0.000000 0.250000 + 0.875000 0.125000 0.125000 + 0.625000 0.000000 0.250000 + 0.750000 0.125000 0.125000 + 0.750000 0.000000 0.375000 + 0.750000 0.125000 0.250000 + 1.000000 0.125000 0.125000 + 0.875000 0.000000 0.375000 + 1.000000 0.125000 0.250000 + 0.875000 0.250000 0.000000 + 0.875000 0.125000 0.250000 + 0.875000 0.250000 0.125000 + 1.000000 0.250000 0.125000 + 0.000000 0.750000 0.125000 + 0.125000 0.875000 0.000000 + 0.000000 0.625000 0.125000 + 0.125000 0.750000 0.000000 + 0.125000 0.750000 0.125000 + 0.000000 0.875000 0.250000 + 0.125000 0.875000 0.125000 + 0.125000 0.875000 0.250000 + 0.000000 0.625000 0.250000 + 0.000000 0.750000 0.375000 + 0.125000 0.750000 0.250000 + 0.125000 0.750000 0.375000 + 0.125000 1.000000 0.250000 + 0.000000 0.875000 0.375000 + 0.125000 0.875000 0.375000 + 0.125000 1.000000 0.375000 + 0.250000 1.000000 0.125000 + 0.250000 0.875000 0.000000 + 0.250000 0.875000 0.125000 + 0.375000 1.000000 0.125000 + 0.250000 0.875000 0.250000 + 0.250000 0.875000 0.375000 + 0.250000 1.000000 0.375000 + 0.375000 1.000000 0.250000 + 0.875000 0.000000 0.875000 + 0.875000 0.125000 0.875000 + 0.875000 0.125000 1.000000 + 0.750000 0.000000 0.875000 + 0.750000 0.125000 0.875000 + 0.750000 0.125000 1.000000 + 0.875000 0.125000 0.750000 + 1.000000 0.125000 0.750000 + 0.875000 0.000000 0.750000 + 1.000000 0.125000 0.625000 + 1.000000 0.250000 0.875000 + 0.875000 0.250000 0.750000 + 0.875000 0.250000 0.875000 + 1.000000 0.250000 0.625000 + 1.000000 0.375000 0.750000 + 0.875000 0.250000 1.000000 + 1.000000 0.375000 0.875000 + 0.000000 0.875000 0.875000 + 0.125000 0.875000 1.000000 + 0.000000 0.750000 0.875000 + 0.125000 0.750000 1.000000 + 0.125000 1.000000 0.875000 + 0.000000 0.875000 0.750000 + 0.125000 0.875000 0.875000 + 0.125000 1.000000 0.750000 + 0.250000 0.875000 1.000000 + 0.250000 1.000000 0.875000 + 0.750000 0.750000 0.125000 + 0.875000 0.750000 0.000000 + 0.750000 0.875000 0.000000 + 0.625000 0.625000 0.125000 + 0.750000 0.625000 0.000000 + 0.625000 0.750000 0.000000 + 0.750000 0.625000 0.125000 + 0.875000 0.750000 0.125000 + 0.750000 0.875000 0.125000 + 0.875000 0.750000 0.250000 + 0.875000 0.875000 0.250000 + 0.625000 0.625000 0.250000 + 0.625000 0.750000 0.125000 + 0.750000 0.625000 0.250000 + 0.625000 0.750000 0.250000 + 0.750000 0.625000 0.375000 + 0.750000 0.750000 0.375000 + 0.750000 0.875000 0.250000 + 1.000000 0.750000 0.125000 + 0.875000 0.625000 0.000000 + 0.875000 0.625000 0.125000 + 0.875000 0.625000 0.250000 + 1.000000 0.625000 0.125000 + 0.875000 1.000000 0.125000 + 0.625000 0.875000 0.000000 + 0.625000 0.875000 0.125000 + 0.750000 1.000000 0.125000 + 1.000000 0.875000 0.250000 + 0.875000 0.625000 0.375000 + 0.875000 0.750000 0.375000 + 1.000000 0.625000 0.250000 + 1.000000 0.750000 0.375000 + 0.875000 0.875000 0.375000 + 0.875000 1.000000 0.250000 + 1.000000 0.875000 0.375000 + 0.750000 0.875000 0.875000 + 0.875000 0.750000 1.000000 + 0.750000 0.875000 1.000000 + 0.875000 0.875000 0.875000 + 0.625000 0.750000 0.875000 + 0.750000 0.625000 1.000000 + 0.625000 0.750000 1.000000 + 0.750000 0.750000 0.875000 + 0.625000 0.875000 0.875000 + 0.875000 0.750000 0.875000 + 0.750000 1.000000 0.875000 + 0.875000 1.000000 0.750000 + 0.625000 0.875000 0.750000 + 0.750000 0.875000 0.750000 + 0.625000 1.000000 0.750000 + 0.750000 1.000000 0.625000 + 1.000000 0.875000 0.875000 + 0.875000 0.625000 1.000000 + 1.000000 0.750000 0.875000 + 0.625000 0.875000 1.000000 + 0.625000 1.000000 0.875000 + 0.875000 0.875000 0.750000 + 0.875000 1.000000 0.625000 + 1.000000 0.875000 0.750000 + 0.250000 0.125000 0.250000 + 0.250000 0.000000 0.375000 + 0.375000 0.125000 0.125000 + 0.375000 0.000000 0.250000 + 0.375000 0.125000 0.250000 + 0.125000 0.250000 0.250000 + 0.000000 0.250000 0.375000 + 0.125000 0.250000 0.375000 + 0.125000 0.375000 0.125000 + 0.000000 0.375000 0.250000 + 0.125000 0.375000 0.250000 + 0.250000 0.125000 0.375000 + 0.250000 0.250000 0.375000 + 0.375000 0.250000 0.125000 + 0.250000 0.375000 0.125000 + 0.250000 0.375000 0.250000 + 0.375000 0.250000 0.250000 + 0.375000 0.375000 0.250000 + 0.250000 0.125000 0.500000 + 0.375000 0.000000 0.375000 + 0.375000 0.125000 0.375000 + 0.375000 0.125000 0.500000 + 0.125000 0.250000 0.500000 + 0.000000 0.375000 0.375000 + 0.125000 0.375000 0.375000 + 0.125000 0.375000 0.500000 + 0.250000 0.375000 0.375000 + 0.375000 0.250000 0.375000 + 0.375000 0.375000 0.375000 + 0.375000 0.250000 0.500000 + 0.250000 0.375000 0.500000 + 0.500000 0.125000 0.125000 + 0.625000 0.250000 0.000000 + 0.500000 0.250000 0.125000 + 0.625000 0.375000 0.000000 + 0.625000 0.125000 0.125000 + 0.500000 0.125000 0.250000 + 0.625000 0.125000 0.250000 + 0.625000 0.250000 0.125000 + 0.750000 0.375000 0.000000 + 0.750000 0.250000 0.125000 + 0.250000 0.500000 0.125000 + 0.250000 0.625000 0.000000 + 0.375000 0.500000 0.125000 + 0.375000 0.625000 0.000000 + 0.125000 0.500000 0.250000 + 0.125000 0.625000 0.125000 + 0.125000 0.500000 0.375000 + 0.125000 0.625000 0.250000 + 0.250000 0.625000 0.125000 + 0.375000 0.500000 0.250000 + 0.375000 0.625000 0.125000 + 0.250000 0.500000 0.375000 + 0.250000 0.625000 0.250000 + 0.375000 0.625000 0.250000 + 0.375000 0.750000 0.000000 + 0.250000 0.750000 0.125000 + 0.375000 0.750000 0.125000 + 0.500000 0.375000 0.250000 + 0.625000 0.375000 0.125000 + 0.500000 0.250000 0.375000 + 0.625000 0.250000 0.250000 + 0.625000 0.375000 0.250000 + 0.625000 0.500000 0.125000 + 0.500000 0.625000 0.125000 + 0.500000 0.375000 0.375000 + 0.625000 0.500000 0.250000 + 0.500000 0.625000 0.250000 + 0.750000 0.375000 0.125000 + 0.750000 0.500000 0.125000 + 0.500000 0.750000 0.125000 + 0.500000 0.125000 0.625000 + 0.625000 0.000000 0.625000 + 0.625000 0.125000 0.500000 + 0.500000 0.125000 0.750000 + 0.625000 0.000000 0.750000 + 0.625000 0.125000 0.625000 + 0.625000 0.250000 0.375000 + 0.500000 0.250000 0.625000 + 0.625000 0.250000 0.500000 + 0.625000 0.375000 0.375000 + 0.750000 0.125000 0.375000 + 0.750000 0.000000 0.625000 + 0.750000 0.125000 0.500000 + 0.875000 0.125000 0.375000 + 0.750000 0.250000 0.375000 + 0.750000 0.375000 0.250000 + 0.875000 0.250000 0.250000 + 0.125000 0.500000 0.750000 + 0.000000 0.625000 0.625000 + 0.125000 0.500000 0.875000 + 0.000000 0.625000 0.750000 + 0.125000 0.625000 0.750000 + 0.250000 0.500000 0.625000 + 0.250000 0.625000 0.375000 + 0.250000 0.625000 0.500000 + 0.375000 0.500000 0.625000 + 0.375000 0.625000 0.375000 + 0.375000 0.625000 0.500000 + 0.125000 0.625000 0.625000 + 0.250000 0.625000 0.625000 + 0.250000 0.500000 0.875000 + 0.375000 0.500000 0.750000 + 0.375000 0.625000 0.625000 + 0.250000 0.625000 0.750000 + 0.375000 0.625000 0.750000 + 0.125000 0.750000 0.500000 + 0.000000 0.750000 0.625000 + 0.125000 0.750000 0.625000 + 0.125000 0.875000 0.500000 + 0.250000 0.750000 0.375000 + 0.375000 0.750000 0.250000 + 0.375000 0.750000 0.375000 + 0.375000 0.875000 0.250000 + 0.375000 0.750000 0.500000 + 0.250000 0.750000 0.625000 + 0.375000 0.750000 0.625000 + 0.250000 0.875000 0.500000 + 0.375000 0.875000 0.375000 + 0.500000 0.250000 0.875000 + 0.625000 0.250000 0.625000 + 0.625000 0.250000 0.750000 + 0.500000 0.375000 0.750000 + 0.625000 0.375000 0.500000 + 0.625000 0.375000 0.625000 + 0.625000 0.375000 0.750000 + 0.625000 0.250000 0.875000 + 0.625000 0.250000 1.000000 + 0.500000 0.375000 0.875000 + 0.625000 0.375000 0.875000 + 0.625000 0.375000 1.000000 + 0.750000 0.125000 0.625000 + 0.750000 0.125000 0.750000 + 0.875000 0.125000 0.500000 + 0.875000 0.125000 0.625000 + 0.750000 0.250000 0.625000 + 0.750000 0.375000 0.375000 + 0.750000 0.375000 0.500000 + 0.875000 0.250000 0.375000 + 0.875000 0.250000 0.500000 + 0.875000 0.375000 0.375000 + 0.750000 0.250000 0.875000 + 0.750000 0.375000 0.625000 + 0.750000 0.375000 0.750000 + 0.875000 0.250000 0.625000 + 0.875000 0.375000 0.500000 + 0.875000 0.375000 0.750000 + 0.750000 0.375000 0.875000 + 0.750000 0.375000 1.000000 + 0.875000 0.375000 0.875000 + 0.125000 0.625000 0.875000 + 0.250000 0.625000 1.000000 + 0.250000 0.625000 0.875000 + 0.375000 0.625000 1.000000 + 0.125000 0.750000 0.875000 + 0.125000 0.750000 0.750000 + 0.125000 0.875000 0.750000 + 0.250000 0.750000 0.875000 + 0.375000 0.750000 1.000000 + 0.250000 0.875000 0.875000 + 0.500000 0.625000 0.625000 + 0.625000 0.500000 0.625000 + 0.625000 0.625000 0.625000 + 0.500000 0.625000 0.750000 + 0.625000 0.500000 0.750000 + 0.625000 0.625000 0.750000 + 0.750000 0.500000 0.375000 + 0.875000 0.500000 0.250000 + 0.500000 0.750000 0.375000 + 0.625000 0.750000 0.375000 + 0.500000 0.875000 0.250000 + 0.625000 0.875000 0.250000 + 0.625000 0.750000 0.500000 + 0.500000 0.750000 0.625000 + 0.625000 0.750000 0.625000 + 0.500000 0.875000 0.375000 + 0.625000 0.875000 0.375000 + 0.625000 0.875000 0.500000 + 0.750000 0.625000 0.500000 + 0.750000 0.500000 0.625000 + 0.875000 0.500000 0.375000 + 0.875000 0.625000 0.500000 + 0.750000 0.625000 0.625000 + 0.750000 0.750000 0.625000 + 0.750000 0.875000 0.375000 + 0.750000 0.875000 0.500000 + 0.875000 0.750000 0.500000 + 0.375000 0.750000 0.750000 + 0.375000 0.750000 0.875000 + 0.250000 0.875000 0.625000 + 0.250000 0.875000 0.750000 + 0.375000 0.875000 0.750000 + 0.500000 0.750000 0.875000 + 0.625000 0.750000 0.750000 + 0.375000 0.875000 0.625000 + 0.500000 0.875000 0.750000 + 0.625000 0.875000 0.625000 + 0.750000 0.500000 0.875000 + 0.750000 0.625000 0.750000 + 0.875000 0.500000 0.750000 + 0.875000 0.625000 0.625000 + 0.875000 0.625000 0.750000 + 0.750000 0.625000 0.875000 + 0.875000 0.500000 0.875000 + 0.875000 0.625000 0.875000 + 0.375000 0.875000 0.875000 + 0.500000 0.875000 0.875000 + 0.750000 0.875000 0.625000 + 0.875000 0.750000 0.625000 + 0.875000 0.750000 0.750000 + 1.000000 0.250000 0.375000 + 1.000000 0.375000 0.250000 + 1.000000 0.375000 0.375000 + 0.250000 1.000000 0.625000 + 0.375000 1.000000 0.625000 + 0.375000 1.000000 0.750000 + 0.625000 1.000000 0.250000 + 0.625000 1.000000 0.375000 + 0.750000 1.000000 0.375000 + 1.000000 0.625000 0.625000 + 1.000000 0.625000 0.750000 + 1.000000 0.750000 0.625000 + 0.000000 0.000000 0.062500 + 0.062500 0.000000 0.000000 + 0.000000 0.062500 0.000000 + 0.062500 0.062500 0.000000 + 0.000000 0.000000 0.937500 + 0.062500 0.000000 0.937500 + 0.000000 0.062500 0.937500 + 0.062500 0.000000 1.000000 + 0.000000 0.062500 1.000000 + 0.062500 0.062500 0.937500 + 0.062500 0.062500 1.000000 + 0.937500 0.000000 0.000000 + 0.937500 0.000000 0.062500 + 1.000000 0.000000 0.062500 + 1.000000 0.062500 0.000000 + 0.000000 0.937500 0.000000 + 0.000000 0.937500 0.062500 + 0.000000 1.000000 0.062500 + 0.062500 1.000000 0.000000 + 0.062500 1.000000 0.062500 + 0.937500 0.000000 1.000000 + 1.000000 0.000000 0.937500 + 1.000000 0.062500 0.937500 + 1.000000 0.062500 1.000000 + 0.000000 0.937500 1.000000 + 0.000000 1.000000 0.937500 + 0.062500 1.000000 1.000000 + 0.937500 0.937500 0.000000 + 0.937500 0.937500 0.062500 + 1.000000 0.937500 0.000000 + 0.937500 1.000000 0.000000 + 1.000000 0.937500 0.062500 + 1.000000 1.000000 0.062500 + 0.937500 0.937500 1.000000 + 0.937500 1.000000 0.937500 + 1.000000 0.937500 1.000000 + 0.937500 1.000000 1.000000 + 1.000000 1.000000 0.937500 + 0.000000 0.000000 0.437500 + 0.000000 0.000000 0.562500 + 0.062500 0.000000 0.437500 + 0.000000 0.062500 0.437500 + 0.062500 0.062500 0.437500 + 0.062500 0.000000 0.500000 + 0.000000 0.062500 0.500000 + 0.062500 0.062500 0.500000 + 0.437500 0.000000 0.000000 + 0.562500 0.000000 0.000000 + 0.437500 0.000000 0.062500 + 0.500000 0.062500 0.000000 + 0.500000 0.000000 0.062500 + 0.562500 0.062500 0.000000 + 0.000000 0.437500 0.000000 + 0.000000 0.562500 0.000000 + 0.000000 0.437500 0.062500 + 0.062500 0.500000 0.000000 + 0.000000 0.500000 0.062500 + 0.062500 0.500000 0.062500 + 0.062500 0.562500 0.000000 + 0.437500 0.437500 0.000000 + 0.562500 0.562500 0.000000 + 0.437500 0.437500 0.062500 + 0.500000 0.437500 0.000000 + 0.437500 0.500000 0.000000 + 0.500000 0.437500 0.062500 + 0.500000 0.500000 0.062500 + 0.562500 0.500000 0.000000 + 0.500000 0.562500 0.000000 + 0.437500 0.000000 0.562500 + 0.562500 0.000000 0.437500 + 0.437500 0.000000 0.500000 + 0.500000 0.000000 0.437500 + 0.500000 0.062500 0.437500 + 0.500000 0.000000 0.562500 + 0.500000 0.062500 0.500000 + 0.562500 0.000000 0.500000 + 0.562500 0.062500 0.437500 + 0.000000 0.437500 0.562500 + 0.000000 0.562500 0.437500 + 0.000000 0.437500 0.500000 + 0.000000 0.500000 0.437500 + 0.000000 0.500000 0.562500 + 0.062500 0.500000 0.500000 + 0.062500 0.500000 0.562500 + 0.000000 0.562500 0.500000 + 0.062500 0.562500 0.437500 + 0.062500 0.562500 0.500000 + 0.437500 0.000000 1.000000 + 0.562500 0.000000 1.000000 + 0.500000 0.000000 0.937500 + 0.500000 0.062500 0.937500 + 0.500000 0.062500 1.000000 + 0.562500 0.000000 0.937500 + 0.562500 0.062500 0.875000 + 0.562500 0.062500 0.937500 + 0.562500 0.062500 1.000000 + 0.000000 0.437500 1.000000 + 0.000000 0.562500 1.000000 + 0.000000 0.500000 0.937500 + 0.062500 0.500000 1.000000 + 0.000000 0.562500 0.937500 + 0.062500 0.562500 1.000000 + 0.437500 0.437500 0.562500 + 0.562500 0.562500 0.437500 + 0.437500 0.437500 0.500000 + 0.437500 0.500000 0.437500 + 0.500000 0.500000 0.437500 + 0.500000 0.437500 0.500000 + 0.437500 0.500000 0.500000 + 0.500000 0.437500 0.562500 + 0.500000 0.500000 0.562500 + 0.562500 0.500000 0.437500 + 0.500000 0.562500 0.437500 + 0.500000 0.562500 0.500000 + 0.562500 0.500000 0.500000 + 0.562500 0.562500 0.500000 + 0.437500 0.437500 1.000000 + 0.562500 0.562500 1.000000 + 0.437500 0.500000 0.937500 + 0.500000 0.437500 1.000000 + 0.437500 0.500000 1.000000 + 0.500000 0.500000 0.937500 + 0.437500 0.562500 0.937500 + 0.500000 0.562500 0.937500 + 0.562500 0.500000 0.937500 + 0.562500 0.500000 1.000000 + 0.500000 0.562500 1.000000 + 0.562500 0.562500 0.937500 + 1.000000 0.000000 0.437500 + 1.000000 0.000000 0.562500 + 0.937500 0.000000 0.500000 + 0.937500 0.000000 0.562500 + 1.000000 0.062500 0.437500 + 1.000000 0.062500 0.500000 + 1.000000 0.437500 0.000000 + 1.000000 0.562500 0.000000 + 0.937500 0.437500 0.000000 + 0.937500 0.500000 0.000000 + 0.937500 0.437500 0.062500 + 0.937500 0.437500 0.125000 + 0.937500 0.500000 0.062500 + 1.000000 0.437500 0.062500 + 1.000000 0.500000 0.062500 + 0.000000 1.000000 0.437500 + 0.000000 1.000000 0.562500 + 0.000000 0.937500 0.500000 + 0.000000 0.937500 0.562500 + 0.062500 0.937500 0.562500 + 0.062500 1.000000 0.500000 + 0.062500 1.000000 0.562500 + 0.437500 1.000000 0.000000 + 0.562500 1.000000 0.000000 + 0.437500 0.937500 0.000000 + 0.500000 0.937500 0.000000 + 0.437500 0.937500 0.062500 + 0.500000 0.937500 0.062500 + 0.500000 1.000000 0.062500 + 0.562500 1.000000 0.062500 + 0.437500 1.000000 0.437500 + 0.562500 1.000000 0.562500 + 0.437500 0.937500 0.500000 + 0.500000 0.937500 0.500000 + 0.500000 0.937500 0.562500 + 0.437500 1.000000 0.500000 + 0.500000 1.000000 0.437500 + 0.500000 1.000000 0.562500 + 0.562500 1.000000 0.500000 + 1.000000 0.437500 0.562500 + 1.000000 0.562500 0.437500 + 0.937500 0.437500 0.562500 + 0.937500 0.500000 0.500000 + 0.937500 0.500000 0.562500 + 1.000000 0.437500 0.500000 + 1.000000 0.500000 0.437500 + 1.000000 0.500000 0.562500 + 1.000000 0.562500 0.500000 + 1.000000 0.437500 1.000000 + 1.000000 0.562500 1.000000 + 0.937500 0.437500 1.000000 + 0.937500 0.500000 1.000000 + 1.000000 0.500000 0.937500 + 1.000000 0.562500 0.937500 + 0.437500 1.000000 1.000000 + 0.562500 1.000000 1.000000 + 0.437500 0.937500 1.000000 + 0.500000 0.937500 1.000000 + 0.437500 1.000000 0.937500 + 0.500000 1.000000 0.937500 + 1.000000 1.000000 0.437500 + 1.000000 1.000000 0.562500 + 0.937500 0.937500 0.500000 + 0.937500 0.937500 0.562500 + 0.937500 1.000000 0.437500 + 0.937500 1.000000 0.500000 + 1.000000 0.937500 0.500000 + 1.000000 0.937500 0.562500 + 0.000000 0.000000 0.187500 + 0.000000 0.000000 0.312500 + 0.062500 0.000000 0.187500 + 0.000000 0.062500 0.187500 + 0.062500 0.062500 0.187500 + 0.062500 0.000000 0.250000 + 0.000000 0.062500 0.250000 + 0.062500 0.062500 0.250000 + 0.187500 0.000000 0.000000 + 0.312500 0.000000 0.000000 + 0.187500 0.000000 0.062500 + 0.250000 0.062500 0.000000 + 0.250000 0.000000 0.062500 + 0.312500 0.062500 0.000000 + 0.000000 0.187500 0.000000 + 0.000000 0.312500 0.000000 + 0.000000 0.187500 0.062500 + 0.062500 0.250000 0.000000 + 0.000000 0.250000 0.062500 + 0.062500 0.250000 0.062500 + 0.062500 0.312500 0.000000 + 0.187500 0.187500 0.000000 + 0.312500 0.312500 0.000000 + 0.187500 0.187500 0.062500 + 0.250000 0.187500 0.000000 + 0.187500 0.250000 0.000000 + 0.250000 0.187500 0.062500 + 0.250000 0.250000 0.062500 + 0.312500 0.250000 0.000000 + 0.250000 0.312500 0.000000 + 0.000000 0.000000 0.812500 + 0.000000 0.000000 0.687500 + 0.062500 0.000000 0.750000 + 0.000000 0.062500 0.750000 + 0.062500 0.062500 0.750000 + 0.062500 0.000000 0.687500 + 0.000000 0.062500 0.687500 + 0.062500 0.062500 0.687500 + 0.187500 0.000000 0.812500 + 0.312500 0.000000 0.687500 + 0.187500 0.000000 0.750000 + 0.250000 0.000000 0.812500 + 0.250000 0.062500 0.750000 + 0.250000 0.000000 0.687500 + 0.250000 0.062500 0.687500 + 0.312500 0.000000 0.750000 + 0.312500 0.062500 0.687500 + 0.000000 0.187500 0.812500 + 0.000000 0.312500 0.687500 + 0.000000 0.187500 0.750000 + 0.000000 0.250000 0.812500 + 0.062500 0.250000 0.750000 + 0.062500 0.250000 0.812500 + 0.000000 0.250000 0.687500 + 0.000000 0.312500 0.750000 + 0.062500 0.312500 0.687500 + 0.062500 0.312500 0.750000 + 0.187500 0.000000 1.000000 + 0.312500 0.000000 1.000000 + 0.250000 0.000000 0.937500 + 0.250000 0.062500 0.937500 + 0.250000 0.062500 1.000000 + 0.312500 0.000000 0.937500 + 0.312500 0.062500 0.875000 + 0.312500 0.062500 0.937500 + 0.312500 0.062500 1.000000 + 0.000000 0.187500 1.000000 + 0.000000 0.312500 1.000000 + 0.000000 0.250000 0.937500 + 0.062500 0.250000 1.000000 + 0.000000 0.312500 0.937500 + 0.062500 0.312500 1.000000 + 0.187500 0.187500 0.812500 + 0.312500 0.312500 0.687500 + 0.187500 0.187500 0.750000 + 0.250000 0.187500 0.750000 + 0.187500 0.250000 0.750000 + 0.250000 0.187500 0.812500 + 0.250000 0.250000 0.812500 + 0.187500 0.250000 0.687500 + 0.250000 0.250000 0.687500 + 0.312500 0.250000 0.687500 + 0.250000 0.312500 0.687500 + 0.250000 0.312500 0.750000 + 0.312500 0.250000 0.750000 + 0.312500 0.312500 0.750000 + 0.187500 0.187500 1.000000 + 0.312500 0.312500 1.000000 + 0.187500 0.250000 0.937500 + 0.250000 0.187500 1.000000 + 0.187500 0.250000 1.000000 + 0.250000 0.250000 0.937500 + 0.187500 0.312500 0.937500 + 0.250000 0.312500 0.937500 + 0.312500 0.250000 0.937500 + 0.312500 0.250000 1.000000 + 0.250000 0.312500 1.000000 + 0.312500 0.312500 0.937500 + 0.812500 0.000000 0.000000 + 0.687500 0.000000 0.000000 + 0.750000 0.000000 0.062500 + 0.812500 0.062500 0.000000 + 0.687500 0.000000 0.062500 + 0.750000 0.062500 0.000000 + 0.812500 0.000000 0.187500 + 0.687500 0.000000 0.312500 + 0.750000 0.000000 0.187500 + 0.812500 0.000000 0.250000 + 0.812500 0.062500 0.187500 + 0.687500 0.000000 0.250000 + 0.750000 0.062500 0.187500 + 0.750000 0.000000 0.312500 + 0.750000 0.062500 0.250000 + 1.000000 0.000000 0.187500 + 1.000000 0.000000 0.312500 + 0.937500 0.000000 0.250000 + 1.000000 0.062500 0.187500 + 0.937500 0.000000 0.312500 + 1.000000 0.062500 0.250000 + 1.000000 0.187500 0.000000 + 1.000000 0.312500 0.000000 + 0.937500 0.187500 0.000000 + 0.937500 0.187500 0.062500 + 1.000000 0.187500 0.062500 + 0.937500 0.250000 0.000000 + 0.937500 0.187500 0.125000 + 0.937500 0.250000 0.062500 + 1.000000 0.250000 0.062500 + 0.000000 0.812500 0.000000 + 0.000000 0.687500 0.000000 + 0.000000 0.750000 0.062500 + 0.062500 0.812500 0.000000 + 0.000000 0.687500 0.062500 + 0.062500 0.750000 0.000000 + 0.062500 0.750000 0.062500 + 0.000000 0.812500 0.187500 + 0.000000 0.687500 0.312500 + 0.000000 0.750000 0.187500 + 0.000000 0.812500 0.250000 + 0.062500 0.812500 0.187500 + 0.062500 0.812500 0.250000 + 0.000000 0.687500 0.250000 + 0.000000 0.750000 0.312500 + 0.062500 0.750000 0.250000 + 0.062500 0.750000 0.312500 + 0.000000 1.000000 0.187500 + 0.000000 1.000000 0.312500 + 0.000000 0.937500 0.250000 + 0.062500 1.000000 0.250000 + 0.000000 0.937500 0.312500 + 0.062500 0.937500 0.312500 + 0.062500 1.000000 0.312500 + 0.187500 1.000000 0.000000 + 0.312500 1.000000 0.000000 + 0.187500 0.937500 0.000000 + 0.187500 0.937500 0.062500 + 0.250000 1.000000 0.062500 + 0.250000 0.937500 0.000000 + 0.250000 0.937500 0.062500 + 0.312500 1.000000 0.062500 + 0.187500 1.000000 0.187500 + 0.312500 1.000000 0.312500 + 0.187500 0.937500 0.250000 + 0.187500 1.000000 0.250000 + 0.250000 1.000000 0.187500 + 0.250000 0.937500 0.250000 + 0.250000 0.937500 0.312500 + 0.250000 1.000000 0.312500 + 0.312500 1.000000 0.250000 + 0.812500 0.000000 1.000000 + 0.687500 0.000000 1.000000 + 0.812500 0.000000 0.937500 + 0.812500 0.062500 0.937500 + 0.812500 0.062500 1.000000 + 0.750000 0.000000 0.937500 + 0.750000 0.062500 0.937500 + 0.750000 0.062500 1.000000 + 0.812500 0.062500 0.875000 + 1.000000 0.000000 0.812500 + 1.000000 0.000000 0.687500 + 0.937500 0.000000 0.812500 + 1.000000 0.062500 0.750000 + 0.937500 0.000000 0.750000 + 1.000000 0.062500 0.687500 + 1.000000 0.187500 0.812500 + 1.000000 0.312500 0.687500 + 0.937500 0.187500 0.812500 + 1.000000 0.187500 0.750000 + 1.000000 0.250000 0.812500 + 0.937500 0.250000 0.750000 + 0.937500 0.250000 0.812500 + 1.000000 0.250000 0.687500 + 1.000000 0.312500 0.750000 + 1.000000 0.187500 1.000000 + 1.000000 0.312500 1.000000 + 0.937500 0.187500 1.000000 + 1.000000 0.250000 0.937500 + 0.937500 0.250000 1.000000 + 1.000000 0.312500 0.937500 + 0.000000 0.812500 1.000000 + 0.000000 0.687500 1.000000 + 0.000000 0.812500 0.937500 + 0.062500 0.812500 1.000000 + 0.000000 0.750000 0.937500 + 0.062500 0.750000 1.000000 + 0.000000 1.000000 0.812500 + 0.000000 1.000000 0.687500 + 0.000000 0.937500 0.812500 + 0.062500 1.000000 0.812500 + 0.000000 0.937500 0.750000 + 0.062500 0.937500 0.812500 + 0.062500 1.000000 0.750000 + 0.187500 1.000000 1.000000 + 0.312500 1.000000 1.000000 + 0.187500 0.937500 1.000000 + 0.187500 1.000000 0.937500 + 0.250000 0.937500 1.000000 + 0.250000 1.000000 0.937500 + 0.812500 0.812500 0.000000 + 0.687500 0.687500 0.000000 + 0.750000 0.750000 0.062500 + 0.812500 0.750000 0.000000 + 0.750000 0.812500 0.000000 + 0.687500 0.687500 0.062500 + 0.750000 0.687500 0.000000 + 0.687500 0.750000 0.000000 + 0.750000 0.687500 0.062500 + 0.812500 0.812500 0.187500 + 0.687500 0.687500 0.312500 + 0.750000 0.750000 0.187500 + 0.812500 0.750000 0.187500 + 0.750000 0.812500 0.187500 + 0.812500 0.750000 0.250000 + 0.812500 0.812500 0.250000 + 0.687500 0.687500 0.250000 + 0.687500 0.750000 0.187500 + 0.750000 0.687500 0.250000 + 0.687500 0.750000 0.250000 + 0.750000 0.687500 0.312500 + 0.750000 0.750000 0.312500 + 0.750000 0.812500 0.250000 + 1.000000 0.812500 0.000000 + 1.000000 0.687500 0.000000 + 0.937500 0.750000 0.000000 + 0.937500 0.750000 0.062500 + 1.000000 0.750000 0.062500 + 0.937500 0.687500 0.000000 + 0.937500 0.687500 0.062500 + 0.937500 0.687500 0.125000 + 1.000000 0.687500 0.062500 + 0.812500 1.000000 0.000000 + 0.687500 1.000000 0.000000 + 0.750000 0.937500 0.000000 + 0.750000 0.937500 0.062500 + 0.812500 1.000000 0.062500 + 0.687500 0.937500 0.000000 + 0.687500 0.937500 0.062500 + 0.750000 1.000000 0.062500 + 1.000000 0.812500 0.187500 + 1.000000 0.687500 0.312500 + 0.937500 0.750000 0.250000 + 1.000000 0.750000 0.187500 + 1.000000 0.812500 0.250000 + 0.937500 0.687500 0.312500 + 0.937500 0.750000 0.312500 + 1.000000 0.687500 0.250000 + 1.000000 0.750000 0.312500 + 1.000000 1.000000 0.187500 + 1.000000 1.000000 0.312500 + 0.937500 0.937500 0.250000 + 0.937500 1.000000 0.187500 + 1.000000 0.937500 0.250000 + 0.937500 0.937500 0.312500 + 0.937500 1.000000 0.250000 + 1.000000 0.937500 0.312500 + 0.812500 0.812500 1.000000 + 0.687500 0.687500 1.000000 + 0.750000 0.812500 0.937500 + 0.812500 0.750000 1.000000 + 0.750000 0.812500 1.000000 + 0.812500 0.812500 0.937500 + 0.687500 0.750000 0.937500 + 0.750000 0.687500 1.000000 + 0.687500 0.750000 1.000000 + 0.750000 0.750000 0.937500 + 0.687500 0.812500 0.937500 + 0.812500 0.750000 0.937500 + 0.812500 1.000000 0.812500 + 0.687500 1.000000 0.687500 + 0.750000 0.937500 0.812500 + 0.750000 1.000000 0.812500 + 0.812500 1.000000 0.750000 + 0.687500 0.937500 0.750000 + 0.750000 0.937500 0.750000 + 0.687500 1.000000 0.750000 + 0.750000 1.000000 0.687500 + 1.000000 0.812500 1.000000 + 1.000000 0.687500 1.000000 + 0.937500 0.750000 1.000000 + 1.000000 0.812500 0.937500 + 0.937500 0.687500 1.000000 + 1.000000 0.750000 0.937500 + 0.812500 1.000000 1.000000 + 0.687500 1.000000 1.000000 + 0.750000 0.937500 1.000000 + 0.750000 1.000000 0.937500 + 0.687500 0.937500 1.000000 + 0.687500 1.000000 0.937500 + 1.000000 1.000000 0.812500 + 1.000000 1.000000 0.687500 + 0.937500 0.937500 0.812500 + 0.937500 1.000000 0.750000 + 1.000000 0.937500 0.812500 + 0.937500 0.937500 0.750000 + 0.937500 1.000000 0.687500 + 1.000000 0.937500 0.750000 + 0.187500 0.000000 0.312500 + 0.312500 0.000000 0.187500 + 0.187500 0.000000 0.250000 + 0.250000 0.000000 0.187500 + 0.250000 0.062500 0.187500 + 0.250000 0.062500 0.250000 + 0.250000 0.000000 0.312500 + 0.312500 0.062500 0.187500 + 0.312500 0.000000 0.250000 + 0.312500 0.062500 0.250000 + 0.000000 0.187500 0.312500 + 0.000000 0.312500 0.187500 + 0.000000 0.187500 0.250000 + 0.000000 0.250000 0.187500 + 0.062500 0.250000 0.250000 + 0.000000 0.250000 0.312500 + 0.062500 0.250000 0.312500 + 0.062500 0.312500 0.187500 + 0.000000 0.312500 0.250000 + 0.062500 0.312500 0.250000 + 0.187500 0.187500 0.312500 + 0.312500 0.312500 0.187500 + 0.187500 0.187500 0.250000 + 0.187500 0.250000 0.187500 + 0.250000 0.250000 0.187500 + 0.250000 0.187500 0.250000 + 0.187500 0.250000 0.250000 + 0.250000 0.187500 0.312500 + 0.250000 0.250000 0.312500 + 0.312500 0.250000 0.187500 + 0.250000 0.312500 0.187500 + 0.250000 0.312500 0.250000 + 0.312500 0.250000 0.250000 + 0.312500 0.312500 0.250000 + 0.187500 0.000000 0.500000 + 0.312500 0.000000 0.500000 + 0.187500 0.000000 0.562500 + 0.250000 0.000000 0.562500 + 0.250000 0.000000 0.437500 + 0.250000 0.062500 0.437500 + 0.250000 0.062500 0.500000 + 0.312500 0.000000 0.437500 + 0.312500 0.062500 0.437500 + 0.312500 0.062500 0.500000 + 0.000000 0.187500 0.500000 + 0.000000 0.312500 0.500000 + 0.000000 0.187500 0.562500 + 0.000000 0.250000 0.562500 + 0.062500 0.250000 0.562500 + 0.000000 0.250000 0.437500 + 0.062500 0.250000 0.500000 + 0.000000 0.312500 0.437500 + 0.062500 0.312500 0.437500 + 0.062500 0.312500 0.500000 + 0.187500 0.187500 0.500000 + 0.312500 0.312500 0.500000 + 0.187500 0.187500 0.562500 + 0.250000 0.187500 0.562500 + 0.250000 0.250000 0.562500 + 0.187500 0.250000 0.437500 + 0.250000 0.250000 0.437500 + 0.250000 0.187500 0.500000 + 0.187500 0.250000 0.500000 + 0.250000 0.312500 0.437500 + 0.312500 0.250000 0.437500 + 0.312500 0.312500 0.437500 + 0.312500 0.250000 0.500000 + 0.250000 0.312500 0.500000 + 0.500000 0.187500 0.000000 + 0.500000 0.312500 0.000000 + 0.437500 0.187500 0.000000 + 0.437500 0.250000 0.000000 + 0.437500 0.187500 0.062500 + 0.437500 0.250000 0.062500 + 0.500000 0.187500 0.062500 + 0.562500 0.250000 0.000000 + 0.500000 0.250000 0.062500 + 0.562500 0.312500 0.000000 + 0.500000 0.000000 0.187500 + 0.500000 0.000000 0.312500 + 0.562500 0.000000 0.187500 + 0.562500 0.000000 0.250000 + 0.437500 0.000000 0.250000 + 0.437500 0.000000 0.312500 + 0.500000 0.062500 0.187500 + 0.562500 0.062500 0.187500 + 0.500000 0.062500 0.250000 + 0.562500 0.062500 0.250000 + 0.687500 0.187500 0.000000 + 0.812500 0.312500 0.000000 + 0.750000 0.187500 0.000000 + 0.750000 0.187500 0.062500 + 0.812500 0.250000 0.000000 + 0.687500 0.250000 0.000000 + 0.687500 0.187500 0.062500 + 0.687500 0.250000 0.062500 + 0.750000 0.312500 0.000000 + 0.750000 0.250000 0.062500 + 0.187500 0.500000 0.000000 + 0.312500 0.500000 0.000000 + 0.187500 0.437500 0.000000 + 0.250000 0.437500 0.000000 + 0.187500 0.437500 0.062500 + 0.250000 0.437500 0.062500 + 0.250000 0.500000 0.062500 + 0.250000 0.562500 0.000000 + 0.312500 0.500000 0.062500 + 0.312500 0.562500 0.000000 + 0.000000 0.500000 0.187500 + 0.000000 0.500000 0.312500 + 0.000000 0.562500 0.187500 + 0.000000 0.562500 0.250000 + 0.000000 0.437500 0.250000 + 0.000000 0.437500 0.312500 + 0.062500 0.500000 0.250000 + 0.062500 0.562500 0.187500 + 0.062500 0.500000 0.312500 + 0.062500 0.562500 0.250000 + 0.187500 0.500000 0.187500 + 0.312500 0.500000 0.312500 + 0.187500 0.437500 0.250000 + 0.250000 0.437500 0.250000 + 0.187500 0.437500 0.312500 + 0.250000 0.437500 0.312500 + 0.250000 0.500000 0.187500 + 0.187500 0.500000 0.250000 + 0.250000 0.562500 0.187500 + 0.312500 0.500000 0.250000 + 0.312500 0.562500 0.187500 + 0.250000 0.500000 0.312500 + 0.250000 0.562500 0.250000 + 0.312500 0.562500 0.250000 + 0.187500 0.687500 0.000000 + 0.312500 0.812500 0.000000 + 0.187500 0.750000 0.000000 + 0.250000 0.812500 0.000000 + 0.250000 0.687500 0.000000 + 0.187500 0.687500 0.062500 + 0.250000 0.687500 0.062500 + 0.312500 0.750000 0.000000 + 0.250000 0.750000 0.062500 + 0.312500 0.750000 0.062500 + 0.500000 0.312500 0.187500 + 0.500000 0.187500 0.312500 + 0.437500 0.187500 0.250000 + 0.437500 0.250000 0.250000 + 0.437500 0.187500 0.312500 + 0.437500 0.250000 0.312500 + 0.500000 0.250000 0.187500 + 0.500000 0.187500 0.250000 + 0.562500 0.250000 0.187500 + 0.500000 0.312500 0.250000 + 0.562500 0.312500 0.187500 + 0.500000 0.250000 0.312500 + 0.562500 0.250000 0.250000 + 0.562500 0.312500 0.250000 + 0.500000 0.500000 0.187500 + 0.500000 0.500000 0.312500 + 0.562500 0.562500 0.187500 + 0.562500 0.562500 0.250000 + 0.437500 0.437500 0.250000 + 0.437500 0.437500 0.312500 + 0.437500 0.500000 0.187500 + 0.437500 0.500000 0.250000 + 0.500000 0.437500 0.250000 + 0.562500 0.500000 0.187500 + 0.500000 0.562500 0.187500 + 0.500000 0.437500 0.312500 + 0.562500 0.500000 0.250000 + 0.500000 0.562500 0.250000 + 0.687500 0.500000 0.000000 + 0.812500 0.500000 0.000000 + 0.750000 0.562500 0.000000 + 0.812500 0.562500 0.000000 + 0.687500 0.437500 0.000000 + 0.750000 0.437500 0.000000 + 0.687500 0.437500 0.062500 + 0.687500 0.500000 0.062500 + 0.750000 0.437500 0.062500 + 0.750000 0.500000 0.062500 + 0.500000 0.687500 0.000000 + 0.500000 0.812500 0.000000 + 0.562500 0.750000 0.000000 + 0.562500 0.750000 0.062500 + 0.562500 0.812500 0.000000 + 0.437500 0.687500 0.000000 + 0.437500 0.687500 0.062500 + 0.437500 0.750000 0.000000 + 0.500000 0.687500 0.062500 + 0.500000 0.750000 0.062500 + 0.500000 0.000000 0.687500 + 0.500000 0.000000 0.812500 + 0.437500 0.000000 0.750000 + 0.437500 0.000000 0.812500 + 0.500000 0.062500 0.687500 + 0.562500 0.000000 0.687500 + 0.562500 0.062500 0.625000 + 0.500000 0.062500 0.750000 + 0.562500 0.000000 0.750000 + 0.562500 0.062500 0.687500 + 0.500000 0.187500 0.500000 + 0.500000 0.312500 0.500000 + 0.437500 0.187500 0.562500 + 0.437500 0.187500 0.625000 + 0.437500 0.250000 0.562500 + 0.437500 0.187500 0.500000 + 0.437500 0.250000 0.500000 + 0.500000 0.250000 0.437500 + 0.500000 0.312500 0.437500 + 0.500000 0.187500 0.562500 + 0.562500 0.250000 0.437500 + 0.500000 0.250000 0.562500 + 0.562500 0.250000 0.500000 + 0.562500 0.312500 0.437500 + 0.687500 0.000000 0.500000 + 0.812500 0.000000 0.500000 + 0.750000 0.000000 0.437500 + 0.812500 0.000000 0.437500 + 0.812500 0.062500 0.375000 + 0.687500 0.000000 0.562500 + 0.750000 0.062500 0.437500 + 0.750000 0.000000 0.562500 + 0.750000 0.062500 0.500000 + 0.812500 0.062500 0.437500 + 0.687500 0.187500 0.312500 + 0.812500 0.312500 0.187500 + 0.750000 0.187500 0.250000 + 0.812500 0.250000 0.187500 + 0.687500 0.187500 0.250000 + 0.750000 0.250000 0.187500 + 0.687500 0.250000 0.250000 + 0.750000 0.312500 0.187500 + 0.687500 0.187500 0.375000 + 0.687500 0.250000 0.312500 + 0.750000 0.187500 0.312500 + 0.750000 0.250000 0.312500 + 0.750000 0.312500 0.250000 + 0.812500 0.250000 0.250000 + 0.000000 0.500000 0.687500 + 0.000000 0.500000 0.812500 + 0.000000 0.437500 0.750000 + 0.000000 0.437500 0.812500 + 0.062500 0.437500 0.812500 + 0.062500 0.500000 0.750000 + 0.000000 0.562500 0.687500 + 0.062500 0.500000 0.812500 + 0.000000 0.562500 0.750000 + 0.062500 0.562500 0.750000 + 0.187500 0.500000 0.500000 + 0.312500 0.500000 0.500000 + 0.187500 0.437500 0.562500 + 0.250000 0.437500 0.562500 + 0.187500 0.437500 0.500000 + 0.250000 0.437500 0.500000 + 0.187500 0.500000 0.437500 + 0.250000 0.500000 0.437500 + 0.250000 0.500000 0.562500 + 0.250000 0.562500 0.437500 + 0.250000 0.562500 0.500000 + 0.312500 0.500000 0.562500 + 0.312500 0.562500 0.437500 + 0.312500 0.562500 0.500000 + 0.187500 0.500000 0.687500 + 0.312500 0.500000 0.812500 + 0.187500 0.437500 0.750000 + 0.250000 0.437500 0.750000 + 0.250000 0.437500 0.812500 + 0.187500 0.500000 0.750000 + 0.250000 0.500000 0.687500 + 0.187500 0.562500 0.687500 + 0.250000 0.562500 0.687500 + 0.250000 0.500000 0.812500 + 0.312500 0.500000 0.750000 + 0.312500 0.562500 0.687500 + 0.250000 0.562500 0.750000 + 0.312500 0.562500 0.750000 + 0.000000 0.687500 0.500000 + 0.000000 0.812500 0.500000 + 0.000000 0.750000 0.437500 + 0.000000 0.812500 0.437500 + 0.000000 0.687500 0.562500 + 0.062500 0.687500 0.562500 + 0.062500 0.750000 0.500000 + 0.000000 0.750000 0.562500 + 0.062500 0.750000 0.562500 + 0.062500 0.812500 0.500000 + 0.187500 0.687500 0.312500 + 0.312500 0.812500 0.187500 + 0.187500 0.750000 0.187500 + 0.187500 0.750000 0.250000 + 0.250000 0.812500 0.187500 + 0.250000 0.812500 0.250000 + 0.187500 0.687500 0.250000 + 0.250000 0.687500 0.250000 + 0.250000 0.750000 0.187500 + 0.250000 0.687500 0.312500 + 0.250000 0.750000 0.312500 + 0.312500 0.750000 0.250000 + 0.312500 0.750000 0.312500 + 0.312500 0.812500 0.250000 + 0.187500 0.687500 0.500000 + 0.312500 0.812500 0.500000 + 0.187500 0.750000 0.437500 + 0.187500 0.812500 0.437500 + 0.250000 0.812500 0.437500 + 0.250000 0.687500 0.500000 + 0.250000 0.687500 0.562500 + 0.187500 0.750000 0.500000 + 0.250000 0.750000 0.437500 + 0.312500 0.750000 0.500000 + 0.250000 0.750000 0.562500 + 0.312500 0.750000 0.562500 + 0.250000 0.812500 0.500000 + 0.312500 0.812500 0.437500 + 0.500000 0.187500 0.812500 + 0.500000 0.312500 0.687500 + 0.437500 0.187500 0.812500 + 0.437500 0.250000 0.750000 + 0.437500 0.250000 0.812500 + 0.500000 0.187500 0.750000 + 0.500000 0.250000 0.687500 + 0.500000 0.250000 0.812500 + 0.562500 0.250000 0.687500 + 0.562500 0.250000 0.750000 + 0.500000 0.312500 0.750000 + 0.562500 0.312500 0.625000 + 0.562500 0.312500 0.687500 + 0.562500 0.312500 0.750000 + 0.500000 0.187500 1.000000 + 0.500000 0.312500 1.000000 + 0.437500 0.187500 1.000000 + 0.437500 0.250000 1.000000 + 0.500000 0.250000 0.937500 + 0.562500 0.250000 0.937500 + 0.562500 0.250000 1.000000 + 0.500000 0.312500 0.937500 + 0.562500 0.312500 0.937500 + 0.562500 0.312500 1.000000 + 0.687500 0.000000 0.812500 + 0.812500 0.000000 0.687500 + 0.750000 0.000000 0.812500 + 0.812500 0.000000 0.750000 + 0.687500 0.000000 0.750000 + 0.750000 0.000000 0.687500 + 0.750000 0.062500 0.687500 + 0.750000 0.062500 0.750000 + 0.812500 0.062500 0.625000 + 0.812500 0.062500 0.687500 + 0.687500 0.187500 0.625000 + 0.812500 0.312500 0.375000 + 0.687500 0.187500 0.562500 + 0.687500 0.250000 0.500000 + 0.750000 0.187500 0.500000 + 0.750000 0.250000 0.437500 + 0.687500 0.250000 0.562500 + 0.750000 0.187500 0.562500 + 0.750000 0.250000 0.562500 + 0.750000 0.312500 0.437500 + 0.750000 0.312500 0.500000 + 0.812500 0.250000 0.437500 + 0.812500 0.250000 0.500000 + 0.812500 0.312500 0.437500 + 0.687500 0.187500 0.812500 + 0.812500 0.312500 0.687500 + 0.750000 0.187500 0.812500 + 0.812500 0.250000 0.750000 + 0.687500 0.250000 0.750000 + 0.687500 0.250000 0.812500 + 0.750000 0.187500 0.750000 + 0.750000 0.250000 0.687500 + 0.750000 0.250000 0.812500 + 0.750000 0.312500 0.687500 + 0.750000 0.312500 0.750000 + 0.812500 0.250000 0.687500 + 0.812500 0.312500 0.625000 + 0.812500 0.312500 0.750000 + 0.687500 0.187500 1.000000 + 0.812500 0.312500 1.000000 + 0.750000 0.187500 1.000000 + 0.812500 0.250000 0.937500 + 0.812500 0.250000 1.000000 + 0.687500 0.250000 1.000000 + 0.750000 0.250000 0.937500 + 0.750000 0.312500 0.937500 + 0.750000 0.312500 1.000000 + 0.812500 0.312500 0.937500 + 0.187500 0.500000 1.000000 + 0.312500 0.500000 1.000000 + 0.187500 0.437500 1.000000 + 0.250000 0.437500 1.000000 + 0.187500 0.500000 0.937500 + 0.250000 0.500000 0.937500 + 0.187500 0.562500 0.937500 + 0.250000 0.562500 1.000000 + 0.250000 0.562500 0.937500 + 0.312500 0.562500 1.000000 + 0.000000 0.687500 0.812500 + 0.000000 0.812500 0.687500 + 0.000000 0.750000 0.812500 + 0.000000 0.812500 0.750000 + 0.000000 0.687500 0.750000 + 0.000000 0.750000 0.687500 + 0.062500 0.687500 0.812500 + 0.062500 0.750000 0.812500 + 0.062500 0.750000 0.750000 + 0.062500 0.812500 0.750000 + 0.187500 0.687500 1.000000 + 0.312500 0.812500 1.000000 + 0.187500 0.750000 1.000000 + 0.187500 0.812500 0.937500 + 0.250000 0.812500 1.000000 + 0.250000 0.687500 1.000000 + 0.187500 0.750000 0.937500 + 0.250000 0.750000 0.937500 + 0.312500 0.750000 1.000000 + 0.250000 0.812500 0.937500 + 0.500000 0.500000 0.687500 + 0.500000 0.500000 0.812500 + 0.437500 0.437500 0.750000 + 0.437500 0.437500 0.812500 + 0.437500 0.500000 0.687500 + 0.437500 0.500000 0.750000 + 0.500000 0.437500 0.750000 + 0.500000 0.437500 0.812500 + 0.500000 0.562500 0.687500 + 0.562500 0.500000 0.687500 + 0.562500 0.562500 0.687500 + 0.500000 0.562500 0.750000 + 0.562500 0.500000 0.750000 + 0.562500 0.562500 0.750000 + 0.687500 0.500000 0.312500 + 0.812500 0.500000 0.187500 + 0.750000 0.562500 0.187500 + 0.750000 0.562500 0.250000 + 0.812500 0.562500 0.187500 + 0.687500 0.437500 0.250000 + 0.687500 0.500000 0.250000 + 0.750000 0.500000 0.187500 + 0.687500 0.437500 0.312500 + 0.750000 0.437500 0.250000 + 0.687500 0.437500 0.375000 + 0.750000 0.437500 0.312500 + 0.750000 0.500000 0.312500 + 0.812500 0.500000 0.250000 + 0.500000 0.687500 0.312500 + 0.500000 0.812500 0.187500 + 0.562500 0.750000 0.250000 + 0.562500 0.812500 0.187500 + 0.437500 0.687500 0.250000 + 0.437500 0.750000 0.187500 + 0.500000 0.687500 0.250000 + 0.500000 0.750000 0.187500 + 0.437500 0.687500 0.312500 + 0.437500 0.750000 0.250000 + 0.500000 0.750000 0.312500 + 0.562500 0.750000 0.312500 + 0.500000 0.812500 0.250000 + 0.562500 0.812500 0.250000 + 0.500000 0.687500 0.500000 + 0.500000 0.812500 0.500000 + 0.437500 0.687500 0.500000 + 0.437500 0.687500 0.562500 + 0.437500 0.750000 0.437500 + 0.437500 0.750000 0.500000 + 0.500000 0.687500 0.562500 + 0.500000 0.750000 0.437500 + 0.562500 0.750000 0.500000 + 0.500000 0.750000 0.562500 + 0.562500 0.750000 0.562500 + 0.500000 0.812500 0.437500 + 0.562500 0.812500 0.437500 + 0.562500 0.812500 0.500000 + 0.687500 0.500000 0.500000 + 0.812500 0.500000 0.500000 + 0.750000 0.562500 0.437500 + 0.812500 0.562500 0.375000 + 0.812500 0.562500 0.437500 + 0.687500 0.437500 0.562500 + 0.750000 0.437500 0.500000 + 0.750000 0.437500 0.562500 + 0.687500 0.500000 0.562500 + 0.750000 0.500000 0.437500 + 0.750000 0.562500 0.500000 + 0.750000 0.500000 0.562500 + 0.812500 0.500000 0.437500 + 0.812500 0.562500 0.500000 + 0.687500 0.687500 0.500000 + 0.812500 0.812500 0.500000 + 0.750000 0.750000 0.437500 + 0.812500 0.750000 0.437500 + 0.812500 0.812500 0.437500 + 0.687500 0.687500 0.562500 + 0.687500 0.750000 0.437500 + 0.687500 0.750000 0.500000 + 0.750000 0.687500 0.500000 + 0.750000 0.687500 0.562500 + 0.750000 0.750000 0.562500 + 0.750000 0.812500 0.437500 + 0.750000 0.812500 0.500000 + 0.812500 0.750000 0.500000 + 0.312500 0.687500 0.812500 + 0.187500 0.812500 0.687500 + 0.187500 0.687500 0.750000 + 0.250000 0.687500 0.750000 + 0.187500 0.750000 0.687500 + 0.250000 0.750000 0.687500 + 0.250000 0.687500 0.812500 + 0.187500 0.750000 0.750000 + 0.250000 0.750000 0.812500 + 0.312500 0.750000 0.750000 + 0.312500 0.750000 0.812500 + 0.250000 0.812500 0.687500 + 0.250000 0.812500 0.750000 + 0.312500 0.812500 0.750000 + 0.500000 0.687500 0.812500 + 0.500000 0.812500 0.687500 + 0.562500 0.750000 0.812500 + 0.562500 0.812500 0.750000 + 0.437500 0.687500 0.750000 + 0.437500 0.750000 0.687500 + 0.500000 0.687500 0.750000 + 0.500000 0.750000 0.687500 + 0.437500 0.750000 0.750000 + 0.500000 0.750000 0.812500 + 0.562500 0.750000 0.750000 + 0.437500 0.812500 0.687500 + 0.500000 0.812500 0.750000 + 0.562500 0.812500 0.687500 + 0.687500 0.500000 0.812500 + 0.812500 0.500000 0.687500 + 0.687500 0.437500 0.750000 + 0.687500 0.437500 0.812500 + 0.750000 0.437500 0.750000 + 0.750000 0.437500 0.812500 + 0.687500 0.500000 0.750000 + 0.750000 0.500000 0.687500 + 0.750000 0.562500 0.687500 + 0.750000 0.500000 0.812500 + 0.750000 0.562500 0.750000 + 0.812500 0.500000 0.750000 + 0.812500 0.562500 0.687500 + 0.812500 0.562500 0.750000 + 0.687500 0.500000 1.000000 + 0.812500 0.500000 1.000000 + 0.750000 0.562500 1.000000 + 0.812500 0.562500 1.000000 + 0.687500 0.437500 1.000000 + 0.750000 0.437500 1.000000 + 0.750000 0.500000 0.937500 + 0.750000 0.562500 0.937500 + 0.812500 0.500000 0.937500 + 0.812500 0.562500 0.937500 + 0.500000 0.687500 1.000000 + 0.500000 0.812500 1.000000 + 0.562500 0.750000 1.000000 + 0.562500 0.812500 1.000000 + 0.437500 0.687500 1.000000 + 0.437500 0.750000 1.000000 + 0.437500 0.750000 0.937500 + 0.500000 0.750000 0.937500 + 0.437500 0.812500 0.937500 + 0.500000 0.812500 0.937500 + 0.687500 0.687500 0.812500 + 0.812500 0.812500 0.687500 + 0.750000 0.750000 0.812500 + 0.750000 0.812500 0.750000 + 0.812500 0.812500 0.750000 + 0.687500 0.687500 0.750000 + 0.687500 0.750000 0.687500 + 0.750000 0.750000 0.687500 + 0.687500 0.750000 0.750000 + 0.750000 0.687500 0.750000 + 0.750000 0.687500 0.812500 + 0.750000 0.812500 0.687500 + 0.812500 0.750000 0.687500 + 0.812500 0.750000 0.750000 + 1.000000 0.187500 0.312500 + 1.000000 0.312500 0.187500 + 1.000000 0.187500 0.250000 + 1.000000 0.250000 0.187500 + 0.937500 0.187500 0.312500 + 0.937500 0.250000 0.250000 + 0.937500 0.187500 0.375000 + 0.937500 0.250000 0.312500 + 1.000000 0.250000 0.312500 + 1.000000 0.312500 0.250000 + 1.000000 0.187500 0.500000 + 1.000000 0.312500 0.500000 + 0.937500 0.187500 0.625000 + 1.000000 0.187500 0.562500 + 1.000000 0.250000 0.562500 + 0.937500 0.187500 0.562500 + 0.937500 0.250000 0.500000 + 0.937500 0.250000 0.562500 + 1.000000 0.250000 0.437500 + 1.000000 0.312500 0.437500 + 1.000000 0.500000 0.187500 + 1.000000 0.500000 0.312500 + 1.000000 0.562500 0.187500 + 1.000000 0.562500 0.250000 + 0.937500 0.437500 0.312500 + 0.937500 0.437500 0.375000 + 0.937500 0.500000 0.250000 + 0.937500 0.500000 0.312500 + 1.000000 0.437500 0.250000 + 1.000000 0.437500 0.312500 + 0.187500 1.000000 0.500000 + 0.312500 1.000000 0.500000 + 0.187500 1.000000 0.437500 + 0.250000 1.000000 0.437500 + 0.187500 0.937500 0.500000 + 0.250000 0.937500 0.500000 + 0.250000 0.937500 0.562500 + 0.312500 0.937500 0.562500 + 0.250000 1.000000 0.562500 + 0.312500 1.000000 0.562500 + 0.187500 1.000000 0.687500 + 0.312500 1.000000 0.812500 + 0.187500 1.000000 0.750000 + 0.250000 1.000000 0.812500 + 0.187500 0.937500 0.750000 + 0.250000 0.937500 0.812500 + 0.250000 0.937500 0.750000 + 0.312500 0.937500 0.812500 + 0.250000 1.000000 0.687500 + 0.312500 1.000000 0.750000 + 0.500000 1.000000 0.187500 + 0.500000 1.000000 0.312500 + 0.437500 1.000000 0.187500 + 0.437500 1.000000 0.250000 + 0.437500 0.937500 0.250000 + 0.437500 0.937500 0.312500 + 0.500000 0.937500 0.250000 + 0.500000 0.937500 0.312500 + 0.562500 1.000000 0.250000 + 0.562500 1.000000 0.312500 + 0.687500 1.000000 0.187500 + 0.812500 1.000000 0.312500 + 0.750000 0.937500 0.250000 + 0.750000 1.000000 0.187500 + 0.812500 1.000000 0.250000 + 0.687500 0.937500 0.250000 + 0.687500 0.937500 0.312500 + 0.750000 0.937500 0.312500 + 0.687500 1.000000 0.250000 + 0.750000 1.000000 0.312500 + 0.500000 1.000000 0.687500 + 0.500000 1.000000 0.812500 + 0.562500 0.937500 0.812500 + 0.562500 1.000000 0.750000 + 0.562500 1.000000 0.812500 + 0.437500 0.937500 0.750000 + 0.500000 0.937500 0.750000 + 0.500000 0.937500 0.812500 + 0.437500 1.000000 0.687500 + 0.437500 1.000000 0.750000 + 0.687500 1.000000 0.500000 + 0.812500 1.000000 0.500000 + 0.750000 1.000000 0.562500 + 0.812500 1.000000 0.562500 + 0.687500 0.937500 0.500000 + 0.750000 0.937500 0.500000 + 0.687500 0.937500 0.562500 + 0.750000 0.937500 0.562500 + 0.687500 1.000000 0.437500 + 0.750000 1.000000 0.437500 + 1.000000 0.500000 0.687500 + 1.000000 0.500000 0.812500 + 1.000000 0.437500 0.750000 + 1.000000 0.437500 0.812500 + 0.937500 0.437500 0.750000 + 0.937500 0.437500 0.812500 + 0.937500 0.500000 0.750000 + 0.937500 0.500000 0.812500 + 1.000000 0.562500 0.687500 + 1.000000 0.562500 0.750000 + 1.000000 0.687500 0.500000 + 1.000000 0.812500 0.500000 + 1.000000 0.750000 0.437500 + 1.000000 0.812500 0.437500 + 0.937500 0.687500 0.500000 + 0.937500 0.750000 0.500000 + 0.937500 0.687500 0.562500 + 0.937500 0.750000 0.562500 + 1.000000 0.687500 0.562500 + 1.000000 0.750000 0.562500 + 1.000000 0.687500 0.812500 + 1.000000 0.812500 0.687500 + 0.937500 0.750000 0.812500 + 1.000000 0.750000 0.812500 + 1.000000 0.812500 0.750000 + 0.937500 0.687500 0.750000 + 0.937500 0.687500 0.812500 + 0.937500 0.750000 0.750000 + 1.000000 0.687500 0.750000 + 1.000000 0.750000 0.687500 + 0.062500 0.000000 0.062500 + 0.000000 0.062500 0.062500 + 0.062500 0.062500 0.062500 + 0.062500 0.000000 0.125000 + 0.000000 0.062500 0.125000 + 0.062500 0.062500 0.125000 + 0.125000 0.062500 0.000000 + 0.125000 0.000000 0.062500 + 0.187500 0.062500 0.000000 + 0.062500 0.125000 0.000000 + 0.000000 0.125000 0.062500 + 0.062500 0.125000 0.062500 + 0.062500 0.187500 0.000000 + 0.125000 0.062500 0.062500 + 0.125000 0.125000 0.062500 + 0.187500 0.125000 0.000000 + 0.125000 0.187500 0.000000 + 0.062500 0.000000 0.875000 + 0.000000 0.062500 0.875000 + 0.062500 0.062500 0.875000 + 0.062500 0.000000 0.812500 + 0.000000 0.062500 0.812500 + 0.062500 0.062500 0.812500 + 0.125000 0.000000 0.937500 + 0.125000 0.062500 0.875000 + 0.125000 0.000000 0.812500 + 0.125000 0.062500 0.812500 + 0.187500 0.000000 0.875000 + 0.187500 0.062500 0.812500 + 0.000000 0.125000 0.937500 + 0.062500 0.125000 0.875000 + 0.062500 0.125000 0.937500 + 0.000000 0.125000 0.812500 + 0.000000 0.187500 0.875000 + 0.062500 0.187500 0.812500 + 0.062500 0.187500 0.875000 + 0.125000 0.062500 0.937500 + 0.125000 0.062500 1.000000 + 0.187500 0.000000 0.937500 + 0.187500 0.062500 0.875000 + 0.187500 0.062500 0.937500 + 0.187500 0.062500 1.000000 + 0.062500 0.125000 1.000000 + 0.000000 0.187500 0.937500 + 0.062500 0.187500 1.000000 + 0.125000 0.125000 0.937500 + 0.062500 0.125000 0.812500 + 0.125000 0.125000 0.812500 + 0.187500 0.125000 0.812500 + 0.125000 0.187500 0.812500 + 0.125000 0.187500 0.875000 + 0.187500 0.125000 0.875000 + 0.187500 0.187500 0.875000 + 0.062500 0.187500 0.937500 + 0.125000 0.187500 0.937500 + 0.187500 0.125000 0.937500 + 0.187500 0.125000 1.000000 + 0.125000 0.187500 1.000000 + 0.187500 0.187500 0.937500 + 0.875000 0.000000 0.062500 + 0.937500 0.062500 0.000000 + 0.812500 0.000000 0.062500 + 0.875000 0.062500 0.000000 + 0.937500 0.000000 0.125000 + 0.937500 0.062500 0.062500 + 0.812500 0.000000 0.125000 + 0.875000 0.062500 0.062500 + 0.875000 0.000000 0.187500 + 0.875000 0.062500 0.125000 + 1.000000 0.062500 0.062500 + 0.937500 0.000000 0.187500 + 1.000000 0.062500 0.125000 + 0.937500 0.125000 0.000000 + 0.937500 0.062500 0.125000 + 0.937500 0.125000 0.062500 + 1.000000 0.125000 0.062500 + 0.000000 0.875000 0.062500 + 0.062500 0.937500 0.000000 + 0.000000 0.812500 0.062500 + 0.062500 0.875000 0.000000 + 0.062500 0.875000 0.062500 + 0.000000 0.937500 0.125000 + 0.062500 0.937500 0.062500 + 0.062500 0.937500 0.125000 + 0.000000 0.812500 0.125000 + 0.000000 0.875000 0.187500 + 0.062500 0.875000 0.125000 + 0.062500 0.875000 0.187500 + 0.062500 1.000000 0.125000 + 0.000000 0.937500 0.187500 + 0.062500 0.937500 0.187500 + 0.062500 1.000000 0.187500 + 0.125000 1.000000 0.062500 + 0.125000 0.937500 0.000000 + 0.125000 0.937500 0.062500 + 0.187500 1.000000 0.062500 + 0.125000 0.937500 0.125000 + 0.125000 0.937500 0.187500 + 0.125000 1.000000 0.187500 + 0.187500 1.000000 0.125000 + 0.937500 0.000000 0.937500 + 0.937500 0.062500 0.937500 + 0.937500 0.062500 1.000000 + 0.875000 0.000000 0.937500 + 0.875000 0.062500 0.937500 + 0.875000 0.062500 1.000000 + 0.937500 0.062500 0.875000 + 1.000000 0.062500 0.875000 + 0.937500 0.000000 0.875000 + 1.000000 0.062500 0.812500 + 1.000000 0.125000 0.937500 + 0.937500 0.125000 0.875000 + 0.937500 0.125000 0.937500 + 1.000000 0.125000 0.812500 + 1.000000 0.187500 0.875000 + 0.937500 0.125000 1.000000 + 1.000000 0.187500 0.937500 + 0.000000 0.937500 0.937500 + 0.062500 0.937500 1.000000 + 0.000000 0.875000 0.937500 + 0.062500 0.875000 1.000000 + 0.062500 1.000000 0.937500 + 0.000000 0.937500 0.875000 + 0.062500 0.937500 0.937500 + 0.062500 1.000000 0.875000 + 0.125000 0.937500 1.000000 + 0.125000 1.000000 0.937500 + 0.875000 0.875000 0.062500 + 0.937500 0.875000 0.000000 + 0.875000 0.937500 0.000000 + 0.812500 0.812500 0.062500 + 0.875000 0.812500 0.000000 + 0.812500 0.875000 0.000000 + 0.875000 0.812500 0.062500 + 0.937500 0.875000 0.062500 + 0.875000 0.937500 0.062500 + 0.937500 0.875000 0.125000 + 0.937500 0.937500 0.125000 + 0.812500 0.812500 0.125000 + 0.812500 0.875000 0.062500 + 0.875000 0.812500 0.125000 + 0.812500 0.875000 0.125000 + 0.875000 0.812500 0.187500 + 0.875000 0.875000 0.187500 + 0.875000 0.937500 0.125000 + 1.000000 0.875000 0.062500 + 0.937500 0.812500 0.000000 + 0.937500 0.812500 0.062500 + 0.937500 0.812500 0.125000 + 1.000000 0.812500 0.062500 + 0.937500 1.000000 0.062500 + 0.812500 0.937500 0.000000 + 0.812500 0.937500 0.062500 + 0.875000 1.000000 0.062500 + 1.000000 0.937500 0.125000 + 0.937500 0.812500 0.187500 + 0.937500 0.875000 0.187500 + 1.000000 0.812500 0.125000 + 1.000000 0.875000 0.187500 + 0.937500 0.937500 0.187500 + 0.937500 1.000000 0.125000 + 1.000000 0.937500 0.187500 + 0.875000 0.937500 0.937500 + 0.937500 0.875000 1.000000 + 0.875000 0.937500 1.000000 + 0.937500 0.937500 0.937500 + 0.812500 0.875000 0.937500 + 0.875000 0.812500 1.000000 + 0.812500 0.875000 1.000000 + 0.875000 0.875000 0.937500 + 0.812500 0.937500 0.937500 + 0.937500 0.875000 0.937500 + 0.875000 1.000000 0.937500 + 0.937500 1.000000 0.875000 + 0.812500 0.937500 0.875000 + 0.875000 0.937500 0.875000 + 0.812500 1.000000 0.875000 + 0.875000 1.000000 0.812500 + 1.000000 0.937500 0.937500 + 0.937500 0.812500 1.000000 + 1.000000 0.875000 0.937500 + 0.812500 0.937500 1.000000 + 0.812500 1.000000 0.937500 + 0.937500 0.937500 0.875000 + 0.937500 1.000000 0.812500 + 1.000000 0.937500 0.875000 + 0.062500 0.000000 0.375000 + 0.000000 0.062500 0.375000 + 0.062500 0.062500 0.375000 + 0.062500 0.000000 0.312500 + 0.000000 0.062500 0.312500 + 0.062500 0.062500 0.312500 + 0.062500 0.000000 0.562500 + 0.000000 0.062500 0.562500 + 0.062500 0.062500 0.562500 + 0.062500 0.000000 0.625000 + 0.000000 0.062500 0.625000 + 0.062500 0.062500 0.625000 + 0.125000 0.062500 0.375000 + 0.125000 0.000000 0.437500 + 0.125000 0.000000 0.312500 + 0.125000 0.062500 0.312500 + 0.187500 0.062500 0.312500 + 0.187500 0.000000 0.375000 + 0.187500 0.062500 0.375000 + 0.062500 0.125000 0.375000 + 0.000000 0.125000 0.437500 + 0.062500 0.125000 0.437500 + 0.000000 0.125000 0.312500 + 0.062500 0.187500 0.312500 + 0.000000 0.187500 0.375000 + 0.062500 0.187500 0.375000 + 0.125000 0.062500 0.437500 + 0.125000 0.125000 0.437500 + 0.062500 0.125000 0.312500 + 0.125000 0.125000 0.312500 + 0.187500 0.125000 0.312500 + 0.125000 0.187500 0.312500 + 0.125000 0.187500 0.375000 + 0.187500 0.125000 0.375000 + 0.187500 0.187500 0.375000 + 0.125000 0.062500 0.500000 + 0.125000 0.000000 0.562500 + 0.187500 0.000000 0.437500 + 0.187500 0.062500 0.437500 + 0.187500 0.062500 0.500000 + 0.062500 0.125000 0.500000 + 0.000000 0.125000 0.562500 + 0.062500 0.125000 0.562500 + 0.000000 0.187500 0.437500 + 0.062500 0.187500 0.437500 + 0.062500 0.187500 0.500000 + 0.125000 0.062500 0.562500 + 0.125000 0.125000 0.562500 + 0.125000 0.187500 0.437500 + 0.187500 0.125000 0.437500 + 0.187500 0.187500 0.437500 + 0.187500 0.125000 0.500000 + 0.125000 0.187500 0.500000 + 0.375000 0.000000 0.062500 + 0.437500 0.062500 0.000000 + 0.312500 0.000000 0.062500 + 0.375000 0.062500 0.000000 + 0.562500 0.000000 0.062500 + 0.625000 0.062500 0.000000 + 0.625000 0.000000 0.062500 + 0.687500 0.062500 0.000000 + 0.437500 0.062500 0.062500 + 0.437500 0.000000 0.125000 + 0.312500 0.000000 0.125000 + 0.375000 0.062500 0.062500 + 0.375000 0.062500 0.125000 + 0.375000 0.000000 0.187500 + 0.437500 0.062500 0.125000 + 0.500000 0.062500 0.062500 + 0.562500 0.125000 0.000000 + 0.437500 0.125000 0.000000 + 0.437500 0.125000 0.062500 + 0.500000 0.125000 0.062500 + 0.562500 0.187500 0.000000 + 0.562500 0.062500 0.062500 + 0.562500 0.000000 0.125000 + 0.437500 0.000000 0.187500 + 0.500000 0.062500 0.125000 + 0.562500 0.062500 0.125000 + 0.625000 0.062500 0.062500 + 0.687500 0.125000 0.000000 + 0.562500 0.125000 0.062500 + 0.625000 0.187500 0.000000 + 0.625000 0.125000 0.062500 + 0.000000 0.375000 0.062500 + 0.062500 0.437500 0.000000 + 0.000000 0.312500 0.062500 + 0.062500 0.375000 0.000000 + 0.062500 0.375000 0.062500 + 0.000000 0.562500 0.062500 + 0.062500 0.625000 0.000000 + 0.000000 0.625000 0.062500 + 0.062500 0.687500 0.000000 + 0.062500 0.625000 0.062500 + 0.062500 0.437500 0.062500 + 0.000000 0.437500 0.125000 + 0.062500 0.437500 0.125000 + 0.000000 0.312500 0.125000 + 0.062500 0.375000 0.125000 + 0.000000 0.375000 0.187500 + 0.062500 0.375000 0.187500 + 0.125000 0.500000 0.062500 + 0.125000 0.562500 0.000000 + 0.125000 0.437500 0.000000 + 0.125000 0.437500 0.062500 + 0.187500 0.500000 0.062500 + 0.187500 0.562500 0.000000 + 0.062500 0.500000 0.125000 + 0.062500 0.562500 0.062500 + 0.000000 0.562500 0.125000 + 0.000000 0.437500 0.187500 + 0.062500 0.500000 0.187500 + 0.062500 0.562500 0.125000 + 0.125000 0.562500 0.062500 + 0.125000 0.437500 0.125000 + 0.062500 0.437500 0.187500 + 0.125000 0.437500 0.187500 + 0.187500 0.500000 0.125000 + 0.187500 0.562500 0.062500 + 0.125000 0.500000 0.187500 + 0.125000 0.562500 0.125000 + 0.187500 0.562500 0.125000 + 0.125000 0.687500 0.000000 + 0.187500 0.625000 0.000000 + 0.125000 0.625000 0.062500 + 0.187500 0.625000 0.062500 + 0.375000 0.375000 0.062500 + 0.437500 0.375000 0.000000 + 0.375000 0.437500 0.000000 + 0.312500 0.312500 0.062500 + 0.375000 0.312500 0.000000 + 0.312500 0.375000 0.000000 + 0.375000 0.312500 0.062500 + 0.562500 0.562500 0.062500 + 0.625000 0.562500 0.000000 + 0.562500 0.625000 0.000000 + 0.625000 0.625000 0.062500 + 0.687500 0.625000 0.000000 + 0.625000 0.687500 0.000000 + 0.625000 0.562500 0.062500 + 0.437500 0.375000 0.062500 + 0.375000 0.437500 0.062500 + 0.437500 0.375000 0.125000 + 0.437500 0.437500 0.125000 + 0.312500 0.312500 0.125000 + 0.312500 0.375000 0.062500 + 0.375000 0.312500 0.125000 + 0.312500 0.375000 0.125000 + 0.375000 0.312500 0.187500 + 0.375000 0.375000 0.187500 + 0.375000 0.437500 0.125000 + 0.500000 0.375000 0.062500 + 0.562500 0.437500 0.000000 + 0.437500 0.312500 0.000000 + 0.437500 0.312500 0.062500 + 0.500000 0.312500 0.062500 + 0.562500 0.375000 0.000000 + 0.437500 0.500000 0.062500 + 0.437500 0.562500 0.000000 + 0.312500 0.437500 0.000000 + 0.312500 0.437500 0.062500 + 0.375000 0.500000 0.062500 + 0.375000 0.562500 0.000000 + 0.500000 0.437500 0.125000 + 0.562500 0.437500 0.062500 + 0.437500 0.312500 0.125000 + 0.437500 0.312500 0.187500 + 0.437500 0.375000 0.187500 + 0.500000 0.312500 0.125000 + 0.562500 0.375000 0.062500 + 0.500000 0.375000 0.187500 + 0.562500 0.375000 0.125000 + 0.562500 0.437500 0.125000 + 0.562500 0.500000 0.062500 + 0.500000 0.562500 0.062500 + 0.562500 0.562500 0.125000 + 0.437500 0.437500 0.187500 + 0.437500 0.500000 0.125000 + 0.500000 0.437500 0.187500 + 0.562500 0.500000 0.125000 + 0.500000 0.562500 0.125000 + 0.687500 0.562500 0.000000 + 0.625000 0.437500 0.000000 + 0.625000 0.437500 0.062500 + 0.625000 0.500000 0.062500 + 0.562500 0.625000 0.062500 + 0.562500 0.687500 0.000000 + 0.437500 0.562500 0.062500 + 0.437500 0.625000 0.000000 + 0.500000 0.625000 0.062500 + 0.375000 0.000000 0.562500 + 0.437500 0.000000 0.625000 + 0.437500 0.062500 0.562500 + 0.312500 0.000000 0.625000 + 0.375000 0.000000 0.687500 + 0.375000 0.062500 0.625000 + 0.375000 0.062500 0.562500 + 0.562500 0.000000 0.375000 + 0.625000 0.000000 0.437500 + 0.625000 0.062500 0.375000 + 0.625000 0.000000 0.312500 + 0.687500 0.000000 0.375000 + 0.687500 0.062500 0.312500 + 0.625000 0.062500 0.312500 + 0.437500 0.000000 0.437500 + 0.437500 0.062500 0.437500 + 0.437500 0.062500 0.500000 + 0.312500 0.000000 0.562500 + 0.375000 0.000000 0.437500 + 0.375000 0.062500 0.437500 + 0.375000 0.062500 0.500000 + 0.500000 0.062500 0.375000 + 0.562500 0.062500 0.375000 + 0.562500 0.000000 0.312500 + 0.437500 0.000000 0.375000 + 0.500000 0.062500 0.312500 + 0.562500 0.062500 0.312500 + 0.500000 0.125000 0.437500 + 0.562500 0.125000 0.375000 + 0.437500 0.062500 0.375000 + 0.437500 0.125000 0.375000 + 0.437500 0.125000 0.437500 + 0.500000 0.125000 0.312500 + 0.562500 0.125000 0.312500 + 0.500000 0.187500 0.375000 + 0.562500 0.187500 0.312500 + 0.562500 0.187500 0.375000 + 0.500000 0.062500 0.562500 + 0.562500 0.000000 0.562500 + 0.562500 0.062500 0.500000 + 0.437500 0.000000 0.687500 + 0.500000 0.062500 0.625000 + 0.562500 0.000000 0.625000 + 0.562500 0.062500 0.562500 + 0.562500 0.125000 0.437500 + 0.437500 0.062500 0.625000 + 0.437500 0.125000 0.562500 + 0.437500 0.125000 0.500000 + 0.500000 0.187500 0.437500 + 0.500000 0.125000 0.562500 + 0.562500 0.125000 0.500000 + 0.562500 0.187500 0.437500 + 0.625000 0.062500 0.437500 + 0.687500 0.000000 0.437500 + 0.687500 0.062500 0.375000 + 0.625000 0.000000 0.562500 + 0.625000 0.062500 0.500000 + 0.687500 0.062500 0.437500 + 0.687500 0.125000 0.312500 + 0.625000 0.125000 0.312500 + 0.625000 0.187500 0.312500 + 0.625000 0.125000 0.437500 + 0.625000 0.187500 0.375000 + 0.687500 0.125000 0.375000 + 0.000000 0.375000 0.562500 + 0.000000 0.437500 0.625000 + 0.062500 0.437500 0.562500 + 0.062500 0.437500 0.625000 + 0.000000 0.312500 0.625000 + 0.000000 0.375000 0.687500 + 0.062500 0.375000 0.625000 + 0.062500 0.375000 0.687500 + 0.000000 0.562500 0.375000 + 0.000000 0.625000 0.437500 + 0.062500 0.625000 0.375000 + 0.062500 0.625000 0.437500 + 0.000000 0.625000 0.312500 + 0.000000 0.687500 0.375000 + 0.062500 0.687500 0.312500 + 0.062500 0.687500 0.375000 + 0.000000 0.437500 0.437500 + 0.062500 0.437500 0.500000 + 0.000000 0.312500 0.562500 + 0.062500 0.375000 0.562500 + 0.000000 0.375000 0.437500 + 0.062500 0.375000 0.500000 + 0.062500 0.437500 0.437500 + 0.062500 0.500000 0.437500 + 0.062500 0.562500 0.375000 + 0.000000 0.562500 0.312500 + 0.000000 0.437500 0.375000 + 0.062500 0.500000 0.375000 + 0.062500 0.562500 0.312500 + 0.062500 0.500000 0.625000 + 0.000000 0.562500 0.562500 + 0.000000 0.437500 0.687500 + 0.062500 0.437500 0.687500 + 0.062500 0.500000 0.687500 + 0.000000 0.562500 0.625000 + 0.062500 0.562500 0.625000 + 0.125000 0.500000 0.562500 + 0.125000 0.562500 0.437500 + 0.125000 0.562500 0.500000 + 0.125000 0.437500 0.562500 + 0.125000 0.437500 0.500000 + 0.125000 0.500000 0.437500 + 0.187500 0.500000 0.562500 + 0.187500 0.562500 0.437500 + 0.187500 0.562500 0.500000 + 0.062500 0.562500 0.562500 + 0.125000 0.562500 0.562500 + 0.125000 0.437500 0.625000 + 0.125000 0.437500 0.687500 + 0.125000 0.500000 0.687500 + 0.187500 0.500000 0.625000 + 0.187500 0.562500 0.562500 + 0.125000 0.562500 0.625000 + 0.187500 0.562500 0.625000 + 0.062500 0.625000 0.500000 + 0.000000 0.687500 0.437500 + 0.000000 0.625000 0.562500 + 0.062500 0.625000 0.562500 + 0.062500 0.687500 0.500000 + 0.125000 0.625000 0.437500 + 0.062500 0.625000 0.312500 + 0.125000 0.687500 0.312500 + 0.125000 0.687500 0.375000 + 0.125000 0.562500 0.375000 + 0.125000 0.625000 0.312500 + 0.187500 0.625000 0.375000 + 0.187500 0.625000 0.437500 + 0.187500 0.687500 0.375000 + 0.062500 0.687500 0.437500 + 0.125000 0.687500 0.437500 + 0.187500 0.625000 0.500000 + 0.125000 0.625000 0.562500 + 0.187500 0.625000 0.562500 + 0.125000 0.687500 0.500000 + 0.187500 0.687500 0.437500 + 0.437500 0.000000 0.937500 + 0.437500 0.062500 0.937500 + 0.437500 0.062500 1.000000 + 0.375000 0.000000 0.937500 + 0.375000 0.062500 0.937500 + 0.375000 0.062500 1.000000 + 0.437500 0.062500 0.875000 + 0.625000 0.000000 0.937500 + 0.625000 0.062500 0.937500 + 0.625000 0.062500 1.000000 + 0.687500 0.000000 0.937500 + 0.687500 0.062500 0.937500 + 0.687500 0.062500 1.000000 + 0.687500 0.062500 0.875000 + 0.500000 0.062500 0.875000 + 0.562500 0.000000 0.875000 + 0.562500 0.062500 0.812500 + 0.437500 0.000000 0.875000 + 0.500000 0.062500 0.812500 + 0.562500 0.000000 0.812500 + 0.562500 0.062500 0.750000 + 0.500000 0.125000 0.937500 + 0.562500 0.125000 0.812500 + 0.562500 0.125000 0.875000 + 0.437500 0.125000 0.875000 + 0.437500 0.125000 0.937500 + 0.500000 0.125000 0.812500 + 0.500000 0.187500 0.875000 + 0.562500 0.187500 0.750000 + 0.562500 0.187500 0.812500 + 0.562500 0.187500 0.875000 + 0.562500 0.125000 0.937500 + 0.562500 0.125000 1.000000 + 0.437500 0.125000 1.000000 + 0.500000 0.187500 0.937500 + 0.562500 0.187500 0.937500 + 0.562500 0.187500 1.000000 + 0.625000 0.062500 0.812500 + 0.625000 0.062500 0.875000 + 0.687500 0.000000 0.875000 + 0.625000 0.000000 0.812500 + 0.687500 0.062500 0.750000 + 0.687500 0.062500 0.812500 + 0.625000 0.125000 0.812500 + 0.562500 0.125000 0.750000 + 0.625000 0.062500 0.750000 + 0.625000 0.125000 0.687500 + 0.625000 0.187500 0.687500 + 0.625000 0.187500 0.750000 + 0.687500 0.125000 0.687500 + 0.687500 0.125000 0.750000 + 0.687500 0.187500 0.687500 + 0.625000 0.125000 0.937500 + 0.687500 0.125000 0.875000 + 0.625000 0.187500 0.812500 + 0.625000 0.187500 0.875000 + 0.687500 0.125000 0.812500 + 0.687500 0.187500 0.750000 + 0.687500 0.187500 0.875000 + 0.687500 0.125000 0.937500 + 0.687500 0.125000 1.000000 + 0.625000 0.187500 0.937500 + 0.625000 0.187500 1.000000 + 0.687500 0.187500 0.937500 + 0.000000 0.437500 0.937500 + 0.062500 0.437500 1.000000 + 0.000000 0.375000 0.937500 + 0.062500 0.375000 1.000000 + 0.000000 0.625000 0.937500 + 0.062500 0.625000 1.000000 + 0.000000 0.687500 0.937500 + 0.062500 0.687500 1.000000 + 0.062500 0.500000 0.937500 + 0.000000 0.562500 0.875000 + 0.000000 0.437500 0.875000 + 0.062500 0.437500 0.937500 + 0.062500 0.500000 0.875000 + 0.000000 0.562500 0.812500 + 0.062500 0.562500 0.875000 + 0.062500 0.562500 0.937500 + 0.125000 0.562500 1.000000 + 0.125000 0.437500 1.000000 + 0.125000 0.500000 0.937500 + 0.125000 0.562500 0.937500 + 0.187500 0.562500 1.000000 + 0.062500 0.625000 0.937500 + 0.000000 0.687500 0.875000 + 0.000000 0.625000 0.812500 + 0.062500 0.625000 0.875000 + 0.062500 0.687500 0.875000 + 0.062500 0.687500 0.937500 + 0.125000 0.687500 1.000000 + 0.125000 0.625000 0.937500 + 0.187500 0.625000 1.000000 + 0.125000 0.687500 0.937500 + 0.375000 0.375000 0.562500 + 0.437500 0.375000 0.562500 + 0.375000 0.437500 0.562500 + 0.437500 0.375000 0.625000 + 0.437500 0.437500 0.625000 + 0.312500 0.312500 0.625000 + 0.375000 0.312500 0.625000 + 0.312500 0.375000 0.625000 + 0.375000 0.312500 0.687500 + 0.375000 0.375000 0.687500 + 0.312500 0.375000 0.562500 + 0.375000 0.437500 0.625000 + 0.562500 0.562500 0.375000 + 0.625000 0.562500 0.375000 + 0.562500 0.625000 0.375000 + 0.625000 0.562500 0.437500 + 0.625000 0.625000 0.437500 + 0.625000 0.625000 0.312500 + 0.687500 0.625000 0.312500 + 0.625000 0.687500 0.312500 + 0.687500 0.625000 0.375000 + 0.687500 0.687500 0.375000 + 0.562500 0.625000 0.312500 + 0.625000 0.687500 0.375000 + 0.375000 0.437500 0.437500 + 0.437500 0.437500 0.437500 + 0.437500 0.375000 0.500000 + 0.375000 0.437500 0.500000 + 0.312500 0.312500 0.562500 + 0.375000 0.312500 0.562500 + 0.312500 0.375000 0.437500 + 0.375000 0.375000 0.437500 + 0.375000 0.312500 0.500000 + 0.312500 0.375000 0.500000 + 0.437500 0.375000 0.437500 + 0.437500 0.500000 0.375000 + 0.375000 0.500000 0.437500 + 0.437500 0.562500 0.375000 + 0.312500 0.437500 0.375000 + 0.375000 0.437500 0.375000 + 0.312500 0.437500 0.437500 + 0.375000 0.500000 0.312500 + 0.312500 0.500000 0.375000 + 0.375000 0.562500 0.312500 + 0.437500 0.562500 0.312500 + 0.375000 0.562500 0.375000 + 0.500000 0.437500 0.437500 + 0.562500 0.500000 0.375000 + 0.500000 0.562500 0.375000 + 0.562500 0.562500 0.312500 + 0.437500 0.437500 0.375000 + 0.437500 0.500000 0.312500 + 0.500000 0.437500 0.375000 + 0.562500 0.500000 0.312500 + 0.500000 0.562500 0.312500 + 0.500000 0.375000 0.562500 + 0.562500 0.437500 0.437500 + 0.437500 0.312500 0.562500 + 0.437500 0.312500 0.625000 + 0.437500 0.312500 0.500000 + 0.500000 0.375000 0.437500 + 0.500000 0.312500 0.562500 + 0.562500 0.375000 0.437500 + 0.562500 0.375000 0.500000 + 0.437500 0.500000 0.562500 + 0.437500 0.562500 0.437500 + 0.437500 0.562500 0.500000 + 0.312500 0.437500 0.562500 + 0.312500 0.437500 0.500000 + 0.312500 0.500000 0.437500 + 0.375000 0.500000 0.562500 + 0.375000 0.562500 0.437500 + 0.375000 0.562500 0.500000 + 0.500000 0.437500 0.625000 + 0.562500 0.437500 0.500000 + 0.562500 0.437500 0.562500 + 0.437500 0.312500 0.687500 + 0.437500 0.375000 0.687500 + 0.500000 0.312500 0.625000 + 0.500000 0.375000 0.687500 + 0.562500 0.375000 0.562500 + 0.562500 0.375000 0.625000 + 0.562500 0.437500 0.625000 + 0.500000 0.562500 0.562500 + 0.562500 0.500000 0.562500 + 0.562500 0.562500 0.562500 + 0.437500 0.437500 0.687500 + 0.437500 0.500000 0.625000 + 0.500000 0.437500 0.687500 + 0.500000 0.562500 0.625000 + 0.562500 0.500000 0.625000 + 0.562500 0.562500 0.625000 + 0.625000 0.500000 0.437500 + 0.625000 0.562500 0.312500 + 0.687500 0.562500 0.312500 + 0.562500 0.437500 0.375000 + 0.625000 0.500000 0.312500 + 0.625000 0.437500 0.375000 + 0.625000 0.437500 0.437500 + 0.687500 0.500000 0.375000 + 0.500000 0.625000 0.437500 + 0.562500 0.625000 0.437500 + 0.562500 0.687500 0.312500 + 0.437500 0.625000 0.312500 + 0.500000 0.625000 0.312500 + 0.437500 0.625000 0.375000 + 0.500000 0.687500 0.375000 + 0.562500 0.687500 0.375000 + 0.562500 0.625000 0.500000 + 0.437500 0.562500 0.562500 + 0.437500 0.625000 0.437500 + 0.437500 0.625000 0.500000 + 0.500000 0.625000 0.562500 + 0.562500 0.625000 0.562500 + 0.500000 0.687500 0.437500 + 0.562500 0.687500 0.437500 + 0.562500 0.687500 0.500000 + 0.625000 0.562500 0.500000 + 0.687500 0.562500 0.375000 + 0.687500 0.562500 0.437500 + 0.625000 0.437500 0.500000 + 0.625000 0.437500 0.562500 + 0.625000 0.500000 0.562500 + 0.687500 0.500000 0.437500 + 0.687500 0.562500 0.500000 + 0.687500 0.625000 0.437500 + 0.687500 0.687500 0.437500 + 0.625000 0.562500 0.562500 + 0.625000 0.625000 0.562500 + 0.625000 0.687500 0.437500 + 0.625000 0.687500 0.500000 + 0.687500 0.625000 0.500000 + 0.375000 0.437500 0.937500 + 0.437500 0.375000 1.000000 + 0.375000 0.437500 1.000000 + 0.437500 0.437500 0.937500 + 0.312500 0.375000 0.937500 + 0.375000 0.312500 1.000000 + 0.312500 0.375000 1.000000 + 0.375000 0.375000 0.937500 + 0.312500 0.437500 0.937500 + 0.437500 0.375000 0.937500 + 0.562500 0.625000 0.937500 + 0.625000 0.562500 1.000000 + 0.562500 0.625000 1.000000 + 0.625000 0.625000 0.937500 + 0.625000 0.687500 0.937500 + 0.687500 0.625000 1.000000 + 0.625000 0.687500 1.000000 + 0.687500 0.687500 0.937500 + 0.562500 0.687500 0.937500 + 0.687500 0.625000 0.937500 + 0.375000 0.500000 0.937500 + 0.437500 0.500000 0.875000 + 0.375000 0.562500 0.875000 + 0.437500 0.562500 0.875000 + 0.312500 0.437500 0.875000 + 0.375000 0.437500 0.875000 + 0.312500 0.500000 0.875000 + 0.375000 0.500000 0.812500 + 0.312500 0.562500 0.812500 + 0.375000 0.562500 0.812500 + 0.437500 0.562500 0.812500 + 0.500000 0.437500 0.937500 + 0.562500 0.437500 0.937500 + 0.562500 0.437500 1.000000 + 0.437500 0.312500 1.000000 + 0.500000 0.375000 0.937500 + 0.562500 0.375000 0.937500 + 0.562500 0.375000 1.000000 + 0.375000 0.562500 0.937500 + 0.437500 0.562500 1.000000 + 0.312500 0.437500 1.000000 + 0.312500 0.500000 0.937500 + 0.312500 0.562500 0.937500 + 0.375000 0.562500 1.000000 + 0.500000 0.562500 0.875000 + 0.562500 0.500000 0.875000 + 0.562500 0.562500 0.875000 + 0.437500 0.437500 0.875000 + 0.437500 0.500000 0.812500 + 0.500000 0.437500 0.875000 + 0.500000 0.562500 0.812500 + 0.562500 0.500000 0.812500 + 0.562500 0.562500 0.812500 + 0.437500 0.625000 0.875000 + 0.437500 0.625000 0.937500 + 0.312500 0.562500 0.875000 + 0.312500 0.625000 0.812500 + 0.375000 0.625000 0.812500 + 0.312500 0.625000 0.875000 + 0.375000 0.625000 0.937500 + 0.375000 0.687500 0.812500 + 0.375000 0.687500 0.875000 + 0.437500 0.687500 0.875000 + 0.500000 0.625000 0.937500 + 0.562500 0.625000 0.875000 + 0.562500 0.687500 0.875000 + 0.437500 0.625000 0.812500 + 0.500000 0.625000 0.812500 + 0.437500 0.687500 0.812500 + 0.500000 0.687500 0.875000 + 0.562500 0.687500 0.812500 + 0.625000 0.500000 0.937500 + 0.625000 0.562500 0.875000 + 0.562500 0.437500 0.875000 + 0.625000 0.437500 0.875000 + 0.625000 0.437500 0.937500 + 0.625000 0.500000 0.812500 + 0.625000 0.562500 0.812500 + 0.687500 0.500000 0.875000 + 0.687500 0.562500 0.812500 + 0.687500 0.562500 0.875000 + 0.625000 0.562500 0.937500 + 0.687500 0.562500 1.000000 + 0.625000 0.437500 1.000000 + 0.687500 0.500000 0.937500 + 0.687500 0.562500 0.937500 + 0.562500 0.687500 1.000000 + 0.437500 0.625000 1.000000 + 0.437500 0.687500 0.937500 + 0.500000 0.687500 0.937500 + 0.625000 0.687500 0.875000 + 0.687500 0.687500 0.875000 + 0.562500 0.625000 0.812500 + 0.625000 0.625000 0.812500 + 0.625000 0.687500 0.812500 + 0.687500 0.625000 0.812500 + 0.687500 0.625000 0.875000 + 0.937500 0.000000 0.437500 + 1.000000 0.062500 0.375000 + 0.937500 0.000000 0.375000 + 1.000000 0.062500 0.312500 + 0.937500 0.000000 0.625000 + 1.000000 0.062500 0.562500 + 0.937500 0.000000 0.687500 + 1.000000 0.062500 0.625000 + 0.875000 0.000000 0.562500 + 0.937500 0.062500 0.437500 + 0.875000 0.000000 0.437500 + 0.937500 0.062500 0.375000 + 0.812500 0.000000 0.562500 + 0.875000 0.062500 0.437500 + 0.875000 0.062500 0.500000 + 0.937500 0.062500 0.500000 + 0.937500 0.062500 0.562500 + 0.875000 0.000000 0.687500 + 0.812500 0.000000 0.625000 + 0.875000 0.062500 0.562500 + 0.875000 0.062500 0.625000 + 1.000000 0.125000 0.437500 + 1.000000 0.125000 0.312500 + 0.937500 0.125000 0.375000 + 0.937500 0.125000 0.437500 + 1.000000 0.187500 0.375000 + 0.937500 0.062500 0.625000 + 1.000000 0.125000 0.562500 + 0.937500 0.125000 0.500000 + 0.937500 0.125000 0.562500 + 1.000000 0.187500 0.437500 + 0.937500 0.375000 0.000000 + 0.937500 0.375000 0.062500 + 1.000000 0.375000 0.062500 + 0.937500 0.312500 0.000000 + 0.937500 0.312500 0.062500 + 1.000000 0.312500 0.062500 + 0.937500 0.312500 0.125000 + 0.937500 0.562500 0.000000 + 0.937500 0.562500 0.062500 + 1.000000 0.562500 0.062500 + 0.937500 0.625000 0.000000 + 0.937500 0.625000 0.062500 + 1.000000 0.625000 0.062500 + 0.937500 0.562500 0.125000 + 0.875000 0.437500 0.000000 + 0.875000 0.375000 0.062500 + 0.875000 0.312500 0.000000 + 0.875000 0.312500 0.062500 + 0.812500 0.375000 0.000000 + 0.812500 0.312500 0.062500 + 0.812500 0.375000 0.062500 + 0.875000 0.437500 0.062500 + 0.875000 0.500000 0.062500 + 0.875000 0.562500 0.000000 + 0.812500 0.437500 0.000000 + 0.812500 0.437500 0.062500 + 0.812500 0.500000 0.062500 + 0.875000 0.375000 0.187500 + 0.875000 0.437500 0.125000 + 0.937500 0.375000 0.125000 + 0.875000 0.312500 0.125000 + 0.812500 0.312500 0.125000 + 0.812500 0.375000 0.125000 + 0.812500 0.312500 0.250000 + 0.812500 0.375000 0.187500 + 0.875000 0.312500 0.187500 + 0.875000 0.437500 0.187500 + 0.937500 0.375000 0.187500 + 0.937500 0.437500 0.187500 + 0.812500 0.312500 0.312500 + 0.812500 0.375000 0.250000 + 0.875000 0.312500 0.250000 + 0.812500 0.375000 0.312500 + 0.875000 0.312500 0.312500 + 0.875000 0.375000 0.312500 + 0.875000 0.437500 0.250000 + 0.937500 0.375000 0.250000 + 0.937500 0.500000 0.125000 + 0.875000 0.562500 0.062500 + 0.875000 0.562500 0.125000 + 0.812500 0.437500 0.125000 + 0.812500 0.500000 0.125000 + 0.812500 0.437500 0.187500 + 0.812500 0.437500 0.250000 + 0.875000 0.500000 0.187500 + 1.000000 0.437500 0.125000 + 1.000000 0.312500 0.125000 + 0.937500 0.312500 0.187500 + 0.937500 0.312500 0.250000 + 1.000000 0.375000 0.187500 + 1.000000 0.562500 0.125000 + 0.937500 0.437500 0.250000 + 0.937500 0.500000 0.187500 + 1.000000 0.437500 0.187500 + 0.000000 0.937500 0.437500 + 0.062500 1.000000 0.437500 + 0.000000 0.937500 0.375000 + 0.062500 1.000000 0.375000 + 0.062500 0.937500 0.437500 + 0.000000 0.937500 0.625000 + 0.062500 1.000000 0.625000 + 0.000000 0.937500 0.687500 + 0.062500 1.000000 0.687500 + 0.062500 0.937500 0.687500 + 0.000000 0.875000 0.562500 + 0.062500 0.875000 0.562500 + 0.062500 0.937500 0.500000 + 0.000000 0.875000 0.437500 + 0.000000 0.812500 0.562500 + 0.062500 0.812500 0.562500 + 0.062500 0.875000 0.500000 + 0.062500 0.875000 0.625000 + 0.062500 0.937500 0.625000 + 0.000000 0.875000 0.687500 + 0.000000 0.812500 0.625000 + 0.062500 0.812500 0.687500 + 0.062500 0.875000 0.687500 + 0.125000 0.937500 0.562500 + 0.125000 0.937500 0.625000 + 0.062500 0.812500 0.625000 + 0.125000 0.812500 0.625000 + 0.125000 0.875000 0.562500 + 0.125000 0.812500 0.687500 + 0.125000 0.875000 0.687500 + 0.187500 0.875000 0.625000 + 0.187500 0.875000 0.687500 + 0.187500 0.937500 0.625000 + 0.125000 1.000000 0.562500 + 0.125000 1.000000 0.437500 + 0.125000 0.937500 0.500000 + 0.187500 0.937500 0.562500 + 0.187500 1.000000 0.562500 + 0.125000 1.000000 0.687500 + 0.125000 0.937500 0.687500 + 0.187500 0.937500 0.687500 + 0.187500 1.000000 0.625000 + 0.375000 0.937500 0.000000 + 0.375000 0.937500 0.062500 + 0.437500 1.000000 0.062500 + 0.312500 0.937500 0.000000 + 0.312500 0.937500 0.062500 + 0.375000 1.000000 0.062500 + 0.562500 0.937500 0.000000 + 0.562500 0.937500 0.062500 + 0.625000 1.000000 0.062500 + 0.625000 0.937500 0.000000 + 0.625000 0.937500 0.062500 + 0.687500 1.000000 0.062500 + 0.437500 0.875000 0.000000 + 0.375000 0.875000 0.062500 + 0.437500 0.875000 0.062500 + 0.312500 0.875000 0.000000 + 0.375000 0.812500 0.000000 + 0.312500 0.812500 0.062500 + 0.375000 0.812500 0.062500 + 0.500000 0.875000 0.062500 + 0.562500 0.875000 0.000000 + 0.562500 0.875000 0.062500 + 0.437500 0.812500 0.000000 + 0.437500 0.812500 0.062500 + 0.500000 0.812500 0.062500 + 0.437500 0.875000 0.125000 + 0.437500 0.937500 0.125000 + 0.312500 0.875000 0.062500 + 0.312500 0.875000 0.125000 + 0.375000 0.937500 0.125000 + 0.312500 0.812500 0.125000 + 0.375000 0.812500 0.125000 + 0.375000 0.812500 0.187500 + 0.375000 0.875000 0.187500 + 0.437500 0.875000 0.187500 + 0.500000 0.937500 0.125000 + 0.562500 0.937500 0.125000 + 0.562500 0.875000 0.125000 + 0.437500 0.812500 0.125000 + 0.500000 0.812500 0.125000 + 0.437500 0.812500 0.187500 + 0.500000 0.875000 0.187500 + 0.562500 0.875000 0.187500 + 0.562500 1.000000 0.125000 + 0.437500 1.000000 0.125000 + 0.437500 0.937500 0.187500 + 0.500000 0.937500 0.187500 + 0.562500 1.000000 0.187500 + 0.625000 0.937500 0.125000 + 0.687500 1.000000 0.125000 + 0.562500 0.937500 0.187500 + 0.625000 0.937500 0.187500 + 0.625000 1.000000 0.187500 + 0.375000 0.937500 0.437500 + 0.375000 1.000000 0.437500 + 0.437500 1.000000 0.375000 + 0.312500 0.937500 0.375000 + 0.312500 1.000000 0.375000 + 0.375000 1.000000 0.312500 + 0.375000 0.937500 0.375000 + 0.562500 0.937500 0.625000 + 0.562500 1.000000 0.625000 + 0.625000 1.000000 0.562500 + 0.625000 0.937500 0.687500 + 0.625000 1.000000 0.687500 + 0.687500 1.000000 0.625000 + 0.625000 0.937500 0.625000 + 0.437500 0.875000 0.500000 + 0.437500 0.875000 0.562500 + 0.375000 0.937500 0.500000 + 0.437500 0.937500 0.437500 + 0.312500 0.875000 0.437500 + 0.312500 0.937500 0.437500 + 0.375000 0.812500 0.500000 + 0.375000 0.812500 0.562500 + 0.312500 0.875000 0.500000 + 0.375000 0.875000 0.437500 + 0.375000 0.875000 0.562500 + 0.500000 0.875000 0.562500 + 0.500000 0.937500 0.437500 + 0.562500 0.937500 0.500000 + 0.437500 0.812500 0.500000 + 0.437500 0.812500 0.562500 + 0.437500 0.875000 0.437500 + 0.500000 0.812500 0.562500 + 0.500000 0.875000 0.437500 + 0.562500 0.875000 0.500000 + 0.562500 0.875000 0.562500 + 0.562500 0.937500 0.437500 + 0.437500 0.937500 0.562500 + 0.500000 0.937500 0.625000 + 0.562500 0.937500 0.562500 + 0.562500 0.875000 0.687500 + 0.437500 0.812500 0.625000 + 0.500000 0.812500 0.625000 + 0.437500 0.875000 0.625000 + 0.500000 0.875000 0.687500 + 0.562500 0.875000 0.625000 + 0.437500 1.000000 0.562500 + 0.312500 1.000000 0.437500 + 0.312500 0.937500 0.500000 + 0.375000 0.937500 0.562500 + 0.375000 1.000000 0.562500 + 0.562500 1.000000 0.437500 + 0.437500 1.000000 0.312500 + 0.437500 0.937500 0.375000 + 0.500000 0.937500 0.375000 + 0.562500 1.000000 0.375000 + 0.562500 0.937500 0.687500 + 0.562500 1.000000 0.687500 + 0.437500 0.937500 0.625000 + 0.500000 0.937500 0.687500 + 0.437500 1.000000 0.625000 + 0.687500 1.000000 0.562500 + 0.625000 0.937500 0.500000 + 0.625000 0.937500 0.562500 + 0.625000 1.000000 0.437500 + 0.937500 0.375000 0.625000 + 1.000000 0.375000 0.562500 + 1.000000 0.437500 0.625000 + 0.937500 0.312500 0.687500 + 1.000000 0.312500 0.625000 + 1.000000 0.375000 0.687500 + 0.937500 0.375000 0.687500 + 0.937500 0.562500 0.437500 + 1.000000 0.562500 0.375000 + 1.000000 0.625000 0.437500 + 0.937500 0.625000 0.375000 + 1.000000 0.625000 0.312500 + 1.000000 0.687500 0.375000 + 0.937500 0.625000 0.437500 + 0.875000 0.437500 0.562500 + 0.875000 0.437500 0.625000 + 0.937500 0.375000 0.562500 + 0.937500 0.437500 0.500000 + 0.937500 0.437500 0.625000 + 0.875000 0.312500 0.687500 + 0.812500 0.375000 0.625000 + 0.812500 0.375000 0.687500 + 0.875000 0.312500 0.625000 + 0.875000 0.375000 0.562500 + 0.875000 0.375000 0.687500 + 0.875000 0.500000 0.562500 + 0.937500 0.500000 0.437500 + 0.937500 0.562500 0.500000 + 0.875000 0.562500 0.437500 + 0.937500 0.562500 0.375000 + 0.812500 0.437500 0.562500 + 0.875000 0.437500 0.500000 + 0.812500 0.500000 0.562500 + 0.875000 0.500000 0.437500 + 0.875000 0.562500 0.500000 + 0.937500 0.500000 0.625000 + 0.937500 0.562500 0.562500 + 0.812500 0.437500 0.625000 + 0.812500 0.437500 0.687500 + 0.875000 0.437500 0.687500 + 0.812500 0.500000 0.625000 + 0.875000 0.562500 0.562500 + 0.875000 0.500000 0.687500 + 0.875000 0.562500 0.625000 + 0.937500 0.562500 0.625000 + 1.000000 0.437500 0.437500 + 0.937500 0.312500 0.625000 + 1.000000 0.312500 0.562500 + 0.937500 0.312500 0.562500 + 0.937500 0.375000 0.500000 + 1.000000 0.375000 0.437500 + 1.000000 0.562500 0.312500 + 0.937500 0.437500 0.437500 + 0.937500 0.500000 0.375000 + 1.000000 0.437500 0.375000 + 1.000000 0.562500 0.562500 + 1.000000 0.437500 0.687500 + 0.937500 0.437500 0.687500 + 0.937500 0.500000 0.687500 + 1.000000 0.562500 0.625000 + 1.000000 0.687500 0.437500 + 0.937500 0.625000 0.500000 + 0.937500 0.625000 0.562500 + 1.000000 0.625000 0.562500 + 0.937500 0.375000 1.000000 + 1.000000 0.437500 0.937500 + 0.937500 0.312500 1.000000 + 1.000000 0.375000 0.937500 + 0.937500 0.562500 1.000000 + 1.000000 0.625000 0.937500 + 0.937500 0.625000 1.000000 + 1.000000 0.687500 0.937500 + 0.875000 0.437500 1.000000 + 0.937500 0.437500 0.937500 + 0.875000 0.312500 1.000000 + 0.937500 0.375000 0.937500 + 0.812500 0.375000 1.000000 + 0.875000 0.375000 0.937500 + 0.875000 0.437500 0.937500 + 0.937500 0.500000 0.937500 + 0.937500 0.562500 0.937500 + 0.875000 0.562500 1.000000 + 0.812500 0.437500 1.000000 + 0.875000 0.500000 0.937500 + 0.875000 0.562500 0.937500 + 1.000000 0.562500 0.875000 + 1.000000 0.437500 0.875000 + 0.937500 0.437500 0.875000 + 0.937500 0.500000 0.875000 + 1.000000 0.562500 0.812500 + 0.937500 0.625000 0.937500 + 1.000000 0.687500 0.875000 + 0.937500 0.562500 0.875000 + 0.937500 0.625000 0.875000 + 1.000000 0.625000 0.812500 + 0.375000 0.937500 1.000000 + 0.375000 1.000000 0.937500 + 0.312500 0.937500 1.000000 + 0.312500 1.000000 0.937500 + 0.562500 0.937500 1.000000 + 0.562500 1.000000 0.937500 + 0.625000 0.937500 1.000000 + 0.625000 1.000000 0.937500 + 0.437500 0.875000 1.000000 + 0.375000 0.937500 0.937500 + 0.312500 0.875000 1.000000 + 0.312500 0.937500 0.937500 + 0.375000 0.812500 1.000000 + 0.312500 0.875000 0.937500 + 0.375000 0.875000 0.937500 + 0.437500 0.937500 0.937500 + 0.500000 0.937500 0.937500 + 0.562500 0.875000 1.000000 + 0.437500 0.812500 1.000000 + 0.437500 0.875000 0.937500 + 0.500000 0.875000 0.937500 + 0.437500 1.000000 0.875000 + 0.312500 1.000000 0.875000 + 0.312500 0.937500 0.875000 + 0.375000 0.937500 0.875000 + 0.375000 1.000000 0.812500 + 0.562500 0.937500 0.937500 + 0.562500 1.000000 0.875000 + 0.437500 0.937500 0.875000 + 0.500000 0.937500 0.875000 + 0.437500 1.000000 0.812500 + 0.937500 0.937500 0.437500 + 0.937500 1.000000 0.375000 + 1.000000 0.937500 0.437500 + 0.937500 0.937500 0.375000 + 0.937500 1.000000 0.312500 + 1.000000 0.937500 0.375000 + 0.937500 0.937500 0.625000 + 0.937500 1.000000 0.562500 + 1.000000 0.937500 0.625000 + 0.937500 0.937500 0.687500 + 0.937500 1.000000 0.625000 + 1.000000 0.937500 0.687500 + 0.875000 0.875000 0.562500 + 0.875000 0.937500 0.437500 + 0.875000 0.937500 0.500000 + 0.937500 0.875000 0.500000 + 0.875000 0.875000 0.437500 + 0.937500 0.875000 0.437500 + 0.812500 0.812500 0.562500 + 0.812500 0.875000 0.437500 + 0.812500 0.875000 0.500000 + 0.875000 0.812500 0.500000 + 0.875000 0.812500 0.562500 + 0.875000 0.937500 0.562500 + 0.937500 0.875000 0.562500 + 0.937500 0.875000 0.625000 + 0.875000 0.875000 0.687500 + 0.875000 0.937500 0.625000 + 0.812500 0.812500 0.625000 + 0.812500 0.875000 0.562500 + 0.812500 0.875000 0.625000 + 0.875000 0.812500 0.625000 + 0.875000 0.812500 0.687500 + 0.875000 1.000000 0.437500 + 0.875000 0.937500 0.375000 + 0.875000 1.000000 0.312500 + 0.812500 0.937500 0.375000 + 0.812500 0.937500 0.437500 + 0.812500 1.000000 0.375000 + 0.875000 1.000000 0.562500 + 0.812500 0.937500 0.500000 + 0.812500 0.937500 0.562500 + 0.812500 1.000000 0.437500 + 1.000000 0.875000 0.562500 + 1.000000 0.875000 0.437500 + 0.937500 0.812500 0.500000 + 0.937500 0.812500 0.562500 + 1.000000 0.812500 0.562500 + 0.937500 0.875000 0.687500 + 1.000000 0.875000 0.687500 + 0.937500 0.812500 0.625000 + 0.937500 0.812500 0.687500 + 1.000000 0.812500 0.625000 + 0.125000 0.062500 0.125000 + 0.125000 0.000000 0.187500 + 0.187500 0.062500 0.062500 + 0.187500 0.000000 0.125000 + 0.187500 0.062500 0.125000 + 0.062500 0.125000 0.125000 + 0.000000 0.125000 0.187500 + 0.062500 0.125000 0.187500 + 0.062500 0.187500 0.062500 + 0.000000 0.187500 0.125000 + 0.062500 0.187500 0.125000 + 0.125000 0.062500 0.187500 + 0.125000 0.125000 0.187500 + 0.187500 0.125000 0.062500 + 0.125000 0.187500 0.062500 + 0.125000 0.187500 0.125000 + 0.187500 0.125000 0.125000 + 0.187500 0.187500 0.125000 + 0.125000 0.062500 0.250000 + 0.187500 0.000000 0.187500 + 0.187500 0.062500 0.187500 + 0.187500 0.062500 0.250000 + 0.062500 0.125000 0.250000 + 0.000000 0.187500 0.187500 + 0.062500 0.187500 0.187500 + 0.062500 0.187500 0.250000 + 0.125000 0.187500 0.187500 + 0.187500 0.125000 0.187500 + 0.187500 0.187500 0.187500 + 0.187500 0.125000 0.250000 + 0.125000 0.187500 0.250000 + 0.250000 0.062500 0.062500 + 0.312500 0.125000 0.000000 + 0.250000 0.125000 0.062500 + 0.312500 0.187500 0.000000 + 0.312500 0.062500 0.062500 + 0.250000 0.062500 0.125000 + 0.312500 0.062500 0.125000 + 0.312500 0.125000 0.062500 + 0.375000 0.187500 0.000000 + 0.375000 0.125000 0.062500 + 0.125000 0.250000 0.062500 + 0.125000 0.312500 0.000000 + 0.187500 0.250000 0.062500 + 0.187500 0.312500 0.000000 + 0.062500 0.250000 0.125000 + 0.062500 0.312500 0.062500 + 0.062500 0.250000 0.187500 + 0.062500 0.312500 0.125000 + 0.125000 0.312500 0.062500 + 0.187500 0.250000 0.125000 + 0.187500 0.312500 0.062500 + 0.125000 0.250000 0.187500 + 0.125000 0.312500 0.125000 + 0.187500 0.312500 0.125000 + 0.187500 0.375000 0.000000 + 0.125000 0.375000 0.062500 + 0.187500 0.375000 0.062500 + 0.250000 0.187500 0.125000 + 0.312500 0.187500 0.062500 + 0.250000 0.125000 0.187500 + 0.312500 0.125000 0.125000 + 0.312500 0.187500 0.125000 + 0.312500 0.250000 0.062500 + 0.250000 0.312500 0.062500 + 0.250000 0.187500 0.187500 + 0.312500 0.250000 0.125000 + 0.250000 0.312500 0.125000 + 0.375000 0.187500 0.062500 + 0.375000 0.250000 0.062500 + 0.250000 0.375000 0.062500 + 0.125000 0.062500 0.750000 + 0.125000 0.000000 0.687500 + 0.125000 0.062500 0.687500 + 0.187500 0.062500 0.750000 + 0.187500 0.000000 0.687500 + 0.187500 0.062500 0.687500 + 0.062500 0.125000 0.750000 + 0.000000 0.125000 0.687500 + 0.062500 0.187500 0.750000 + 0.000000 0.187500 0.687500 + 0.062500 0.187500 0.687500 + 0.062500 0.125000 0.687500 + 0.125000 0.125000 0.687500 + 0.187500 0.125000 0.750000 + 0.187500 0.125000 0.687500 + 0.125000 0.187500 0.750000 + 0.125000 0.187500 0.687500 + 0.187500 0.187500 0.687500 + 0.125000 0.062500 0.625000 + 0.187500 0.000000 0.625000 + 0.187500 0.062500 0.625000 + 0.187500 0.062500 0.562500 + 0.062500 0.125000 0.625000 + 0.000000 0.187500 0.625000 + 0.062500 0.187500 0.625000 + 0.062500 0.187500 0.562500 + 0.187500 0.125000 0.625000 + 0.125000 0.187500 0.625000 + 0.187500 0.187500 0.625000 + 0.187500 0.125000 0.562500 + 0.125000 0.187500 0.562500 + 0.250000 0.062500 0.812500 + 0.312500 0.000000 0.812500 + 0.312500 0.062500 0.750000 + 0.250000 0.062500 0.875000 + 0.312500 0.000000 0.875000 + 0.312500 0.062500 0.812500 + 0.250000 0.125000 0.687500 + 0.312500 0.125000 0.687500 + 0.250000 0.125000 0.812500 + 0.312500 0.125000 0.750000 + 0.250000 0.187500 0.687500 + 0.312500 0.187500 0.687500 + 0.250000 0.062500 0.625000 + 0.312500 0.062500 0.625000 + 0.250000 0.062500 0.562500 + 0.312500 0.062500 0.562500 + 0.312500 0.125000 0.625000 + 0.250000 0.187500 0.625000 + 0.312500 0.187500 0.625000 + 0.250000 0.125000 0.562500 + 0.312500 0.125000 0.562500 + 0.312500 0.187500 0.562500 + 0.375000 0.062500 0.687500 + 0.375000 0.000000 0.812500 + 0.375000 0.062500 0.750000 + 0.437500 0.062500 0.687500 + 0.375000 0.125000 0.687500 + 0.375000 0.187500 0.625000 + 0.375000 0.125000 0.562500 + 0.375000 0.187500 0.562500 + 0.437500 0.125000 0.625000 + 0.062500 0.250000 0.875000 + 0.000000 0.312500 0.812500 + 0.062500 0.250000 0.937500 + 0.000000 0.312500 0.875000 + 0.062500 0.312500 0.875000 + 0.125000 0.250000 0.812500 + 0.062500 0.250000 0.687500 + 0.125000 0.312500 0.687500 + 0.125000 0.312500 0.750000 + 0.187500 0.250000 0.812500 + 0.125000 0.250000 0.687500 + 0.187500 0.312500 0.687500 + 0.187500 0.312500 0.750000 + 0.062500 0.312500 0.812500 + 0.125000 0.312500 0.812500 + 0.125000 0.250000 0.937500 + 0.187500 0.250000 0.875000 + 0.187500 0.312500 0.812500 + 0.125000 0.312500 0.875000 + 0.187500 0.312500 0.875000 + 0.062500 0.312500 0.625000 + 0.062500 0.250000 0.625000 + 0.062500 0.312500 0.562500 + 0.062500 0.375000 0.750000 + 0.000000 0.375000 0.812500 + 0.062500 0.375000 0.812500 + 0.062500 0.437500 0.750000 + 0.125000 0.375000 0.687500 + 0.125000 0.312500 0.625000 + 0.187500 0.375000 0.625000 + 0.187500 0.375000 0.687500 + 0.125000 0.375000 0.562500 + 0.187500 0.437500 0.625000 + 0.187500 0.375000 0.750000 + 0.125000 0.375000 0.812500 + 0.187500 0.375000 0.812500 + 0.125000 0.437500 0.750000 + 0.187500 0.437500 0.687500 + 0.250000 0.125000 0.937500 + 0.312500 0.125000 0.812500 + 0.312500 0.125000 0.875000 + 0.250000 0.187500 0.875000 + 0.312500 0.187500 0.750000 + 0.312500 0.187500 0.812500 + 0.312500 0.187500 0.875000 + 0.312500 0.125000 0.937500 + 0.312500 0.125000 1.000000 + 0.250000 0.187500 0.937500 + 0.312500 0.187500 0.937500 + 0.312500 0.187500 1.000000 + 0.375000 0.062500 0.812500 + 0.375000 0.062500 0.875000 + 0.437500 0.062500 0.750000 + 0.437500 0.062500 0.812500 + 0.375000 0.125000 0.812500 + 0.375000 0.187500 0.687500 + 0.375000 0.187500 0.750000 + 0.437500 0.125000 0.687500 + 0.437500 0.125000 0.750000 + 0.437500 0.187500 0.687500 + 0.375000 0.125000 0.937500 + 0.375000 0.187500 0.812500 + 0.375000 0.187500 0.875000 + 0.437500 0.125000 0.812500 + 0.437500 0.187500 0.750000 + 0.437500 0.187500 0.875000 + 0.375000 0.187500 0.937500 + 0.375000 0.187500 1.000000 + 0.437500 0.187500 0.937500 + 0.062500 0.312500 0.937500 + 0.125000 0.312500 1.000000 + 0.125000 0.312500 0.937500 + 0.187500 0.312500 1.000000 + 0.062500 0.375000 0.937500 + 0.062500 0.375000 0.875000 + 0.062500 0.437500 0.875000 + 0.125000 0.375000 0.937500 + 0.187500 0.375000 1.000000 + 0.125000 0.437500 0.937500 + 0.250000 0.312500 0.812500 + 0.312500 0.250000 0.812500 + 0.312500 0.312500 0.812500 + 0.250000 0.312500 0.875000 + 0.312500 0.250000 0.875000 + 0.312500 0.312500 0.875000 + 0.187500 0.250000 0.625000 + 0.187500 0.312500 0.625000 + 0.125000 0.250000 0.562500 + 0.125000 0.312500 0.562500 + 0.187500 0.312500 0.562500 + 0.312500 0.250000 0.625000 + 0.250000 0.312500 0.625000 + 0.187500 0.250000 0.562500 + 0.312500 0.250000 0.562500 + 0.250000 0.312500 0.562500 + 0.375000 0.250000 0.687500 + 0.375000 0.250000 0.562500 + 0.437500 0.250000 0.625000 + 0.250000 0.375000 0.687500 + 0.312500 0.375000 0.687500 + 0.187500 0.375000 0.562500 + 0.250000 0.375000 0.562500 + 0.250000 0.437500 0.625000 + 0.312500 0.437500 0.625000 + 0.312500 0.375000 0.750000 + 0.250000 0.375000 0.812500 + 0.312500 0.375000 0.812500 + 0.250000 0.437500 0.687500 + 0.312500 0.437500 0.687500 + 0.312500 0.437500 0.750000 + 0.375000 0.312500 0.750000 + 0.375000 0.250000 0.812500 + 0.437500 0.250000 0.687500 + 0.437500 0.312500 0.750000 + 0.375000 0.312500 0.812500 + 0.375000 0.375000 0.812500 + 0.375000 0.437500 0.687500 + 0.375000 0.437500 0.750000 + 0.437500 0.375000 0.750000 + 0.187500 0.375000 0.875000 + 0.187500 0.375000 0.937500 + 0.125000 0.437500 0.812500 + 0.125000 0.437500 0.875000 + 0.187500 0.437500 0.875000 + 0.250000 0.375000 0.937500 + 0.312500 0.375000 0.875000 + 0.187500 0.437500 0.812500 + 0.250000 0.437500 0.875000 + 0.312500 0.437500 0.812500 + 0.375000 0.250000 0.937500 + 0.375000 0.312500 0.875000 + 0.437500 0.250000 0.875000 + 0.437500 0.312500 0.812500 + 0.437500 0.312500 0.875000 + 0.375000 0.312500 0.937500 + 0.437500 0.250000 0.937500 + 0.437500 0.312500 0.937500 + 0.187500 0.437500 0.937500 + 0.250000 0.437500 0.937500 + 0.375000 0.437500 0.812500 + 0.437500 0.375000 0.812500 + 0.437500 0.375000 0.875000 + 0.812500 0.062500 0.062500 + 0.687500 0.000000 0.125000 + 0.750000 0.062500 0.062500 + 0.812500 0.062500 0.125000 + 0.687500 0.000000 0.187500 + 0.750000 0.062500 0.125000 + 0.812500 0.125000 0.000000 + 0.875000 0.125000 0.062500 + 0.812500 0.125000 0.062500 + 0.875000 0.187500 0.000000 + 0.687500 0.062500 0.062500 + 0.625000 0.000000 0.187500 + 0.687500 0.062500 0.125000 + 0.625000 0.062500 0.125000 + 0.750000 0.125000 0.062500 + 0.812500 0.187500 0.000000 + 0.687500 0.125000 0.062500 + 0.875000 0.062500 0.187500 + 0.812500 0.000000 0.312500 + 0.937500 0.062500 0.187500 + 0.875000 0.000000 0.312500 + 0.875000 0.062500 0.250000 + 0.812500 0.125000 0.125000 + 0.812500 0.062500 0.250000 + 0.812500 0.125000 0.187500 + 0.937500 0.125000 0.125000 + 0.875000 0.187500 0.062500 + 0.875000 0.125000 0.187500 + 0.875000 0.187500 0.125000 + 0.687500 0.062500 0.187500 + 0.687500 0.062500 0.250000 + 0.625000 0.062500 0.187500 + 0.625000 0.062500 0.250000 + 0.750000 0.125000 0.187500 + 0.812500 0.187500 0.062500 + 0.812500 0.187500 0.125000 + 0.687500 0.125000 0.125000 + 0.687500 0.125000 0.187500 + 0.750000 0.187500 0.125000 + 0.750000 0.062500 0.312500 + 0.812500 0.000000 0.375000 + 0.812500 0.062500 0.312500 + 0.750000 0.062500 0.375000 + 0.812500 0.125000 0.250000 + 0.812500 0.187500 0.187500 + 0.687500 0.125000 0.250000 + 0.750000 0.187500 0.187500 + 0.750000 0.125000 0.312500 + 0.937500 0.062500 0.250000 + 1.000000 0.125000 0.187500 + 0.937500 0.125000 0.187500 + 1.000000 0.187500 0.125000 + 0.937500 0.062500 0.312500 + 0.875000 0.062500 0.312500 + 0.875000 0.062500 0.375000 + 0.937500 0.125000 0.250000 + 1.000000 0.187500 0.187500 + 0.937500 0.125000 0.312500 + 0.875000 0.250000 0.062500 + 0.812500 0.250000 0.062500 + 0.875000 0.187500 0.187500 + 0.937500 0.187500 0.187500 + 0.812500 0.125000 0.312500 + 0.875000 0.125000 0.312500 + 0.875000 0.187500 0.250000 + 0.937500 0.250000 0.125000 + 0.812500 0.250000 0.125000 + 0.812500 0.187500 0.250000 + 0.875000 0.250000 0.187500 + 0.937500 0.187500 0.250000 + 0.937500 0.250000 0.187500 + 0.062500 0.812500 0.062500 + 0.000000 0.687500 0.125000 + 0.062500 0.750000 0.125000 + 0.062500 0.812500 0.125000 + 0.000000 0.687500 0.187500 + 0.062500 0.750000 0.187500 + 0.125000 0.812500 0.000000 + 0.125000 0.812500 0.062500 + 0.125000 0.875000 0.062500 + 0.187500 0.875000 0.000000 + 0.187500 0.875000 0.062500 + 0.062500 0.687500 0.062500 + 0.062500 0.687500 0.125000 + 0.000000 0.625000 0.187500 + 0.062500 0.625000 0.125000 + 0.062500 0.625000 0.187500 + 0.125000 0.750000 0.062500 + 0.187500 0.812500 0.000000 + 0.125000 0.687500 0.062500 + 0.187500 0.750000 0.062500 + 0.125000 0.812500 0.125000 + 0.062500 0.687500 0.187500 + 0.125000 0.750000 0.187500 + 0.187500 0.812500 0.062500 + 0.187500 0.812500 0.125000 + 0.125000 0.687500 0.125000 + 0.125000 0.687500 0.187500 + 0.187500 0.750000 0.125000 + 0.062500 0.875000 0.250000 + 0.000000 0.812500 0.312500 + 0.062500 0.812500 0.312500 + 0.062500 0.937500 0.250000 + 0.000000 0.875000 0.312500 + 0.062500 0.875000 0.312500 + 0.125000 0.875000 0.187500 + 0.125000 0.812500 0.187500 + 0.187500 0.937500 0.125000 + 0.187500 0.875000 0.125000 + 0.187500 0.875000 0.187500 + 0.125000 0.812500 0.250000 + 0.125000 0.812500 0.312500 + 0.125000 0.937500 0.250000 + 0.125000 0.875000 0.312500 + 0.187500 0.937500 0.187500 + 0.187500 0.875000 0.250000 + 0.187500 0.875000 0.312500 + 0.062500 0.687500 0.250000 + 0.062500 0.625000 0.250000 + 0.062500 0.750000 0.375000 + 0.000000 0.812500 0.375000 + 0.062500 0.812500 0.375000 + 0.062500 0.750000 0.437500 + 0.125000 0.750000 0.312500 + 0.187500 0.812500 0.187500 + 0.187500 0.812500 0.250000 + 0.125000 0.687500 0.250000 + 0.187500 0.750000 0.312500 + 0.125000 0.812500 0.375000 + 0.187500 0.812500 0.312500 + 0.187500 0.812500 0.375000 + 0.125000 0.750000 0.437500 + 0.187500 0.750000 0.375000 + 0.125000 0.937500 0.312500 + 0.125000 1.000000 0.312500 + 0.187500 0.937500 0.312500 + 0.187500 1.000000 0.312500 + 0.062500 0.875000 0.375000 + 0.062500 0.937500 0.375000 + 0.062500 0.812500 0.437500 + 0.062500 0.875000 0.437500 + 0.125000 0.937500 0.375000 + 0.187500 0.875000 0.375000 + 0.187500 0.937500 0.375000 + 0.125000 0.812500 0.437500 + 0.125000 0.875000 0.437500 + 0.187500 0.875000 0.437500 + 0.187500 1.000000 0.375000 + 0.125000 0.937500 0.437500 + 0.187500 0.937500 0.437500 + 0.250000 0.937500 0.125000 + 0.312500 1.000000 0.125000 + 0.250000 0.937500 0.187500 + 0.312500 1.000000 0.187500 + 0.250000 0.875000 0.062500 + 0.250000 0.812500 0.062500 + 0.312500 0.937500 0.125000 + 0.250000 0.875000 0.187500 + 0.250000 0.812500 0.125000 + 0.312500 0.875000 0.187500 + 0.312500 0.937500 0.187500 + 0.375000 1.000000 0.187500 + 0.375000 0.937500 0.187500 + 0.250000 0.875000 0.312500 + 0.312500 0.937500 0.250000 + 0.250000 0.812500 0.312500 + 0.312500 0.875000 0.250000 + 0.312500 0.875000 0.312500 + 0.250000 0.937500 0.375000 + 0.312500 0.937500 0.312500 + 0.250000 0.812500 0.375000 + 0.250000 0.875000 0.437500 + 0.312500 0.875000 0.375000 + 0.250000 0.937500 0.437500 + 0.375000 0.937500 0.250000 + 0.375000 0.937500 0.312500 + 0.875000 0.062500 0.875000 + 0.812500 0.000000 0.875000 + 0.875000 0.062500 0.812500 + 0.937500 0.062500 0.812500 + 0.875000 0.000000 0.812500 + 0.937500 0.062500 0.750000 + 0.875000 0.125000 0.937500 + 0.812500 0.125000 0.875000 + 0.812500 0.125000 0.937500 + 0.875000 0.125000 0.812500 + 0.937500 0.125000 0.812500 + 0.937500 0.187500 0.875000 + 0.875000 0.187500 0.812500 + 0.875000 0.187500 0.875000 + 0.937500 0.187500 0.750000 + 0.812500 0.125000 1.000000 + 0.937500 0.187500 0.937500 + 0.875000 0.187500 0.937500 + 0.875000 0.187500 1.000000 + 0.750000 0.062500 0.875000 + 0.812500 0.062500 0.812500 + 0.812500 0.000000 0.812500 + 0.750000 0.062500 0.812500 + 0.812500 0.062500 0.750000 + 0.750000 0.125000 0.937500 + 0.812500 0.125000 0.812500 + 0.812500 0.187500 0.812500 + 0.812500 0.187500 0.875000 + 0.750000 0.125000 0.812500 + 0.750000 0.187500 0.875000 + 0.812500 0.187500 0.750000 + 0.812500 0.187500 0.937500 + 0.812500 0.187500 1.000000 + 0.750000 0.187500 0.937500 + 0.937500 0.125000 0.750000 + 0.875000 0.062500 0.750000 + 0.937500 0.125000 0.687500 + 0.875000 0.187500 0.750000 + 0.937500 0.187500 0.687500 + 0.812500 0.125000 0.750000 + 0.875000 0.125000 0.687500 + 0.875000 0.187500 0.687500 + 1.000000 0.125000 0.687500 + 1.000000 0.187500 0.687500 + 0.937500 0.062500 0.687500 + 0.875000 0.062500 0.687500 + 1.000000 0.187500 0.625000 + 0.937500 0.125000 0.625000 + 0.937500 0.250000 0.875000 + 1.000000 0.312500 0.812500 + 0.937500 0.250000 0.937500 + 1.000000 0.312500 0.875000 + 0.875000 0.250000 0.812500 + 0.937500 0.250000 0.687500 + 0.937500 0.312500 0.750000 + 0.812500 0.250000 0.812500 + 0.875000 0.250000 0.687500 + 0.875000 0.312500 0.750000 + 0.937500 0.312500 0.812500 + 0.875000 0.250000 0.937500 + 0.937500 0.312500 0.875000 + 0.812500 0.250000 0.875000 + 0.875000 0.312500 0.812500 + 0.875000 0.312500 0.875000 + 0.937500 0.250000 0.625000 + 1.000000 0.375000 0.812500 + 0.937500 0.375000 0.750000 + 0.937500 0.375000 0.812500 + 0.937500 0.312500 0.937500 + 0.875000 0.312500 0.937500 + 0.937500 0.375000 0.875000 + 0.062500 0.875000 0.937500 + 0.000000 0.812500 0.875000 + 0.062500 0.812500 0.937500 + 0.062500 0.937500 0.875000 + 0.000000 0.875000 0.812500 + 0.062500 0.875000 0.875000 + 0.125000 0.812500 1.000000 + 0.125000 0.937500 0.937500 + 0.125000 0.875000 0.937500 + 0.187500 0.875000 1.000000 + 0.062500 0.750000 0.937500 + 0.000000 0.812500 0.812500 + 0.062500 0.812500 0.875000 + 0.062500 0.750000 0.875000 + 0.125000 0.812500 0.937500 + 0.187500 0.812500 1.000000 + 0.125000 0.750000 0.937500 + 0.125000 0.937500 0.875000 + 0.125000 1.000000 0.812500 + 0.187500 0.937500 0.937500 + 0.187500 1.000000 0.875000 + 0.062500 0.875000 0.812500 + 0.062500 0.937500 0.750000 + 0.062500 0.812500 0.812500 + 0.062500 0.875000 0.750000 + 0.125000 0.937500 0.812500 + 0.187500 0.875000 0.937500 + 0.187500 0.937500 0.875000 + 0.125000 0.812500 0.875000 + 0.125000 0.875000 0.812500 + 0.187500 0.875000 0.875000 + 0.187500 1.000000 0.812500 + 0.125000 0.937500 0.750000 + 0.187500 0.937500 0.812500 + 0.250000 0.937500 0.937500 + 0.250000 0.875000 0.937500 + 0.250000 0.937500 0.875000 + 0.812500 0.750000 0.062500 + 0.750000 0.812500 0.062500 + 0.687500 0.687500 0.125000 + 0.687500 0.750000 0.062500 + 0.750000 0.687500 0.125000 + 0.812500 0.750000 0.125000 + 0.750000 0.812500 0.125000 + 0.687500 0.687500 0.187500 + 0.687500 0.750000 0.125000 + 0.750000 0.687500 0.187500 + 0.812500 0.687500 0.000000 + 0.812500 0.687500 0.062500 + 0.875000 0.750000 0.062500 + 0.875000 0.687500 0.000000 + 0.875000 0.687500 0.062500 + 0.687500 0.812500 0.000000 + 0.750000 0.875000 0.062500 + 0.687500 0.812500 0.062500 + 0.687500 0.875000 0.000000 + 0.687500 0.625000 0.062500 + 0.625000 0.687500 0.062500 + 0.687500 0.625000 0.125000 + 0.625000 0.625000 0.187500 + 0.625000 0.687500 0.125000 + 0.625000 0.562500 0.125000 + 0.562500 0.625000 0.125000 + 0.625000 0.562500 0.187500 + 0.750000 0.625000 0.062500 + 0.812500 0.625000 0.000000 + 0.687500 0.562500 0.062500 + 0.750000 0.562500 0.062500 + 0.625000 0.750000 0.062500 + 0.625000 0.812500 0.000000 + 0.562500 0.687500 0.062500 + 0.812500 0.687500 0.125000 + 0.687500 0.625000 0.187500 + 0.750000 0.625000 0.187500 + 0.812500 0.625000 0.062500 + 0.812500 0.625000 0.125000 + 0.687500 0.562500 0.125000 + 0.687500 0.562500 0.187500 + 0.750000 0.562500 0.125000 + 0.875000 0.750000 0.187500 + 0.812500 0.687500 0.187500 + 0.812500 0.687500 0.250000 + 0.937500 0.750000 0.125000 + 0.875000 0.687500 0.125000 + 0.875000 0.687500 0.187500 + 0.812500 0.875000 0.187500 + 0.687500 0.812500 0.125000 + 0.687500 0.812500 0.187500 + 0.750000 0.875000 0.187500 + 0.812500 0.937500 0.125000 + 0.687500 0.875000 0.062500 + 0.687500 0.875000 0.125000 + 0.750000 0.937500 0.125000 + 0.875000 0.812500 0.250000 + 0.812500 0.687500 0.312500 + 0.812500 0.750000 0.312500 + 0.937500 0.750000 0.187500 + 0.875000 0.687500 0.250000 + 0.937500 0.812500 0.250000 + 0.875000 0.687500 0.312500 + 0.875000 0.750000 0.312500 + 0.812500 0.812500 0.312500 + 0.812500 0.875000 0.250000 + 0.875000 0.937500 0.187500 + 0.937500 0.875000 0.250000 + 0.875000 0.812500 0.312500 + 0.875000 0.875000 0.312500 + 0.875000 0.937500 0.250000 + 0.625000 0.687500 0.187500 + 0.687500 0.625000 0.250000 + 0.625000 0.687500 0.250000 + 0.562500 0.625000 0.187500 + 0.625000 0.562500 0.250000 + 0.562500 0.625000 0.250000 + 0.625000 0.750000 0.187500 + 0.625000 0.812500 0.062500 + 0.625000 0.812500 0.125000 + 0.562500 0.687500 0.125000 + 0.562500 0.687500 0.187500 + 0.562500 0.750000 0.125000 + 0.750000 0.625000 0.312500 + 0.812500 0.625000 0.187500 + 0.812500 0.625000 0.250000 + 0.687500 0.562500 0.250000 + 0.750000 0.562500 0.312500 + 0.687500 0.750000 0.312500 + 0.687500 0.812500 0.250000 + 0.625000 0.812500 0.187500 + 0.562500 0.687500 0.250000 + 0.562500 0.750000 0.187500 + 0.625000 0.750000 0.312500 + 0.625000 0.812500 0.250000 + 0.750000 0.687500 0.375000 + 0.812500 0.625000 0.312500 + 0.812500 0.625000 0.375000 + 0.812500 0.687500 0.375000 + 0.750000 0.562500 0.375000 + 0.750000 0.625000 0.437500 + 0.750000 0.812500 0.312500 + 0.812500 0.750000 0.375000 + 0.812500 0.812500 0.375000 + 0.687500 0.750000 0.375000 + 0.750000 0.687500 0.437500 + 0.750000 0.812500 0.375000 + 0.812500 0.937500 0.187500 + 0.687500 0.875000 0.187500 + 0.750000 0.937500 0.187500 + 0.812500 0.875000 0.312500 + 0.812500 0.937500 0.250000 + 0.687500 0.812500 0.312500 + 0.687500 0.875000 0.250000 + 0.750000 0.875000 0.312500 + 0.937500 0.687500 0.187500 + 1.000000 0.687500 0.125000 + 0.937500 0.687500 0.250000 + 1.000000 0.687500 0.187500 + 0.875000 0.625000 0.062500 + 0.812500 0.562500 0.062500 + 0.875000 0.625000 0.187500 + 0.937500 0.625000 0.125000 + 0.812500 0.562500 0.125000 + 0.812500 0.562500 0.250000 + 0.875000 0.562500 0.187500 + 0.937500 0.625000 0.187500 + 0.875000 0.625000 0.312500 + 0.937500 0.625000 0.250000 + 0.812500 0.562500 0.312500 + 0.875000 0.562500 0.250000 + 0.875000 0.562500 0.312500 + 1.000000 0.625000 0.187500 + 0.937500 0.562500 0.187500 + 0.937500 0.562500 0.250000 + 0.812500 1.000000 0.125000 + 0.875000 1.000000 0.187500 + 0.625000 0.875000 0.062500 + 0.562500 0.812500 0.062500 + 0.687500 0.937500 0.125000 + 0.562500 0.812500 0.125000 + 0.625000 0.875000 0.187500 + 0.812500 1.000000 0.187500 + 0.687500 0.937500 0.187500 + 0.937500 0.812500 0.312500 + 1.000000 0.812500 0.312500 + 0.937500 0.875000 0.312500 + 1.000000 0.875000 0.312500 + 0.875000 0.687500 0.375000 + 0.937500 0.625000 0.312500 + 0.937500 0.687500 0.375000 + 0.812500 0.625000 0.437500 + 0.875000 0.562500 0.375000 + 0.875000 0.625000 0.437500 + 0.937500 0.750000 0.375000 + 0.875000 0.812500 0.375000 + 0.937500 0.812500 0.375000 + 0.812500 0.687500 0.437500 + 0.875000 0.687500 0.437500 + 0.875000 0.750000 0.437500 + 0.937500 0.562500 0.312500 + 1.000000 0.812500 0.375000 + 0.937500 0.687500 0.437500 + 0.937500 0.750000 0.437500 + 0.875000 0.937500 0.312500 + 0.937500 0.875000 0.375000 + 0.812500 0.875000 0.375000 + 0.875000 0.812500 0.437500 + 0.812500 0.937500 0.312500 + 0.937500 0.812500 0.437500 + 0.750000 0.875000 0.937500 + 0.812500 0.875000 0.875000 + 0.687500 0.812500 0.875000 + 0.750000 0.812500 0.875000 + 0.687500 0.875000 0.875000 + 0.750000 0.937500 0.875000 + 0.812500 0.937500 0.812500 + 0.687500 0.875000 0.812500 + 0.750000 0.875000 0.812500 + 0.687500 0.937500 0.812500 + 0.875000 0.812500 0.937500 + 0.812500 0.687500 1.000000 + 0.875000 0.750000 0.937500 + 0.937500 0.812500 0.937500 + 0.875000 0.687500 1.000000 + 0.937500 0.750000 0.937500 + 0.687500 0.812500 1.000000 + 0.687500 0.875000 0.937500 + 0.750000 0.937500 0.937500 + 0.687500 0.875000 1.000000 + 0.687500 0.937500 0.937500 + 0.812500 0.812500 0.875000 + 0.875000 0.812500 0.875000 + 0.875000 0.937500 0.812500 + 0.812500 0.875000 0.812500 + 0.937500 0.875000 0.875000 + 0.875000 0.875000 0.812500 + 0.937500 0.875000 0.812500 + 0.625000 0.750000 0.937500 + 0.687500 0.750000 0.875000 + 0.625000 0.812500 0.875000 + 0.625000 0.812500 0.812500 + 0.687500 0.812500 0.812500 + 0.562500 0.750000 0.875000 + 0.625000 0.750000 0.812500 + 0.562500 0.812500 0.812500 + 0.750000 0.687500 0.937500 + 0.812500 0.687500 0.937500 + 0.812500 0.625000 1.000000 + 0.750000 0.625000 0.937500 + 0.812500 0.625000 0.937500 + 0.625000 0.812500 0.937500 + 0.625000 0.812500 1.000000 + 0.562500 0.750000 0.937500 + 0.562500 0.812500 0.937500 + 0.812500 0.750000 0.875000 + 0.750000 0.812500 0.812500 + 0.812500 0.812500 0.812500 + 0.687500 0.750000 0.812500 + 0.750000 0.687500 0.875000 + 0.812500 0.750000 0.812500 + 0.687500 0.937500 0.875000 + 0.625000 0.875000 0.812500 + 0.625000 0.937500 0.812500 + 0.625000 0.875000 0.937500 + 0.625000 0.937500 0.875000 + 0.562500 0.812500 0.875000 + 0.562500 0.875000 0.812500 + 0.562500 0.875000 0.875000 + 0.937500 0.812500 0.875000 + 0.875000 0.687500 0.937500 + 0.937500 0.750000 0.875000 + 0.875000 0.812500 0.812500 + 0.937500 0.812500 0.812500 + 0.812500 0.687500 0.875000 + 0.875000 0.687500 0.875000 + 0.875000 0.750000 0.812500 + 0.687500 1.000000 0.812500 + 0.687500 1.000000 0.875000 + 0.812500 0.937500 0.750000 + 0.812500 1.000000 0.687500 + 0.875000 0.937500 0.750000 + 0.875000 1.000000 0.687500 + 0.687500 0.875000 0.750000 + 0.625000 0.937500 0.750000 + 0.687500 0.937500 0.687500 + 0.625000 0.812500 0.750000 + 0.562500 0.875000 0.750000 + 0.625000 0.875000 0.687500 + 0.750000 0.937500 0.687500 + 0.812500 0.875000 0.750000 + 0.812500 0.937500 0.687500 + 0.687500 0.812500 0.750000 + 0.687500 0.875000 0.687500 + 0.750000 0.875000 0.687500 + 0.625000 1.000000 0.812500 + 0.562500 0.937500 0.750000 + 0.812500 1.000000 0.625000 + 0.687500 0.937500 0.625000 + 0.750000 0.937500 0.625000 + 1.000000 0.812500 0.875000 + 1.000000 0.875000 0.812500 + 0.937500 0.687500 0.937500 + 0.875000 0.625000 0.937500 + 1.000000 0.812500 0.812500 + 0.937500 0.687500 0.875000 + 0.625000 0.937500 0.937500 + 0.562500 0.875000 0.937500 + 0.562500 0.937500 0.875000 + 0.875000 0.937500 0.687500 + 0.937500 0.875000 0.750000 + 0.812500 0.875000 0.687500 + 0.875000 0.812500 0.750000 + 0.812500 0.937500 0.625000 + 0.937500 0.812500 0.750000 + 0.250000 0.062500 0.312500 + 0.312500 0.125000 0.187500 + 0.312500 0.125000 0.250000 + 0.250000 0.125000 0.312500 + 0.312500 0.187500 0.187500 + 0.312500 0.187500 0.250000 + 0.312500 0.000000 0.312500 + 0.312500 0.062500 0.312500 + 0.250000 0.062500 0.375000 + 0.312500 0.000000 0.375000 + 0.312500 0.062500 0.375000 + 0.375000 0.062500 0.187500 + 0.375000 0.125000 0.187500 + 0.375000 0.187500 0.125000 + 0.437500 0.125000 0.125000 + 0.437500 0.187500 0.125000 + 0.375000 0.062500 0.250000 + 0.375000 0.000000 0.312500 + 0.437500 0.062500 0.187500 + 0.437500 0.062500 0.250000 + 0.312500 0.125000 0.312500 + 0.375000 0.187500 0.187500 + 0.375000 0.187500 0.250000 + 0.375000 0.062500 0.312500 + 0.375000 0.125000 0.312500 + 0.437500 0.125000 0.187500 + 0.437500 0.187500 0.187500 + 0.437500 0.125000 0.250000 + 0.125000 0.250000 0.312500 + 0.125000 0.312500 0.187500 + 0.125000 0.312500 0.250000 + 0.187500 0.250000 0.312500 + 0.187500 0.312500 0.187500 + 0.187500 0.312500 0.250000 + 0.062500 0.250000 0.375000 + 0.000000 0.312500 0.312500 + 0.062500 0.312500 0.312500 + 0.062500 0.250000 0.437500 + 0.000000 0.312500 0.375000 + 0.062500 0.312500 0.375000 + 0.125000 0.312500 0.312500 + 0.187500 0.250000 0.375000 + 0.187500 0.312500 0.312500 + 0.125000 0.250000 0.437500 + 0.125000 0.312500 0.375000 + 0.187500 0.312500 0.375000 + 0.125000 0.375000 0.187500 + 0.187500 0.375000 0.125000 + 0.187500 0.375000 0.187500 + 0.187500 0.437500 0.125000 + 0.062500 0.375000 0.250000 + 0.000000 0.375000 0.312500 + 0.062500 0.375000 0.312500 + 0.062500 0.437500 0.250000 + 0.187500 0.375000 0.250000 + 0.125000 0.375000 0.312500 + 0.187500 0.375000 0.312500 + 0.187500 0.437500 0.187500 + 0.125000 0.437500 0.250000 + 0.250000 0.187500 0.375000 + 0.312500 0.187500 0.312500 + 0.250000 0.125000 0.437500 + 0.312500 0.125000 0.375000 + 0.312500 0.187500 0.375000 + 0.250000 0.312500 0.312500 + 0.312500 0.250000 0.312500 + 0.312500 0.312500 0.312500 + 0.250000 0.187500 0.437500 + 0.250000 0.312500 0.375000 + 0.312500 0.250000 0.375000 + 0.312500 0.312500 0.375000 + 0.375000 0.250000 0.187500 + 0.437500 0.250000 0.125000 + 0.250000 0.375000 0.187500 + 0.312500 0.375000 0.187500 + 0.250000 0.437500 0.125000 + 0.312500 0.437500 0.125000 + 0.312500 0.375000 0.250000 + 0.250000 0.375000 0.312500 + 0.312500 0.375000 0.312500 + 0.250000 0.437500 0.187500 + 0.312500 0.437500 0.187500 + 0.312500 0.437500 0.250000 + 0.375000 0.312500 0.250000 + 0.375000 0.187500 0.312500 + 0.375000 0.250000 0.312500 + 0.437500 0.250000 0.187500 + 0.437500 0.312500 0.250000 + 0.375000 0.312500 0.312500 + 0.375000 0.375000 0.312500 + 0.375000 0.437500 0.187500 + 0.375000 0.437500 0.250000 + 0.437500 0.375000 0.250000 + 0.312500 0.125000 0.437500 + 0.312500 0.125000 0.500000 + 0.312500 0.187500 0.437500 + 0.312500 0.187500 0.500000 + 0.375000 0.062500 0.375000 + 0.437500 0.062500 0.312500 + 0.375000 0.125000 0.437500 + 0.375000 0.187500 0.375000 + 0.437500 0.125000 0.312500 + 0.437500 0.187500 0.375000 + 0.375000 0.187500 0.437500 + 0.375000 0.187500 0.500000 + 0.437500 0.187500 0.437500 + 0.125000 0.312500 0.437500 + 0.125000 0.312500 0.500000 + 0.187500 0.312500 0.437500 + 0.187500 0.312500 0.500000 + 0.062500 0.375000 0.375000 + 0.062500 0.375000 0.437500 + 0.062500 0.437500 0.312500 + 0.062500 0.437500 0.375000 + 0.125000 0.375000 0.437500 + 0.187500 0.375000 0.375000 + 0.187500 0.375000 0.437500 + 0.125000 0.437500 0.312500 + 0.125000 0.437500 0.375000 + 0.187500 0.437500 0.375000 + 0.187500 0.375000 0.500000 + 0.125000 0.437500 0.437500 + 0.187500 0.437500 0.437500 + 0.312500 0.375000 0.375000 + 0.250000 0.375000 0.437500 + 0.312500 0.437500 0.312500 + 0.250000 0.437500 0.375000 + 0.375000 0.312500 0.375000 + 0.375000 0.250000 0.437500 + 0.437500 0.312500 0.312500 + 0.437500 0.250000 0.375000 + 0.437500 0.312500 0.375000 + 0.375000 0.312500 0.437500 + 0.375000 0.437500 0.312500 + 0.437500 0.375000 0.312500 + 0.437500 0.375000 0.375000 + 0.437500 0.250000 0.437500 + 0.437500 0.312500 0.437500 + 0.250000 0.437500 0.437500 + 0.562500 0.187500 0.062500 + 0.500000 0.187500 0.125000 + 0.562500 0.125000 0.125000 + 0.500000 0.125000 0.187500 + 0.562500 0.187500 0.125000 + 0.562500 0.250000 0.062500 + 0.625000 0.312500 0.000000 + 0.625000 0.187500 0.062500 + 0.625000 0.250000 0.062500 + 0.687500 0.312500 0.000000 + 0.562500 0.312500 0.062500 + 0.500000 0.187500 0.187500 + 0.562500 0.250000 0.125000 + 0.562500 0.312500 0.125000 + 0.625000 0.312500 0.062500 + 0.687500 0.375000 0.000000 + 0.625000 0.375000 0.062500 + 0.562500 0.125000 0.187500 + 0.625000 0.125000 0.187500 + 0.625000 0.187500 0.125000 + 0.687500 0.187500 0.125000 + 0.562500 0.125000 0.250000 + 0.562500 0.187500 0.187500 + 0.562500 0.187500 0.250000 + 0.625000 0.187500 0.187500 + 0.687500 0.187500 0.187500 + 0.625000 0.187500 0.250000 + 0.687500 0.312500 0.062500 + 0.687500 0.250000 0.125000 + 0.625000 0.312500 0.125000 + 0.625000 0.250000 0.187500 + 0.687500 0.312500 0.125000 + 0.750000 0.312500 0.062500 + 0.687500 0.375000 0.062500 + 0.750000 0.375000 0.062500 + 0.687500 0.250000 0.187500 + 0.750000 0.312500 0.125000 + 0.250000 0.562500 0.062500 + 0.312500 0.500000 0.125000 + 0.312500 0.562500 0.062500 + 0.250000 0.562500 0.125000 + 0.312500 0.500000 0.187500 + 0.312500 0.562500 0.125000 + 0.312500 0.625000 0.000000 + 0.250000 0.625000 0.062500 + 0.312500 0.625000 0.062500 + 0.312500 0.687500 0.000000 + 0.375000 0.562500 0.062500 + 0.375000 0.500000 0.187500 + 0.375000 0.562500 0.125000 + 0.437500 0.562500 0.125000 + 0.375000 0.625000 0.062500 + 0.375000 0.687500 0.000000 + 0.437500 0.625000 0.062500 + 0.125000 0.562500 0.187500 + 0.125000 0.500000 0.312500 + 0.125000 0.562500 0.250000 + 0.187500 0.562500 0.187500 + 0.187500 0.500000 0.312500 + 0.187500 0.562500 0.250000 + 0.125000 0.625000 0.187500 + 0.187500 0.625000 0.125000 + 0.187500 0.625000 0.187500 + 0.187500 0.687500 0.125000 + 0.125000 0.562500 0.312500 + 0.187500 0.500000 0.375000 + 0.187500 0.562500 0.312500 + 0.187500 0.562500 0.375000 + 0.187500 0.625000 0.250000 + 0.187500 0.687500 0.187500 + 0.187500 0.625000 0.312500 + 0.312500 0.625000 0.125000 + 0.250000 0.625000 0.187500 + 0.312500 0.625000 0.187500 + 0.312500 0.687500 0.062500 + 0.250000 0.687500 0.125000 + 0.312500 0.687500 0.125000 + 0.375000 0.562500 0.187500 + 0.375000 0.562500 0.250000 + 0.437500 0.562500 0.187500 + 0.437500 0.562500 0.250000 + 0.375000 0.625000 0.187500 + 0.375000 0.687500 0.062500 + 0.375000 0.687500 0.125000 + 0.437500 0.625000 0.125000 + 0.437500 0.625000 0.187500 + 0.437500 0.687500 0.125000 + 0.250000 0.562500 0.312500 + 0.312500 0.562500 0.312500 + 0.250000 0.562500 0.375000 + 0.312500 0.562500 0.375000 + 0.312500 0.625000 0.250000 + 0.250000 0.687500 0.187500 + 0.312500 0.687500 0.187500 + 0.250000 0.625000 0.312500 + 0.312500 0.625000 0.312500 + 0.312500 0.687500 0.250000 + 0.375000 0.687500 0.187500 + 0.437500 0.625000 0.250000 + 0.437500 0.687500 0.187500 + 0.375000 0.625000 0.312500 + 0.375000 0.687500 0.250000 + 0.375000 0.750000 0.062500 + 0.437500 0.750000 0.062500 + 0.312500 0.750000 0.125000 + 0.312500 0.750000 0.187500 + 0.437500 0.750000 0.125000 + 0.375000 0.750000 0.187500 + 0.562500 0.375000 0.187500 + 0.500000 0.312500 0.312500 + 0.562500 0.375000 0.250000 + 0.562500 0.437500 0.187500 + 0.500000 0.375000 0.312500 + 0.562500 0.437500 0.250000 + 0.625000 0.312500 0.187500 + 0.625000 0.375000 0.187500 + 0.625000 0.437500 0.125000 + 0.687500 0.375000 0.125000 + 0.687500 0.437500 0.125000 + 0.562500 0.250000 0.312500 + 0.562500 0.312500 0.312500 + 0.500000 0.312500 0.375000 + 0.562500 0.250000 0.375000 + 0.562500 0.312500 0.375000 + 0.625000 0.312500 0.250000 + 0.687500 0.312500 0.187500 + 0.625000 0.250000 0.312500 + 0.687500 0.312500 0.250000 + 0.625000 0.437500 0.187500 + 0.562500 0.375000 0.312500 + 0.625000 0.437500 0.250000 + 0.687500 0.375000 0.187500 + 0.687500 0.437500 0.187500 + 0.625000 0.312500 0.312500 + 0.625000 0.375000 0.312500 + 0.687500 0.375000 0.250000 + 0.625000 0.500000 0.187500 + 0.687500 0.500000 0.125000 + 0.500000 0.625000 0.187500 + 0.500000 0.687500 0.125000 + 0.562500 0.437500 0.312500 + 0.562500 0.375000 0.375000 + 0.687500 0.500000 0.187500 + 0.625000 0.437500 0.312500 + 0.500000 0.687500 0.187500 + 0.750000 0.437500 0.125000 + 0.750000 0.375000 0.187500 + 0.750000 0.437500 0.187500 + 0.562500 0.125000 0.562500 + 0.500000 0.125000 0.687500 + 0.562500 0.125000 0.625000 + 0.562500 0.187500 0.500000 + 0.500000 0.187500 0.625000 + 0.562500 0.187500 0.562500 + 0.625000 0.062500 0.562500 + 0.625000 0.000000 0.687500 + 0.625000 0.062500 0.625000 + 0.687500 0.062500 0.500000 + 0.687500 0.000000 0.625000 + 0.687500 0.062500 0.562500 + 0.625000 0.125000 0.562500 + 0.625000 0.187500 0.437500 + 0.625000 0.187500 0.500000 + 0.687500 0.125000 0.437500 + 0.687500 0.125000 0.500000 + 0.687500 0.187500 0.437500 + 0.562500 0.125000 0.687500 + 0.500000 0.187500 0.687500 + 0.562500 0.187500 0.625000 + 0.562500 0.187500 0.687500 + 0.625000 0.062500 0.687500 + 0.687500 0.000000 0.687500 + 0.687500 0.062500 0.625000 + 0.687500 0.062500 0.687500 + 0.625000 0.187500 0.562500 + 0.687500 0.125000 0.562500 + 0.687500 0.187500 0.500000 + 0.625000 0.187500 0.625000 + 0.687500 0.125000 0.625000 + 0.625000 0.250000 0.437500 + 0.625000 0.312500 0.375000 + 0.687500 0.250000 0.375000 + 0.687500 0.312500 0.312500 + 0.562500 0.250000 0.562500 + 0.562500 0.312500 0.500000 + 0.562500 0.250000 0.625000 + 0.562500 0.312500 0.562500 + 0.625000 0.312500 0.437500 + 0.687500 0.250000 0.437500 + 0.687500 0.312500 0.375000 + 0.625000 0.250000 0.562500 + 0.625000 0.312500 0.500000 + 0.687500 0.312500 0.437500 + 0.687500 0.375000 0.312500 + 0.625000 0.375000 0.437500 + 0.687500 0.375000 0.375000 + 0.750000 0.125000 0.437500 + 0.812500 0.125000 0.375000 + 0.750000 0.187500 0.375000 + 0.812500 0.187500 0.312500 + 0.750000 0.062500 0.562500 + 0.812500 0.062500 0.500000 + 0.750000 0.062500 0.625000 + 0.812500 0.062500 0.562500 + 0.812500 0.125000 0.437500 + 0.750000 0.187500 0.437500 + 0.812500 0.187500 0.375000 + 0.750000 0.125000 0.562500 + 0.812500 0.125000 0.500000 + 0.812500 0.187500 0.437500 + 0.875000 0.187500 0.312500 + 0.875000 0.125000 0.437500 + 0.875000 0.187500 0.375000 + 0.750000 0.312500 0.312500 + 0.812500 0.250000 0.312500 + 0.750000 0.312500 0.375000 + 0.812500 0.250000 0.375000 + 0.750000 0.375000 0.312500 + 0.875000 0.250000 0.312500 + 0.062500 0.562500 0.687500 + 0.125000 0.500000 0.812500 + 0.125000 0.562500 0.750000 + 0.125000 0.562500 0.687500 + 0.187500 0.500000 0.812500 + 0.187500 0.562500 0.750000 + 0.000000 0.625000 0.687500 + 0.062500 0.625000 0.687500 + 0.062500 0.625000 0.625000 + 0.000000 0.687500 0.625000 + 0.062500 0.687500 0.625000 + 0.062500 0.562500 0.812500 + 0.125000 0.562500 0.812500 + 0.187500 0.500000 0.875000 + 0.125000 0.562500 0.875000 + 0.187500 0.562500 0.875000 + 0.062500 0.625000 0.750000 + 0.000000 0.687500 0.687500 + 0.062500 0.625000 0.812500 + 0.062500 0.687500 0.750000 + 0.125000 0.625000 0.687500 + 0.187500 0.562500 0.812500 + 0.187500 0.625000 0.750000 + 0.062500 0.687500 0.687500 + 0.125000 0.687500 0.687500 + 0.125000 0.625000 0.812500 + 0.187500 0.625000 0.812500 + 0.125000 0.687500 0.750000 + 0.250000 0.562500 0.562500 + 0.312500 0.500000 0.625000 + 0.312500 0.562500 0.562500 + 0.250000 0.562500 0.625000 + 0.312500 0.500000 0.687500 + 0.312500 0.562500 0.625000 + 0.250000 0.625000 0.437500 + 0.312500 0.625000 0.375000 + 0.312500 0.625000 0.437500 + 0.250000 0.687500 0.375000 + 0.312500 0.687500 0.312500 + 0.312500 0.687500 0.375000 + 0.312500 0.625000 0.500000 + 0.250000 0.625000 0.562500 + 0.312500 0.625000 0.562500 + 0.250000 0.687500 0.437500 + 0.312500 0.687500 0.437500 + 0.312500 0.687500 0.500000 + 0.375000 0.562500 0.562500 + 0.375000 0.500000 0.687500 + 0.375000 0.562500 0.625000 + 0.437500 0.562500 0.625000 + 0.375000 0.625000 0.437500 + 0.375000 0.687500 0.312500 + 0.375000 0.687500 0.375000 + 0.437500 0.687500 0.375000 + 0.375000 0.625000 0.562500 + 0.375000 0.687500 0.437500 + 0.375000 0.687500 0.500000 + 0.437500 0.625000 0.562500 + 0.437500 0.687500 0.437500 + 0.187500 0.625000 0.625000 + 0.187500 0.625000 0.687500 + 0.125000 0.687500 0.562500 + 0.125000 0.687500 0.625000 + 0.187500 0.687500 0.625000 + 0.312500 0.625000 0.625000 + 0.250000 0.625000 0.687500 + 0.312500 0.625000 0.687500 + 0.187500 0.687500 0.562500 + 0.312500 0.687500 0.562500 + 0.250000 0.687500 0.625000 + 0.312500 0.687500 0.625000 + 0.250000 0.562500 0.812500 + 0.250000 0.562500 0.875000 + 0.375000 0.562500 0.687500 + 0.375000 0.562500 0.750000 + 0.437500 0.562500 0.687500 + 0.437500 0.562500 0.750000 + 0.375000 0.625000 0.687500 + 0.375000 0.687500 0.562500 + 0.375000 0.687500 0.625000 + 0.437500 0.625000 0.625000 + 0.437500 0.625000 0.687500 + 0.437500 0.687500 0.625000 + 0.312500 0.625000 0.750000 + 0.187500 0.687500 0.687500 + 0.250000 0.687500 0.687500 + 0.250000 0.625000 0.812500 + 0.312500 0.687500 0.750000 + 0.312500 0.687500 0.687500 + 0.375000 0.687500 0.687500 + 0.437500 0.625000 0.750000 + 0.437500 0.687500 0.687500 + 0.375000 0.687500 0.750000 + 0.125000 0.750000 0.562500 + 0.125000 0.812500 0.500000 + 0.187500 0.750000 0.562500 + 0.187500 0.812500 0.500000 + 0.062500 0.750000 0.625000 + 0.062500 0.750000 0.687500 + 0.125000 0.812500 0.562500 + 0.187500 0.750000 0.625000 + 0.125000 0.750000 0.687500 + 0.187500 0.812500 0.625000 + 0.187500 0.812500 0.562500 + 0.187500 0.875000 0.500000 + 0.187500 0.875000 0.562500 + 0.312500 0.750000 0.375000 + 0.312500 0.812500 0.312500 + 0.312500 0.750000 0.437500 + 0.312500 0.812500 0.375000 + 0.375000 0.750000 0.312500 + 0.375000 0.812500 0.250000 + 0.437500 0.750000 0.312500 + 0.437500 0.812500 0.250000 + 0.375000 0.812500 0.312500 + 0.375000 0.750000 0.437500 + 0.375000 0.812500 0.375000 + 0.437500 0.750000 0.375000 + 0.437500 0.812500 0.312500 + 0.437500 0.812500 0.375000 + 0.375000 0.875000 0.312500 + 0.437500 0.875000 0.250000 + 0.437500 0.875000 0.312500 + 0.375000 0.750000 0.562500 + 0.375000 0.812500 0.437500 + 0.437500 0.750000 0.562500 + 0.437500 0.812500 0.437500 + 0.312500 0.750000 0.625000 + 0.250000 0.812500 0.562500 + 0.312500 0.750000 0.687500 + 0.250000 0.812500 0.625000 + 0.312500 0.812500 0.625000 + 0.312500 0.812500 0.562500 + 0.437500 0.750000 0.625000 + 0.375000 0.750000 0.687500 + 0.375000 0.812500 0.625000 + 0.250000 0.875000 0.562500 + 0.312500 0.875000 0.562500 + 0.437500 0.875000 0.375000 + 0.562500 0.250000 0.812500 + 0.500000 0.312500 0.812500 + 0.562500 0.312500 0.812500 + 0.562500 0.250000 0.875000 + 0.500000 0.312500 0.875000 + 0.562500 0.312500 0.875000 + 0.625000 0.250000 0.687500 + 0.625000 0.312500 0.562500 + 0.625000 0.312500 0.625000 + 0.687500 0.250000 0.625000 + 0.687500 0.312500 0.500000 + 0.687500 0.312500 0.562500 + 0.625000 0.312500 0.687500 + 0.625000 0.312500 0.750000 + 0.625000 0.250000 0.812500 + 0.687500 0.250000 0.687500 + 0.687500 0.312500 0.625000 + 0.687500 0.312500 0.687500 + 0.687500 0.312500 0.750000 + 0.562500 0.375000 0.687500 + 0.562500 0.375000 0.750000 + 0.500000 0.375000 0.812500 + 0.562500 0.437500 0.687500 + 0.562500 0.437500 0.750000 + 0.625000 0.375000 0.562500 + 0.687500 0.375000 0.437500 + 0.687500 0.375000 0.500000 + 0.687500 0.437500 0.437500 + 0.625000 0.375000 0.687500 + 0.687500 0.375000 0.562500 + 0.687500 0.375000 0.625000 + 0.625000 0.437500 0.625000 + 0.687500 0.437500 0.500000 + 0.687500 0.437500 0.625000 + 0.625000 0.312500 0.812500 + 0.562500 0.375000 0.812500 + 0.625000 0.375000 0.812500 + 0.687500 0.375000 0.687500 + 0.687500 0.375000 0.750000 + 0.625000 0.437500 0.687500 + 0.625000 0.437500 0.750000 + 0.687500 0.437500 0.687500 + 0.625000 0.250000 0.937500 + 0.625000 0.312500 0.875000 + 0.687500 0.250000 0.875000 + 0.687500 0.312500 0.812500 + 0.687500 0.312500 0.875000 + 0.625000 0.312500 0.937500 + 0.625000 0.312500 1.000000 + 0.687500 0.250000 0.937500 + 0.687500 0.312500 0.937500 + 0.687500 0.312500 1.000000 + 0.562500 0.375000 0.875000 + 0.562500 0.437500 0.812500 + 0.625000 0.375000 0.937500 + 0.687500 0.375000 0.812500 + 0.687500 0.375000 0.875000 + 0.625000 0.437500 0.812500 + 0.687500 0.437500 0.875000 + 0.687500 0.375000 0.937500 + 0.687500 0.375000 1.000000 + 0.687500 0.437500 0.937500 + 0.750000 0.125000 0.687500 + 0.812500 0.125000 0.562500 + 0.812500 0.125000 0.625000 + 0.750000 0.187500 0.625000 + 0.812500 0.187500 0.500000 + 0.812500 0.187500 0.562500 + 0.812500 0.125000 0.687500 + 0.750000 0.187500 0.687500 + 0.812500 0.187500 0.625000 + 0.812500 0.187500 0.687500 + 0.875000 0.125000 0.562500 + 0.875000 0.187500 0.437500 + 0.875000 0.187500 0.500000 + 0.937500 0.187500 0.437500 + 0.875000 0.187500 0.562500 + 0.875000 0.187500 0.625000 + 0.937500 0.187500 0.500000 + 0.750000 0.312500 0.562500 + 0.812500 0.250000 0.562500 + 0.812500 0.312500 0.500000 + 0.750000 0.312500 0.625000 + 0.812500 0.250000 0.625000 + 0.812500 0.312500 0.562500 + 0.750000 0.375000 0.437500 + 0.812500 0.375000 0.375000 + 0.750000 0.437500 0.375000 + 0.812500 0.437500 0.312500 + 0.812500 0.375000 0.437500 + 0.750000 0.375000 0.562500 + 0.812500 0.375000 0.500000 + 0.750000 0.437500 0.437500 + 0.812500 0.437500 0.375000 + 0.812500 0.437500 0.437500 + 0.875000 0.250000 0.437500 + 0.875000 0.312500 0.375000 + 0.937500 0.250000 0.375000 + 0.937500 0.312500 0.312500 + 0.875000 0.312500 0.437500 + 0.875000 0.250000 0.562500 + 0.875000 0.312500 0.500000 + 0.937500 0.250000 0.437500 + 0.937500 0.312500 0.375000 + 0.937500 0.312500 0.437500 + 0.875000 0.375000 0.437500 + 0.875000 0.437500 0.312500 + 0.875000 0.437500 0.375000 + 0.937500 0.375000 0.312500 + 0.937500 0.375000 0.375000 + 0.750000 0.312500 0.812500 + 0.812500 0.312500 0.812500 + 0.750000 0.312500 0.875000 + 0.812500 0.312500 0.875000 + 0.750000 0.375000 0.687500 + 0.812500 0.375000 0.562500 + 0.750000 0.437500 0.625000 + 0.812500 0.437500 0.500000 + 0.812500 0.375000 0.750000 + 0.750000 0.375000 0.812500 + 0.750000 0.437500 0.687500 + 0.812500 0.437500 0.750000 + 0.875000 0.312500 0.562500 + 0.937500 0.312500 0.500000 + 0.875000 0.437500 0.437500 + 0.937500 0.375000 0.437500 + 0.812500 0.375000 0.812500 + 0.875000 0.375000 0.812500 + 0.875000 0.437500 0.750000 + 0.750000 0.375000 0.937500 + 0.812500 0.375000 0.875000 + 0.750000 0.437500 0.875000 + 0.812500 0.437500 0.812500 + 0.812500 0.437500 0.875000 + 0.812500 0.375000 0.937500 + 0.750000 0.437500 0.937500 + 0.812500 0.437500 0.937500 + 0.875000 0.437500 0.812500 + 0.875000 0.437500 0.875000 + 0.187500 0.625000 0.937500 + 0.187500 0.625000 0.875000 + 0.125000 0.687500 0.875000 + 0.125000 0.687500 0.812500 + 0.187500 0.687500 0.875000 + 0.250000 0.625000 0.937500 + 0.312500 0.625000 1.000000 + 0.187500 0.687500 0.937500 + 0.250000 0.687500 0.937500 + 0.312500 0.687500 1.000000 + 0.312500 0.625000 0.937500 + 0.187500 0.687500 0.812500 + 0.250000 0.687500 0.875000 + 0.312500 0.687500 0.875000 + 0.312500 0.687500 0.937500 + 0.375000 0.687500 1.000000 + 0.375000 0.687500 0.937500 + 0.125000 0.750000 0.812500 + 0.125000 0.812500 0.812500 + 0.187500 0.750000 0.875000 + 0.187500 0.812500 0.875000 + 0.125000 0.812500 0.750000 + 0.187500 0.750000 0.812500 + 0.187500 0.812500 0.750000 + 0.187500 0.812500 0.812500 + 0.187500 0.875000 0.812500 + 0.187500 0.875000 0.750000 + 0.312500 0.750000 0.937500 + 0.250000 0.812500 0.875000 + 0.312500 0.750000 0.875000 + 0.250000 0.812500 0.812500 + 0.312500 0.812500 0.875000 + 0.312500 0.812500 0.937500 + 0.375000 0.750000 0.937500 + 0.375000 0.812500 0.937500 + 0.250000 0.875000 0.812500 + 0.312500 0.875000 0.875000 + 0.562500 0.625000 0.625000 + 0.500000 0.625000 0.687500 + 0.562500 0.625000 0.687500 + 0.562500 0.687500 0.562500 + 0.500000 0.687500 0.625000 + 0.562500 0.687500 0.625000 + 0.625000 0.562500 0.625000 + 0.625000 0.500000 0.687500 + 0.687500 0.562500 0.562500 + 0.687500 0.500000 0.625000 + 0.687500 0.562500 0.625000 + 0.625000 0.562500 0.687500 + 0.625000 0.625000 0.687500 + 0.625000 0.687500 0.562500 + 0.625000 0.687500 0.625000 + 0.687500 0.625000 0.562500 + 0.687500 0.625000 0.625000 + 0.687500 0.687500 0.625000 + 0.562500 0.625000 0.750000 + 0.500000 0.687500 0.687500 + 0.562500 0.687500 0.687500 + 0.562500 0.687500 0.750000 + 0.625000 0.562500 0.750000 + 0.687500 0.500000 0.687500 + 0.687500 0.562500 0.687500 + 0.687500 0.562500 0.750000 + 0.625000 0.687500 0.687500 + 0.687500 0.625000 0.687500 + 0.687500 0.687500 0.687500 + 0.625000 0.687500 0.750000 + 0.687500 0.625000 0.750000 + 0.812500 0.500000 0.312500 + 0.812500 0.500000 0.375000 + 0.875000 0.500000 0.312500 + 0.562500 0.750000 0.375000 + 0.500000 0.812500 0.312500 + 0.562500 0.812500 0.312500 + 0.562500 0.750000 0.437500 + 0.500000 0.812500 0.375000 + 0.562500 0.812500 0.375000 + 0.625000 0.812500 0.312500 + 0.625000 0.750000 0.437500 + 0.625000 0.812500 0.375000 + 0.687500 0.812500 0.375000 + 0.562500 0.875000 0.250000 + 0.500000 0.875000 0.312500 + 0.562500 0.875000 0.312500 + 0.562500 0.937500 0.250000 + 0.625000 0.875000 0.312500 + 0.687500 0.875000 0.312500 + 0.625000 0.937500 0.250000 + 0.625000 0.750000 0.562500 + 0.625000 0.812500 0.437500 + 0.625000 0.812500 0.500000 + 0.687500 0.750000 0.562500 + 0.687500 0.812500 0.437500 + 0.687500 0.812500 0.500000 + 0.562500 0.750000 0.625000 + 0.562500 0.812500 0.562500 + 0.562500 0.750000 0.687500 + 0.562500 0.812500 0.625000 + 0.625000 0.812500 0.562500 + 0.687500 0.750000 0.625000 + 0.687500 0.812500 0.562500 + 0.625000 0.750000 0.687500 + 0.625000 0.812500 0.625000 + 0.687500 0.812500 0.625000 + 0.562500 0.875000 0.375000 + 0.562500 0.875000 0.437500 + 0.562500 0.937500 0.312500 + 0.562500 0.937500 0.375000 + 0.625000 0.875000 0.437500 + 0.687500 0.875000 0.375000 + 0.687500 0.875000 0.437500 + 0.625000 0.937500 0.312500 + 0.625000 0.937500 0.375000 + 0.687500 0.937500 0.375000 + 0.687500 0.875000 0.500000 + 0.625000 0.875000 0.562500 + 0.687500 0.875000 0.562500 + 0.625000 0.937500 0.437500 + 0.687500 0.937500 0.437500 + 0.750000 0.562500 0.562500 + 0.812500 0.625000 0.500000 + 0.750000 0.625000 0.562500 + 0.812500 0.687500 0.500000 + 0.812500 0.562500 0.562500 + 0.750000 0.562500 0.625000 + 0.812500 0.562500 0.625000 + 0.812500 0.625000 0.562500 + 0.875000 0.687500 0.500000 + 0.875000 0.625000 0.562500 + 0.750000 0.687500 0.625000 + 0.812500 0.687500 0.562500 + 0.750000 0.625000 0.687500 + 0.812500 0.625000 0.625000 + 0.812500 0.687500 0.625000 + 0.750000 0.812500 0.562500 + 0.812500 0.750000 0.562500 + 0.750000 0.687500 0.687500 + 0.750000 0.812500 0.625000 + 0.812500 0.750000 0.625000 + 0.750000 0.875000 0.437500 + 0.750000 0.937500 0.375000 + 0.750000 0.875000 0.562500 + 0.750000 0.937500 0.437500 + 0.875000 0.687500 0.562500 + 0.875000 0.750000 0.562500 + 0.375000 0.750000 0.812500 + 0.312500 0.812500 0.687500 + 0.375000 0.812500 0.750000 + 0.437500 0.750000 0.812500 + 0.375000 0.812500 0.687500 + 0.437500 0.812500 0.750000 + 0.312500 0.812500 0.812500 + 0.375000 0.812500 0.812500 + 0.437500 0.750000 0.875000 + 0.375000 0.812500 0.875000 + 0.437500 0.812500 0.875000 + 0.250000 0.875000 0.687500 + 0.312500 0.875000 0.687500 + 0.312500 0.875000 0.625000 + 0.250000 0.937500 0.625000 + 0.312500 0.937500 0.625000 + 0.312500 0.875000 0.750000 + 0.312500 0.875000 0.812500 + 0.250000 0.937500 0.687500 + 0.312500 0.937500 0.750000 + 0.437500 0.812500 0.812500 + 0.375000 0.875000 0.687500 + 0.437500 0.875000 0.750000 + 0.375000 0.875000 0.812500 + 0.437500 0.875000 0.812500 + 0.312500 0.937500 0.687500 + 0.375000 0.937500 0.687500 + 0.375000 0.937500 0.750000 + 0.500000 0.812500 0.812500 + 0.500000 0.812500 0.875000 + 0.625000 0.812500 0.687500 + 0.687500 0.812500 0.687500 + 0.437500 0.875000 0.687500 + 0.375000 0.937500 0.625000 + 0.500000 0.875000 0.812500 + 0.437500 0.937500 0.687500 + 0.687500 0.875000 0.625000 + 0.750000 0.562500 0.812500 + 0.812500 0.500000 0.812500 + 0.812500 0.562500 0.812500 + 0.750000 0.562500 0.875000 + 0.812500 0.500000 0.875000 + 0.812500 0.562500 0.875000 + 0.812500 0.625000 0.687500 + 0.812500 0.625000 0.750000 + 0.750000 0.625000 0.812500 + 0.812500 0.687500 0.687500 + 0.812500 0.687500 0.750000 + 0.875000 0.562500 0.687500 + 0.875000 0.562500 0.750000 + 0.875000 0.500000 0.812500 + 0.937500 0.562500 0.687500 + 0.937500 0.562500 0.750000 + 0.875000 0.625000 0.687500 + 0.875000 0.687500 0.625000 + 0.937500 0.625000 0.625000 + 0.937500 0.687500 0.625000 + 0.812500 0.625000 0.812500 + 0.875000 0.562500 0.812500 + 0.875000 0.625000 0.812500 + 0.875000 0.687500 0.687500 + 0.875000 0.687500 0.750000 + 0.937500 0.625000 0.687500 + 0.937500 0.625000 0.750000 + 0.937500 0.687500 0.687500 + 0.812500 0.625000 0.875000 + 0.812500 0.687500 0.812500 + 0.875000 0.562500 0.875000 + 0.937500 0.562500 0.812500 + 0.875000 0.687500 0.812500 + 0.937500 0.625000 0.812500 + 0.437500 0.875000 0.875000 + 0.375000 0.937500 0.812500 + 0.437500 0.937500 0.812500 + 0.875000 0.750000 0.687500 + 0.937500 0.750000 0.625000 + 0.937500 0.750000 0.687500 + 1.000000 0.312500 0.312500 + 1.000000 0.312500 0.375000 + 1.000000 0.375000 0.312500 + 0.312500 1.000000 0.625000 + 0.312500 1.000000 0.687500 + 0.375000 1.000000 0.687500 + 0.625000 1.000000 0.312500 + 0.687500 1.000000 0.312500 + 0.687500 1.000000 0.375000 + 1.000000 0.625000 0.687500 + 1.000000 0.687500 0.625000 + 1.000000 0.687500 0.687500 +24576 + 1 2 737 740 739 + 1 2 736 739 740 + 1 2 735 737 739 + 1 2 736 740 738 + 1 1 730 732 733 + 1 1 730 733 731 + 1 15 818 825 824 + 1 18 855 847 857 + 1 17 844 845 833 + 1 15 821 820 824 + 1 15 821 824 825 + 1 18 851 854 857 + 1 18 855 857 854 + 1 14 808 815 816 + 1 17 842 833 845 + 1 18 853 857 847 + 1 14 812 813 816 + 1 14 812 816 815 + 1 17 840 843 845 + 1 17 842 845 843 + 1 13 799 805 806 + 1 15 822 818 824 + 1 17 841 844 833 + 1 13 803 804 806 + 1 13 803 806 805 + 1 15 820 823 824 + 1 15 822 824 823 + 1 14 808 816 814 + 1 18 853 847 856 + 1 16 830 831 827 + 1 14 813 811 814 + 1 14 813 814 816 + 1 18 850 852 856 + 1 18 853 856 852 + 1 9 769 774 775 + 1 11 786 783 788 + 1 12 795 797 790 + 1 9 771 772 775 + 1 9 771 775 774 + 1 11 785 787 788 + 1 11 786 788 787 + 1 9 769 775 773 + 1 12 795 790 796 + 1 10 780 781 777 + 1 9 772 770 773 + 1 9 772 773 775 + 1 12 792 794 796 + 1 12 795 796 794 + 1 35 984 991 990 + 1 38 1021 1013 1023 + 1 37 1010 1011 999 + 1 35 987 986 990 + 1 35 987 990 991 + 1 38 1017 1020 1023 + 1 38 1021 1023 1020 + 1 34 974 981 982 + 1 37 1008 999 1011 + 1 38 1019 1023 1013 + 1 34 977 978 982 + 1 34 977 982 981 + 1 37 1004 1009 1011 + 1 37 1008 1011 1009 + 1 33 965 971 972 + 1 35 988 984 990 + 1 37 1007 1010 999 + 1 33 967 968 972 + 1 33 967 972 971 + 1 35 986 989 990 + 1 35 988 990 989 + 1 34 974 982 980 + 1 38 1019 1013 1022 + 1 36 996 997 993 + 1 34 978 976 980 + 1 34 978 980 982 + 1 38 1016 1018 1022 + 1 38 1019 1022 1018 + 1 28 927 932 933 + 1 30 944 941 946 + 1 31 953 955 948 + 1 28 929 930 933 + 1 28 929 933 932 + 1 30 943 945 946 + 1 30 944 946 945 + 1 28 927 933 931 + 1 31 953 948 954 + 1 29 938 939 935 + 1 28 930 928 931 + 1 28 930 931 933 + 1 31 950 952 954 + 1 31 953 954 952 + 1 48 1095 1099 1098 + 1 98 1622 1619 1627 + 1 97 1607 1617 1605 + 1 48 1102 1101 1098 + 1 48 1102 1098 1099 + 1 98 1624 1621 1627 + 1 98 1622 1627 1621 + 1 111 1785 1787 1793 + 1 61 1204 1201 1206 + 1 113 1817 1808 1805 + 1 111 1786 1791 1793 + 1 111 1786 1793 1787 + 1 61 1210 1212 1206 + 1 61 1204 1206 1212 + 1 106 1715 1727 1718 + 1 107 1741 1729 1732 + 1 56 1158 1159 1153 + 1 106 1724 1716 1718 + 1 106 1724 1718 1727 + 1 107 1730 1731 1732 + 1 107 1741 1732 1731 + 1 94 1571 1577 1578 + 1 93 1566 1557 1568 + 1 97 1614 1613 1605 + 1 94 1574 1575 1578 + 1 94 1574 1578 1577 + 1 93 1565 1569 1568 + 1 93 1566 1568 1569 + 1 94 1571 1578 1579 + 1 98 1626 1627 1619 + 1 97 1614 1605 1617 + 1 94 1576 1578 1575 + 1 94 1576 1579 1578 + 1 98 1624 1627 1625 + 1 98 1626 1625 1627 + 1 102 1658 1667 1668 + 1 110 1777 1771 1782 + 1 113 1811 1816 1805 + 1 102 1670 1671 1668 + 1 102 1670 1668 1667 + 1 110 1780 1778 1782 + 1 110 1777 1782 1778 + 1 111 1785 1793 1792 + 1 110 1781 1782 1771 + 1 113 1817 1805 1816 + 1 111 1790 1793 1791 + 1 111 1790 1792 1793 + 1 110 1780 1782 1783 + 1 110 1781 1783 1782 + 1 44 1061 1065 1066 + 1 91 1532 1529 1541 + 1 92 1546 1555 1543 + 1 44 1069 1070 1066 + 1 44 1069 1066 1065 + 1 91 1538 1533 1541 + 1 91 1532 1541 1533 + 1 104 1687 1689 1699 + 1 56 1157 1153 1159 + 1 107 1739 1732 1729 + 1 104 1688 1697 1699 + 1 104 1688 1699 1689 + 1 56 1165 1166 1159 + 1 56 1157 1159 1166 + 1 109 1757 1769 1759 + 1 113 1815 1805 1808 + 1 61 1203 1206 1201 + 1 109 1766 1758 1759 + 1 109 1766 1759 1769 + 1 113 1806 1807 1808 + 1 113 1815 1808 1807 + 1 88 1491 1501 1503 + 1 89 1514 1505 1517 + 1 92 1551 1553 1543 + 1 88 1498 1500 1503 + 1 88 1498 1503 1501 + 1 89 1512 1515 1517 + 1 89 1514 1517 1515 + 1 88 1491 1503 1502 + 1 91 1539 1541 1529 + 1 92 1551 1543 1555 + 1 88 1499 1503 1500 + 1 88 1499 1502 1503 + 1 91 1538 1541 1540 + 1 91 1539 1540 1541 + 1 102 1659 1669 1671 + 1 105 1709 1701 1713 + 1 107 1738 1740 1729 + 1 102 1666 1668 1671 + 1 102 1666 1671 1669 + 1 105 1708 1710 1713 + 1 105 1709 1713 1710 + 1 104 1687 1699 1698 + 1 105 1711 1713 1701 + 1 107 1739 1729 1740 + 1 104 1696 1699 1697 + 1 104 1696 1698 1699 + 1 105 1708 1713 1712 + 1 105 1711 1712 1713 + 1 40 1030 1033 1034 + 1 85 1459 1457 1465 + 1 86 1469 1479 1467 + 1 40 1037 1038 1034 + 1 40 1037 1034 1033 + 1 85 1462 1460 1465 + 1 85 1459 1465 1460 + 1 95 1581 1583 1589 + 1 48 1097 1095 1098 + 1 97 1615 1607 1605 + 1 95 1582 1587 1589 + 1 95 1582 1589 1583 + 1 48 1101 1103 1098 + 1 48 1097 1098 1103 + 1 103 1673 1685 1676 + 1 106 1726 1715 1718 + 1 56 1156 1158 1153 + 1 103 1684 1675 1676 + 1 103 1684 1676 1685 + 1 106 1716 1717 1718 + 1 106 1726 1718 1717 + 1 83 1433 1439 1441 + 1 84 1453 1443 1455 + 1 86 1477 1478 1467 + 1 83 1436 1438 1441 + 1 83 1436 1441 1439 + 1 84 1452 1454 1455 + 1 84 1453 1455 1454 + 1 83 1433 1441 1440 + 1 85 1463 1465 1457 + 1 86 1477 1467 1479 + 1 83 1437 1441 1438 + 1 83 1437 1440 1441 + 1 85 1462 1465 1464 + 1 85 1463 1464 1465 + 1 93 1557 1567 1568 + 1 96 1599 1591 1603 + 1 97 1613 1616 1605 + 1 93 1564 1565 1568 + 1 93 1564 1568 1567 + 1 96 1598 1600 1603 + 1 96 1599 1603 1600 + 1 95 1581 1589 1588 + 1 96 1601 1603 1591 + 1 97 1615 1605 1616 + 1 95 1586 1589 1587 + 1 95 1586 1588 1589 + 1 96 1598 1603 1602 + 1 96 1601 1602 1603 + 1 44 1061 1066 1064 + 1 92 1546 1543 1554 + 1 90 1521 1527 1519 + 1 44 1070 1068 1064 + 1 44 1070 1064 1066 + 1 92 1549 1545 1554 + 1 92 1546 1554 1545 + 1 109 1757 1759 1768 + 1 61 1203 1201 1205 + 1 112 1803 1797 1795 + 1 109 1758 1765 1768 + 1 109 1758 1768 1759 + 1 61 1209 1211 1205 + 1 61 1203 1205 1211 + 1 100 1639 1647 1641 + 1 101 1657 1649 1652 + 1 52 1127 1128 1125 + 1 100 1645 1640 1641 + 1 100 1645 1641 1647 + 1 101 1650 1651 1652 + 1 101 1657 1652 1651 + 1 89 1505 1513 1516 + 1 87 1487 1481 1488 + 1 90 1526 1525 1519 + 1 89 1509 1511 1516 + 1 89 1509 1516 1513 + 1 87 1486 1489 1488 + 1 87 1487 1488 1489 + 1 89 1505 1516 1517 + 1 92 1553 1554 1543 + 1 90 1526 1519 1527 + 1 89 1512 1516 1511 + 1 89 1512 1517 1516 + 1 92 1549 1554 1552 + 1 92 1553 1552 1554 + 1 99 1628 1634 1635 + 1 108 1749 1743 1754 + 1 112 1799 1802 1795 + 1 99 1636 1637 1635 + 1 99 1636 1635 1634 + 1 108 1752 1750 1754 + 1 108 1749 1754 1750 + 1 109 1757 1768 1767 + 1 108 1753 1754 1743 + 1 112 1803 1795 1802 + 1 109 1764 1768 1765 + 1 109 1764 1767 1768 + 1 108 1752 1754 1755 + 1 108 1753 1755 1754 + 1 32 956 959 960 + 1 70 1289 1287 1295 + 1 71 1300 1309 1297 + 1 32 962 963 960 + 1 32 962 960 959 + 1 70 1292 1290 1295 + 1 70 1289 1295 1290 + 1 76 1351 1353 1359 + 1 43 1056 1054 1057 + 1 78 1382 1377 1375 + 1 76 1352 1357 1359 + 1 76 1352 1359 1353 + 1 43 1059 1060 1057 + 1 43 1056 1057 1060 + 1 80 1399 1411 1401 + 1 82 1431 1423 1426 + 1 55 1146 1148 1144 + 1 80 1408 1400 1401 + 1 80 1408 1401 1411 + 1 82 1424 1425 1426 + 1 82 1431 1426 1425 + 1 67 1253 1259 1261 + 1 68 1272 1263 1275 + 1 71 1305 1307 1297 + 1 67 1256 1258 1261 + 1 67 1256 1261 1259 + 1 68 1270 1273 1275 + 1 68 1272 1275 1273 + 1 67 1253 1261 1260 + 1 70 1293 1295 1287 + 1 71 1305 1297 1309 + 1 67 1257 1261 1258 + 1 67 1257 1260 1261 + 1 70 1292 1295 1294 + 1 70 1293 1294 1295 + 1 75 1341 1348 1349 + 1 77 1369 1361 1373 + 1 78 1381 1383 1375 + 1 75 1346 1347 1349 + 1 75 1346 1349 1348 + 1 77 1368 1370 1373 + 1 77 1369 1373 1370 + 1 76 1351 1359 1358 + 1 77 1371 1373 1361 + 1 78 1382 1375 1383 + 1 76 1356 1359 1357 + 1 76 1356 1358 1359 + 1 77 1368 1373 1372 + 1 77 1371 1372 1373 + 1 32 956 960 958 + 1 71 1300 1297 1308 + 1 69 1279 1285 1277 + 1 32 963 961 958 + 1 32 963 958 960 + 1 71 1303 1299 1308 + 1 71 1300 1308 1299 + 1 80 1399 1401 1410 + 1 55 1146 1144 1147 + 1 81 1421 1415 1413 + 1 80 1400 1407 1410 + 1 80 1400 1410 1401 + 1 55 1150 1152 1147 + 1 55 1146 1147 1152 + 1 73 1321 1329 1323 + 1 74 1339 1331 1334 + 1 39 1026 1027 1024 + 1 73 1327 1322 1323 + 1 73 1327 1323 1329 + 1 74 1332 1333 1334 + 1 74 1339 1334 1333 + 1 68 1263 1271 1274 + 1 66 1249 1243 1250 + 1 69 1284 1283 1277 + 1 68 1267 1269 1274 + 1 68 1267 1274 1271 + 1 66 1248 1251 1250 + 1 66 1249 1250 1251 + 1 68 1263 1274 1275 + 1 71 1307 1308 1297 + 1 69 1284 1277 1285 + 1 68 1270 1274 1269 + 1 68 1270 1275 1274 + 1 71 1303 1308 1306 + 1 71 1307 1306 1308 + 1 72 1310 1316 1317 + 1 79 1391 1385 1396 + 1 81 1417 1420 1413 + 1 72 1318 1319 1317 + 1 72 1318 1317 1316 + 1 79 1394 1392 1396 + 1 79 1391 1396 1392 + 1 80 1399 1410 1409 + 1 79 1395 1396 1385 + 1 81 1421 1413 1420 + 1 80 1406 1410 1407 + 1 80 1406 1409 1410 + 1 79 1394 1396 1397 + 1 79 1395 1397 1396 + 1 133 983 1979 1978 + 1 136 1994 1012 1996 + 1 135 1989 1990 998 + 1 133 1975 1974 1978 + 1 133 1975 1978 1979 + 1 136 1983 1993 1996 + 1 136 1994 1996 1993 + 1 132 973 1972 1973 + 1 135 1987 998 1990 + 1 136 1992 1996 1012 + 1 132 1968 1969 1973 + 1 132 1968 1973 1972 + 1 135 1983 1988 1990 + 1 135 1987 1990 1988 + 1 131 964 1965 1966 + 1 133 1976 983 1978 + 1 135 1986 1989 998 + 1 131 1961 1962 1966 + 1 131 1961 1966 1965 + 1 133 1974 1977 1978 + 1 133 1976 1978 1977 + 1 132 973 1973 1971 + 1 136 1992 1012 1995 + 1 134 1981 1982 992 + 1 132 1969 1967 1971 + 1 132 1969 1971 1973 + 1 136 1980 1991 1995 + 1 136 1992 1995 1991 + 1 126 926 1942 1943 + 1 128 1948 940 1950 + 1 129 1952 1954 947 + 1 126 1939 1940 1943 + 1 126 1939 1943 1942 + 1 128 1947 1949 1950 + 1 128 1948 1950 1949 + 1 126 926 1943 1941 + 1 129 1952 947 1953 + 1 127 1945 1946 934 + 1 126 1940 1938 1941 + 1 126 1940 1941 1943 + 1 129 1944 1951 1953 + 1 129 1952 1953 1951 + 1 214 1096 2465 2464 + 1 221 2513 1618 2516 + 1 220 2506 2511 1604 + 1 214 2462 2461 2464 + 1 214 2462 2464 2465 + 1 221 2505 2512 2516 + 1 221 2513 2516 2512 + 1 251 1784 2762 2765 + 1 243 2695 1202 2697 + 1 253 2776 2771 1804 + 1 251 2691 2761 2765 + 1 251 2691 2765 2762 + 1 243 2693 2699 2697 + 1 243 2695 2697 2699 + 1 240 1714 2672 2667 + 1 241 2679 1728 2674 + 1 229 2568 2569 1154 + 1 240 2665 2563 2667 + 1 240 2665 2667 2672 + 1 241 2564 2673 2674 + 1 241 2679 2674 2673 + 1 217 1570 2487 2488 + 1 216 2480 1556 2482 + 1 220 2508 2507 1604 + 1 217 2474 2484 2488 + 1 217 2474 2488 2487 + 1 216 2476 2483 2482 + 1 216 2480 2482 2483 + 1 217 1570 2488 2489 + 1 221 2515 2516 1618 + 1 220 2508 1604 2511 + 1 217 2485 2488 2484 + 1 217 2485 2489 2488 + 1 221 2505 2516 2514 + 1 221 2515 2514 2516 + 1 247 1659 2731 2732 + 1 250 2756 1770 2759 + 1 253 2773 2775 1804 + 1 247 2725 2726 2732 + 1 247 2725 2732 2731 + 1 250 2752 2757 2759 + 1 250 2756 2759 2757 + 1 251 1784 2765 2764 + 1 250 2758 2759 1770 + 1 253 2776 1804 2775 + 1 251 2751 2765 2761 + 1 251 2751 2764 2765 + 1 250 2752 2759 2760 + 1 250 2758 2760 2759 + 1 204 1062 2392 2393 + 1 211 2439 1528 2445 + 1 212 2447 2452 1542 + 1 204 2388 2389 2393 + 1 204 2388 2393 2392 + 1 211 2437 2440 2445 + 1 211 2439 2445 2440 + 1 238 1686 2650 2655 + 1 229 2567 1154 2569 + 1 241 2677 2674 1728 + 1 238 2562 2649 2655 + 1 238 2562 2655 2650 + 1 229 2564 2571 2569 + 1 229 2567 2569 2571 + 1 249 1756 2750 2745 + 1 253 2774 1804 2771 + 1 243 2694 2697 1202 + 1 249 2744 2690 2745 + 1 249 2744 2745 2750 + 1 253 2693 2770 2771 + 1 253 2774 2771 2770 + 1 208 1490 2420 2422 + 1 209 2428 1504 2431 + 1 212 2448 2450 1542 + 1 208 2414 2416 2422 + 1 208 2414 2422 2420 + 1 209 2424 2429 2431 + 1 209 2428 2431 2429 + 1 208 1490 2422 2421 + 1 211 2443 2445 1528 + 1 212 2448 1542 2452 + 1 208 2415 2422 2416 + 1 208 2415 2421 2422 + 1 211 2437 2445 2444 + 1 211 2443 2444 2445 + 1 236 1658 2637 2639 + 1 239 2660 1700 2664 + 1 241 2676 2678 1728 + 1 236 2631 2633 2639 + 1 236 2631 2639 2637 + 1 239 2656 2661 2664 + 1 239 2660 2664 2661 + 1 238 1686 2655 2654 + 1 239 2662 2664 1700 + 1 241 2677 1728 2678 + 1 238 2648 2655 2649 + 1 238 2648 2654 2655 + 1 239 2656 2664 2663 + 1 239 2662 2663 2664 + 1 195 1031 2325 2326 + 1 201 2367 1456 2371 + 1 202 2372 2377 1466 + 1 195 2322 2323 2326 + 1 195 2322 2326 2325 + 1 201 2366 2368 2371 + 1 201 2367 2371 2368 + 1 218 1580 2492 2495 + 1 214 2463 1096 2464 + 1 220 2509 2506 1604 + 1 218 2460 2491 2495 + 1 218 2460 2495 2492 + 1 214 2461 2466 2464 + 1 214 2463 2464 2466 + 1 237 1672 2647 2642 + 1 240 2671 1714 2667 + 1 229 2566 2568 1154 + 1 237 2640 2561 2642 + 1 237 2640 2642 2647 + 1 240 2563 2666 2667 + 1 240 2671 2667 2666 + 1 199 1432 2355 2357 + 1 200 2363 1442 2365 + 1 202 2375 2376 1466 + 1 199 2351 2353 2357 + 1 199 2351 2357 2355 + 1 200 2358 2364 2365 + 1 200 2363 2365 2364 + 1 199 1432 2357 2356 + 1 201 2369 2371 1456 + 1 202 2375 1466 2377 + 1 199 2352 2357 2353 + 1 199 2352 2356 2357 + 1 201 2366 2371 2370 + 1 201 2369 2370 2371 + 1 216 1556 2481 2482 + 1 219 2500 1590 2504 + 1 220 2507 2510 1604 + 1 216 2475 2476 2482 + 1 216 2475 2482 2481 + 1 219 2496 2501 2504 + 1 219 2500 2504 2501 + 1 218 1580 2495 2494 + 1 219 2502 2504 1590 + 1 220 2509 1604 2510 + 1 218 2490 2495 2491 + 1 218 2490 2494 2495 + 1 219 2496 2504 2503 + 1 219 2502 2503 2504 + 1 204 1062 2393 2391 + 1 212 2447 1542 2451 + 1 210 2433 2436 1518 + 1 204 2389 2387 2391 + 1 204 2389 2391 2393 + 1 212 2432 2446 2451 + 1 212 2447 2451 2446 + 1 249 1756 2745 2749 + 1 243 2694 1202 2696 + 1 252 2769 2766 1794 + 1 249 2690 2743 2749 + 1 249 2690 2749 2745 + 1 243 2692 2698 2696 + 1 243 2694 2696 2698 + 1 226 1638 2542 2539 + 1 227 2547 1648 2544 + 1 223 2523 2524 1126 + 1 226 2538 2521 2539 + 1 226 2538 2539 2542 + 1 227 2522 2543 2544 + 1 227 2547 2544 2543 + 1 209 1504 2427 2430 + 1 207 2411 1480 2412 + 1 210 2435 2434 1518 + 1 209 2407 2423 2430 + 1 209 2407 2430 2427 + 1 207 2408 2413 2412 + 1 207 2411 2412 2413 + 1 209 1504 2430 2431 + 1 212 2450 2451 1542 + 1 210 2435 1518 2436 + 1 209 2424 2430 2423 + 1 209 2424 2431 2430 + 1 212 2432 2451 2449 + 1 212 2450 2449 2451 + 1 246 1629 2722 2723 + 1 248 2738 1742 2741 + 1 252 2767 2768 1794 + 1 246 2718 2719 2723 + 1 246 2718 2723 2722 + 1 248 2734 2739 2741 + 1 248 2738 2741 2739 + 1 249 1756 2749 2748 + 1 248 2740 2741 1742 + 1 252 2769 1794 2768 + 1 249 2733 2749 2743 + 1 249 2733 2748 2749 + 1 248 2734 2741 2742 + 1 248 2740 2742 2741 + 1 165 957 2134 2135 + 1 170 2165 1286 2169 + 1 171 2171 2176 1296 + 1 165 2131 2132 2135 + 1 165 2131 2135 2134 + 1 170 2164 2166 2169 + 1 170 2165 2169 2166 + 1 182 1350 2233 2236 + 1 179 2215 1055 2216 + 1 184 2248 2246 1374 + 1 182 2213 2232 2236 + 1 182 2213 2236 2233 + 1 179 2214 2217 2216 + 1 179 2215 2216 2217 + 1 191 1398 2304 2299 + 1 193 2313 1422 2310 + 1 186 2260 2262 1145 + 1 191 2298 2257 2299 + 1 191 2298 2299 2304 + 1 193 2259 2309 2310 + 1 193 2313 2310 2309 + 1 167 1252 2147 2149 + 1 168 2155 1262 2158 + 1 171 2172 2174 1296 + 1 167 2143 2145 2149 + 1 167 2143 2149 2147 + 1 168 2151 2156 2158 + 1 168 2155 2158 2156 + 1 167 1252 2149 2148 + 1 170 2167 2169 1286 + 1 171 2172 1296 2176 + 1 167 2144 2149 2145 + 1 167 2144 2148 2149 + 1 170 2164 2169 2168 + 1 170 2167 2168 2169 + 1 181 1340 2229 2230 + 1 183 2241 1360 2245 + 1 184 2247 2249 1374 + 1 181 2225 2226 2230 + 1 181 2225 2230 2229 + 1 183 2237 2242 2245 + 1 183 2241 2245 2242 + 1 182 1350 2236 2235 + 1 183 2243 2245 1360 + 1 184 2248 1374 2249 + 1 182 2231 2236 2232 + 1 182 2231 2235 2236 + 1 183 2237 2245 2244 + 1 183 2243 2244 2245 + 1 165 957 2135 2133 + 1 171 2171 1296 2175 + 1 169 2160 2163 1276 + 1 165 2132 2130 2133 + 1 165 2132 2133 2135 + 1 171 2159 2170 2175 + 1 171 2171 2175 2170 + 1 191 1398 2299 2303 + 1 186 2260 1145 2261 + 1 192 2308 2305 1412 + 1 191 2257 2297 2303 + 1 191 2257 2303 2299 + 1 186 2258 2263 2261 + 1 186 2260 2261 2263 + 1 176 1320 2202 2199 + 1 177 2207 1330 2204 + 1 173 2183 2184 1025 + 1 176 2198 2181 2199 + 1 176 2198 2199 2202 + 1 177 2182 2203 2204 + 1 177 2207 2204 2203 + 1 168 1262 2154 2157 + 1 166 2140 1242 2141 + 1 169 2162 2161 1276 + 1 168 2136 2150 2157 + 1 168 2136 2157 2154 + 1 166 2137 2142 2141 + 1 166 2140 2141 2142 + 1 168 1262 2157 2158 + 1 171 2174 2175 1296 + 1 169 2162 1276 2163 + 1 168 2151 2157 2150 + 1 168 2151 2158 2157 + 1 171 2159 2175 2173 + 1 171 2174 2173 2175 + 1 188 1311 2279 2280 + 1 190 2292 1384 2295 + 1 192 2306 2307 1412 + 1 188 2275 2276 2280 + 1 188 2275 2280 2279 + 1 190 2288 2293 2295 + 1 190 2292 2295 2293 + 1 191 1398 2303 2302 + 1 190 2294 2295 1384 + 1 192 2308 1412 2307 + 1 191 2287 2303 2297 + 1 191 2287 2302 2303 + 1 190 2288 2295 2296 + 1 190 2294 2296 2295 + 1 213 817 2455 2454 + 1 363 2486 1572 3411 + 1 362 2477 3408 1558 + 1 213 2458 2457 2454 + 1 213 2458 2454 2455 + 1 363 3403 2478 3411 + 1 363 2486 3411 2478 + 1 378 1573 2714 3479 + 1 242 2681 846 2683 + 1 380 3484 2727 1661 + 1 378 2685 3477 3479 + 1 378 2685 3479 2714 + 1 242 2687 2689 2683 + 1 242 2681 2683 2689 + 1 373 1559 3456 2624 + 1 374 3461 1660 2634 + 1 228 2551 2552 832 + 1 373 3453 2556 2624 + 1 373 3453 2624 3456 + 1 374 2557 2625 2634 + 1 374 3461 2634 2625 + 1 359 1015 3390 3391 + 1 358 3384 1003 3386 + 1 362 3405 3404 1558 + 1 359 3381 3388 3391 + 1 359 3381 3391 3390 + 1 358 3383 3387 3386 + 1 358 3384 3386 3387 + 1 359 1015 3391 3392 + 1 363 3410 3411 1572 + 1 362 3405 1558 3408 + 1 359 3389 3391 3388 + 1 359 3389 3392 3391 + 1 363 3403 3411 3409 + 1 363 3410 3409 3411 + 1 367 1004 3423 3424 + 1 377 3454 1560 3475 + 1 380 3458 3483 1661 + 1 367 3426 3427 3424 + 1 367 3426 3424 3423 + 1 377 3473 3457 3475 + 1 377 3454 3475 3457 + 1 378 1573 3479 3478 + 1 377 3474 3475 1560 + 1 380 3484 1661 3483 + 1 378 3472 3479 3477 + 1 378 3472 3478 3479 + 1 377 3473 3475 3476 + 1 377 3474 3476 3475 + 1 203 807 2380 2381 + 1 356 2417 1492 3375 + 1 357 2426 3380 1506 + 1 203 2384 2385 2381 + 1 203 2384 2381 2380 + 1 356 3370 2425 3375 + 1 356 2417 3375 2425 + 1 371 1493 2615 3446 + 1 228 2550 832 2552 + 1 374 3459 2634 1660 + 1 371 2555 3442 3446 + 1 371 2555 3446 2615 + 1 228 2557 2559 2552 + 1 228 2550 2552 2559 + 1 376 1508 3471 2704 + 1 380 3482 1661 2727 + 1 242 2680 2683 846 + 1 376 3468 2684 2704 + 1 376 3468 2704 3471 + 1 380 2687 2705 2727 + 1 380 3482 2727 2705 + 1 352 1002 3352 3355 + 1 353 3359 1014 3362 + 1 357 3376 3378 1506 + 1 352 3348 3351 3355 + 1 352 3348 3355 3352 + 1 353 3357 3360 3362 + 1 353 3359 3362 3360 + 1 352 1002 3355 3354 + 1 356 3372 3375 1492 + 1 357 3376 1506 3380 + 1 352 3350 3355 3351 + 1 352 3350 3354 3355 + 1 356 3370 3375 3373 + 1 356 3372 3373 3375 + 1 367 1017 3425 3427 + 1 372 3448 1507 3452 + 1 374 3458 3460 1660 + 1 367 3422 3424 3427 + 1 367 3422 3427 3425 + 1 372 3447 3449 3452 + 1 372 3448 3452 3449 + 1 371 1493 3446 3445 + 1 372 3450 3452 1507 + 1 374 3459 1660 3460 + 1 371 3441 3446 3442 + 1 371 3441 3445 3446 + 1 372 3447 3452 3451 + 1 372 3450 3451 3452 + 1 194 798 2315 2316 + 1 349 2354 1434 3337 + 1 350 2360 3342 1444 + 1 194 2318 2319 2316 + 1 194 2318 2316 2315 + 1 349 3334 2359 3337 + 1 349 2354 3337 2359 + 1 360 1435 2470 3396 + 1 213 2453 817 2454 + 1 362 3406 2477 1558 + 1 360 2456 3394 3396 + 1 360 2456 3396 2470 + 1 213 2457 2459 2454 + 1 213 2453 2454 2459 + 1 370 1446 3440 2605 + 1 373 3455 1559 2624 + 1 228 2549 2551 832 + 1 370 3438 2554 2605 + 1 370 3438 2605 3440 + 1 373 2556 2606 2624 + 1 373 3455 2624 2606 + 1 345 985 3315 3317 + 1 346 3320 1001 3323 + 1 350 3338 3339 1444 + 1 345 3312 3314 3317 + 1 345 3312 3317 3315 + 1 346 3319 3321 3323 + 1 346 3320 3323 3321 + 1 345 985 3317 3316 + 1 349 3335 3337 1434 + 1 350 3338 1444 3342 + 1 345 3313 3317 3314 + 1 345 3313 3316 3317 + 1 349 3334 3337 3336 + 1 349 3335 3336 3337 + 1 358 1003 3385 3386 + 1 361 3398 1445 3402 + 1 362 3404 3407 1558 + 1 358 3382 3383 3386 + 1 358 3382 3386 3385 + 1 361 3397 3399 3402 + 1 361 3398 3402 3399 + 1 360 1435 3396 3395 + 1 361 3400 3402 1445 + 1 362 3406 1558 3407 + 1 360 3393 3396 3394 + 1 360 3393 3395 3396 + 1 361 3397 3402 3401 + 1 361 3400 3401 3402 + 1 203 807 2381 2379 + 1 357 2426 1506 3379 + 1 355 2409 3369 1482 + 1 203 2385 2383 2379 + 1 203 2385 2379 2381 + 1 357 3366 2410 3379 + 1 357 2426 3379 2410 + 1 376 1508 2704 3470 + 1 242 2680 846 2682 + 1 379 3481 2720 1631 + 1 376 2684 3467 3470 + 1 376 2684 3470 2704 + 1 242 2686 2688 2682 + 1 242 2680 2682 2688 + 1 365 1483 3418 2527 + 1 366 3421 1630 2534 + 1 222 2517 2518 826 + 1 365 3416 2519 2527 + 1 365 3416 2527 3418 + 1 366 2520 2528 2534 + 1 366 3421 2534 2528 + 1 353 1014 3358 3361 + 1 351 3345 994 3346 + 1 355 3368 3367 1482 + 1 353 3343 3356 3361 + 1 353 3343 3361 3358 + 1 351 3344 3347 3346 + 1 351 3345 3346 3347 + 1 353 1014 3361 3362 + 1 357 3378 3379 1506 + 1 355 3368 1482 3369 + 1 353 3357 3361 3356 + 1 353 3357 3362 3361 + 1 357 3366 3379 3377 + 1 357 3378 3377 3379 + 1 364 995 3412 3413 + 1 375 3417 1484 3465 + 1 379 3420 3480 1631 + 1 364 3414 3415 3413 + 1 364 3414 3413 3412 + 1 375 3463 3419 3465 + 1 375 3417 3465 3419 + 1 376 1508 3470 3469 + 1 375 3464 3465 1484 + 1 379 3481 1631 3480 + 1 376 3462 3470 3467 + 1 376 3462 3469 3470 + 1 375 3463 3465 3466 + 1 375 3464 3466 3465 + 1 164 768 2125 2126 + 1 326 2146 1254 3235 + 1 327 2153 3240 1264 + 1 164 2128 2129 2126 + 1 164 2128 2126 2125 + 1 326 3232 2152 3235 + 1 326 2146 3235 2152 + 1 332 1255 2221 3258 + 1 178 2208 782 2209 + 1 334 3266 2227 1342 + 1 332 2210 3256 3258 + 1 332 2210 3258 2221 + 1 178 2211 2212 2209 + 1 178 2208 2209 2212 + 1 336 1266 3277 2268 + 1 338 3280 1343 2283 + 1 185 2250 2252 789 + 1 336 3274 2253 2268 + 1 336 3274 2268 3277 + 1 338 2255 2269 2283 + 1 338 3280 2283 2269 + 1 323 942 3218 3220 + 1 324 3224 949 3227 + 1 327 3236 3238 1264 + 1 323 3215 3217 3220 + 1 323 3215 3220 3218 + 1 324 3222 3225 3227 + 1 324 3224 3227 3225 + 1 323 942 3220 3219 + 1 326 3233 3235 1254 + 1 327 3236 1264 3240 + 1 323 3216 3220 3217 + 1 323 3216 3219 3220 + 1 326 3232 3235 3234 + 1 326 3233 3234 3235 + 1 331 951 3253 3254 + 1 333 3260 1265 3264 + 1 334 3265 3267 1342 + 1 331 3251 3252 3254 + 1 331 3251 3254 3253 + 1 333 3259 3261 3264 + 1 333 3260 3264 3261 + 1 332 1255 3258 3257 + 1 333 3262 3264 1265 + 1 334 3266 1342 3267 + 1 332 3255 3258 3256 + 1 332 3255 3257 3258 + 1 333 3259 3264 3263 + 1 333 3262 3263 3264 + 1 164 768 2126 2124 + 1 327 2153 1264 3239 + 1 325 2138 3231 1244 + 1 164 2129 2127 2124 + 1 164 2129 2124 2126 + 1 327 3228 2139 3239 + 1 327 2153 3239 2139 + 1 336 1266 2268 3276 + 1 185 2250 789 2251 + 1 337 3279 2277 1313 + 1 336 2253 3273 3276 + 1 336 2253 3276 2268 + 1 185 2254 2256 2251 + 1 185 2250 2251 2256 + 1 329 1245 3247 2187 + 1 330 3250 1312 2194 + 1 172 2177 2178 776 + 1 329 3245 2179 2187 + 1 329 3245 2187 3247 + 1 330 2180 2188 2194 + 1 330 3250 2194 2188 + 1 324 949 3223 3226 + 1 322 3212 936 3213 + 1 325 3230 3229 1244 + 1 324 3210 3221 3226 + 1 324 3210 3226 3223 + 1 322 3211 3214 3213 + 1 322 3212 3213 3214 + 1 324 949 3226 3227 + 1 327 3238 3239 1264 + 1 325 3230 1244 3231 + 1 324 3222 3226 3221 + 1 324 3222 3227 3226 + 1 327 3228 3239 3237 + 1 327 3238 3237 3239 + 1 328 937 3241 3242 + 1 335 3246 1246 3271 + 1 337 3249 3278 1313 + 1 328 3243 3244 3242 + 1 328 3243 3242 3241 + 1 335 3269 3248 3271 + 1 335 3246 3271 3248 + 1 336 1266 3276 3275 + 1 335 3270 3271 1246 + 1 337 3279 1313 3278 + 1 336 3268 3276 3273 + 1 336 3268 3275 3276 + 1 335 3269 3271 3272 + 1 335 3270 3272 3271 + 1 146 750 2040 2039 + 1 424 2053 1121 3677 + 1 423 2049 3672 1112 + 1 146 2043 2042 2039 + 1 146 2043 2039 2040 + 1 424 3667 2050 3677 + 1 424 2053 3677 2050 + 1 437 1123 3097 3729 + 1 304 3095 908 3104 + 1 657 3731 3118 1913 + 1 437 3105 3730 3729 + 1 437 3105 3729 3097 + 1 304 3108 3106 3104 + 1 304 3095 3104 3106 + 1 433 1115 3715 3034 + 1 654 3727 1912 3088 + 1 295 3031 3049 899 + 1 433 3718 3050 3034 + 1 433 3718 3034 3715 + 1 654 3055 3037 3088 + 1 654 3727 3088 3037 + 1 427 1620 3694 3692 + 1 426 3690 1606 3687 + 1 423 3674 3673 1112 + 1 427 3685 3669 3692 + 1 427 3685 3692 3694 + 1 426 3668 3688 3687 + 1 426 3690 3687 3688 + 1 427 1620 3692 3693 + 1 424 3679 3677 1121 + 1 423 3674 1112 3672 + 1 427 3676 3692 3669 + 1 427 3676 3693 3692 + 1 424 3667 3677 3678 + 1 424 3679 3678 3677 + 1 649 1612 3716 4652 + 1 434 3713 1116 3719 + 1 657 4668 3728 1913 + 1 649 3722 4654 4652 + 1 649 3722 4652 3716 + 1 434 3724 3723 3719 + 1 434 3713 3719 3723 + 1 437 1123 3729 3711 + 1 434 3709 3719 1116 + 1 657 3731 1913 3728 + 1 437 3720 3729 3730 + 1 437 3720 3711 3729 + 1 434 3724 3719 3721 + 1 434 3709 3721 3719 + 1 305 909 3099 3111 + 1 501 3101 1226 4031 + 1 712 3124 4034 1934 + 1 305 3112 3115 3111 + 1 305 3112 3111 3099 + 1 501 4032 3121 4031 + 1 501 3101 4031 3121 + 1 485 1224 2117 3952 + 1 159 2101 763 2103 + 1 487 3964 2121 1236 + 1 485 2105 3949 3952 + 1 485 2105 3952 2117 + 1 159 2107 2109 2103 + 1 159 2101 2103 2109 + 1 717 1935 4043 3208 + 1 505 4039 1239 3166 + 1 317 3182 3163 921 + 1 717 4041 3189 3208 + 1 717 4041 3208 4043 + 1 505 3183 3205 3166 + 1 505 4039 3166 3205 + 1 489 1208 3975 3976 + 1 710 3988 1814 4891 + 1 712 4004 4894 1934 + 1 489 3978 3979 3976 + 1 489 3978 3976 3975 + 1 710 4890 4003 4891 + 1 710 3988 4891 4003 + 1 489 1208 3976 3950 + 1 501 3953 4031 1226 + 1 712 4004 1934 4034 + 1 489 3977 3976 3979 + 1 489 3977 3950 3976 + 1 501 4032 4031 3999 + 1 501 3953 3999 4031 + 1 491 1806 3989 3986 + 1 493 4005 1930 4002 + 1 487 3965 3966 1236 + 1 491 3984 3960 3986 + 1 491 3984 3986 3989 + 1 493 3961 4001 4002 + 1 493 4005 4002 4001 + 1 485 1224 3952 3954 + 1 493 4000 4002 1930 + 1 487 3964 1236 3966 + 1 485 3951 3952 3949 + 1 485 3951 3954 3952 + 1 493 3961 4002 3998 + 1 493 4000 3998 4002 + 1 296 900 3058 3038 + 1 689 3092 1922 3931 + 1 477 3041 3919 1189 + 1 296 3065 3059 3038 + 1 296 3065 3038 3058 + 1 689 3922 3044 3931 + 1 689 3092 3931 3044 + 1 694 1923 3202 3938 + 1 316 3172 920 3157 + 1 481 3934 3160 1198 + 1 694 3178 3936 3938 + 1 694 3178 3938 3202 + 1 316 3173 3174 3157 + 1 316 3172 3157 3174 + 1 458 1186 3830 2093 + 1 459 3836 1195 2097 + 1 154 2074 2075 758 + 1 458 3825 2080 2093 + 1 458 3825 2093 3830 + 1 459 2081 2094 2097 + 1 459 3836 2097 2094 + 1 686 1736 3874 3926 + 1 464 3864 1164 3826 + 1 477 3917 3831 1189 + 1 686 3869 3920 3926 + 1 686 3869 3926 3874 + 1 464 3866 3867 3826 + 1 464 3864 3826 3867 + 1 686 1736 3926 4802 + 1 689 4807 3931 1922 + 1 477 3917 1189 3919 + 1 686 4800 3926 3920 + 1 686 4800 4802 3926 + 1 689 3922 3931 3927 + 1 689 4807 3927 3931 + 1 465 1165 3827 3833 + 1 478 3832 1190 3913 + 1 481 3838 3915 1198 + 1 465 3871 3872 3833 + 1 465 3871 3833 3827 + 1 478 3924 3837 3913 + 1 478 3832 3913 3837 + 1 694 1923 3938 3932 + 1 478 3923 3913 1190 + 1 481 3934 1198 3915 + 1 694 3928 3938 3936 + 1 694 3928 3932 3938 + 1 478 3924 3913 3925 + 1 478 3923 3925 3913 + 1 245 849 2711 2712 + 1 636 2729 1665 4594 + 1 637 2754 4598 1773 + 1 245 2715 2716 2712 + 1 245 2715 2712 2711 + 1 636 4593 2753 4594 + 1 636 2729 4594 2753 + 1 630 1664 2636 4563 + 1 235 2621 839 2623 + 1 632 4572 2669 1719 + 1 630 2627 4560 4563 + 1 630 2627 4563 2636 + 1 235 2629 2630 2623 + 1 235 2621 2623 2630 + 1 651 1774 4661 3069 + 1 650 4657 1721 3061 + 1 295 3046 3045 899 + 1 651 4655 3052 3069 + 1 651 4655 3069 4661 + 1 650 3051 3068 3061 + 1 650 4657 3061 3068 + 1 627 1563 4541 4543 + 1 634 4555 1609 4586 + 1 637 4577 4596 1773 + 1 627 4544 4546 4543 + 1 627 4544 4543 4541 + 1 634 4584 4575 4586 + 1 634 4555 4586 4575 + 1 627 1563 4543 4542 + 1 636 4562 4594 1665 + 1 637 4577 1773 4598 + 1 627 4545 4543 4546 + 1 627 4545 4542 4543 + 1 636 4593 4594 4576 + 1 636 4562 4576 4594 + 1 629 1608 4559 4558 + 1 633 4579 1772 4582 + 1 632 4571 4574 1719 + 1 629 4554 4553 4558 + 1 629 4554 4558 4559 + 1 633 4569 4578 4582 + 1 633 4579 4582 4578 + 1 630 1664 4563 4564 + 1 633 4581 4582 1772 + 1 632 4572 1719 4574 + 1 630 4561 4563 4560 + 1 630 4561 4564 4563 + 1 633 4569 4582 4580 + 1 633 4581 4580 4582 + 1 245 849 2712 2713 + 1 638 2763 4602 1788 + 1 637 2754 1773 4599 + 1 245 2717 2712 2716 + 1 245 2717 2713 2712 + 1 638 4595 4602 2755 + 1 638 2763 2755 4602 + 1 656 1789 4677 3113 + 1 304 3103 3104 908 + 1 657 4679 1913 3118 + 1 656 3107 4677 4675 + 1 656 3107 3113 4677 + 1 304 3108 3104 3109 + 1 304 3103 3109 3104 + 1 651 1774 3069 4662 + 1 654 4669 3088 1912 + 1 295 3046 899 3049 + 1 651 4659 3069 3052 + 1 651 4659 4662 3069 + 1 654 3055 3088 3070 + 1 654 4669 3070 3088 + 1 635 1623 4591 4590 + 1 634 4585 4586 1609 + 1 637 4597 1773 4596 + 1 635 4583 4591 4588 + 1 635 4583 4590 4591 + 1 634 4584 4586 4587 + 1 634 4585 4587 4586 + 1 635 1623 4592 4591 + 1 638 4601 1788 4602 + 1 637 4597 4599 1773 + 1 635 4589 4588 4591 + 1 635 4589 4591 4592 + 1 638 4595 4600 4602 + 1 638 4601 4602 4600 + 1 649 1612 4652 4651 + 1 655 4660 4673 1775 + 1 657 4668 1913 4678 + 1 649 4653 4652 4654 + 1 649 4653 4651 4652 + 1 655 4671 4673 4667 + 1 655 4660 4667 4673 + 1 656 1789 4676 4677 + 1 655 4672 1775 4673 + 1 657 4679 4678 1913 + 1 656 4670 4675 4677 + 1 656 4670 4677 4676 + 1 655 4671 4674 4673 + 1 655 4672 4673 4674 + 1 236 840 2632 2633 + 1 669 2670 1722 4725 + 1 670 2676 4732 1733 + 1 236 2638 2639 2633 + 1 236 2638 2633 2632 + 1 669 4723 2675 4725 + 1 669 2670 4725 2675 + 1 687 1725 3063 4803 + 1 297 3056 901 3067 + 1 708 4808 3093 1924 + 1 687 3071 4805 4803 + 1 687 3071 4803 3063 + 1 297 3074 3072 3067 + 1 297 3056 3067 3072 + 1 691 1738 4815 3175 + 1 716 4824 1925 3203 + 1 317 3169 3181 921 + 1 691 4818 3185 3175 + 1 691 4818 3175 4815 + 1 716 3188 3179 3203 + 1 716 4824 3203 3179 + 1 672 1776 4742 4741 + 1 673 4747 1809 4745 + 1 670 4733 4734 1733 + 1 672 4739 4728 4741 + 1 672 4739 4741 4742 + 1 673 4729 4744 4745 + 1 673 4747 4745 4744 + 1 672 1776 4741 4740 + 1 669 4726 4725 1722 + 1 670 4733 1733 4732 + 1 672 4724 4741 4728 + 1 672 4724 4740 4741 + 1 669 4723 4725 4727 + 1 669 4726 4727 4725 + 1 706 1813 4816 4871 + 1 690 4809 1737 4810 + 1 708 4879 4823 1924 + 1 706 4811 4868 4871 + 1 706 4811 4871 4816 + 1 690 4812 4813 4810 + 1 690 4809 4810 4813 + 1 687 1725 4803 4799 + 1 690 4801 4810 1737 + 1 708 4808 1924 4823 + 1 687 4804 4803 4805 + 1 687 4804 4799 4803 + 1 690 4812 4810 4806 + 1 690 4801 4806 4810 + 1 305 909 3111 3110 + 1 711 3119 4893 1915 + 1 712 3124 1934 4895 + 1 305 3114 3111 3115 + 1 305 3114 3110 3111 + 1 711 4892 4893 3123 + 1 711 3119 3123 4893 + 1 707 1914 4876 3089 + 1 297 3066 3067 901 + 1 708 4880 1924 3093 + 1 707 3073 4876 4873 + 1 707 3073 3089 4876 + 1 297 3074 3067 3075 + 1 297 3066 3075 3067 + 1 717 1935 3208 4901 + 1 716 4900 3203 1925 + 1 317 3182 921 3181 + 1 717 4899 3208 3189 + 1 717 4899 4901 3208 + 1 716 3188 3203 3207 + 1 716 4900 3207 3203 + 1 705 1779 4864 4862 + 1 710 4870 4891 1814 + 1 712 4884 1934 4894 + 1 705 4865 4864 4867 + 1 705 4865 4862 4864 + 1 710 4890 4891 4882 + 1 710 4870 4882 4891 + 1 705 1779 4863 4864 + 1 711 4875 1915 4893 + 1 712 4884 4895 1934 + 1 705 4866 4867 4864 + 1 705 4866 4864 4863 + 1 711 4892 4883 4893 + 1 711 4875 4893 4883 + 1 706 1813 4871 4872 + 1 709 4886 4889 1933 + 1 708 4879 1924 4881 + 1 706 4869 4871 4868 + 1 706 4869 4872 4871 + 1 709 4878 4889 4885 + 1 709 4886 4885 4889 + 1 707 1914 4877 4876 + 1 709 4888 1933 4889 + 1 708 4880 4881 1924 + 1 707 4874 4873 4876 + 1 707 4874 4876 4877 + 1 709 4878 4887 4889 + 1 709 4888 4889 4887 + 1 142 746 2020 2021 + 1 404 2032 1081 3592 + 1 405 2035 3599 1088 + 1 142 2024 2025 2021 + 1 142 2024 2021 2020 + 1 404 3590 2034 3592 + 1 404 2032 3592 2034 + 1 416 1084 2918 3641 + 1 280 2915 884 2940 + 1 621 3647 2959 1872 + 1 416 2942 3644 3641 + 1 416 2942 3641 2918 + 1 280 2947 2943 2940 + 1 280 2915 2940 2943 + 1 419 1092 3654 2970 + 1 626 3660 1873 3019 + 1 286 2967 2984 890 + 1 419 3657 2985 2970 + 1 419 3657 2970 3654 + 1 626 2990 2973 3019 + 1 626 3660 3019 2973 + 1 408 1531 3612 3610 + 1 409 3617 1544 3615 + 1 405 3600 3601 1088 + 1 408 3608 3595 3610 + 1 408 3608 3610 3612 + 1 409 3596 3614 3615 + 1 409 3617 3615 3614 + 1 408 1531 3610 3609 + 1 404 3593 3592 1081 + 1 405 3600 1088 3599 + 1 408 3591 3610 3595 + 1 408 3591 3609 3610 + 1 404 3590 3592 3594 + 1 404 3593 3594 3592 + 1 618 1550 3655 4511 + 1 418 3648 1091 3649 + 1 621 4522 3659 1872 + 1 618 3650 4509 4511 + 1 618 3650 4511 3655 + 1 418 3651 3652 3649 + 1 418 3648 3649 3652 + 1 416 1084 3641 3635 + 1 418 3637 3649 1091 + 1 621 3647 1872 3659 + 1 416 3642 3641 3644 + 1 416 3642 3635 3641 + 1 418 3651 3649 3645 + 1 418 3637 3645 3649 + 1 281 885 2921 2950 + 1 474 2924 1182 3908 + 1 679 2965 3912 1883 + 1 281 2951 2956 2950 + 1 281 2951 2950 2921 + 1 474 3910 2962 3908 + 1 474 2924 3908 2962 + 1 457 1179 2090 3821 + 1 154 2073 758 2075 + 1 459 3835 2097 1195 + 1 457 2079 3817 3821 + 1 457 2079 3821 2090 + 1 154 2081 2082 2075 + 1 154 2073 2075 2082 + 1 692 1885 3937 3193 + 1 481 3933 1198 3160 + 1 316 3170 3157 920 + 1 692 3935 3176 3193 + 1 692 3935 3193 3937 + 1 481 3173 3191 3160 + 1 481 3933 3160 3191 + 1 463 1163 3857 3858 + 1 677 3873 1734 4760 + 1 679 3882 4766 1883 + 1 463 3862 3863 3858 + 1 463 3862 3858 3857 + 1 677 4757 3881 4760 + 1 677 3873 4760 3881 + 1 463 1163 3858 3819 + 1 474 3823 3908 1182 + 1 679 3882 1883 3912 + 1 463 3859 3858 3863 + 1 463 3859 3819 3858 + 1 474 3910 3908 3877 + 1 474 3823 3877 3908 + 1 465 1730 3875 3872 + 1 466 3883 1880 3880 + 1 459 3838 3839 1195 + 1 465 3870 3833 3872 + 1 465 3870 3872 3875 + 1 466 3834 3879 3880 + 1 466 3883 3880 3879 + 1 457 1179 3821 3824 + 1 466 3878 3880 1880 + 1 459 3835 1195 3839 + 1 457 3820 3821 3817 + 1 457 3820 3824 3821 + 1 466 3834 3880 3876 + 1 466 3878 3876 3880 + 1 288 892 3005 2974 + 1 704 3029 1904 4027 + 1 496 2977 4014 1218 + 1 288 3011 3006 2974 + 1 288 3011 2974 3005 + 1 704 4017 2980 4027 + 1 704 3029 4027 2980 + 1 715 1905 3198 4042 + 1 317 3180 921 3163 + 1 505 4038 3166 1239 + 1 715 3187 4040 4042 + 1 715 3187 4042 3198 + 1 317 3183 3184 3163 + 1 317 3180 3163 3184 + 1 484 1215 3945 2112 + 1 487 3962 1236 2121 + 1 159 2100 2103 763 + 1 484 3940 2104 2112 + 1 484 3940 2112 3945 + 1 487 2107 2113 2121 + 1 487 3962 2121 2113 + 1 701 1812 3987 4021 + 1 488 3968 1207 3941 + 1 496 4012 3946 1218 + 1 701 3973 4015 4021 + 1 701 3973 4021 3987 + 1 488 3970 3971 3941 + 1 488 3968 3941 3971 + 1 701 1812 4021 4856 + 1 704 4861 4027 1904 + 1 496 4012 1218 4014 + 1 701 4855 4021 4015 + 1 701 4855 4856 4021 + 1 704 4017 4027 4022 + 1 704 4861 4022 4027 + 1 491 1210 3942 3960 + 1 497 3947 1219 4008 + 1 505 3965 4010 1239 + 1 491 3985 3986 3960 + 1 491 3985 3960 3942 + 1 497 4019 3963 4008 + 1 497 3947 4008 3963 + 1 715 1905 4042 4028 + 1 497 4018 4008 1219 + 1 505 4038 1239 4010 + 1 715 4023 4042 4040 + 1 715 4023 4028 4042 + 1 497 4019 4008 4020 + 1 497 4018 4020 4008 + 1 234 838 2612 2614 + 1 604 2635 1662 4451 + 1 606 2659 4459 1702 + 1 234 2618 2620 2614 + 1 234 2618 2614 2612 + 1 604 4448 2657 4451 + 1 604 2635 4451 2657 + 1 610 1663 2728 4478 + 1 244 2701 848 2703 + 1 613 4492 2746 1760 + 1 610 2707 4476 4478 + 1 610 2707 4478 2728 + 1 244 2709 2710 2703 + 1 244 2701 2703 2710 + 1 622 1705 4527 2995 + 1 624 4535 1761 3007 + 1 286 2981 2982 890 + 1 622 4525 2987 2995 + 1 622 4525 2995 4527 + 1 624 2988 2996 3007 + 1 624 4535 3007 2996 + 1 601 1510 4433 4435 + 1 603 4443 1547 4447 + 1 606 4456 4458 1702 + 1 601 4430 4432 4435 + 1 601 4430 4435 4433 + 1 603 4442 4444 4447 + 1 603 4443 4447 4444 + 1 601 1510 4435 4434 + 1 604 4449 4451 1662 + 1 606 4456 1702 4459 + 1 601 4431 4435 4432 + 1 601 4431 4434 4435 + 1 604 4448 4451 4450 + 1 604 4449 4450 4451 + 1 608 1548 4470 4472 + 1 611 4480 1703 4484 + 1 613 4491 4493 1760 + 1 608 4466 4468 4472 + 1 608 4466 4472 4470 + 1 611 4479 4481 4484 + 1 611 4480 4484 4481 + 1 610 1663 4478 4477 + 1 611 4482 4484 1703 + 1 613 4492 1760 4493 + 1 610 4475 4478 4476 + 1 610 4475 4477 4478 + 1 611 4479 4484 4483 + 1 611 4482 4483 4484 + 1 234 838 2614 2613 + 1 605 2653 4455 1694 + 1 606 2659 1702 4460 + 1 234 2619 2614 2620 + 1 234 2619 2613 2614 + 1 605 4452 4455 2658 + 1 605 2653 2658 4455 + 1 619 1695 4515 2954 + 1 280 2939 2940 884 + 1 621 4523 1872 2959 + 1 619 2946 4515 4513 + 1 619 2946 2954 4515 + 1 280 2947 2940 2948 + 1 280 2939 2948 2940 + 1 622 1705 2995 4528 + 1 626 4540 3019 1873 + 1 286 2981 890 2984 + 1 622 4526 2995 2987 + 1 622 4526 4528 2995 + 1 626 2990 3019 2997 + 1 626 4540 2997 3019 + 1 602 1537 4441 4439 + 1 603 4445 4447 1547 + 1 606 4457 1702 4458 + 1 602 4436 4441 4438 + 1 602 4436 4439 4441 + 1 603 4442 4447 4446 + 1 603 4445 4446 4447 + 1 602 1537 4440 4441 + 1 605 4453 1694 4455 + 1 606 4457 4460 1702 + 1 602 4437 4438 4441 + 1 602 4437 4441 4440 + 1 605 4452 4454 4455 + 1 605 4453 4455 4454 + 1 618 1550 4511 4510 + 1 620 4517 4521 1704 + 1 621 4522 1872 4524 + 1 618 4508 4511 4509 + 1 618 4508 4510 4511 + 1 620 4516 4521 4518 + 1 620 4517 4518 4521 + 1 619 1695 4514 4515 + 1 620 4519 1704 4521 + 1 621 4523 4524 1872 + 1 619 4512 4513 4515 + 1 619 4512 4515 4514 + 1 620 4516 4520 4521 + 1 620 4519 4521 4520 + 1 247 851 2724 2726 + 1 671 2747 1762 4738 + 1 673 2773 4746 1809 + 1 247 2730 2732 2726 + 1 247 2730 2726 2724 + 1 671 4735 2772 4738 + 1 671 2747 4738 2772 + 1 681 1763 3008 4777 + 1 287 2992 891 2994 + 1 685 4795 3028 1902 + 1 681 2998 4775 4777 + 1 681 2998 4777 3008 + 1 287 3000 3001 2994 + 1 287 2992 2994 3001 + 1 691 1811 4817 3185 + 1 693 4821 1903 3197 + 1 316 3169 3171 920 + 1 691 4814 3175 3185 + 1 691 4814 3185 4817 + 1 693 3177 3186 3197 + 1 693 4821 3197 3186 + 1 668 1706 4720 4722 + 1 670 4730 1733 4734 + 1 673 4743 4745 1809 + 1 668 4717 4719 4722 + 1 668 4717 4722 4720 + 1 670 4729 4731 4734 + 1 670 4730 4734 4731 + 1 668 1706 4722 4721 + 1 671 4736 4738 1762 + 1 673 4743 1809 4746 + 1 668 4718 4722 4719 + 1 668 4718 4721 4722 + 1 671 4735 4738 4737 + 1 671 4736 4737 4738 + 1 680 1735 4771 4773 + 1 682 4779 1810 4783 + 1 685 4794 4796 1902 + 1 680 4768 4770 4773 + 1 680 4768 4773 4771 + 1 682 4778 4780 4783 + 1 682 4779 4783 4780 + 1 681 1763 4777 4776 + 1 682 4781 4783 1810 + 1 685 4795 1902 4796 + 1 681 4774 4777 4775 + 1 681 4774 4776 4777 + 1 682 4778 4783 4782 + 1 682 4781 4782 4783 + 1 281 885 2950 2949 + 1 678 2960 4764 1874 + 1 679 2965 1883 4767 + 1 281 2955 2950 2956 + 1 281 2955 2949 2950 + 1 678 4761 4764 2964 + 1 678 2960 2964 4764 + 1 683 1875 4787 3020 + 1 287 2993 2994 891 + 1 685 4797 1902 3028 + 1 683 2999 4787 4785 + 1 683 2999 3020 4787 + 1 287 3000 2994 3002 + 1 287 2993 3002 2994 + 1 692 1885 3193 4820 + 1 693 4822 3197 1903 + 1 316 3170 920 3171 + 1 692 4819 3193 3176 + 1 692 4819 4820 3193 + 1 693 3177 3197 3194 + 1 693 4822 3194 3197 + 1 676 1707 4756 4754 + 1 677 4758 4760 1734 + 1 679 4765 1883 4766 + 1 676 4751 4756 4753 + 1 676 4751 4754 4756 + 1 677 4757 4760 4759 + 1 677 4758 4759 4760 + 1 676 1707 4755 4756 + 1 678 4762 1874 4764 + 1 679 4765 4767 1883 + 1 676 4752 4753 4756 + 1 676 4752 4756 4755 + 1 678 4761 4763 4764 + 1 678 4762 4764 4763 + 1 680 1735 4773 4772 + 1 684 4789 4793 1884 + 1 685 4794 1902 4798 + 1 680 4769 4773 4770 + 1 680 4769 4772 4773 + 1 684 4788 4793 4790 + 1 684 4789 4790 4793 + 1 683 1875 4786 4787 + 1 684 4791 1884 4793 + 1 685 4797 4798 1902 + 1 683 4784 4785 4787 + 1 683 4784 4787 4786 + 1 684 4788 4792 4793 + 1 684 4791 4793 4792 + 1 138 742 2001 2002 + 1 385 2008 1041 3504 + 1 386 2012 3510 1048 + 1 138 2005 2006 2002 + 1 138 2005 2002 2001 + 1 385 3502 2011 3504 + 1 385 2008 3504 2011 + 1 392 1043 2779 3537 + 1 256 2777 860 2786 + 1 592 3542 2800 1822 + 1 392 2787 3539 3537 + 1 392 2787 3537 2779 + 1 256 2790 2788 2786 + 1 256 2777 2786 2788 + 1 396 1052 3550 2812 + 1 595 3555 1823 2865 + 1 264 2809 2837 868 + 1 396 3553 2838 2812 + 1 396 3553 2812 3550 + 1 595 2843 2814 2865 + 1 595 3555 2865 2814 + 1 389 1458 3527 3526 + 1 390 3532 1468 3529 + 1 386 3512 3513 1048 + 1 389 3524 3508 3526 + 1 389 3524 3526 3527 + 1 390 3509 3528 3529 + 1 390 3532 3529 3528 + 1 389 1458 3526 3525 + 1 385 3505 3504 1041 + 1 386 3512 1048 3510 + 1 389 3503 3526 3508 + 1 389 3503 3525 3526 + 1 385 3502 3504 3506 + 1 385 3505 3506 3504 + 1 589 1476 3552 4382 + 1 395 3545 1051 3546 + 1 592 4393 3554 1822 + 1 589 3547 4380 4382 + 1 589 3547 4382 3552 + 1 395 3548 3549 3546 + 1 395 3545 3546 3549 + 1 392 1043 3537 3533 + 1 395 3535 3546 1051 + 1 592 3542 1822 3554 + 1 392 3538 3537 3539 + 1 392 3538 3533 3537 + 1 395 3548 3546 3540 + 1 395 3535 3540 3546 + 1 257 861 2781 2793 + 1 430 2783 1108 3705 + 1 642 2806 3708 1833 + 1 257 2794 2797 2793 + 1 257 2794 2793 2781 + 1 430 3706 2803 3705 + 1 430 2783 3705 2803 + 1 422 1106 2046 3664 + 1 146 2038 750 2039 + 1 423 3671 2049 1112 + 1 422 2041 3661 3664 + 1 422 2041 3664 2046 + 1 146 2042 2044 2039 + 1 146 2038 2039 2044 + 1 652 1835 3725 3079 + 1 433 3714 1115 3034 + 1 295 3047 3031 899 + 1 652 3717 3053 3079 + 1 652 3717 3079 3725 + 1 433 3050 3077 3034 + 1 433 3714 3034 3077 + 1 425 1100 3680 3681 + 1 640 3689 1610 4612 + 1 642 3701 4618 1833 + 1 425 3683 3684 3681 + 1 425 3683 3681 3680 + 1 640 4609 3700 4612 + 1 640 3689 4612 3700 + 1 425 1100 3681 3662 + 1 430 3665 3705 1108 + 1 642 3701 1833 3708 + 1 425 3682 3681 3684 + 1 425 3682 3662 3681 + 1 430 3706 3705 3696 + 1 430 3665 3696 3705 + 1 426 1606 3691 3687 + 1 428 3702 1830 3699 + 1 423 3673 3675 1112 + 1 426 3686 3668 3687 + 1 426 3686 3687 3691 + 1 428 3670 3698 3699 + 1 428 3702 3699 3698 + 1 422 1106 3664 3666 + 1 428 3697 3699 1830 + 1 423 3671 1112 3675 + 1 422 3663 3664 3661 + 1 422 3663 3666 3664 + 1 428 3670 3699 3695 + 1 428 3697 3695 3699 + 1 266 870 2855 2816 + 1 675 2870 1844 3902 + 1 469 2819 3891 1173 + 1 266 2862 2857 2816 + 1 266 2862 2816 2855 + 1 675 3894 2821 3902 + 1 675 2870 3902 2821 + 1 688 1845 3084 3929 + 1 296 3057 900 3038 + 1 477 3918 3041 1189 + 1 688 3064 3921 3929 + 1 688 3064 3929 3084 + 1 296 3059 3060 3038 + 1 296 3057 3038 3060 + 1 456 1170 3814 2085 + 1 458 3828 1186 2093 + 1 154 2072 2074 758 + 1 456 3811 2078 2085 + 1 456 3811 2085 3814 + 1 458 2080 2086 2093 + 1 458 3828 2093 2086 + 1 674 1723 3868 3898 + 1 462 3852 1162 3812 + 1 469 3890 3815 1173 + 1 674 3856 3893 3898 + 1 674 3856 3898 3868 + 1 462 3853 3854 3812 + 1 462 3852 3812 3854 + 1 674 1723 3898 4749 + 1 675 4750 3902 1844 + 1 469 3890 1173 3891 + 1 674 4748 3898 3893 + 1 674 4748 4749 3898 + 1 675 3894 3902 3899 + 1 675 4750 3899 3902 + 1 464 1164 3813 3826 + 1 470 3816 1174 3884 + 1 477 3831 3886 1189 + 1 464 3865 3866 3826 + 1 464 3865 3826 3813 + 1 470 3896 3829 3884 + 1 470 3816 3884 3829 + 1 688 1845 3929 3903 + 1 470 3895 3884 1174 + 1 477 3918 1189 3886 + 1 688 3900 3929 3921 + 1 688 3900 3903 3929 + 1 470 3896 3884 3897 + 1 470 3895 3897 3884 + 1 215 819 2467 2469 + 1 582 2479 1561 4352 + 1 584 2499 4360 1592 + 1 215 2471 2473 2469 + 1 215 2471 2469 2467 + 1 582 4349 2497 4352 + 1 582 2479 4352 2497 + 1 586 1562 2626 4369 + 1 233 2603 837 2604 + 1 588 4377 2645 1680 + 1 586 2609 4367 4369 + 1 586 2609 4369 2626 + 1 233 2610 2611 2604 + 1 233 2603 2604 2611 + 1 593 1595 4398 2847 + 1 594 4400 1681 2860 + 1 264 2835 2836 868 + 1 593 4396 2841 2847 + 1 593 4396 2847 4398 + 1 594 2842 2848 2860 + 1 594 4400 2860 2848 + 1 579 1451 4334 4336 + 1 581 4344 1474 4348 + 1 584 4357 4359 1592 + 1 579 4331 4333 4336 + 1 579 4331 4336 4334 + 1 581 4343 4345 4348 + 1 581 4344 4348 4345 + 1 579 1451 4336 4335 + 1 582 4350 4352 1561 + 1 584 4357 1592 4360 + 1 579 4332 4336 4333 + 1 579 4332 4335 4336 + 1 582 4349 4352 4351 + 1 582 4350 4351 4352 + 1 585 1475 4364 4365 + 1 587 4371 1593 4375 + 1 588 4376 4378 1680 + 1 585 4362 4363 4365 + 1 585 4362 4365 4364 + 1 587 4370 4372 4375 + 1 587 4371 4375 4372 + 1 586 1562 4369 4368 + 1 587 4373 4375 1593 + 1 588 4377 1680 4378 + 1 586 4366 4369 4367 + 1 586 4366 4368 4369 + 1 587 4370 4375 4374 + 1 587 4373 4374 4375 + 1 215 819 2469 2468 + 1 583 2493 4356 1584 + 1 584 2499 1592 4361 + 1 215 2472 2469 2473 + 1 215 2472 2468 2469 + 1 583 4353 4356 2498 + 1 583 2493 2498 4356 + 1 590 1585 4386 2795 + 1 256 2785 2786 860 + 1 592 4394 1822 2800 + 1 590 2789 4386 4384 + 1 590 2789 2795 4386 + 1 256 2790 2786 2791 + 1 256 2785 2791 2786 + 1 593 1595 2847 4399 + 1 595 4401 2865 1823 + 1 264 2835 868 2837 + 1 593 4397 2847 2841 + 1 593 4397 4399 2847 + 1 595 2843 2865 2849 + 1 595 4401 2849 2865 + 1 580 1461 4342 4340 + 1 581 4346 4348 1474 + 1 584 4358 1592 4359 + 1 580 4337 4342 4339 + 1 580 4337 4340 4342 + 1 581 4343 4348 4347 + 1 581 4346 4347 4348 + 1 580 1461 4341 4342 + 1 583 4354 1584 4356 + 1 584 4358 4361 1592 + 1 580 4338 4339 4342 + 1 580 4338 4342 4341 + 1 583 4353 4355 4356 + 1 583 4354 4356 4355 + 1 589 1476 4382 4381 + 1 591 4388 4392 1594 + 1 592 4393 1822 4395 + 1 589 4379 4382 4380 + 1 589 4379 4381 4382 + 1 591 4387 4392 4389 + 1 591 4388 4389 4392 + 1 590 1585 4385 4386 + 1 591 4390 1594 4392 + 1 592 4394 4395 1822 + 1 590 4383 4384 4386 + 1 590 4383 4386 4385 + 1 591 4387 4391 4392 + 1 591 4390 4392 4391 + 1 235 839 2622 2623 + 1 631 2646 1682 4568 + 1 632 2669 4573 1719 + 1 235 2628 2629 2623 + 1 235 2628 2623 2622 + 1 631 4565 2668 4568 + 1 631 2646 4568 2668 + 1 644 1683 2861 4629 + 1 265 2844 869 2846 + 1 648 4647 2869 1842 + 1 644 2850 4627 4629 + 1 644 2850 4629 2861 + 1 265 2852 2853 2846 + 1 265 2844 2846 2853 + 1 650 1721 4658 3061 + 1 653 4665 1843 3083 + 1 295 3045 3048 899 + 1 650 4656 3051 3061 + 1 650 4656 3061 4658 + 1 653 3054 3062 3083 + 1 653 4665 3083 3062 + 1 628 1596 4550 4552 + 1 629 4556 1608 4558 + 1 632 4570 4571 1719 + 1 628 4547 4549 4552 + 1 628 4547 4552 4550 + 1 629 4553 4557 4558 + 1 629 4556 4558 4557 + 1 628 1596 4552 4551 + 1 631 4566 4568 1682 + 1 632 4570 1719 4573 + 1 628 4548 4552 4549 + 1 628 4548 4551 4552 + 1 631 4565 4568 4567 + 1 631 4566 4567 4568 + 1 643 1611 4623 4625 + 1 645 4631 1720 4635 + 1 648 4646 4648 1842 + 1 643 4620 4622 4625 + 1 643 4620 4625 4623 + 1 645 4630 4632 4635 + 1 645 4631 4635 4632 + 1 644 1683 4629 4628 + 1 645 4633 4635 1720 + 1 648 4647 1842 4648 + 1 644 4626 4629 4627 + 1 644 4626 4628 4629 + 1 645 4630 4635 4634 + 1 645 4633 4634 4635 + 1 257 861 2793 2792 + 1 641 2801 4616 1824 + 1 642 2806 1833 4619 + 1 257 2796 2793 2797 + 1 257 2796 2792 2793 + 1 641 4613 4616 2805 + 1 641 2801 2805 4616 + 1 646 1825 4639 2866 + 1 265 2845 2846 869 + 1 648 4649 1842 2869 + 1 646 2851 4639 4637 + 1 646 2851 2866 4639 + 1 265 2852 2846 2854 + 1 265 2845 2854 2846 + 1 652 1835 3079 4664 + 1 653 4666 3083 1843 + 1 295 3047 899 3048 + 1 652 4663 3079 3053 + 1 652 4663 4664 3079 + 1 653 3054 3083 3080 + 1 653 4666 3080 3083 + 1 639 1597 4608 4606 + 1 640 4610 4612 1610 + 1 642 4617 1833 4618 + 1 639 4603 4608 4605 + 1 639 4603 4606 4608 + 1 640 4609 4612 4611 + 1 640 4610 4611 4612 + 1 639 1597 4607 4608 + 1 641 4614 1824 4616 + 1 642 4617 4619 1833 + 1 639 4604 4605 4608 + 1 639 4604 4608 4607 + 1 641 4613 4615 4616 + 1 641 4614 4616 4615 + 1 643 1611 4625 4624 + 1 647 4641 4645 1834 + 1 648 4646 1842 4650 + 1 643 4621 4625 4622 + 1 643 4621 4624 4625 + 1 647 4640 4645 4642 + 1 647 4641 4642 4645 + 1 646 1825 4638 4639 + 1 647 4643 1834 4645 + 1 648 4649 4650 1842 + 1 646 4636 4637 4639 + 1 646 4636 4639 4638 + 1 647 4640 4644 4645 + 1 647 4643 4645 4644 + 1 142 746 2021 2019 + 1 405 2035 1088 3597 + 1 403 2027 3587 1073 + 1 142 2025 2023 2019 + 1 142 2025 2019 2021 + 1 405 3584 2028 3597 + 1 405 2035 3597 2028 + 1 419 1092 2970 3653 + 1 286 2967 890 2983 + 1 625 3658 3014 1853 + 1 419 2985 3656 3653 + 1 419 2985 3653 2970 + 1 286 2989 2986 2983 + 1 286 2967 2983 2986 + 1 411 1075 3623 2874 + 1 617 3633 1852 2907 + 1 271 2872 2884 875 + 1 411 3625 2885 2874 + 1 411 3625 2874 3623 + 1 617 2888 2876 2907 + 1 617 3633 2907 2876 + 1 409 1544 3616 3613 + 1 407 3607 1520 3605 + 1 403 3589 3588 1073 + 1 409 3604 3586 3613 + 1 409 3604 3613 3616 + 1 407 3585 3606 3605 + 1 407 3607 3605 3606 + 1 409 1544 3613 3615 + 1 405 3601 3597 1088 + 1 403 3589 1073 3587 + 1 409 3596 3613 3586 + 1 409 3596 3615 3613 + 1 405 3584 3597 3598 + 1 405 3601 3598 3597 + 1 614 1524 3624 4496 + 1 412 3622 1076 3626 + 1 625 4506 3634 1853 + 1 614 3629 4498 4496 + 1 614 3629 4496 3624 + 1 412 3631 3630 3626 + 1 412 3622 3626 3630 + 1 419 1092 3653 3620 + 1 412 3618 3626 1076 + 1 625 3658 1853 3634 + 1 419 3627 3653 3656 + 1 419 3627 3620 3653 + 1 412 3631 3626 3628 + 1 412 3618 3628 3626 + 1 288 892 2974 3004 + 1 496 2977 1218 4013 + 1 703 3025 4025 1894 + 1 288 3006 3010 3004 + 1 288 3006 3004 2974 + 1 496 4016 3022 4013 + 1 496 2977 4013 3022 + 1 484 1215 2112 3944 + 1 159 2100 763 2102 + 1 486 3957 2119 1230 + 1 484 2104 3939 3944 + 1 484 2104 3944 2112 + 1 159 2106 2108 2102 + 1 159 2100 2102 2108 + 1 714 1895 4037 3155 + 1 503 4035 1232 3132 + 1 311 3142 3130 915 + 1 714 4036 3146 3155 + 1 714 4036 3155 4037 + 1 503 3143 3152 3132 + 1 503 4035 3132 3152 + 1 488 1207 3967 3969 + 1 700 3982 1801 4854 + 1 703 3996 4859 1894 + 1 488 3972 3974 3969 + 1 488 3972 3969 3967 + 1 700 4853 3995 4854 + 1 700 3982 4854 3995 + 1 488 1207 3969 3941 + 1 496 3946 4013 1218 + 1 703 3996 1894 4025 + 1 488 3970 3969 3974 + 1 488 3970 3941 3969 + 1 496 4016 4013 3991 + 1 496 3946 3991 4013 + 1 490 1796 3983 3981 + 1 492 3997 1890 3994 + 1 486 3958 3959 1230 + 1 490 3980 3955 3981 + 1 490 3980 3981 3983 + 1 492 3956 3993 3994 + 1 492 3997 3994 3993 + 1 484 1215 3944 3948 + 1 492 3992 3994 1890 + 1 486 3957 1230 3959 + 1 484 3943 3944 3939 + 1 484 3943 3948 3944 + 1 492 3956 3994 3990 + 1 492 3992 3990 3994 + 1 272 876 2890 2877 + 1 664 2911 1862 3764 + 1 444 2879 3754 1135 + 1 272 2894 2891 2877 + 1 272 2894 2877 2890 + 1 664 3756 2881 3764 + 1 664 2911 3764 2881 + 1 667 1863 3149 3768 + 1 310 3135 914 3126 + 1 447 3766 3128 1142 + 1 667 3139 3767 3768 + 1 667 3139 3768 3149 + 1 310 3136 3137 3126 + 1 310 3135 3126 3137 + 1 439 1133 3735 2060 + 1 440 3739 1140 2063 + 1 150 2055 2056 754 + 1 439 3732 2057 2060 + 1 439 3732 2060 3735 + 1 440 2058 2061 2063 + 1 440 3739 2063 2061 + 1 662 1654 3748 3760 + 1 441 3742 1129 3733 + 1 444 3753 3736 1135 + 1 662 3745 3755 3760 + 1 662 3745 3760 3748 + 1 441 3743 3744 3733 + 1 441 3742 3733 3744 + 1 662 1654 3760 4700 + 1 664 4705 3764 1862 + 1 444 3753 1135 3754 + 1 662 4698 3760 3755 + 1 662 4698 4700 3760 + 1 664 3756 3764 3761 + 1 664 4705 3761 3764 + 1 442 1130 3734 3738 + 1 445 3737 1136 3749 + 1 447 3741 3751 1142 + 1 442 3746 3747 3738 + 1 442 3746 3738 3734 + 1 445 3758 3740 3749 + 1 445 3737 3749 3740 + 1 667 1863 3768 3765 + 1 445 3757 3749 1136 + 1 447 3766 1142 3751 + 1 667 3762 3768 3767 + 1 667 3762 3765 3768 + 1 445 3758 3749 3759 + 1 445 3757 3759 3749 + 1 244 848 2700 2702 + 1 609 2721 1633 4474 + 1 612 2736 4488 1745 + 1 244 2706 2708 2702 + 1 244 2706 2702 2700 + 1 609 4473 2735 4474 + 1 609 2721 4474 2735 + 1 598 1632 2535 4416 + 1 224 2525 828 2526 + 1 599 4420 2540 1642 + 1 598 2529 4413 4416 + 1 598 2529 4416 2535 + 1 224 2530 2531 2526 + 1 224 2525 2526 2531 + 1 616 1746 4503 2898 + 1 615 4500 1643 2892 + 1 271 2883 2882 875 + 1 616 4499 2887 2898 + 1 616 4499 2898 4503 + 1 615 2886 2897 2892 + 1 615 4500 2892 2897 + 1 596 1485 4402 4404 + 1 607 4410 1523 4464 + 1 612 4424 4486 1745 + 1 596 4405 4407 4404 + 1 596 4405 4404 4402 + 1 607 4462 4422 4464 + 1 607 4410 4464 4422 + 1 596 1485 4404 4403 + 1 609 4415 4474 1633 + 1 612 4424 1745 4488 + 1 596 4406 4404 4407 + 1 596 4406 4403 4404 + 1 609 4473 4474 4423 + 1 609 4415 4423 4474 + 1 597 1522 4412 4411 + 1 600 4426 1744 4429 + 1 599 4419 4421 1642 + 1 597 4409 4408 4411 + 1 597 4409 4411 4412 + 1 600 4418 4425 4429 + 1 600 4426 4429 4425 + 1 598 1632 4416 4417 + 1 600 4428 4429 1744 + 1 599 4420 1642 4421 + 1 598 4414 4416 4413 + 1 598 4414 4417 4416 + 1 600 4418 4429 4427 + 1 600 4428 4427 4429 + 1 244 848 2702 2703 + 1 613 2746 4494 1760 + 1 612 2736 1745 4489 + 1 244 2709 2702 2708 + 1 244 2709 2703 2702 + 1 613 4485 4494 2737 + 1 613 2746 2737 4494 + 1 624 1761 4537 3007 + 1 286 2982 2983 890 + 1 625 4539 1853 3014 + 1 624 2988 4537 4534 + 1 624 2988 3007 4537 + 1 286 2989 2983 2991 + 1 286 2982 2991 2983 + 1 616 1746 2898 4504 + 1 617 4507 2907 1852 + 1 271 2883 875 2884 + 1 616 4501 2898 2887 + 1 616 4501 4504 2898 + 1 617 2888 2907 2899 + 1 617 4507 2899 2907 + 1 608 1548 4471 4469 + 1 607 4463 4464 1523 + 1 612 4487 1745 4486 + 1 608 4461 4471 4467 + 1 608 4461 4469 4471 + 1 607 4462 4464 4465 + 1 607 4463 4465 4464 + 1 608 1548 4472 4471 + 1 613 4491 1760 4494 + 1 612 4487 4489 1745 + 1 608 4468 4467 4471 + 1 608 4468 4471 4472 + 1 613 4485 4490 4494 + 1 613 4491 4494 4490 + 1 614 1524 4496 4495 + 1 623 4502 4532 1747 + 1 625 4506 1853 4538 + 1 614 4497 4496 4498 + 1 614 4497 4495 4496 + 1 623 4530 4532 4505 + 1 623 4502 4505 4532 + 1 624 1761 4536 4537 + 1 623 4531 1747 4532 + 1 625 4539 4538 1853 + 1 624 4529 4534 4537 + 1 624 4529 4537 4536 + 1 623 4530 4533 4532 + 1 623 4531 4532 4533 + 1 225 829 2532 2533 + 1 658 2541 1644 4682 + 1 659 2546 4687 1653 + 1 225 2536 2537 2533 + 1 225 2536 2533 2532 + 1 658 4680 2545 4682 + 1 658 2541 4682 2545 + 1 663 1646 2893 4701 + 1 273 2889 877 2896 + 1 698 4706 2912 1864 + 1 663 2900 4703 4701 + 1 663 2900 4701 2893 + 1 273 2903 2901 2896 + 1 273 2889 2896 2901 + 1 666 1656 4712 3138 + 1 713 4716 1865 3150 + 1 311 3134 3141 915 + 1 666 4714 3144 3138 + 1 666 4714 3138 4712 + 1 713 3145 3140 3150 + 1 713 4716 3150 3140 + 1 660 1748 4693 4692 + 1 661 4696 1798 4695 + 1 659 4688 4689 1653 + 1 660 4690 4685 4692 + 1 660 4690 4692 4693 + 1 661 4686 4694 4695 + 1 661 4696 4695 4694 + 1 660 1748 4692 4691 + 1 658 4683 4682 1644 + 1 659 4688 1653 4687 + 1 660 4681 4692 4685 + 1 660 4681 4691 4692 + 1 658 4680 4682 4684 + 1 658 4683 4684 4682 + 1 696 1800 4713 4834 + 1 665 4707 1655 4708 + 1 698 4842 4715 1864 + 1 696 4709 4831 4834 + 1 696 4709 4834 4713 + 1 665 4710 4711 4708 + 1 665 4707 4708 4711 + 1 663 1646 4701 4697 + 1 665 4699 4708 1655 + 1 698 4706 1864 4715 + 1 663 4702 4701 4703 + 1 663 4702 4697 4701 + 1 665 4710 4708 4704 + 1 665 4699 4704 4708 + 1 288 892 3004 3003 + 1 702 3015 4858 1855 + 1 703 3025 1894 4860 + 1 288 3009 3004 3010 + 1 288 3009 3003 3004 + 1 702 4857 4858 3024 + 1 702 3015 3024 4858 + 1 697 1854 4839 2908 + 1 273 2895 2896 877 + 1 698 4843 1864 2912 + 1 697 2902 4839 4836 + 1 697 2902 2908 4839 + 1 273 2903 2896 2904 + 1 273 2895 2904 2896 + 1 714 1895 3155 4898 + 1 713 4897 3150 1865 + 1 311 3142 915 3141 + 1 714 4896 3155 3146 + 1 714 4896 4898 3155 + 1 713 3145 3150 3154 + 1 713 4897 3154 3150 + 1 695 1751 4827 4825 + 1 700 4833 4854 1801 + 1 703 4847 1894 4859 + 1 695 4828 4827 4830 + 1 695 4828 4825 4827 + 1 700 4853 4854 4845 + 1 700 4833 4845 4854 + 1 695 1751 4826 4827 + 1 702 4838 1855 4858 + 1 703 4847 4860 1894 + 1 695 4829 4830 4827 + 1 695 4829 4827 4826 + 1 702 4857 4846 4858 + 1 702 4838 4858 4846 + 1 696 1800 4834 4835 + 1 699 4849 4852 1893 + 1 698 4842 1864 4844 + 1 696 4832 4834 4831 + 1 696 4832 4835 4834 + 1 699 4841 4852 4848 + 1 699 4849 4848 4852 + 1 697 1854 4840 4839 + 1 699 4851 1893 4852 + 1 698 4843 4844 1864 + 1 697 4837 4836 4839 + 1 697 4837 4839 4840 + 1 699 4841 4850 4852 + 1 699 4851 4852 4850 + 1 130 734 1956 1957 + 1 340 1970 975 3289 + 1 341 1985 3296 1000 + 1 130 1959 1960 1957 + 1 130 1959 1957 1956 + 1 340 3287 1984 3289 + 1 340 1970 3289 1984 + 1 354 979 2382 3363 + 1 205 2378 809 2395 + 1 533 3374 2418 1494 + 1 354 2396 3365 3363 + 1 354 2396 3363 2382 + 1 205 2399 2397 2395 + 1 205 2378 2395 2397 + 1 369 1006 3434 2553 + 1 538 3444 1495 2616 + 1 230 2548 2575 834 + 1 369 3437 2576 2553 + 1 369 3437 2553 3434 + 1 538 2581 2558 2616 + 1 538 3444 2616 2558 + 1 343 1288 3306 3305 + 1 344 3311 1298 3309 + 1 341 3297 3298 1000 + 1 343 3303 3292 3305 + 1 343 3303 3305 3306 + 1 344 3293 3308 3309 + 1 344 3311 3309 3308 + 1 343 1288 3305 3304 + 1 340 3290 3289 975 + 1 341 3297 1000 3296 + 1 343 3288 3305 3292 + 1 343 3288 3304 3305 + 1 340 3287 3289 3291 + 1 340 3290 3291 3289 + 1 530 1304 3435 4153 + 1 368 3428 1005 3429 + 1 533 4164 3443 1494 + 1 530 3430 4151 4153 + 1 530 3430 4153 3435 + 1 368 3431 3432 3429 + 1 368 3428 3429 3432 + 1 354 979 3363 3349 + 1 368 3353 3429 1005 + 1 533 3374 1494 3443 + 1 354 3364 3363 3365 + 1 354 3364 3349 3363 + 1 368 3431 3429 3371 + 1 368 3353 3371 3429 + 1 206 810 2386 2402 + 1 406 2390 1067 3602 + 1 556 2442 3611 1534 + 1 206 2403 2406 2402 + 1 206 2403 2402 2386 + 1 406 3603 2438 3602 + 1 406 2390 3602 2438 + 1 398 1063 2022 3559 + 1 141 2014 745 2015 + 1 399 3564 2031 1080 + 1 398 2016 3556 3559 + 1 398 2016 3559 2022 + 1 141 2017 2018 2015 + 1 141 2014 2015 2018 + 1 564 1536 3643 2944 + 1 415 3639 1083 2917 + 1 278 2927 2914 882 + 1 564 3640 2931 2944 + 1 564 3640 2944 3643 + 1 415 2929 2941 2917 + 1 415 3639 2917 2941 + 1 400 1058 3567 3568 + 1 554 3574 1379 4246 + 1 556 3582 4252 1534 + 1 400 3570 3571 3568 + 1 400 3570 3568 3567 + 1 554 4243 3581 4246 + 1 554 3574 4246 3581 + 1 400 1058 3568 3557 + 1 406 3560 3602 1067 + 1 556 3582 1534 3611 + 1 400 3569 3568 3571 + 1 400 3569 3557 3568 + 1 406 3603 3602 3577 + 1 406 3560 3577 3602 + 1 401 1376 3575 3573 + 1 402 3583 1530 3580 + 1 399 3565 3566 1080 + 1 401 3572 3562 3573 + 1 401 3572 3573 3575 + 1 402 3563 3579 3580 + 1 402 3583 3580 3579 + 1 398 1063 3559 3561 + 1 402 3578 3580 1530 + 1 399 3564 1080 3566 + 1 398 3558 3559 3556 + 1 398 3558 3561 3559 + 1 402 3563 3580 3576 + 1 402 3578 3576 3580 + 1 232 836 2596 2560 + 1 575 2652 1692 3860 + 1 460 2565 3842 1160 + 1 232 2602 2597 2560 + 1 232 2602 2560 2596 + 1 575 3845 2570 3860 + 1 575 2652 3860 2570 + 1 578 1693 2953 3909 + 1 279 2933 883 2920 + 1 473 3906 2923 1181 + 1 578 2938 3907 3909 + 1 578 2938 3909 2953 + 1 279 2934 2935 2920 + 1 279 2933 2920 2935 + 1 449 1155 3775 2076 + 1 451 3785 1178 2089 + 1 153 2065 2067 757 + 1 449 3770 2068 2076 + 1 449 3770 2076 3775 + 1 451 2070 2077 2089 + 1 451 3785 2089 2077 + 1 572 1430 3802 3849 + 1 452 3789 1149 3771 + 1 460 3840 3776 1160 + 1 572 3794 3843 3849 + 1 572 3794 3849 3802 + 1 452 3791 3792 3771 + 1 452 3789 3771 3792 + 1 572 1430 3849 4322 + 1 575 4327 3860 1692 + 1 460 3840 1160 3842 + 1 572 4321 3849 3843 + 1 572 4321 4322 3849 + 1 575 3845 3860 3850 + 1 575 4327 3850 3860 + 1 454 1151 3772 3784 + 1 461 3777 1161 3818 + 1 473 3787 3822 1181 + 1 454 3800 3801 3784 + 1 454 3800 3784 3772 + 1 461 3847 3786 3818 + 1 461 3777 3818 3786 + 1 578 1693 3909 3861 + 1 461 3846 3818 1161 + 1 473 3906 1181 3822 + 1 578 3851 3909 3907 + 1 578 3851 3861 3909 + 1 461 3847 3818 3848 + 1 461 3846 3848 3818 + 1 180 784 2218 2220 + 1 516 2228 1344 4093 + 1 518 2240 4101 1362 + 1 180 2222 2224 2220 + 1 180 2222 2220 2218 + 1 516 4090 2238 4093 + 1 516 2228 4093 2238 + 1 522 1345 2284 4120 + 1 187 2265 791 2267 + 1 525 4134 2300 1402 + 1 522 2271 4118 4120 + 1 522 2271 4120 2284 + 1 187 2273 2274 2267 + 1 187 2265 2267 2274 + 1 534 1365 4169 2586 + 1 536 4177 1403 2598 + 1 230 2572 2573 834 + 1 534 4167 2578 2586 + 1 534 4167 2586 4169 + 1 536 2579 2587 2598 + 1 536 4177 2598 2587 + 1 513 1268 4075 4077 + 1 515 4085 1301 4089 + 1 518 4098 4100 1362 + 1 513 4072 4074 4077 + 1 513 4072 4077 4075 + 1 515 4084 4086 4089 + 1 515 4085 4089 4086 + 1 513 1268 4077 4076 + 1 516 4091 4093 1344 + 1 518 4098 1362 4101 + 1 513 4073 4077 4074 + 1 513 4073 4076 4077 + 1 516 4090 4093 4092 + 1 516 4091 4092 4093 + 1 520 1302 4112 4114 + 1 523 4122 1363 4126 + 1 525 4133 4135 1402 + 1 520 4108 4110 4114 + 1 520 4108 4114 4112 + 1 523 4121 4123 4126 + 1 523 4122 4126 4123 + 1 522 1345 4120 4119 + 1 523 4124 4126 1363 + 1 525 4134 1402 4135 + 1 522 4117 4120 4118 + 1 522 4117 4119 4120 + 1 523 4121 4126 4125 + 1 523 4124 4125 4126 + 1 180 784 2220 2219 + 1 517 2234 4097 1354 + 1 518 2240 1362 4102 + 1 180 2223 2220 2224 + 1 180 2223 2219 2220 + 1 517 4094 4097 2239 + 1 517 2234 2239 4097 + 1 531 1355 4157 2404 + 1 205 2394 2395 809 + 1 533 4165 1494 2418 + 1 531 2398 4157 4155 + 1 531 2398 2404 4157 + 1 205 2399 2395 2400 + 1 205 2394 2400 2395 + 1 534 1365 2586 4170 + 1 538 4182 2616 1495 + 1 230 2572 834 2575 + 1 534 4168 2586 2578 + 1 534 4168 4170 2586 + 1 538 2581 2616 2588 + 1 538 4182 2588 2616 + 1 514 1291 4083 4081 + 1 515 4087 4089 1301 + 1 518 4099 1362 4100 + 1 514 4078 4083 4080 + 1 514 4078 4081 4083 + 1 515 4084 4089 4088 + 1 515 4087 4088 4089 + 1 514 1291 4082 4083 + 1 517 4095 1354 4097 + 1 518 4099 4102 1362 + 1 514 4079 4080 4083 + 1 514 4079 4083 4082 + 1 517 4094 4096 4097 + 1 517 4095 4097 4096 + 1 530 1304 4153 4152 + 1 532 4159 4163 1364 + 1 533 4164 1494 4166 + 1 530 4150 4153 4151 + 1 530 4150 4152 4153 + 1 532 4158 4163 4160 + 1 532 4159 4160 4163 + 1 531 1355 4156 4157 + 1 532 4161 1364 4163 + 1 533 4165 4166 1494 + 1 531 4154 4155 4157 + 1 531 4154 4157 4156 + 1 532 4158 4162 4163 + 1 532 4161 4163 4162 + 1 189 793 2281 2282 + 1 551 2301 1404 4233 + 1 552 2312 4236 1427 + 1 189 2285 2286 2282 + 1 189 2285 2282 2281 + 1 551 4230 2311 4233 + 1 551 2301 4233 2311 + 1 558 1405 2599 4263 + 1 231 2583 835 2585 + 1 562 4281 2651 1690 + 1 558 2589 4261 4263 + 1 558 2589 4263 2599 + 1 231 2591 2592 2585 + 1 231 2583 2585 2592 + 1 563 1429 4286 2936 + 1 565 4289 1691 2952 + 1 278 2926 2928 882 + 1 563 4285 2930 2936 + 1 563 4285 2936 4286 + 1 565 2932 2937 2952 + 1 565 4289 2952 2937 + 1 549 1366 4223 4225 + 1 550 4227 1378 4229 + 1 552 4234 4235 1427 + 1 549 4220 4222 4225 + 1 549 4220 4225 4223 + 1 550 4226 4228 4229 + 1 550 4227 4229 4228 + 1 549 1366 4225 4224 + 1 551 4231 4233 1404 + 1 552 4234 1427 4236 + 1 549 4221 4225 4222 + 1 549 4221 4224 4225 + 1 551 4230 4233 4232 + 1 551 4231 4232 4233 + 1 557 1380 4257 4259 + 1 559 4265 1428 4269 + 1 562 4280 4282 1690 + 1 557 4254 4256 4259 + 1 557 4254 4259 4257 + 1 559 4264 4266 4269 + 1 559 4265 4269 4266 + 1 558 1405 4263 4262 + 1 559 4267 4269 1428 + 1 562 4281 1690 4282 + 1 558 4260 4263 4261 + 1 558 4260 4262 4263 + 1 559 4264 4269 4268 + 1 559 4267 4268 4269 + 1 206 810 2402 2401 + 1 555 2419 4250 1496 + 1 556 2442 1534 4253 + 1 206 2405 2402 2406 + 1 206 2405 2401 2402 + 1 555 4247 4250 2441 + 1 555 2419 2441 4250 + 1 560 1497 4273 2617 + 1 231 2584 2585 835 + 1 562 4283 1690 2651 + 1 560 2590 4273 4271 + 1 560 2590 2617 4273 + 1 231 2591 2585 2593 + 1 231 2584 2593 2585 + 1 564 1536 2944 4288 + 1 565 4290 2952 1691 + 1 278 2927 882 2928 + 1 564 4287 2944 2931 + 1 564 4287 4288 2944 + 1 565 2932 2952 2945 + 1 565 4290 2945 2952 + 1 553 1367 4242 4240 + 1 554 4244 4246 1379 + 1 556 4251 1534 4252 + 1 553 4237 4242 4239 + 1 553 4237 4240 4242 + 1 554 4243 4246 4245 + 1 554 4244 4245 4246 + 1 553 1367 4241 4242 + 1 555 4248 1496 4250 + 1 556 4251 4253 1534 + 1 553 4238 4239 4242 + 1 553 4238 4242 4241 + 1 555 4247 4249 4250 + 1 555 4248 4250 4249 + 1 557 1380 4259 4258 + 1 561 4275 4279 1535 + 1 562 4280 1690 4284 + 1 557 4255 4259 4256 + 1 557 4255 4258 4259 + 1 561 4274 4279 4276 + 1 561 4275 4276 4279 + 1 560 1497 4272 4273 + 1 561 4277 1535 4279 + 1 562 4283 4284 1690 + 1 560 4270 4271 4273 + 1 560 4270 4273 4272 + 1 561 4274 4278 4279 + 1 561 4277 4279 4278 + 1 130 734 1957 1955 + 1 341 1985 1000 3294 + 1 339 1963 3284 966 + 1 130 1960 1958 1955 + 1 130 1960 1955 1957 + 1 341 3281 1964 3294 + 1 341 1985 3294 1964 + 1 369 1006 2553 3433 + 1 230 2548 834 2574 + 1 537 3439 2607 1448 + 1 369 2576 3436 3433 + 1 369 2576 3433 2553 + 1 230 2580 2577 2574 + 1 230 2548 2574 2577 + 1 347 969 3325 2317 + 1 529 3340 1447 2361 + 1 196 2314 2330 800 + 1 347 3327 2331 2317 + 1 347 3327 2317 3325 + 1 529 2334 2320 2361 + 1 529 3340 2361 2320 + 1 344 1298 3310 3307 + 1 342 3302 1278 3300 + 1 339 3286 3285 966 + 1 344 3299 3283 3307 + 1 344 3299 3307 3310 + 1 342 3282 3301 3300 + 1 342 3302 3300 3301 + 1 344 1298 3307 3309 + 1 341 3298 3294 1000 + 1 339 3286 966 3284 + 1 344 3293 3307 3283 + 1 344 3293 3309 3307 + 1 341 3281 3294 3295 + 1 341 3298 3295 3294 + 1 526 1282 3326 4138 + 1 348 3324 970 3328 + 1 537 4148 3341 1448 + 1 526 3331 4140 4138 + 1 526 3331 4138 3326 + 1 348 3333 3332 3328 + 1 348 3324 3328 3332 + 1 369 1006 3433 3322 + 1 348 3318 3328 970 + 1 537 3439 1448 3341 + 1 369 3329 3433 3436 + 1 369 3329 3322 3433 + 1 348 3333 3328 3330 + 1 348 3318 3330 3328 + 1 232 836 2560 2595 + 1 460 2565 1160 3841 + 1 574 2644 3855 1678 + 1 232 2597 2601 2595 + 1 232 2597 2595 2560 + 1 460 3844 2641 3841 + 1 460 2565 3841 2641 + 1 449 1155 2076 3774 + 1 153 2065 757 2066 + 1 450 3781 2084 1169 + 1 449 2068 3769 3774 + 1 449 2068 3774 2076 + 1 153 2069 2071 2066 + 1 153 2065 2066 2071 + 1 577 1679 3892 2859 + 1 468 3888 1172 2818 + 1 263 2830 2815 867 + 1 577 3889 2834 2859 + 1 577 3889 2859 3892 + 1 468 2831 2856 2818 + 1 468 3888 2818 2856 + 1 452 1149 3788 3790 + 1 571 3798 1419 4320 + 1 574 3809 4325 1678 + 1 452 3793 3795 3790 + 1 452 3793 3790 3788 + 1 571 4319 3808 4320 + 1 571 3798 4320 3808 + 1 452 1149 3790 3771 + 1 460 3776 3841 1160 + 1 574 3809 1678 3855 + 1 452 3791 3790 3795 + 1 452 3791 3771 3790 + 1 460 3844 3841 3804 + 1 460 3776 3804 3841 + 1 453 1414 3799 3797 + 1 455 3810 1674 3807 + 1 450 3782 3783 1169 + 1 453 3796 3779 3797 + 1 453 3796 3797 3799 + 1 455 3780 3806 3807 + 1 455 3810 3807 3806 + 1 449 1155 3774 3778 + 1 455 3805 3807 1674 + 1 450 3781 1169 3783 + 1 449 3773 3774 3769 + 1 449 3773 3778 3774 + 1 455 3780 3807 3803 + 1 455 3805 3803 3807 + 1 197 801 2336 2321 + 1 545 2373 1470 3530 + 1 387 2324 3515 1035 + 1 197 2340 2337 2321 + 1 197 2340 2321 2336 + 1 545 3517 2327 3530 + 1 545 2373 3530 2327 + 1 548 1471 2839 3551 + 1 262 2823 866 2808 + 1 394 3543 2811 1050 + 1 548 2827 3544 3551 + 1 548 2827 3551 2839 + 1 262 2824 2825 2808 + 1 262 2823 2808 2825 + 1 381 1032 3488 2003 + 1 382 3492 1047 2010 + 1 137 1997 1998 741 + 1 381 3485 1999 2003 + 1 381 3485 2003 3488 + 1 382 2000 2004 2010 + 1 382 3492 2010 2004 + 1 543 1336 3501 3521 + 1 383 3495 1028 3486 + 1 387 3514 3489 1035 + 1 543 3498 3516 3521 + 1 543 3498 3521 3501 + 1 383 3496 3497 3486 + 1 383 3495 3486 3497 + 1 543 1336 3521 4203 + 1 545 4208 3530 1470 + 1 387 3514 1035 3515 + 1 543 4201 3521 3516 + 1 543 4201 4203 3521 + 1 545 3517 3530 3522 + 1 545 4208 3522 3530 + 1 384 1029 3487 3491 + 1 388 3490 1036 3507 + 1 394 3494 3511 1050 + 1 384 3499 3500 3491 + 1 384 3499 3491 3487 + 1 388 3519 3493 3507 + 1 388 3490 3507 3493 + 1 548 1471 3551 3531 + 1 388 3518 3507 1036 + 1 394 3543 1050 3511 + 1 548 3523 3551 3544 + 1 548 3523 3531 3551 + 1 388 3519 3507 3520 + 1 388 3518 3520 3507 + 1 187 791 2264 2266 + 1 521 2278 1315 4116 + 1 524 2290 4130 1387 + 1 187 2270 2272 2266 + 1 187 2270 2266 2264 + 1 521 4115 2289 4116 + 1 521 2278 4116 2289 + 1 510 1314 2195 4058 + 1 174 2185 778 2186 + 1 511 4062 2200 1324 + 1 510 2189 4055 4058 + 1 510 2189 4058 2195 + 1 174 2190 2191 2186 + 1 174 2185 2186 2191 + 1 528 1388 4145 2344 + 1 527 4142 1325 2338 + 1 196 2329 2328 800 + 1 528 4141 2333 2344 + 1 528 4141 2344 4145 + 1 527 2332 2343 2338 + 1 527 4142 2338 2343 + 1 508 1247 4044 4046 + 1 519 4052 1281 4106 + 1 524 4066 4128 1387 + 1 508 4047 4049 4046 + 1 508 4047 4046 4044 + 1 519 4104 4064 4106 + 1 519 4052 4106 4064 + 1 508 1247 4046 4045 + 1 521 4057 4116 1315 + 1 524 4066 1387 4130 + 1 508 4048 4046 4049 + 1 508 4048 4045 4046 + 1 521 4115 4116 4065 + 1 521 4057 4065 4116 + 1 509 1280 4054 4053 + 1 512 4068 1386 4071 + 1 511 4061 4063 1324 + 1 509 4051 4050 4053 + 1 509 4051 4053 4054 + 1 512 4060 4067 4071 + 1 512 4068 4071 4067 + 1 510 1314 4058 4059 + 1 512 4070 4071 1386 + 1 511 4062 1324 4063 + 1 510 4056 4058 4055 + 1 510 4056 4059 4058 + 1 512 4060 4071 4069 + 1 512 4070 4069 4071 + 1 187 791 2266 2267 + 1 525 2300 4136 1402 + 1 524 2290 1387 4131 + 1 187 2273 2266 2272 + 1 187 2273 2267 2266 + 1 525 4127 4136 2291 + 1 525 2300 2291 4136 + 1 536 1403 4179 2598 + 1 230 2573 2574 834 + 1 537 4181 1448 2607 + 1 536 2579 4179 4176 + 1 536 2579 2598 4179 + 1 230 2580 2574 2582 + 1 230 2573 2582 2574 + 1 528 1388 2344 4146 + 1 529 4149 2361 1447 + 1 196 2329 800 2330 + 1 528 4143 2344 2333 + 1 528 4143 4146 2344 + 1 529 2334 2361 2345 + 1 529 4149 2345 2361 + 1 520 1302 4113 4111 + 1 519 4105 4106 1281 + 1 524 4129 1387 4128 + 1 520 4103 4113 4109 + 1 520 4103 4111 4113 + 1 519 4104 4106 4107 + 1 519 4105 4107 4106 + 1 520 1302 4114 4113 + 1 525 4133 1402 4136 + 1 524 4129 4131 1387 + 1 520 4110 4109 4113 + 1 520 4110 4113 4114 + 1 525 4127 4132 4136 + 1 525 4133 4136 4132 + 1 526 1282 4138 4137 + 1 535 4144 4174 1389 + 1 537 4148 1448 4180 + 1 526 4139 4138 4140 + 1 526 4139 4137 4138 + 1 535 4172 4174 4147 + 1 535 4144 4147 4174 + 1 536 1403 4178 4179 + 1 535 4173 1389 4174 + 1 537 4181 4180 1448 + 1 536 4171 4176 4179 + 1 536 4171 4179 4178 + 1 535 4172 4175 4174 + 1 535 4173 4174 4175 + 1 175 779 2192 2193 + 1 539 2201 1326 4185 + 1 540 2206 4190 1335 + 1 175 2196 2197 2193 + 1 175 2196 2193 2192 + 1 539 4183 2205 4185 + 1 539 2201 4185 2205 + 1 544 1328 2339 4204 + 1 198 2335 802 2342 + 1 569 4209 2374 1472 + 1 544 2346 4206 4204 + 1 544 2346 4204 2339 + 1 198 2349 2347 2342 + 1 198 2335 2342 2347 + 1 547 1338 4215 2826 + 1 576 4219 1473 2840 + 1 263 2822 2829 867 + 1 547 4217 2832 2826 + 1 547 4217 2826 4215 + 1 576 2833 2828 2840 + 1 576 4219 2840 2828 + 1 541 1390 4196 4195 + 1 542 4199 1416 4198 + 1 540 4191 4192 1335 + 1 541 4193 4188 4195 + 1 541 4193 4195 4196 + 1 542 4189 4197 4198 + 1 542 4199 4198 4197 + 1 541 1390 4195 4194 + 1 539 4186 4185 1326 + 1 540 4191 1335 4190 + 1 541 4184 4195 4188 + 1 541 4184 4194 4195 + 1 539 4183 4185 4187 + 1 539 4186 4187 4185 + 1 567 1418 4216 4300 + 1 546 4210 1337 4211 + 1 569 4308 4218 1472 + 1 567 4212 4297 4300 + 1 567 4212 4300 4216 + 1 546 4213 4214 4211 + 1 546 4210 4211 4214 + 1 544 1328 4204 4200 + 1 546 4202 4211 1337 + 1 569 4209 1472 4218 + 1 544 4205 4204 4206 + 1 544 4205 4200 4204 + 1 546 4213 4211 4207 + 1 546 4202 4207 4211 + 1 232 836 2595 2594 + 1 573 2608 4324 1450 + 1 574 2644 1678 4326 + 1 232 2600 2595 2601 + 1 232 2600 2594 2595 + 1 573 4323 4324 2643 + 1 573 2608 2643 4324 + 1 568 1449 4305 2362 + 1 198 2341 2342 802 + 1 569 4309 1472 2374 + 1 568 2348 4305 4302 + 1 568 2348 2362 4305 + 1 198 2349 2342 2350 + 1 198 2341 2350 2342 + 1 577 1679 2859 4330 + 1 576 4329 2840 1473 + 1 263 2830 867 2829 + 1 577 4328 2859 2834 + 1 577 4328 4330 2859 + 1 576 2833 2840 2858 + 1 576 4329 2858 2840 + 1 566 1393 4293 4291 + 1 571 4299 4320 1419 + 1 574 4313 1678 4325 + 1 566 4294 4293 4296 + 1 566 4294 4291 4293 + 1 571 4319 4320 4311 + 1 571 4299 4311 4320 + 1 566 1393 4292 4293 + 1 573 4304 1450 4324 + 1 574 4313 4326 1678 + 1 566 4295 4296 4293 + 1 566 4295 4293 4292 + 1 573 4323 4312 4324 + 1 573 4304 4324 4312 + 1 567 1418 4300 4301 + 1 570 4315 4318 1677 + 1 569 4308 1472 4310 + 1 567 4298 4300 4297 + 1 567 4298 4301 4300 + 1 570 4307 4318 4314 + 1 570 4315 4314 4318 + 1 568 1449 4306 4305 + 1 570 4317 1677 4318 + 1 569 4309 4310 1472 + 1 568 4303 4302 4305 + 1 568 4303 4305 4306 + 1 570 4307 4316 4318 + 1 570 4317 4318 4316 + 1 737 133 1975 1974 + 1 740 1975 136 1983 + 1 739 1974 1983 135 + 1 737 740 739 1974 + 1 737 740 1974 1975 + 1 740 739 1974 1983 + 1 740 1975 1983 1974 + 1 736 132 1968 1969 + 1 739 1968 135 1983 + 1 740 1969 1983 136 + 1 736 739 740 1969 + 1 736 739 1969 1968 + 1 739 740 1969 1983 + 1 739 1968 1983 1969 + 1 735 131 1961 1962 + 1 737 1961 133 1974 + 1 739 1962 1974 135 + 1 735 737 739 1962 + 1 735 737 1962 1961 + 1 737 739 1962 1974 + 1 737 1961 1974 1962 + 1 736 132 1969 1967 + 1 740 1969 136 1980 + 1 738 1967 1980 134 + 1 736 740 738 1967 + 1 736 740 1967 1969 + 1 740 738 1967 1980 + 1 740 1969 1980 1967 + 1 730 126 1939 1940 + 1 732 1939 128 1947 + 1 733 1940 1947 129 + 1 730 732 733 1940 + 1 730 732 1940 1939 + 1 732 733 1940 1947 + 1 732 1939 1947 1940 + 1 730 126 1940 1938 + 1 733 1940 129 1944 + 1 731 1938 1944 127 + 1 730 733 731 1938 + 1 730 733 1938 1940 + 1 733 731 1938 1944 + 1 733 1940 1944 1938 + 1 818 214 2462 2461 + 1 825 2462 221 2505 + 1 824 2461 2505 220 + 1 818 825 824 2461 + 1 818 825 2461 2462 + 1 825 824 2461 2505 + 1 825 2462 2505 2461 + 1 855 251 2691 2761 + 1 847 2691 243 2693 + 1 857 2761 2693 253 + 1 855 847 857 2761 + 1 855 847 2761 2691 + 1 847 857 2761 2693 + 1 847 2691 2693 2761 + 1 844 240 2665 2563 + 1 845 2665 241 2564 + 1 833 2563 2564 229 + 1 844 845 833 2563 + 1 844 845 2563 2665 + 1 845 833 2563 2564 + 1 845 2665 2564 2563 + 1 821 217 2474 2484 + 1 820 2474 216 2476 + 1 824 2484 2476 220 + 1 821 820 824 2484 + 1 821 820 2484 2474 + 1 820 824 2484 2476 + 1 820 2474 2476 2484 + 1 821 217 2484 2485 + 1 825 2485 2505 221 + 1 824 2484 220 2505 + 1 821 825 2484 824 + 1 821 825 2485 2484 + 1 825 824 2505 2484 + 1 825 2485 2484 2505 + 1 851 247 2725 2726 + 1 854 2725 250 2752 + 1 857 2726 2752 253 + 1 851 854 857 2726 + 1 851 854 2726 2725 + 1 854 857 2726 2752 + 1 854 2725 2752 2726 + 1 855 251 2761 2751 + 1 854 2751 2752 250 + 1 857 2761 253 2752 + 1 855 854 2761 857 + 1 855 854 2751 2761 + 1 854 857 2752 2761 + 1 854 2751 2761 2752 + 1 808 204 2388 2389 + 1 815 2388 211 2437 + 1 816 2389 2437 212 + 1 808 815 816 2389 + 1 808 815 2389 2388 + 1 815 816 2389 2437 + 1 815 2388 2437 2389 + 1 842 238 2562 2649 + 1 833 2562 229 2564 + 1 845 2649 2564 241 + 1 842 833 845 2649 + 1 842 833 2649 2562 + 1 833 845 2649 2564 + 1 833 2562 2564 2649 + 1 853 249 2744 2690 + 1 857 2744 253 2693 + 1 847 2690 2693 243 + 1 853 857 847 2690 + 1 853 857 2690 2744 + 1 857 847 2690 2693 + 1 857 2744 2693 2690 + 1 812 208 2414 2416 + 1 813 2414 209 2424 + 1 816 2416 2424 212 + 1 812 813 816 2416 + 1 812 813 2416 2414 + 1 813 816 2416 2424 + 1 813 2414 2424 2416 + 1 812 208 2416 2415 + 1 815 2415 2437 211 + 1 816 2416 212 2437 + 1 812 815 2416 816 + 1 812 815 2415 2416 + 1 815 816 2437 2416 + 1 815 2415 2416 2437 + 1 840 236 2631 2633 + 1 843 2631 239 2656 + 1 845 2633 2656 241 + 1 840 843 845 2633 + 1 840 843 2633 2631 + 1 843 845 2633 2656 + 1 843 2631 2656 2633 + 1 842 238 2649 2648 + 1 843 2648 2656 239 + 1 845 2649 241 2656 + 1 842 843 2649 845 + 1 842 843 2648 2649 + 1 843 845 2656 2649 + 1 843 2648 2649 2656 + 1 799 195 2322 2323 + 1 805 2322 201 2366 + 1 806 2323 2366 202 + 1 799 805 806 2323 + 1 799 805 2323 2322 + 1 805 806 2323 2366 + 1 805 2322 2366 2323 + 1 822 218 2460 2491 + 1 818 2460 214 2461 + 1 824 2491 2461 220 + 1 822 818 824 2491 + 1 822 818 2491 2460 + 1 818 824 2491 2461 + 1 818 2460 2461 2491 + 1 841 237 2640 2561 + 1 844 2640 240 2563 + 1 833 2561 2563 229 + 1 841 844 833 2561 + 1 841 844 2561 2640 + 1 844 833 2561 2563 + 1 844 2640 2563 2561 + 1 803 199 2351 2353 + 1 804 2351 200 2358 + 1 806 2353 2358 202 + 1 803 804 806 2353 + 1 803 804 2353 2351 + 1 804 806 2353 2358 + 1 804 2351 2358 2353 + 1 803 199 2353 2352 + 1 805 2352 2366 201 + 1 806 2353 202 2366 + 1 803 805 2353 806 + 1 803 805 2352 2353 + 1 805 806 2366 2353 + 1 805 2352 2353 2366 + 1 820 216 2475 2476 + 1 823 2475 219 2496 + 1 824 2476 2496 220 + 1 820 823 824 2476 + 1 820 823 2476 2475 + 1 823 824 2476 2496 + 1 823 2475 2496 2476 + 1 822 218 2491 2490 + 1 823 2490 2496 219 + 1 824 2491 220 2496 + 1 822 823 2491 824 + 1 822 823 2490 2491 + 1 823 824 2496 2491 + 1 823 2490 2491 2496 + 1 808 204 2389 2387 + 1 816 2389 212 2432 + 1 814 2387 2432 210 + 1 808 816 814 2387 + 1 808 816 2387 2389 + 1 816 814 2387 2432 + 1 816 2389 2432 2387 + 1 853 249 2690 2743 + 1 847 2690 243 2692 + 1 856 2743 2692 252 + 1 853 847 856 2743 + 1 853 847 2743 2690 + 1 847 856 2743 2692 + 1 847 2690 2692 2743 + 1 830 226 2538 2521 + 1 831 2538 227 2522 + 1 827 2521 2522 223 + 1 830 831 827 2521 + 1 830 831 2521 2538 + 1 831 827 2521 2522 + 1 831 2538 2522 2521 + 1 813 209 2407 2423 + 1 811 2407 207 2408 + 1 814 2423 2408 210 + 1 813 811 814 2423 + 1 813 811 2423 2407 + 1 811 814 2423 2408 + 1 811 2407 2408 2423 + 1 813 209 2423 2424 + 1 816 2424 2432 212 + 1 814 2423 210 2432 + 1 813 816 2423 814 + 1 813 816 2424 2423 + 1 816 814 2432 2423 + 1 816 2424 2423 2432 + 1 850 246 2718 2719 + 1 852 2718 248 2734 + 1 856 2719 2734 252 + 1 850 852 856 2719 + 1 850 852 2719 2718 + 1 852 856 2719 2734 + 1 852 2718 2734 2719 + 1 853 249 2743 2733 + 1 852 2733 2734 248 + 1 856 2743 252 2734 + 1 853 852 2743 856 + 1 853 852 2733 2743 + 1 852 856 2734 2743 + 1 852 2733 2743 2734 + 1 769 165 2131 2132 + 1 774 2131 170 2164 + 1 775 2132 2164 171 + 1 769 774 775 2132 + 1 769 774 2132 2131 + 1 774 775 2132 2164 + 1 774 2131 2164 2132 + 1 786 182 2213 2232 + 1 783 2213 179 2214 + 1 788 2232 2214 184 + 1 786 783 788 2232 + 1 786 783 2232 2213 + 1 783 788 2232 2214 + 1 783 2213 2214 2232 + 1 795 191 2298 2257 + 1 797 2298 193 2259 + 1 790 2257 2259 186 + 1 795 797 790 2257 + 1 795 797 2257 2298 + 1 797 790 2257 2259 + 1 797 2298 2259 2257 + 1 771 167 2143 2145 + 1 772 2143 168 2151 + 1 775 2145 2151 171 + 1 771 772 775 2145 + 1 771 772 2145 2143 + 1 772 775 2145 2151 + 1 772 2143 2151 2145 + 1 771 167 2145 2144 + 1 774 2144 2164 170 + 1 775 2145 171 2164 + 1 771 774 2145 775 + 1 771 774 2144 2145 + 1 774 775 2164 2145 + 1 774 2144 2145 2164 + 1 785 181 2225 2226 + 1 787 2225 183 2237 + 1 788 2226 2237 184 + 1 785 787 788 2226 + 1 785 787 2226 2225 + 1 787 788 2226 2237 + 1 787 2225 2237 2226 + 1 786 182 2232 2231 + 1 787 2231 2237 183 + 1 788 2232 184 2237 + 1 786 787 2232 788 + 1 786 787 2231 2232 + 1 787 788 2237 2232 + 1 787 2231 2232 2237 + 1 769 165 2132 2130 + 1 775 2132 171 2159 + 1 773 2130 2159 169 + 1 769 775 773 2130 + 1 769 775 2130 2132 + 1 775 773 2130 2159 + 1 775 2132 2159 2130 + 1 795 191 2257 2297 + 1 790 2257 186 2258 + 1 796 2297 2258 192 + 1 795 790 796 2297 + 1 795 790 2297 2257 + 1 790 796 2297 2258 + 1 790 2257 2258 2297 + 1 780 176 2198 2181 + 1 781 2198 177 2182 + 1 777 2181 2182 173 + 1 780 781 777 2181 + 1 780 781 2181 2198 + 1 781 777 2181 2182 + 1 781 2198 2182 2181 + 1 772 168 2136 2150 + 1 770 2136 166 2137 + 1 773 2150 2137 169 + 1 772 770 773 2150 + 1 772 770 2150 2136 + 1 770 773 2150 2137 + 1 770 2136 2137 2150 + 1 772 168 2150 2151 + 1 775 2151 2159 171 + 1 773 2150 169 2159 + 1 772 775 2150 773 + 1 772 775 2151 2150 + 1 775 773 2159 2150 + 1 775 2151 2150 2159 + 1 792 188 2275 2276 + 1 794 2275 190 2288 + 1 796 2276 2288 192 + 1 792 794 796 2276 + 1 792 794 2276 2275 + 1 794 796 2276 2288 + 1 794 2275 2288 2276 + 1 795 191 2297 2287 + 1 794 2287 2288 190 + 1 796 2297 192 2288 + 1 795 794 2297 796 + 1 795 794 2287 2297 + 1 794 796 2288 2297 + 1 794 2287 2297 2288 + 1 984 213 2458 2457 + 1 991 2458 363 3403 + 1 990 2457 3403 362 + 1 984 991 990 2457 + 1 984 991 2457 2458 + 1 991 990 2457 3403 + 1 991 2458 3403 2457 + 1 1021 378 2685 3477 + 1 1013 2685 242 2687 + 1 1023 3477 2687 380 + 1 1021 1013 1023 3477 + 1 1021 1013 3477 2685 + 1 1013 1023 3477 2687 + 1 1013 2685 2687 3477 + 1 1010 373 3453 2556 + 1 1011 3453 374 2557 + 1 999 2556 2557 228 + 1 1010 1011 999 2556 + 1 1010 1011 2556 3453 + 1 1011 999 2556 2557 + 1 1011 3453 2557 2556 + 1 987 359 3381 3388 + 1 986 3381 358 3383 + 1 990 3388 3383 362 + 1 987 986 990 3388 + 1 987 986 3388 3381 + 1 986 990 3388 3383 + 1 986 3381 3383 3388 + 1 987 359 3388 3389 + 1 991 3389 3403 363 + 1 990 3388 362 3403 + 1 987 991 3388 990 + 1 987 991 3389 3388 + 1 991 990 3403 3388 + 1 991 3389 3388 3403 + 1 1017 367 3426 3427 + 1 1020 3426 377 3473 + 1 1023 3427 3473 380 + 1 1017 1020 1023 3427 + 1 1017 1020 3427 3426 + 1 1020 1023 3427 3473 + 1 1020 3426 3473 3427 + 1 1021 378 3477 3472 + 1 1020 3472 3473 377 + 1 1023 3477 380 3473 + 1 1021 1020 3477 1023 + 1 1021 1020 3472 3477 + 1 1020 1023 3473 3477 + 1 1020 3472 3477 3473 + 1 974 203 2384 2385 + 1 981 2384 356 3370 + 1 982 2385 3370 357 + 1 974 981 982 2385 + 1 974 981 2385 2384 + 1 981 982 2385 3370 + 1 981 2384 3370 2385 + 1 1008 371 2555 3442 + 1 999 2555 228 2557 + 1 1011 3442 2557 374 + 1 1008 999 1011 3442 + 1 1008 999 3442 2555 + 1 999 1011 3442 2557 + 1 999 2555 2557 3442 + 1 1019 376 3468 2684 + 1 1023 3468 380 2687 + 1 1013 2684 2687 242 + 1 1019 1023 1013 2684 + 1 1019 1023 2684 3468 + 1 1023 1013 2684 2687 + 1 1023 3468 2687 2684 + 1 977 352 3348 3351 + 1 978 3348 353 3357 + 1 982 3351 3357 357 + 1 977 978 982 3351 + 1 977 978 3351 3348 + 1 978 982 3351 3357 + 1 978 3348 3357 3351 + 1 977 352 3351 3350 + 1 981 3350 3370 356 + 1 982 3351 357 3370 + 1 977 981 3351 982 + 1 977 981 3350 3351 + 1 981 982 3370 3351 + 1 981 3350 3351 3370 + 1 1004 367 3422 3424 + 1 1009 3422 372 3447 + 1 1011 3424 3447 374 + 1 1004 1009 1011 3424 + 1 1004 1009 3424 3422 + 1 1009 1011 3424 3447 + 1 1009 3422 3447 3424 + 1 1008 371 3442 3441 + 1 1009 3441 3447 372 + 1 1011 3442 374 3447 + 1 1008 1009 3442 1011 + 1 1008 1009 3441 3442 + 1 1009 1011 3447 3442 + 1 1009 3441 3442 3447 + 1 965 194 2318 2319 + 1 971 2318 349 3334 + 1 972 2319 3334 350 + 1 965 971 972 2319 + 1 965 971 2319 2318 + 1 971 972 2319 3334 + 1 971 2318 3334 2319 + 1 988 360 2456 3394 + 1 984 2456 213 2457 + 1 990 3394 2457 362 + 1 988 984 990 3394 + 1 988 984 3394 2456 + 1 984 990 3394 2457 + 1 984 2456 2457 3394 + 1 1007 370 3438 2554 + 1 1010 3438 373 2556 + 1 999 2554 2556 228 + 1 1007 1010 999 2554 + 1 1007 1010 2554 3438 + 1 1010 999 2554 2556 + 1 1010 3438 2556 2554 + 1 967 345 3312 3314 + 1 968 3312 346 3319 + 1 972 3314 3319 350 + 1 967 968 972 3314 + 1 967 968 3314 3312 + 1 968 972 3314 3319 + 1 968 3312 3319 3314 + 1 967 345 3314 3313 + 1 971 3313 3334 349 + 1 972 3314 350 3334 + 1 967 971 3314 972 + 1 967 971 3313 3314 + 1 971 972 3334 3314 + 1 971 3313 3314 3334 + 1 986 358 3382 3383 + 1 989 3382 361 3397 + 1 990 3383 3397 362 + 1 986 989 990 3383 + 1 986 989 3383 3382 + 1 989 990 3383 3397 + 1 989 3382 3397 3383 + 1 988 360 3394 3393 + 1 989 3393 3397 361 + 1 990 3394 362 3397 + 1 988 989 3394 990 + 1 988 989 3393 3394 + 1 989 990 3397 3394 + 1 989 3393 3394 3397 + 1 974 203 2385 2383 + 1 982 2385 357 3366 + 1 980 2383 3366 355 + 1 974 982 980 2383 + 1 974 982 2383 2385 + 1 982 980 2383 3366 + 1 982 2385 3366 2383 + 1 1019 376 2684 3467 + 1 1013 2684 242 2686 + 1 1022 3467 2686 379 + 1 1019 1013 1022 3467 + 1 1019 1013 3467 2684 + 1 1013 1022 3467 2686 + 1 1013 2684 2686 3467 + 1 996 365 3416 2519 + 1 997 3416 366 2520 + 1 993 2519 2520 222 + 1 996 997 993 2519 + 1 996 997 2519 3416 + 1 997 993 2519 2520 + 1 997 3416 2520 2519 + 1 978 353 3343 3356 + 1 976 3343 351 3344 + 1 980 3356 3344 355 + 1 978 976 980 3356 + 1 978 976 3356 3343 + 1 976 980 3356 3344 + 1 976 3343 3344 3356 + 1 978 353 3356 3357 + 1 982 3357 3366 357 + 1 980 3356 355 3366 + 1 978 982 3356 980 + 1 978 982 3357 3356 + 1 982 980 3366 3356 + 1 982 3357 3356 3366 + 1 1016 364 3414 3415 + 1 1018 3414 375 3463 + 1 1022 3415 3463 379 + 1 1016 1018 1022 3415 + 1 1016 1018 3415 3414 + 1 1018 1022 3415 3463 + 1 1018 3414 3463 3415 + 1 1019 376 3467 3462 + 1 1018 3462 3463 375 + 1 1022 3467 379 3463 + 1 1019 1018 3467 1022 + 1 1019 1018 3462 3467 + 1 1018 1022 3463 3467 + 1 1018 3462 3467 3463 + 1 927 164 2128 2129 + 1 932 2128 326 3232 + 1 933 2129 3232 327 + 1 927 932 933 2129 + 1 927 932 2129 2128 + 1 932 933 2129 3232 + 1 932 2128 3232 2129 + 1 944 332 2210 3256 + 1 941 2210 178 2211 + 1 946 3256 2211 334 + 1 944 941 946 3256 + 1 944 941 3256 2210 + 1 941 946 3256 2211 + 1 941 2210 2211 3256 + 1 953 336 3274 2253 + 1 955 3274 338 2255 + 1 948 2253 2255 185 + 1 953 955 948 2253 + 1 953 955 2253 3274 + 1 955 948 2253 2255 + 1 955 3274 2255 2253 + 1 929 323 3215 3217 + 1 930 3215 324 3222 + 1 933 3217 3222 327 + 1 929 930 933 3217 + 1 929 930 3217 3215 + 1 930 933 3217 3222 + 1 930 3215 3222 3217 + 1 929 323 3217 3216 + 1 932 3216 3232 326 + 1 933 3217 327 3232 + 1 929 932 3217 933 + 1 929 932 3216 3217 + 1 932 933 3232 3217 + 1 932 3216 3217 3232 + 1 943 331 3251 3252 + 1 945 3251 333 3259 + 1 946 3252 3259 334 + 1 943 945 946 3252 + 1 943 945 3252 3251 + 1 945 946 3252 3259 + 1 945 3251 3259 3252 + 1 944 332 3256 3255 + 1 945 3255 3259 333 + 1 946 3256 334 3259 + 1 944 945 3256 946 + 1 944 945 3255 3256 + 1 945 946 3259 3256 + 1 945 3255 3256 3259 + 1 927 164 2129 2127 + 1 933 2129 327 3228 + 1 931 2127 3228 325 + 1 927 933 931 2127 + 1 927 933 2127 2129 + 1 933 931 2127 3228 + 1 933 2129 3228 2127 + 1 953 336 2253 3273 + 1 948 2253 185 2254 + 1 954 3273 2254 337 + 1 953 948 954 3273 + 1 953 948 3273 2253 + 1 948 954 3273 2254 + 1 948 2253 2254 3273 + 1 938 329 3245 2179 + 1 939 3245 330 2180 + 1 935 2179 2180 172 + 1 938 939 935 2179 + 1 938 939 2179 3245 + 1 939 935 2179 2180 + 1 939 3245 2180 2179 + 1 930 324 3210 3221 + 1 928 3210 322 3211 + 1 931 3221 3211 325 + 1 930 928 931 3221 + 1 930 928 3221 3210 + 1 928 931 3221 3211 + 1 928 3210 3211 3221 + 1 930 324 3221 3222 + 1 933 3222 3228 327 + 1 931 3221 325 3228 + 1 930 933 3221 931 + 1 930 933 3222 3221 + 1 933 931 3228 3221 + 1 933 3222 3221 3228 + 1 950 328 3243 3244 + 1 952 3243 335 3269 + 1 954 3244 3269 337 + 1 950 952 954 3244 + 1 950 952 3244 3243 + 1 952 954 3244 3269 + 1 952 3243 3269 3244 + 1 953 336 3273 3268 + 1 952 3268 3269 335 + 1 954 3273 337 3269 + 1 953 952 3273 954 + 1 953 952 3268 3273 + 1 952 954 3269 3273 + 1 952 3268 3273 3269 + 1 1095 146 2043 2042 + 1 1099 2043 424 3667 + 1 1098 2042 3667 423 + 1 1095 1099 1098 2042 + 1 1095 1099 2042 2043 + 1 1099 1098 2042 3667 + 1 1099 2043 3667 2042 + 1 1622 437 3105 3730 + 1 1619 3105 304 3108 + 1 1627 3730 3108 657 + 1 1622 1619 1627 3730 + 1 1622 1619 3730 3105 + 1 1619 1627 3730 3108 + 1 1619 3105 3108 3730 + 1 1607 433 3718 3050 + 1 1617 3718 654 3055 + 1 1605 3050 3055 295 + 1 1607 1617 1605 3050 + 1 1607 1617 3050 3718 + 1 1617 1605 3050 3055 + 1 1617 3718 3055 3050 + 1 1102 427 3685 3669 + 1 1101 3685 426 3668 + 1 1098 3669 3668 423 + 1 1102 1101 1098 3669 + 1 1102 1101 3669 3685 + 1 1101 1098 3669 3668 + 1 1101 3685 3668 3669 + 1 1102 427 3669 3676 + 1 1099 3676 3667 424 + 1 1098 3669 423 3667 + 1 1102 1099 3669 1098 + 1 1102 1099 3676 3669 + 1 1099 1098 3667 3669 + 1 1099 3676 3669 3667 + 1 1624 649 3722 4654 + 1 1621 3722 434 3724 + 1 1627 4654 3724 657 + 1 1624 1621 1627 4654 + 1 1624 1621 4654 3722 + 1 1621 1627 4654 3724 + 1 1621 3722 3724 4654 + 1 1622 437 3730 3720 + 1 1621 3720 3724 434 + 1 1627 3730 657 3724 + 1 1622 1621 3730 1627 + 1 1622 1621 3720 3730 + 1 1621 1627 3724 3730 + 1 1621 3720 3730 3724 + 1 1785 305 3112 3115 + 1 1787 3112 501 4032 + 1 1793 3115 4032 712 + 1 1785 1787 1793 3115 + 1 1785 1787 3115 3112 + 1 1787 1793 3115 4032 + 1 1787 3112 4032 3115 + 1 1204 485 2105 3949 + 1 1201 2105 159 2107 + 1 1206 3949 2107 487 + 1 1204 1201 1206 3949 + 1 1204 1201 3949 2105 + 1 1201 1206 3949 2107 + 1 1201 2105 2107 3949 + 1 1817 717 4041 3189 + 1 1808 4041 505 3183 + 1 1805 3189 3183 317 + 1 1817 1808 1805 3189 + 1 1817 1808 3189 4041 + 1 1808 1805 3189 3183 + 1 1808 4041 3183 3189 + 1 1786 489 3978 3979 + 1 1791 3978 710 4890 + 1 1793 3979 4890 712 + 1 1786 1791 1793 3979 + 1 1786 1791 3979 3978 + 1 1791 1793 3979 4890 + 1 1791 3978 4890 3979 + 1 1786 489 3979 3977 + 1 1787 3977 4032 501 + 1 1793 3979 712 4032 + 1 1786 1787 3979 1793 + 1 1786 1787 3977 3979 + 1 1787 1793 4032 3979 + 1 1787 3977 3979 4032 + 1 1210 491 3984 3960 + 1 1212 3984 493 3961 + 1 1206 3960 3961 487 + 1 1210 1212 1206 3960 + 1 1210 1212 3960 3984 + 1 1212 1206 3960 3961 + 1 1212 3984 3961 3960 + 1 1204 485 3949 3951 + 1 1212 3951 3961 493 + 1 1206 3949 487 3961 + 1 1204 1212 3949 1206 + 1 1204 1212 3951 3949 + 1 1212 1206 3961 3949 + 1 1212 3951 3949 3961 + 1 1715 296 3065 3059 + 1 1727 3065 689 3922 + 1 1718 3059 3922 477 + 1 1715 1727 1718 3059 + 1 1715 1727 3059 3065 + 1 1727 1718 3059 3922 + 1 1727 3065 3922 3059 + 1 1741 694 3178 3936 + 1 1729 3178 316 3173 + 1 1732 3936 3173 481 + 1 1741 1729 1732 3936 + 1 1741 1729 3936 3178 + 1 1729 1732 3936 3173 + 1 1729 3178 3173 3936 + 1 1158 458 3825 2080 + 1 1159 3825 459 2081 + 1 1153 2080 2081 154 + 1 1158 1159 1153 2080 + 1 1158 1159 2080 3825 + 1 1159 1153 2080 2081 + 1 1159 3825 2081 2080 + 1 1724 686 3869 3920 + 1 1716 3869 464 3866 + 1 1718 3920 3866 477 + 1 1724 1716 1718 3920 + 1 1724 1716 3920 3869 + 1 1716 1718 3920 3866 + 1 1716 3869 3866 3920 + 1 1724 686 3920 4800 + 1 1727 4800 3922 689 + 1 1718 3920 477 3922 + 1 1724 1727 3920 1718 + 1 1724 1727 4800 3920 + 1 1727 1718 3922 3920 + 1 1727 4800 3920 3922 + 1 1730 465 3871 3872 + 1 1731 3871 478 3924 + 1 1732 3872 3924 481 + 1 1730 1731 1732 3872 + 1 1730 1731 3872 3871 + 1 1731 1732 3872 3924 + 1 1731 3871 3924 3872 + 1 1741 694 3936 3928 + 1 1731 3928 3924 478 + 1 1732 3936 481 3924 + 1 1741 1731 3936 1732 + 1 1741 1731 3928 3936 + 1 1731 1732 3924 3936 + 1 1731 3928 3936 3924 + 1 1571 245 2715 2716 + 1 1577 2715 636 4593 + 1 1578 2716 4593 637 + 1 1571 1577 1578 2716 + 1 1571 1577 2716 2715 + 1 1577 1578 2716 4593 + 1 1577 2715 4593 2716 + 1 1566 630 2627 4560 + 1 1557 2627 235 2629 + 1 1568 4560 2629 632 + 1 1566 1557 1568 4560 + 1 1566 1557 4560 2627 + 1 1557 1568 4560 2629 + 1 1557 2627 2629 4560 + 1 1614 651 4655 3052 + 1 1613 4655 650 3051 + 1 1605 3052 3051 295 + 1 1614 1613 1605 3052 + 1 1614 1613 3052 4655 + 1 1613 1605 3052 3051 + 1 1613 4655 3051 3052 + 1 1574 627 4544 4546 + 1 1575 4544 634 4584 + 1 1578 4546 4584 637 + 1 1574 1575 1578 4546 + 1 1574 1575 4546 4544 + 1 1575 1578 4546 4584 + 1 1575 4544 4584 4546 + 1 1574 627 4546 4545 + 1 1577 4545 4593 636 + 1 1578 4546 637 4593 + 1 1574 1577 4546 1578 + 1 1574 1577 4545 4546 + 1 1577 1578 4593 4546 + 1 1577 4545 4546 4593 + 1 1565 629 4554 4553 + 1 1569 4554 633 4569 + 1 1568 4553 4569 632 + 1 1565 1569 1568 4553 + 1 1565 1569 4553 4554 + 1 1569 1568 4553 4569 + 1 1569 4554 4569 4553 + 1 1566 630 4560 4561 + 1 1569 4561 4569 633 + 1 1568 4560 632 4569 + 1 1566 1569 4560 1568 + 1 1566 1569 4561 4560 + 1 1569 1568 4569 4560 + 1 1569 4561 4560 4569 + 1 1571 245 2716 2717 + 1 1579 2717 4595 638 + 1 1578 2716 637 4595 + 1 1571 1579 2716 1578 + 1 1571 1579 2717 2716 + 1 1579 1578 4595 2716 + 1 1579 2717 2716 4595 + 1 1626 656 4675 3107 + 1 1619 3107 3108 304 + 1 1627 4675 657 3108 + 1 1626 1619 4675 1627 + 1 1626 1619 3107 4675 + 1 1619 1627 3108 4675 + 1 1619 3107 4675 3108 + 1 1614 651 3052 4659 + 1 1617 4659 3055 654 + 1 1605 3052 295 3055 + 1 1614 1617 3052 1605 + 1 1614 1617 4659 3052 + 1 1617 1605 3055 3052 + 1 1617 4659 3052 3055 + 1 1576 635 4588 4583 + 1 1575 4583 4584 634 + 1 1578 4588 637 4584 + 1 1576 1575 4588 1578 + 1 1576 1575 4583 4588 + 1 1575 1578 4584 4588 + 1 1575 4583 4588 4584 + 1 1576 635 4589 4588 + 1 1579 4589 638 4595 + 1 1578 4588 4595 637 + 1 1576 1579 1578 4588 + 1 1576 1579 4588 4589 + 1 1579 1578 4588 4595 + 1 1579 4589 4595 4588 + 1 1624 649 4654 4653 + 1 1625 4653 4671 655 + 1 1627 4654 657 4671 + 1 1624 1625 4654 1627 + 1 1624 1625 4653 4654 + 1 1625 1627 4671 4654 + 1 1625 4653 4654 4671 + 1 1626 656 4670 4675 + 1 1625 4670 655 4671 + 1 1627 4675 4671 657 + 1 1626 1625 1627 4675 + 1 1626 1625 4675 4670 + 1 1625 1627 4675 4671 + 1 1625 4670 4671 4675 + 1 1658 236 2638 2639 + 1 1667 2638 669 4723 + 1 1668 2639 4723 670 + 1 1658 1667 1668 2639 + 1 1658 1667 2639 2638 + 1 1667 1668 2639 4723 + 1 1667 2638 4723 2639 + 1 1777 687 3071 4805 + 1 1771 3071 297 3074 + 1 1782 4805 3074 708 + 1 1777 1771 1782 4805 + 1 1777 1771 4805 3071 + 1 1771 1782 4805 3074 + 1 1771 3071 3074 4805 + 1 1811 691 4818 3185 + 1 1816 4818 716 3188 + 1 1805 3185 3188 317 + 1 1811 1816 1805 3185 + 1 1811 1816 3185 4818 + 1 1816 1805 3185 3188 + 1 1816 4818 3188 3185 + 1 1670 672 4739 4728 + 1 1671 4739 673 4729 + 1 1668 4728 4729 670 + 1 1670 1671 1668 4728 + 1 1670 1671 4728 4739 + 1 1671 1668 4728 4729 + 1 1671 4739 4729 4728 + 1 1670 672 4728 4724 + 1 1667 4724 4723 669 + 1 1668 4728 670 4723 + 1 1670 1667 4728 1668 + 1 1670 1667 4724 4728 + 1 1667 1668 4723 4728 + 1 1667 4724 4728 4723 + 1 1780 706 4811 4868 + 1 1778 4811 690 4812 + 1 1782 4868 4812 708 + 1 1780 1778 1782 4868 + 1 1780 1778 4868 4811 + 1 1778 1782 4868 4812 + 1 1778 4811 4812 4868 + 1 1777 687 4805 4804 + 1 1778 4804 4812 690 + 1 1782 4805 708 4812 + 1 1777 1778 4805 1782 + 1 1777 1778 4804 4805 + 1 1778 1782 4812 4805 + 1 1778 4804 4805 4812 + 1 1785 305 3115 3114 + 1 1792 3114 4892 711 + 1 1793 3115 712 4892 + 1 1785 1792 3115 1793 + 1 1785 1792 3114 3115 + 1 1792 1793 4892 3115 + 1 1792 3114 3115 4892 + 1 1781 707 4873 3073 + 1 1771 3073 3074 297 + 1 1782 4873 708 3074 + 1 1781 1771 4873 1782 + 1 1781 1771 3073 4873 + 1 1771 1782 3074 4873 + 1 1771 3073 4873 3074 + 1 1817 717 3189 4899 + 1 1816 4899 3188 716 + 1 1805 3189 317 3188 + 1 1817 1816 3189 1805 + 1 1817 1816 4899 3189 + 1 1816 1805 3188 3189 + 1 1816 4899 3189 3188 + 1 1790 705 4867 4865 + 1 1791 4865 4890 710 + 1 1793 4867 712 4890 + 1 1790 1791 4867 1793 + 1 1790 1791 4865 4867 + 1 1791 1793 4890 4867 + 1 1791 4865 4867 4890 + 1 1790 705 4866 4867 + 1 1792 4866 711 4892 + 1 1793 4867 4892 712 + 1 1790 1792 1793 4867 + 1 1790 1792 4867 4866 + 1 1792 1793 4867 4892 + 1 1792 4866 4892 4867 + 1 1780 706 4868 4869 + 1 1783 4869 4878 709 + 1 1782 4868 708 4878 + 1 1780 1783 4868 1782 + 1 1780 1783 4869 4868 + 1 1783 1782 4878 4868 + 1 1783 4869 4868 4878 + 1 1781 707 4874 4873 + 1 1783 4874 709 4878 + 1 1782 4873 4878 708 + 1 1781 1783 1782 4873 + 1 1781 1783 4873 4874 + 1 1783 1782 4873 4878 + 1 1783 4874 4878 4873 + 1 1061 142 2024 2025 + 1 1065 2024 404 3590 + 1 1066 2025 3590 405 + 1 1061 1065 1066 2025 + 1 1061 1065 2025 2024 + 1 1065 1066 2025 3590 + 1 1065 2024 3590 2025 + 1 1532 416 2942 3644 + 1 1529 2942 280 2947 + 1 1541 3644 2947 621 + 1 1532 1529 1541 3644 + 1 1532 1529 3644 2942 + 1 1529 1541 3644 2947 + 1 1529 2942 2947 3644 + 1 1546 419 3657 2985 + 1 1555 3657 626 2990 + 1 1543 2985 2990 286 + 1 1546 1555 1543 2985 + 1 1546 1555 2985 3657 + 1 1555 1543 2985 2990 + 1 1555 3657 2990 2985 + 1 1069 408 3608 3595 + 1 1070 3608 409 3596 + 1 1066 3595 3596 405 + 1 1069 1070 1066 3595 + 1 1069 1070 3595 3608 + 1 1070 1066 3595 3596 + 1 1070 3608 3596 3595 + 1 1069 408 3595 3591 + 1 1065 3591 3590 404 + 1 1066 3595 405 3590 + 1 1069 1065 3595 1066 + 1 1069 1065 3591 3595 + 1 1065 1066 3590 3595 + 1 1065 3591 3595 3590 + 1 1538 618 3650 4509 + 1 1533 3650 418 3651 + 1 1541 4509 3651 621 + 1 1538 1533 1541 4509 + 1 1538 1533 4509 3650 + 1 1533 1541 4509 3651 + 1 1533 3650 3651 4509 + 1 1532 416 3644 3642 + 1 1533 3642 3651 418 + 1 1541 3644 621 3651 + 1 1532 1533 3644 1541 + 1 1532 1533 3642 3644 + 1 1533 1541 3651 3644 + 1 1533 3642 3644 3651 + 1 1687 281 2951 2956 + 1 1689 2951 474 3910 + 1 1699 2956 3910 679 + 1 1687 1689 1699 2956 + 1 1687 1689 2956 2951 + 1 1689 1699 2956 3910 + 1 1689 2951 3910 2956 + 1 1157 457 2079 3817 + 1 1153 2079 154 2081 + 1 1159 3817 2081 459 + 1 1157 1153 1159 3817 + 1 1157 1153 3817 2079 + 1 1153 1159 3817 2081 + 1 1153 2079 2081 3817 + 1 1739 692 3935 3176 + 1 1732 3935 481 3173 + 1 1729 3176 3173 316 + 1 1739 1732 1729 3176 + 1 1739 1732 3176 3935 + 1 1732 1729 3176 3173 + 1 1732 3935 3173 3176 + 1 1688 463 3862 3863 + 1 1697 3862 677 4757 + 1 1699 3863 4757 679 + 1 1688 1697 1699 3863 + 1 1688 1697 3863 3862 + 1 1697 1699 3863 4757 + 1 1697 3862 4757 3863 + 1 1688 463 3863 3859 + 1 1689 3859 3910 474 + 1 1699 3863 679 3910 + 1 1688 1689 3863 1699 + 1 1688 1689 3859 3863 + 1 1689 1699 3910 3863 + 1 1689 3859 3863 3910 + 1 1165 465 3870 3833 + 1 1166 3870 466 3834 + 1 1159 3833 3834 459 + 1 1165 1166 1159 3833 + 1 1165 1166 3833 3870 + 1 1166 1159 3833 3834 + 1 1166 3870 3834 3833 + 1 1157 457 3817 3820 + 1 1166 3820 3834 466 + 1 1159 3817 459 3834 + 1 1157 1166 3817 1159 + 1 1157 1166 3820 3817 + 1 1166 1159 3834 3817 + 1 1166 3820 3817 3834 + 1 1757 288 3011 3006 + 1 1769 3011 704 4017 + 1 1759 3006 4017 496 + 1 1757 1769 1759 3006 + 1 1757 1769 3006 3011 + 1 1769 1759 3006 4017 + 1 1769 3011 4017 3006 + 1 1815 715 3187 4040 + 1 1805 3187 317 3183 + 1 1808 4040 3183 505 + 1 1815 1805 1808 4040 + 1 1815 1805 4040 3187 + 1 1805 1808 4040 3183 + 1 1805 3187 3183 4040 + 1 1203 484 3940 2104 + 1 1206 3940 487 2107 + 1 1201 2104 2107 159 + 1 1203 1206 1201 2104 + 1 1203 1206 2104 3940 + 1 1206 1201 2104 2107 + 1 1206 3940 2107 2104 + 1 1766 701 3973 4015 + 1 1758 3973 488 3970 + 1 1759 4015 3970 496 + 1 1766 1758 1759 4015 + 1 1766 1758 4015 3973 + 1 1758 1759 4015 3970 + 1 1758 3973 3970 4015 + 1 1766 701 4015 4855 + 1 1769 4855 4017 704 + 1 1759 4015 496 4017 + 1 1766 1769 4015 1759 + 1 1766 1769 4855 4015 + 1 1769 1759 4017 4015 + 1 1769 4855 4015 4017 + 1 1806 491 3985 3986 + 1 1807 3985 497 4019 + 1 1808 3986 4019 505 + 1 1806 1807 1808 3986 + 1 1806 1807 3986 3985 + 1 1807 1808 3986 4019 + 1 1807 3985 4019 3986 + 1 1815 715 4040 4023 + 1 1807 4023 4019 497 + 1 1808 4040 505 4019 + 1 1815 1807 4040 1808 + 1 1815 1807 4023 4040 + 1 1807 1808 4019 4040 + 1 1807 4023 4040 4019 + 1 1491 234 2618 2620 + 1 1501 2618 604 4448 + 1 1503 2620 4448 606 + 1 1491 1501 1503 2620 + 1 1491 1501 2620 2618 + 1 1501 1503 2620 4448 + 1 1501 2618 4448 2620 + 1 1514 610 2707 4476 + 1 1505 2707 244 2709 + 1 1517 4476 2709 613 + 1 1514 1505 1517 4476 + 1 1514 1505 4476 2707 + 1 1505 1517 4476 2709 + 1 1505 2707 2709 4476 + 1 1551 622 4525 2987 + 1 1553 4525 624 2988 + 1 1543 2987 2988 286 + 1 1551 1553 1543 2987 + 1 1551 1553 2987 4525 + 1 1553 1543 2987 2988 + 1 1553 4525 2988 2987 + 1 1498 601 4430 4432 + 1 1500 4430 603 4442 + 1 1503 4432 4442 606 + 1 1498 1500 1503 4432 + 1 1498 1500 4432 4430 + 1 1500 1503 4432 4442 + 1 1500 4430 4442 4432 + 1 1498 601 4432 4431 + 1 1501 4431 4448 604 + 1 1503 4432 606 4448 + 1 1498 1501 4432 1503 + 1 1498 1501 4431 4432 + 1 1501 1503 4448 4432 + 1 1501 4431 4432 4448 + 1 1512 608 4466 4468 + 1 1515 4466 611 4479 + 1 1517 4468 4479 613 + 1 1512 1515 1517 4468 + 1 1512 1515 4468 4466 + 1 1515 1517 4468 4479 + 1 1515 4466 4479 4468 + 1 1514 610 4476 4475 + 1 1515 4475 4479 611 + 1 1517 4476 613 4479 + 1 1514 1515 4476 1517 + 1 1514 1515 4475 4476 + 1 1515 1517 4479 4476 + 1 1515 4475 4476 4479 + 1 1491 234 2620 2619 + 1 1502 2619 4452 605 + 1 1503 2620 606 4452 + 1 1491 1502 2620 1503 + 1 1491 1502 2619 2620 + 1 1502 1503 4452 2620 + 1 1502 2619 2620 4452 + 1 1539 619 4513 2946 + 1 1529 2946 2947 280 + 1 1541 4513 621 2947 + 1 1539 1529 4513 1541 + 1 1539 1529 2946 4513 + 1 1529 1541 2947 4513 + 1 1529 2946 4513 2947 + 1 1551 622 2987 4526 + 1 1555 4526 2990 626 + 1 1543 2987 286 2990 + 1 1551 1555 2987 1543 + 1 1551 1555 4526 2987 + 1 1555 1543 2990 2987 + 1 1555 4526 2987 2990 + 1 1499 602 4438 4436 + 1 1500 4436 4442 603 + 1 1503 4438 606 4442 + 1 1499 1500 4438 1503 + 1 1499 1500 4436 4438 + 1 1500 1503 4442 4438 + 1 1500 4436 4438 4442 + 1 1499 602 4437 4438 + 1 1502 4437 605 4452 + 1 1503 4438 4452 606 + 1 1499 1502 1503 4438 + 1 1499 1502 4438 4437 + 1 1502 1503 4438 4452 + 1 1502 4437 4452 4438 + 1 1538 618 4509 4508 + 1 1540 4508 4516 620 + 1 1541 4509 621 4516 + 1 1538 1540 4509 1541 + 1 1538 1540 4508 4509 + 1 1540 1541 4516 4509 + 1 1540 4508 4509 4516 + 1 1539 619 4512 4513 + 1 1540 4512 620 4516 + 1 1541 4513 4516 621 + 1 1539 1540 1541 4513 + 1 1539 1540 4513 4512 + 1 1540 1541 4513 4516 + 1 1540 4512 4516 4513 + 1 1659 247 2730 2732 + 1 1669 2730 671 4735 + 1 1671 2732 4735 673 + 1 1659 1669 1671 2732 + 1 1659 1669 2732 2730 + 1 1669 1671 2732 4735 + 1 1669 2730 4735 2732 + 1 1709 681 2998 4775 + 1 1701 2998 287 3000 + 1 1713 4775 3000 685 + 1 1709 1701 1713 4775 + 1 1709 1701 4775 2998 + 1 1701 1713 4775 3000 + 1 1701 2998 3000 4775 + 1 1738 691 4814 3175 + 1 1740 4814 693 3177 + 1 1729 3175 3177 316 + 1 1738 1740 1729 3175 + 1 1738 1740 3175 4814 + 1 1740 1729 3175 3177 + 1 1740 4814 3177 3175 + 1 1666 668 4717 4719 + 1 1668 4717 670 4729 + 1 1671 4719 4729 673 + 1 1666 1668 1671 4719 + 1 1666 1668 4719 4717 + 1 1668 1671 4719 4729 + 1 1668 4717 4729 4719 + 1 1666 668 4719 4718 + 1 1669 4718 4735 671 + 1 1671 4719 673 4735 + 1 1666 1669 4719 1671 + 1 1666 1669 4718 4719 + 1 1669 1671 4735 4719 + 1 1669 4718 4719 4735 + 1 1708 680 4768 4770 + 1 1710 4768 682 4778 + 1 1713 4770 4778 685 + 1 1708 1710 1713 4770 + 1 1708 1710 4770 4768 + 1 1710 1713 4770 4778 + 1 1710 4768 4778 4770 + 1 1709 681 4775 4774 + 1 1710 4774 4778 682 + 1 1713 4775 685 4778 + 1 1709 1710 4775 1713 + 1 1709 1710 4774 4775 + 1 1710 1713 4778 4775 + 1 1710 4774 4775 4778 + 1 1687 281 2956 2955 + 1 1698 2955 4761 678 + 1 1699 2956 679 4761 + 1 1687 1698 2956 1699 + 1 1687 1698 2955 2956 + 1 1698 1699 4761 2956 + 1 1698 2955 2956 4761 + 1 1711 683 4785 2999 + 1 1701 2999 3000 287 + 1 1713 4785 685 3000 + 1 1711 1701 4785 1713 + 1 1711 1701 2999 4785 + 1 1701 1713 3000 4785 + 1 1701 2999 4785 3000 + 1 1739 692 3176 4819 + 1 1740 4819 3177 693 + 1 1729 3176 316 3177 + 1 1739 1740 3176 1729 + 1 1739 1740 4819 3176 + 1 1740 1729 3177 3176 + 1 1740 4819 3176 3177 + 1 1696 676 4753 4751 + 1 1697 4751 4757 677 + 1 1699 4753 679 4757 + 1 1696 1697 4753 1699 + 1 1696 1697 4751 4753 + 1 1697 1699 4757 4753 + 1 1697 4751 4753 4757 + 1 1696 676 4752 4753 + 1 1698 4752 678 4761 + 1 1699 4753 4761 679 + 1 1696 1698 1699 4753 + 1 1696 1698 4753 4752 + 1 1698 1699 4753 4761 + 1 1698 4752 4761 4753 + 1 1708 680 4770 4769 + 1 1712 4769 4788 684 + 1 1713 4770 685 4788 + 1 1708 1712 4770 1713 + 1 1708 1712 4769 4770 + 1 1712 1713 4788 4770 + 1 1712 4769 4770 4788 + 1 1711 683 4784 4785 + 1 1712 4784 684 4788 + 1 1713 4785 4788 685 + 1 1711 1712 1713 4785 + 1 1711 1712 4785 4784 + 1 1712 1713 4785 4788 + 1 1712 4784 4788 4785 + 1 1030 138 2005 2006 + 1 1033 2005 385 3502 + 1 1034 2006 3502 386 + 1 1030 1033 1034 2006 + 1 1030 1033 2006 2005 + 1 1033 1034 2006 3502 + 1 1033 2005 3502 2006 + 1 1459 392 2787 3539 + 1 1457 2787 256 2790 + 1 1465 3539 2790 592 + 1 1459 1457 1465 3539 + 1 1459 1457 3539 2787 + 1 1457 1465 3539 2790 + 1 1457 2787 2790 3539 + 1 1469 396 3553 2838 + 1 1479 3553 595 2843 + 1 1467 2838 2843 264 + 1 1469 1479 1467 2838 + 1 1469 1479 2838 3553 + 1 1479 1467 2838 2843 + 1 1479 3553 2843 2838 + 1 1037 389 3524 3508 + 1 1038 3524 390 3509 + 1 1034 3508 3509 386 + 1 1037 1038 1034 3508 + 1 1037 1038 3508 3524 + 1 1038 1034 3508 3509 + 1 1038 3524 3509 3508 + 1 1037 389 3508 3503 + 1 1033 3503 3502 385 + 1 1034 3508 386 3502 + 1 1037 1033 3508 1034 + 1 1037 1033 3503 3508 + 1 1033 1034 3502 3508 + 1 1033 3503 3508 3502 + 1 1462 589 3547 4380 + 1 1460 3547 395 3548 + 1 1465 4380 3548 592 + 1 1462 1460 1465 4380 + 1 1462 1460 4380 3547 + 1 1460 1465 4380 3548 + 1 1460 3547 3548 4380 + 1 1459 392 3539 3538 + 1 1460 3538 3548 395 + 1 1465 3539 592 3548 + 1 1459 1460 3539 1465 + 1 1459 1460 3538 3539 + 1 1460 1465 3548 3539 + 1 1460 3538 3539 3548 + 1 1581 257 2794 2797 + 1 1583 2794 430 3706 + 1 1589 2797 3706 642 + 1 1581 1583 1589 2797 + 1 1581 1583 2797 2794 + 1 1583 1589 2797 3706 + 1 1583 2794 3706 2797 + 1 1097 422 2041 3661 + 1 1095 2041 146 2042 + 1 1098 3661 2042 423 + 1 1097 1095 1098 3661 + 1 1097 1095 3661 2041 + 1 1095 1098 3661 2042 + 1 1095 2041 2042 3661 + 1 1615 652 3717 3053 + 1 1607 3717 433 3050 + 1 1605 3053 3050 295 + 1 1615 1607 1605 3053 + 1 1615 1607 3053 3717 + 1 1607 1605 3053 3050 + 1 1607 3717 3050 3053 + 1 1582 425 3683 3684 + 1 1587 3683 640 4609 + 1 1589 3684 4609 642 + 1 1582 1587 1589 3684 + 1 1582 1587 3684 3683 + 1 1587 1589 3684 4609 + 1 1587 3683 4609 3684 + 1 1582 425 3684 3682 + 1 1583 3682 3706 430 + 1 1589 3684 642 3706 + 1 1582 1583 3684 1589 + 1 1582 1583 3682 3684 + 1 1583 1589 3706 3684 + 1 1583 3682 3684 3706 + 1 1101 426 3686 3668 + 1 1103 3686 428 3670 + 1 1098 3668 3670 423 + 1 1101 1103 1098 3668 + 1 1101 1103 3668 3686 + 1 1103 1098 3668 3670 + 1 1103 3686 3670 3668 + 1 1097 422 3661 3663 + 1 1103 3663 3670 428 + 1 1098 3661 423 3670 + 1 1097 1103 3661 1098 + 1 1097 1103 3663 3661 + 1 1103 1098 3670 3661 + 1 1103 3663 3661 3670 + 1 1673 266 2862 2857 + 1 1685 2862 675 3894 + 1 1676 2857 3894 469 + 1 1673 1685 1676 2857 + 1 1673 1685 2857 2862 + 1 1685 1676 2857 3894 + 1 1685 2862 3894 2857 + 1 1726 688 3064 3921 + 1 1715 3064 296 3059 + 1 1718 3921 3059 477 + 1 1726 1715 1718 3921 + 1 1726 1715 3921 3064 + 1 1715 1718 3921 3059 + 1 1715 3064 3059 3921 + 1 1156 456 3811 2078 + 1 1158 3811 458 2080 + 1 1153 2078 2080 154 + 1 1156 1158 1153 2078 + 1 1156 1158 2078 3811 + 1 1158 1153 2078 2080 + 1 1158 3811 2080 2078 + 1 1684 674 3856 3893 + 1 1675 3856 462 3853 + 1 1676 3893 3853 469 + 1 1684 1675 1676 3893 + 1 1684 1675 3893 3856 + 1 1675 1676 3893 3853 + 1 1675 3856 3853 3893 + 1 1684 674 3893 4748 + 1 1685 4748 3894 675 + 1 1676 3893 469 3894 + 1 1684 1685 3893 1676 + 1 1684 1685 4748 3893 + 1 1685 1676 3894 3893 + 1 1685 4748 3893 3894 + 1 1716 464 3865 3866 + 1 1717 3865 470 3896 + 1 1718 3866 3896 477 + 1 1716 1717 1718 3866 + 1 1716 1717 3866 3865 + 1 1717 1718 3866 3896 + 1 1717 3865 3896 3866 + 1 1726 688 3921 3900 + 1 1717 3900 3896 470 + 1 1718 3921 477 3896 + 1 1726 1717 3921 1718 + 1 1726 1717 3900 3921 + 1 1717 1718 3896 3921 + 1 1717 3900 3921 3896 + 1 1433 215 2471 2473 + 1 1439 2471 582 4349 + 1 1441 2473 4349 584 + 1 1433 1439 1441 2473 + 1 1433 1439 2473 2471 + 1 1439 1441 2473 4349 + 1 1439 2471 4349 2473 + 1 1453 586 2609 4367 + 1 1443 2609 233 2610 + 1 1455 4367 2610 588 + 1 1453 1443 1455 4367 + 1 1453 1443 4367 2609 + 1 1443 1455 4367 2610 + 1 1443 2609 2610 4367 + 1 1477 593 4396 2841 + 1 1478 4396 594 2842 + 1 1467 2841 2842 264 + 1 1477 1478 1467 2841 + 1 1477 1478 2841 4396 + 1 1478 1467 2841 2842 + 1 1478 4396 2842 2841 + 1 1436 579 4331 4333 + 1 1438 4331 581 4343 + 1 1441 4333 4343 584 + 1 1436 1438 1441 4333 + 1 1436 1438 4333 4331 + 1 1438 1441 4333 4343 + 1 1438 4331 4343 4333 + 1 1436 579 4333 4332 + 1 1439 4332 4349 582 + 1 1441 4333 584 4349 + 1 1436 1439 4333 1441 + 1 1436 1439 4332 4333 + 1 1439 1441 4349 4333 + 1 1439 4332 4333 4349 + 1 1452 585 4362 4363 + 1 1454 4362 587 4370 + 1 1455 4363 4370 588 + 1 1452 1454 1455 4363 + 1 1452 1454 4363 4362 + 1 1454 1455 4363 4370 + 1 1454 4362 4370 4363 + 1 1453 586 4367 4366 + 1 1454 4366 4370 587 + 1 1455 4367 588 4370 + 1 1453 1454 4367 1455 + 1 1453 1454 4366 4367 + 1 1454 1455 4370 4367 + 1 1454 4366 4367 4370 + 1 1433 215 2473 2472 + 1 1440 2472 4353 583 + 1 1441 2473 584 4353 + 1 1433 1440 2473 1441 + 1 1433 1440 2472 2473 + 1 1440 1441 4353 2473 + 1 1440 2472 2473 4353 + 1 1463 590 4384 2789 + 1 1457 2789 2790 256 + 1 1465 4384 592 2790 + 1 1463 1457 4384 1465 + 1 1463 1457 2789 4384 + 1 1457 1465 2790 4384 + 1 1457 2789 4384 2790 + 1 1477 593 2841 4397 + 1 1479 4397 2843 595 + 1 1467 2841 264 2843 + 1 1477 1479 2841 1467 + 1 1477 1479 4397 2841 + 1 1479 1467 2843 2841 + 1 1479 4397 2841 2843 + 1 1437 580 4339 4337 + 1 1438 4337 4343 581 + 1 1441 4339 584 4343 + 1 1437 1438 4339 1441 + 1 1437 1438 4337 4339 + 1 1438 1441 4343 4339 + 1 1438 4337 4339 4343 + 1 1437 580 4338 4339 + 1 1440 4338 583 4353 + 1 1441 4339 4353 584 + 1 1437 1440 1441 4339 + 1 1437 1440 4339 4338 + 1 1440 1441 4339 4353 + 1 1440 4338 4353 4339 + 1 1462 589 4380 4379 + 1 1464 4379 4387 591 + 1 1465 4380 592 4387 + 1 1462 1464 4380 1465 + 1 1462 1464 4379 4380 + 1 1464 1465 4387 4380 + 1 1464 4379 4380 4387 + 1 1463 590 4383 4384 + 1 1464 4383 591 4387 + 1 1465 4384 4387 592 + 1 1463 1464 1465 4384 + 1 1463 1464 4384 4383 + 1 1464 1465 4384 4387 + 1 1464 4383 4387 4384 + 1 1557 235 2628 2629 + 1 1567 2628 631 4565 + 1 1568 2629 4565 632 + 1 1557 1567 1568 2629 + 1 1557 1567 2629 2628 + 1 1567 1568 2629 4565 + 1 1567 2628 4565 2629 + 1 1599 644 2850 4627 + 1 1591 2850 265 2852 + 1 1603 4627 2852 648 + 1 1599 1591 1603 4627 + 1 1599 1591 4627 2850 + 1 1591 1603 4627 2852 + 1 1591 2850 2852 4627 + 1 1613 650 4656 3051 + 1 1616 4656 653 3054 + 1 1605 3051 3054 295 + 1 1613 1616 1605 3051 + 1 1613 1616 3051 4656 + 1 1616 1605 3051 3054 + 1 1616 4656 3054 3051 + 1 1564 628 4547 4549 + 1 1565 4547 629 4553 + 1 1568 4549 4553 632 + 1 1564 1565 1568 4549 + 1 1564 1565 4549 4547 + 1 1565 1568 4549 4553 + 1 1565 4547 4553 4549 + 1 1564 628 4549 4548 + 1 1567 4548 4565 631 + 1 1568 4549 632 4565 + 1 1564 1567 4549 1568 + 1 1564 1567 4548 4549 + 1 1567 1568 4565 4549 + 1 1567 4548 4549 4565 + 1 1598 643 4620 4622 + 1 1600 4620 645 4630 + 1 1603 4622 4630 648 + 1 1598 1600 1603 4622 + 1 1598 1600 4622 4620 + 1 1600 1603 4622 4630 + 1 1600 4620 4630 4622 + 1 1599 644 4627 4626 + 1 1600 4626 4630 645 + 1 1603 4627 648 4630 + 1 1599 1600 4627 1603 + 1 1599 1600 4626 4627 + 1 1600 1603 4630 4627 + 1 1600 4626 4627 4630 + 1 1581 257 2797 2796 + 1 1588 2796 4613 641 + 1 1589 2797 642 4613 + 1 1581 1588 2797 1589 + 1 1581 1588 2796 2797 + 1 1588 1589 4613 2797 + 1 1588 2796 2797 4613 + 1 1601 646 4637 2851 + 1 1591 2851 2852 265 + 1 1603 4637 648 2852 + 1 1601 1591 4637 1603 + 1 1601 1591 2851 4637 + 1 1591 1603 2852 4637 + 1 1591 2851 4637 2852 + 1 1615 652 3053 4663 + 1 1616 4663 3054 653 + 1 1605 3053 295 3054 + 1 1615 1616 3053 1605 + 1 1615 1616 4663 3053 + 1 1616 1605 3054 3053 + 1 1616 4663 3053 3054 + 1 1586 639 4605 4603 + 1 1587 4603 4609 640 + 1 1589 4605 642 4609 + 1 1586 1587 4605 1589 + 1 1586 1587 4603 4605 + 1 1587 1589 4609 4605 + 1 1587 4603 4605 4609 + 1 1586 639 4604 4605 + 1 1588 4604 641 4613 + 1 1589 4605 4613 642 + 1 1586 1588 1589 4605 + 1 1586 1588 4605 4604 + 1 1588 1589 4605 4613 + 1 1588 4604 4613 4605 + 1 1598 643 4622 4621 + 1 1602 4621 4640 647 + 1 1603 4622 648 4640 + 1 1598 1602 4622 1603 + 1 1598 1602 4621 4622 + 1 1602 1603 4640 4622 + 1 1602 4621 4622 4640 + 1 1601 646 4636 4637 + 1 1602 4636 647 4640 + 1 1603 4637 4640 648 + 1 1601 1602 1603 4637 + 1 1601 1602 4637 4636 + 1 1602 1603 4637 4640 + 1 1602 4636 4640 4637 + 1 1061 142 2025 2023 + 1 1066 2025 405 3584 + 1 1064 2023 3584 403 + 1 1061 1066 1064 2023 + 1 1061 1066 2023 2025 + 1 1066 1064 2023 3584 + 1 1066 2025 3584 2023 + 1 1546 419 2985 3656 + 1 1543 2985 286 2989 + 1 1554 3656 2989 625 + 1 1546 1543 1554 3656 + 1 1546 1543 3656 2985 + 1 1543 1554 3656 2989 + 1 1543 2985 2989 3656 + 1 1521 411 3625 2885 + 1 1527 3625 617 2888 + 1 1519 2885 2888 271 + 1 1521 1527 1519 2885 + 1 1521 1527 2885 3625 + 1 1527 1519 2885 2888 + 1 1527 3625 2888 2885 + 1 1070 409 3604 3586 + 1 1068 3604 407 3585 + 1 1064 3586 3585 403 + 1 1070 1068 1064 3586 + 1 1070 1068 3586 3604 + 1 1068 1064 3586 3585 + 1 1068 3604 3585 3586 + 1 1070 409 3586 3596 + 1 1066 3596 3584 405 + 1 1064 3586 403 3584 + 1 1070 1066 3586 1064 + 1 1070 1066 3596 3586 + 1 1066 1064 3584 3586 + 1 1066 3596 3586 3584 + 1 1549 614 3629 4498 + 1 1545 3629 412 3631 + 1 1554 4498 3631 625 + 1 1549 1545 1554 4498 + 1 1549 1545 4498 3629 + 1 1545 1554 4498 3631 + 1 1545 3629 3631 4498 + 1 1546 419 3656 3627 + 1 1545 3627 3631 412 + 1 1554 3656 625 3631 + 1 1546 1545 3656 1554 + 1 1546 1545 3627 3656 + 1 1545 1554 3631 3656 + 1 1545 3627 3656 3631 + 1 1757 288 3006 3010 + 1 1759 3006 496 4016 + 1 1768 3010 4016 703 + 1 1757 1759 1768 3010 + 1 1757 1759 3010 3006 + 1 1759 1768 3010 4016 + 1 1759 3006 4016 3010 + 1 1203 484 2104 3939 + 1 1201 2104 159 2106 + 1 1205 3939 2106 486 + 1 1203 1201 1205 3939 + 1 1203 1201 3939 2104 + 1 1201 1205 3939 2106 + 1 1201 2104 2106 3939 + 1 1803 714 4036 3146 + 1 1797 4036 503 3143 + 1 1795 3146 3143 311 + 1 1803 1797 1795 3146 + 1 1803 1797 3146 4036 + 1 1797 1795 3146 3143 + 1 1797 4036 3143 3146 + 1 1758 488 3972 3974 + 1 1765 3972 700 4853 + 1 1768 3974 4853 703 + 1 1758 1765 1768 3974 + 1 1758 1765 3974 3972 + 1 1765 1768 3974 4853 + 1 1765 3972 4853 3974 + 1 1758 488 3974 3970 + 1 1759 3970 4016 496 + 1 1768 3974 703 4016 + 1 1758 1759 3974 1768 + 1 1758 1759 3970 3974 + 1 1759 1768 4016 3974 + 1 1759 3970 3974 4016 + 1 1209 490 3980 3955 + 1 1211 3980 492 3956 + 1 1205 3955 3956 486 + 1 1209 1211 1205 3955 + 1 1209 1211 3955 3980 + 1 1211 1205 3955 3956 + 1 1211 3980 3956 3955 + 1 1203 484 3939 3943 + 1 1211 3943 3956 492 + 1 1205 3939 486 3956 + 1 1203 1211 3939 1205 + 1 1203 1211 3943 3939 + 1 1211 1205 3956 3939 + 1 1211 3943 3939 3956 + 1 1639 272 2894 2891 + 1 1647 2894 664 3756 + 1 1641 2891 3756 444 + 1 1639 1647 1641 2891 + 1 1639 1647 2891 2894 + 1 1647 1641 2891 3756 + 1 1647 2894 3756 2891 + 1 1657 667 3139 3767 + 1 1649 3139 310 3136 + 1 1652 3767 3136 447 + 1 1657 1649 1652 3767 + 1 1657 1649 3767 3139 + 1 1649 1652 3767 3136 + 1 1649 3139 3136 3767 + 1 1127 439 3732 2057 + 1 1128 3732 440 2058 + 1 1125 2057 2058 150 + 1 1127 1128 1125 2057 + 1 1127 1128 2057 3732 + 1 1128 1125 2057 2058 + 1 1128 3732 2058 2057 + 1 1645 662 3745 3755 + 1 1640 3745 441 3743 + 1 1641 3755 3743 444 + 1 1645 1640 1641 3755 + 1 1645 1640 3755 3745 + 1 1640 1641 3755 3743 + 1 1640 3745 3743 3755 + 1 1645 662 3755 4698 + 1 1647 4698 3756 664 + 1 1641 3755 444 3756 + 1 1645 1647 3755 1641 + 1 1645 1647 4698 3755 + 1 1647 1641 3756 3755 + 1 1647 4698 3755 3756 + 1 1650 442 3746 3747 + 1 1651 3746 445 3758 + 1 1652 3747 3758 447 + 1 1650 1651 1652 3747 + 1 1650 1651 3747 3746 + 1 1651 1652 3747 3758 + 1 1651 3746 3758 3747 + 1 1657 667 3767 3762 + 1 1651 3762 3758 445 + 1 1652 3767 447 3758 + 1 1657 1651 3767 1652 + 1 1657 1651 3762 3767 + 1 1651 1652 3758 3767 + 1 1651 3762 3767 3758 + 1 1505 244 2706 2708 + 1 1513 2706 609 4473 + 1 1516 2708 4473 612 + 1 1505 1513 1516 2708 + 1 1505 1513 2708 2706 + 1 1513 1516 2708 4473 + 1 1513 2706 4473 2708 + 1 1487 598 2529 4413 + 1 1481 2529 224 2530 + 1 1488 4413 2530 599 + 1 1487 1481 1488 4413 + 1 1487 1481 4413 2529 + 1 1481 1488 4413 2530 + 1 1481 2529 2530 4413 + 1 1526 616 4499 2887 + 1 1525 4499 615 2886 + 1 1519 2887 2886 271 + 1 1526 1525 1519 2887 + 1 1526 1525 2887 4499 + 1 1525 1519 2887 2886 + 1 1525 4499 2886 2887 + 1 1509 596 4405 4407 + 1 1511 4405 607 4462 + 1 1516 4407 4462 612 + 1 1509 1511 1516 4407 + 1 1509 1511 4407 4405 + 1 1511 1516 4407 4462 + 1 1511 4405 4462 4407 + 1 1509 596 4407 4406 + 1 1513 4406 4473 609 + 1 1516 4407 612 4473 + 1 1509 1513 4407 1516 + 1 1509 1513 4406 4407 + 1 1513 1516 4473 4407 + 1 1513 4406 4407 4473 + 1 1486 597 4409 4408 + 1 1489 4409 600 4418 + 1 1488 4408 4418 599 + 1 1486 1489 1488 4408 + 1 1486 1489 4408 4409 + 1 1489 1488 4408 4418 + 1 1489 4409 4418 4408 + 1 1487 598 4413 4414 + 1 1489 4414 4418 600 + 1 1488 4413 599 4418 + 1 1487 1489 4413 1488 + 1 1487 1489 4414 4413 + 1 1489 1488 4418 4413 + 1 1489 4414 4413 4418 + 1 1505 244 2708 2709 + 1 1517 2709 4485 613 + 1 1516 2708 612 4485 + 1 1505 1517 2708 1516 + 1 1505 1517 2709 2708 + 1 1517 1516 4485 2708 + 1 1517 2709 2708 4485 + 1 1553 624 4534 2988 + 1 1543 2988 2989 286 + 1 1554 4534 625 2989 + 1 1553 1543 4534 1554 + 1 1553 1543 2988 4534 + 1 1543 1554 2989 4534 + 1 1543 2988 4534 2989 + 1 1526 616 2887 4501 + 1 1527 4501 2888 617 + 1 1519 2887 271 2888 + 1 1526 1527 2887 1519 + 1 1526 1527 4501 2887 + 1 1527 1519 2888 2887 + 1 1527 4501 2887 2888 + 1 1512 608 4467 4461 + 1 1511 4461 4462 607 + 1 1516 4467 612 4462 + 1 1512 1511 4467 1516 + 1 1512 1511 4461 4467 + 1 1511 1516 4462 4467 + 1 1511 4461 4467 4462 + 1 1512 608 4468 4467 + 1 1517 4468 613 4485 + 1 1516 4467 4485 612 + 1 1512 1517 1516 4467 + 1 1512 1517 4467 4468 + 1 1517 1516 4467 4485 + 1 1517 4468 4485 4467 + 1 1549 614 4498 4497 + 1 1552 4497 4530 623 + 1 1554 4498 625 4530 + 1 1549 1552 4498 1554 + 1 1549 1552 4497 4498 + 1 1552 1554 4530 4498 + 1 1552 4497 4498 4530 + 1 1553 624 4529 4534 + 1 1552 4529 623 4530 + 1 1554 4534 4530 625 + 1 1553 1552 1554 4534 + 1 1553 1552 4534 4529 + 1 1552 1554 4534 4530 + 1 1552 4529 4530 4534 + 1 1628 225 2536 2537 + 1 1634 2536 658 4680 + 1 1635 2537 4680 659 + 1 1628 1634 1635 2537 + 1 1628 1634 2537 2536 + 1 1634 1635 2537 4680 + 1 1634 2536 4680 2537 + 1 1749 663 2900 4703 + 1 1743 2900 273 2903 + 1 1754 4703 2903 698 + 1 1749 1743 1754 4703 + 1 1749 1743 4703 2900 + 1 1743 1754 4703 2903 + 1 1743 2900 2903 4703 + 1 1799 666 4714 3144 + 1 1802 4714 713 3145 + 1 1795 3144 3145 311 + 1 1799 1802 1795 3144 + 1 1799 1802 3144 4714 + 1 1802 1795 3144 3145 + 1 1802 4714 3145 3144 + 1 1636 660 4690 4685 + 1 1637 4690 661 4686 + 1 1635 4685 4686 659 + 1 1636 1637 1635 4685 + 1 1636 1637 4685 4690 + 1 1637 1635 4685 4686 + 1 1637 4690 4686 4685 + 1 1636 660 4685 4681 + 1 1634 4681 4680 658 + 1 1635 4685 659 4680 + 1 1636 1634 4685 1635 + 1 1636 1634 4681 4685 + 1 1634 1635 4680 4685 + 1 1634 4681 4685 4680 + 1 1752 696 4709 4831 + 1 1750 4709 665 4710 + 1 1754 4831 4710 698 + 1 1752 1750 1754 4831 + 1 1752 1750 4831 4709 + 1 1750 1754 4831 4710 + 1 1750 4709 4710 4831 + 1 1749 663 4703 4702 + 1 1750 4702 4710 665 + 1 1754 4703 698 4710 + 1 1749 1750 4703 1754 + 1 1749 1750 4702 4703 + 1 1750 1754 4710 4703 + 1 1750 4702 4703 4710 + 1 1757 288 3010 3009 + 1 1767 3009 4857 702 + 1 1768 3010 703 4857 + 1 1757 1767 3010 1768 + 1 1757 1767 3009 3010 + 1 1767 1768 4857 3010 + 1 1767 3009 3010 4857 + 1 1753 697 4836 2902 + 1 1743 2902 2903 273 + 1 1754 4836 698 2903 + 1 1753 1743 4836 1754 + 1 1753 1743 2902 4836 + 1 1743 1754 2903 4836 + 1 1743 2902 4836 2903 + 1 1803 714 3146 4896 + 1 1802 4896 3145 713 + 1 1795 3146 311 3145 + 1 1803 1802 3146 1795 + 1 1803 1802 4896 3146 + 1 1802 1795 3145 3146 + 1 1802 4896 3146 3145 + 1 1764 695 4830 4828 + 1 1765 4828 4853 700 + 1 1768 4830 703 4853 + 1 1764 1765 4830 1768 + 1 1764 1765 4828 4830 + 1 1765 1768 4853 4830 + 1 1765 4828 4830 4853 + 1 1764 695 4829 4830 + 1 1767 4829 702 4857 + 1 1768 4830 4857 703 + 1 1764 1767 1768 4830 + 1 1764 1767 4830 4829 + 1 1767 1768 4830 4857 + 1 1767 4829 4857 4830 + 1 1752 696 4831 4832 + 1 1755 4832 4841 699 + 1 1754 4831 698 4841 + 1 1752 1755 4831 1754 + 1 1752 1755 4832 4831 + 1 1755 1754 4841 4831 + 1 1755 4832 4831 4841 + 1 1753 697 4837 4836 + 1 1755 4837 699 4841 + 1 1754 4836 4841 698 + 1 1753 1755 1754 4836 + 1 1753 1755 4836 4837 + 1 1755 1754 4836 4841 + 1 1755 4837 4841 4836 + 1 956 130 1959 1960 + 1 959 1959 340 3287 + 1 960 1960 3287 341 + 1 956 959 960 1960 + 1 956 959 1960 1959 + 1 959 960 1960 3287 + 1 959 1959 3287 1960 + 1 1289 354 2396 3365 + 1 1287 2396 205 2399 + 1 1295 3365 2399 533 + 1 1289 1287 1295 3365 + 1 1289 1287 3365 2396 + 1 1287 1295 3365 2399 + 1 1287 2396 2399 3365 + 1 1300 369 3437 2576 + 1 1309 3437 538 2581 + 1 1297 2576 2581 230 + 1 1300 1309 1297 2576 + 1 1300 1309 2576 3437 + 1 1309 1297 2576 2581 + 1 1309 3437 2581 2576 + 1 962 343 3303 3292 + 1 963 3303 344 3293 + 1 960 3292 3293 341 + 1 962 963 960 3292 + 1 962 963 3292 3303 + 1 963 960 3292 3293 + 1 963 3303 3293 3292 + 1 962 343 3292 3288 + 1 959 3288 3287 340 + 1 960 3292 341 3287 + 1 962 959 3292 960 + 1 962 959 3288 3292 + 1 959 960 3287 3292 + 1 959 3288 3292 3287 + 1 1292 530 3430 4151 + 1 1290 3430 368 3431 + 1 1295 4151 3431 533 + 1 1292 1290 1295 4151 + 1 1292 1290 4151 3430 + 1 1290 1295 4151 3431 + 1 1290 3430 3431 4151 + 1 1289 354 3365 3364 + 1 1290 3364 3431 368 + 1 1295 3365 533 3431 + 1 1289 1290 3365 1295 + 1 1289 1290 3364 3365 + 1 1290 1295 3431 3365 + 1 1290 3364 3365 3431 + 1 1351 206 2403 2406 + 1 1353 2403 406 3603 + 1 1359 2406 3603 556 + 1 1351 1353 1359 2406 + 1 1351 1353 2406 2403 + 1 1353 1359 2406 3603 + 1 1353 2403 3603 2406 + 1 1056 398 2016 3556 + 1 1054 2016 141 2017 + 1 1057 3556 2017 399 + 1 1056 1054 1057 3556 + 1 1056 1054 3556 2016 + 1 1054 1057 3556 2017 + 1 1054 2016 2017 3556 + 1 1382 564 3640 2931 + 1 1377 3640 415 2929 + 1 1375 2931 2929 278 + 1 1382 1377 1375 2931 + 1 1382 1377 2931 3640 + 1 1377 1375 2931 2929 + 1 1377 3640 2929 2931 + 1 1352 400 3570 3571 + 1 1357 3570 554 4243 + 1 1359 3571 4243 556 + 1 1352 1357 1359 3571 + 1 1352 1357 3571 3570 + 1 1357 1359 3571 4243 + 1 1357 3570 4243 3571 + 1 1352 400 3571 3569 + 1 1353 3569 3603 406 + 1 1359 3571 556 3603 + 1 1352 1353 3571 1359 + 1 1352 1353 3569 3571 + 1 1353 1359 3603 3571 + 1 1353 3569 3571 3603 + 1 1059 401 3572 3562 + 1 1060 3572 402 3563 + 1 1057 3562 3563 399 + 1 1059 1060 1057 3562 + 1 1059 1060 3562 3572 + 1 1060 1057 3562 3563 + 1 1060 3572 3563 3562 + 1 1056 398 3556 3558 + 1 1060 3558 3563 402 + 1 1057 3556 399 3563 + 1 1056 1060 3556 1057 + 1 1056 1060 3558 3556 + 1 1060 1057 3563 3556 + 1 1060 3558 3556 3563 + 1 1399 232 2602 2597 + 1 1411 2602 575 3845 + 1 1401 2597 3845 460 + 1 1399 1411 1401 2597 + 1 1399 1411 2597 2602 + 1 1411 1401 2597 3845 + 1 1411 2602 3845 2597 + 1 1431 578 2938 3907 + 1 1423 2938 279 2934 + 1 1426 3907 2934 473 + 1 1431 1423 1426 3907 + 1 1431 1423 3907 2938 + 1 1423 1426 3907 2934 + 1 1423 2938 2934 3907 + 1 1146 449 3770 2068 + 1 1148 3770 451 2070 + 1 1144 2068 2070 153 + 1 1146 1148 1144 2068 + 1 1146 1148 2068 3770 + 1 1148 1144 2068 2070 + 1 1148 3770 2070 2068 + 1 1408 572 3794 3843 + 1 1400 3794 452 3791 + 1 1401 3843 3791 460 + 1 1408 1400 1401 3843 + 1 1408 1400 3843 3794 + 1 1400 1401 3843 3791 + 1 1400 3794 3791 3843 + 1 1408 572 3843 4321 + 1 1411 4321 3845 575 + 1 1401 3843 460 3845 + 1 1408 1411 3843 1401 + 1 1408 1411 4321 3843 + 1 1411 1401 3845 3843 + 1 1411 4321 3843 3845 + 1 1424 454 3800 3801 + 1 1425 3800 461 3847 + 1 1426 3801 3847 473 + 1 1424 1425 1426 3801 + 1 1424 1425 3801 3800 + 1 1425 1426 3801 3847 + 1 1425 3800 3847 3801 + 1 1431 578 3907 3851 + 1 1425 3851 3847 461 + 1 1426 3907 473 3847 + 1 1431 1425 3907 1426 + 1 1431 1425 3851 3907 + 1 1425 1426 3847 3907 + 1 1425 3851 3907 3847 + 1 1253 180 2222 2224 + 1 1259 2222 516 4090 + 1 1261 2224 4090 518 + 1 1253 1259 1261 2224 + 1 1253 1259 2224 2222 + 1 1259 1261 2224 4090 + 1 1259 2222 4090 2224 + 1 1272 522 2271 4118 + 1 1263 2271 187 2273 + 1 1275 4118 2273 525 + 1 1272 1263 1275 4118 + 1 1272 1263 4118 2271 + 1 1263 1275 4118 2273 + 1 1263 2271 2273 4118 + 1 1305 534 4167 2578 + 1 1307 4167 536 2579 + 1 1297 2578 2579 230 + 1 1305 1307 1297 2578 + 1 1305 1307 2578 4167 + 1 1307 1297 2578 2579 + 1 1307 4167 2579 2578 + 1 1256 513 4072 4074 + 1 1258 4072 515 4084 + 1 1261 4074 4084 518 + 1 1256 1258 1261 4074 + 1 1256 1258 4074 4072 + 1 1258 1261 4074 4084 + 1 1258 4072 4084 4074 + 1 1256 513 4074 4073 + 1 1259 4073 4090 516 + 1 1261 4074 518 4090 + 1 1256 1259 4074 1261 + 1 1256 1259 4073 4074 + 1 1259 1261 4090 4074 + 1 1259 4073 4074 4090 + 1 1270 520 4108 4110 + 1 1273 4108 523 4121 + 1 1275 4110 4121 525 + 1 1270 1273 1275 4110 + 1 1270 1273 4110 4108 + 1 1273 1275 4110 4121 + 1 1273 4108 4121 4110 + 1 1272 522 4118 4117 + 1 1273 4117 4121 523 + 1 1275 4118 525 4121 + 1 1272 1273 4118 1275 + 1 1272 1273 4117 4118 + 1 1273 1275 4121 4118 + 1 1273 4117 4118 4121 + 1 1253 180 2224 2223 + 1 1260 2223 4094 517 + 1 1261 2224 518 4094 + 1 1253 1260 2224 1261 + 1 1253 1260 2223 2224 + 1 1260 1261 4094 2224 + 1 1260 2223 2224 4094 + 1 1293 531 4155 2398 + 1 1287 2398 2399 205 + 1 1295 4155 533 2399 + 1 1293 1287 4155 1295 + 1 1293 1287 2398 4155 + 1 1287 1295 2399 4155 + 1 1287 2398 4155 2399 + 1 1305 534 2578 4168 + 1 1309 4168 2581 538 + 1 1297 2578 230 2581 + 1 1305 1309 2578 1297 + 1 1305 1309 4168 2578 + 1 1309 1297 2581 2578 + 1 1309 4168 2578 2581 + 1 1257 514 4080 4078 + 1 1258 4078 4084 515 + 1 1261 4080 518 4084 + 1 1257 1258 4080 1261 + 1 1257 1258 4078 4080 + 1 1258 1261 4084 4080 + 1 1258 4078 4080 4084 + 1 1257 514 4079 4080 + 1 1260 4079 517 4094 + 1 1261 4080 4094 518 + 1 1257 1260 1261 4080 + 1 1257 1260 4080 4079 + 1 1260 1261 4080 4094 + 1 1260 4079 4094 4080 + 1 1292 530 4151 4150 + 1 1294 4150 4158 532 + 1 1295 4151 533 4158 + 1 1292 1294 4151 1295 + 1 1292 1294 4150 4151 + 1 1294 1295 4158 4151 + 1 1294 4150 4151 4158 + 1 1293 531 4154 4155 + 1 1294 4154 532 4158 + 1 1295 4155 4158 533 + 1 1293 1294 1295 4155 + 1 1293 1294 4155 4154 + 1 1294 1295 4155 4158 + 1 1294 4154 4158 4155 + 1 1341 189 2285 2286 + 1 1348 2285 551 4230 + 1 1349 2286 4230 552 + 1 1341 1348 1349 2286 + 1 1341 1348 2286 2285 + 1 1348 1349 2286 4230 + 1 1348 2285 4230 2286 + 1 1369 558 2589 4261 + 1 1361 2589 231 2591 + 1 1373 4261 2591 562 + 1 1369 1361 1373 4261 + 1 1369 1361 4261 2589 + 1 1361 1373 4261 2591 + 1 1361 2589 2591 4261 + 1 1381 563 4285 2930 + 1 1383 4285 565 2932 + 1 1375 2930 2932 278 + 1 1381 1383 1375 2930 + 1 1381 1383 2930 4285 + 1 1383 1375 2930 2932 + 1 1383 4285 2932 2930 + 1 1346 549 4220 4222 + 1 1347 4220 550 4226 + 1 1349 4222 4226 552 + 1 1346 1347 1349 4222 + 1 1346 1347 4222 4220 + 1 1347 1349 4222 4226 + 1 1347 4220 4226 4222 + 1 1346 549 4222 4221 + 1 1348 4221 4230 551 + 1 1349 4222 552 4230 + 1 1346 1348 4222 1349 + 1 1346 1348 4221 4222 + 1 1348 1349 4230 4222 + 1 1348 4221 4222 4230 + 1 1368 557 4254 4256 + 1 1370 4254 559 4264 + 1 1373 4256 4264 562 + 1 1368 1370 1373 4256 + 1 1368 1370 4256 4254 + 1 1370 1373 4256 4264 + 1 1370 4254 4264 4256 + 1 1369 558 4261 4260 + 1 1370 4260 4264 559 + 1 1373 4261 562 4264 + 1 1369 1370 4261 1373 + 1 1369 1370 4260 4261 + 1 1370 1373 4264 4261 + 1 1370 4260 4261 4264 + 1 1351 206 2406 2405 + 1 1358 2405 4247 555 + 1 1359 2406 556 4247 + 1 1351 1358 2406 1359 + 1 1351 1358 2405 2406 + 1 1358 1359 4247 2406 + 1 1358 2405 2406 4247 + 1 1371 560 4271 2590 + 1 1361 2590 2591 231 + 1 1373 4271 562 2591 + 1 1371 1361 4271 1373 + 1 1371 1361 2590 4271 + 1 1361 1373 2591 4271 + 1 1361 2590 4271 2591 + 1 1382 564 2931 4287 + 1 1383 4287 2932 565 + 1 1375 2931 278 2932 + 1 1382 1383 2931 1375 + 1 1382 1383 4287 2931 + 1 1383 1375 2932 2931 + 1 1383 4287 2931 2932 + 1 1356 553 4239 4237 + 1 1357 4237 4243 554 + 1 1359 4239 556 4243 + 1 1356 1357 4239 1359 + 1 1356 1357 4237 4239 + 1 1357 1359 4243 4239 + 1 1357 4237 4239 4243 + 1 1356 553 4238 4239 + 1 1358 4238 555 4247 + 1 1359 4239 4247 556 + 1 1356 1358 1359 4239 + 1 1356 1358 4239 4238 + 1 1358 1359 4239 4247 + 1 1358 4238 4247 4239 + 1 1368 557 4256 4255 + 1 1372 4255 4274 561 + 1 1373 4256 562 4274 + 1 1368 1372 4256 1373 + 1 1368 1372 4255 4256 + 1 1372 1373 4274 4256 + 1 1372 4255 4256 4274 + 1 1371 560 4270 4271 + 1 1372 4270 561 4274 + 1 1373 4271 4274 562 + 1 1371 1372 1373 4271 + 1 1371 1372 4271 4270 + 1 1372 1373 4271 4274 + 1 1372 4270 4274 4271 + 1 956 130 1960 1958 + 1 960 1960 341 3281 + 1 958 1958 3281 339 + 1 956 960 958 1958 + 1 956 960 1958 1960 + 1 960 958 1958 3281 + 1 960 1960 3281 1958 + 1 1300 369 2576 3436 + 1 1297 2576 230 2580 + 1 1308 3436 2580 537 + 1 1300 1297 1308 3436 + 1 1300 1297 3436 2576 + 1 1297 1308 3436 2580 + 1 1297 2576 2580 3436 + 1 1279 347 3327 2331 + 1 1285 3327 529 2334 + 1 1277 2331 2334 196 + 1 1279 1285 1277 2331 + 1 1279 1285 2331 3327 + 1 1285 1277 2331 2334 + 1 1285 3327 2334 2331 + 1 963 344 3299 3283 + 1 961 3299 342 3282 + 1 958 3283 3282 339 + 1 963 961 958 3283 + 1 963 961 3283 3299 + 1 961 958 3283 3282 + 1 961 3299 3282 3283 + 1 963 344 3283 3293 + 1 960 3293 3281 341 + 1 958 3283 339 3281 + 1 963 960 3283 958 + 1 963 960 3293 3283 + 1 960 958 3281 3283 + 1 960 3293 3283 3281 + 1 1303 526 3331 4140 + 1 1299 3331 348 3333 + 1 1308 4140 3333 537 + 1 1303 1299 1308 4140 + 1 1303 1299 4140 3331 + 1 1299 1308 4140 3333 + 1 1299 3331 3333 4140 + 1 1300 369 3436 3329 + 1 1299 3329 3333 348 + 1 1308 3436 537 3333 + 1 1300 1299 3436 1308 + 1 1300 1299 3329 3436 + 1 1299 1308 3333 3436 + 1 1299 3329 3436 3333 + 1 1399 232 2597 2601 + 1 1401 2597 460 3844 + 1 1410 2601 3844 574 + 1 1399 1401 1410 2601 + 1 1399 1401 2601 2597 + 1 1401 1410 2601 3844 + 1 1401 2597 3844 2601 + 1 1146 449 2068 3769 + 1 1144 2068 153 2069 + 1 1147 3769 2069 450 + 1 1146 1144 1147 3769 + 1 1146 1144 3769 2068 + 1 1144 1147 3769 2069 + 1 1144 2068 2069 3769 + 1 1421 577 3889 2834 + 1 1415 3889 468 2831 + 1 1413 2834 2831 263 + 1 1421 1415 1413 2834 + 1 1421 1415 2834 3889 + 1 1415 1413 2834 2831 + 1 1415 3889 2831 2834 + 1 1400 452 3793 3795 + 1 1407 3793 571 4319 + 1 1410 3795 4319 574 + 1 1400 1407 1410 3795 + 1 1400 1407 3795 3793 + 1 1407 1410 3795 4319 + 1 1407 3793 4319 3795 + 1 1400 452 3795 3791 + 1 1401 3791 3844 460 + 1 1410 3795 574 3844 + 1 1400 1401 3795 1410 + 1 1400 1401 3791 3795 + 1 1401 1410 3844 3795 + 1 1401 3791 3795 3844 + 1 1150 453 3796 3779 + 1 1152 3796 455 3780 + 1 1147 3779 3780 450 + 1 1150 1152 1147 3779 + 1 1150 1152 3779 3796 + 1 1152 1147 3779 3780 + 1 1152 3796 3780 3779 + 1 1146 449 3769 3773 + 1 1152 3773 3780 455 + 1 1147 3769 450 3780 + 1 1146 1152 3769 1147 + 1 1146 1152 3773 3769 + 1 1152 1147 3780 3769 + 1 1152 3773 3769 3780 + 1 1321 197 2340 2337 + 1 1329 2340 545 3517 + 1 1323 2337 3517 387 + 1 1321 1329 1323 2337 + 1 1321 1329 2337 2340 + 1 1329 1323 2337 3517 + 1 1329 2340 3517 2337 + 1 1339 548 2827 3544 + 1 1331 2827 262 2824 + 1 1334 3544 2824 394 + 1 1339 1331 1334 3544 + 1 1339 1331 3544 2827 + 1 1331 1334 3544 2824 + 1 1331 2827 2824 3544 + 1 1026 381 3485 1999 + 1 1027 3485 382 2000 + 1 1024 1999 2000 137 + 1 1026 1027 1024 1999 + 1 1026 1027 1999 3485 + 1 1027 1024 1999 2000 + 1 1027 3485 2000 1999 + 1 1327 543 3498 3516 + 1 1322 3498 383 3496 + 1 1323 3516 3496 387 + 1 1327 1322 1323 3516 + 1 1327 1322 3516 3498 + 1 1322 1323 3516 3496 + 1 1322 3498 3496 3516 + 1 1327 543 3516 4201 + 1 1329 4201 3517 545 + 1 1323 3516 387 3517 + 1 1327 1329 3516 1323 + 1 1327 1329 4201 3516 + 1 1329 1323 3517 3516 + 1 1329 4201 3516 3517 + 1 1332 384 3499 3500 + 1 1333 3499 388 3519 + 1 1334 3500 3519 394 + 1 1332 1333 1334 3500 + 1 1332 1333 3500 3499 + 1 1333 1334 3500 3519 + 1 1333 3499 3519 3500 + 1 1339 548 3544 3523 + 1 1333 3523 3519 388 + 1 1334 3544 394 3519 + 1 1339 1333 3544 1334 + 1 1339 1333 3523 3544 + 1 1333 1334 3519 3544 + 1 1333 3523 3544 3519 + 1 1263 187 2270 2272 + 1 1271 2270 521 4115 + 1 1274 2272 4115 524 + 1 1263 1271 1274 2272 + 1 1263 1271 2272 2270 + 1 1271 1274 2272 4115 + 1 1271 2270 4115 2272 + 1 1249 510 2189 4055 + 1 1243 2189 174 2190 + 1 1250 4055 2190 511 + 1 1249 1243 1250 4055 + 1 1249 1243 4055 2189 + 1 1243 1250 4055 2190 + 1 1243 2189 2190 4055 + 1 1284 528 4141 2333 + 1 1283 4141 527 2332 + 1 1277 2333 2332 196 + 1 1284 1283 1277 2333 + 1 1284 1283 2333 4141 + 1 1283 1277 2333 2332 + 1 1283 4141 2332 2333 + 1 1267 508 4047 4049 + 1 1269 4047 519 4104 + 1 1274 4049 4104 524 + 1 1267 1269 1274 4049 + 1 1267 1269 4049 4047 + 1 1269 1274 4049 4104 + 1 1269 4047 4104 4049 + 1 1267 508 4049 4048 + 1 1271 4048 4115 521 + 1 1274 4049 524 4115 + 1 1267 1271 4049 1274 + 1 1267 1271 4048 4049 + 1 1271 1274 4115 4049 + 1 1271 4048 4049 4115 + 1 1248 509 4051 4050 + 1 1251 4051 512 4060 + 1 1250 4050 4060 511 + 1 1248 1251 1250 4050 + 1 1248 1251 4050 4051 + 1 1251 1250 4050 4060 + 1 1251 4051 4060 4050 + 1 1249 510 4055 4056 + 1 1251 4056 4060 512 + 1 1250 4055 511 4060 + 1 1249 1251 4055 1250 + 1 1249 1251 4056 4055 + 1 1251 1250 4060 4055 + 1 1251 4056 4055 4060 + 1 1263 187 2272 2273 + 1 1275 2273 4127 525 + 1 1274 2272 524 4127 + 1 1263 1275 2272 1274 + 1 1263 1275 2273 2272 + 1 1275 1274 4127 2272 + 1 1275 2273 2272 4127 + 1 1307 536 4176 2579 + 1 1297 2579 2580 230 + 1 1308 4176 537 2580 + 1 1307 1297 4176 1308 + 1 1307 1297 2579 4176 + 1 1297 1308 2580 4176 + 1 1297 2579 4176 2580 + 1 1284 528 2333 4143 + 1 1285 4143 2334 529 + 1 1277 2333 196 2334 + 1 1284 1285 2333 1277 + 1 1284 1285 4143 2333 + 1 1285 1277 2334 2333 + 1 1285 4143 2333 2334 + 1 1270 520 4109 4103 + 1 1269 4103 4104 519 + 1 1274 4109 524 4104 + 1 1270 1269 4109 1274 + 1 1270 1269 4103 4109 + 1 1269 1274 4104 4109 + 1 1269 4103 4109 4104 + 1 1270 520 4110 4109 + 1 1275 4110 525 4127 + 1 1274 4109 4127 524 + 1 1270 1275 1274 4109 + 1 1270 1275 4109 4110 + 1 1275 1274 4109 4127 + 1 1275 4110 4127 4109 + 1 1303 526 4140 4139 + 1 1306 4139 4172 535 + 1 1308 4140 537 4172 + 1 1303 1306 4140 1308 + 1 1303 1306 4139 4140 + 1 1306 1308 4172 4140 + 1 1306 4139 4140 4172 + 1 1307 536 4171 4176 + 1 1306 4171 535 4172 + 1 1308 4176 4172 537 + 1 1307 1306 1308 4176 + 1 1307 1306 4176 4171 + 1 1306 1308 4176 4172 + 1 1306 4171 4172 4176 + 1 1310 175 2196 2197 + 1 1316 2196 539 4183 + 1 1317 2197 4183 540 + 1 1310 1316 1317 2197 + 1 1310 1316 2197 2196 + 1 1316 1317 2197 4183 + 1 1316 2196 4183 2197 + 1 1391 544 2346 4206 + 1 1385 2346 198 2349 + 1 1396 4206 2349 569 + 1 1391 1385 1396 4206 + 1 1391 1385 4206 2346 + 1 1385 1396 4206 2349 + 1 1385 2346 2349 4206 + 1 1417 547 4217 2832 + 1 1420 4217 576 2833 + 1 1413 2832 2833 263 + 1 1417 1420 1413 2832 + 1 1417 1420 2832 4217 + 1 1420 1413 2832 2833 + 1 1420 4217 2833 2832 + 1 1318 541 4193 4188 + 1 1319 4193 542 4189 + 1 1317 4188 4189 540 + 1 1318 1319 1317 4188 + 1 1318 1319 4188 4193 + 1 1319 1317 4188 4189 + 1 1319 4193 4189 4188 + 1 1318 541 4188 4184 + 1 1316 4184 4183 539 + 1 1317 4188 540 4183 + 1 1318 1316 4188 1317 + 1 1318 1316 4184 4188 + 1 1316 1317 4183 4188 + 1 1316 4184 4188 4183 + 1 1394 567 4212 4297 + 1 1392 4212 546 4213 + 1 1396 4297 4213 569 + 1 1394 1392 1396 4297 + 1 1394 1392 4297 4212 + 1 1392 1396 4297 4213 + 1 1392 4212 4213 4297 + 1 1391 544 4206 4205 + 1 1392 4205 4213 546 + 1 1396 4206 569 4213 + 1 1391 1392 4206 1396 + 1 1391 1392 4205 4206 + 1 1392 1396 4213 4206 + 1 1392 4205 4206 4213 + 1 1399 232 2601 2600 + 1 1409 2600 4323 573 + 1 1410 2601 574 4323 + 1 1399 1409 2601 1410 + 1 1399 1409 2600 2601 + 1 1409 1410 4323 2601 + 1 1409 2600 2601 4323 + 1 1395 568 4302 2348 + 1 1385 2348 2349 198 + 1 1396 4302 569 2349 + 1 1395 1385 4302 1396 + 1 1395 1385 2348 4302 + 1 1385 1396 2349 4302 + 1 1385 2348 4302 2349 + 1 1421 577 2834 4328 + 1 1420 4328 2833 576 + 1 1413 2834 263 2833 + 1 1421 1420 2834 1413 + 1 1421 1420 4328 2834 + 1 1420 1413 2833 2834 + 1 1420 4328 2834 2833 + 1 1406 566 4296 4294 + 1 1407 4294 4319 571 + 1 1410 4296 574 4319 + 1 1406 1407 4296 1410 + 1 1406 1407 4294 4296 + 1 1407 1410 4319 4296 + 1 1407 4294 4296 4319 + 1 1406 566 4295 4296 + 1 1409 4295 573 4323 + 1 1410 4296 4323 574 + 1 1406 1409 1410 4296 + 1 1406 1409 4296 4295 + 1 1409 1410 4296 4323 + 1 1409 4295 4323 4296 + 1 1394 567 4297 4298 + 1 1397 4298 4307 570 + 1 1396 4297 569 4307 + 1 1394 1397 4297 1396 + 1 1394 1397 4298 4297 + 1 1397 1396 4307 4297 + 1 1397 4298 4297 4307 + 1 1395 568 4303 4302 + 1 1397 4303 570 4307 + 1 1396 4302 4307 569 + 1 1395 1397 1396 4302 + 1 1395 1397 4302 4303 + 1 1397 1396 4302 4307 + 1 1397 4303 4307 4302 + 1 983 35 987 986 + 1 1979 987 359 3381 + 1 1978 986 3381 358 + 1 983 1979 1978 986 + 1 983 1979 986 987 + 1 1979 1978 986 3381 + 1 1979 987 3381 986 + 1 1994 359 1015 3390 + 1 1012 1015 38 1017 + 1 1996 3390 1017 367 + 1 1994 1012 1996 3390 + 1 1994 1012 3390 1015 + 1 1012 1996 3390 1017 + 1 1012 1015 1017 3390 + 1 1989 358 3384 1003 + 1 1990 3384 367 1004 + 1 998 1003 1004 37 + 1 1989 1990 998 1003 + 1 1989 1990 1003 3384 + 1 1990 998 1003 1004 + 1 1990 3384 1004 1003 + 1 1975 136 1983 1993 + 1 1974 1983 135 1989 + 1 1978 1993 1989 358 + 1 1975 1974 1978 1993 + 1 1975 1974 1993 1983 + 1 1974 1978 1993 1989 + 1 1974 1983 1989 1993 + 1 1975 136 1993 1994 + 1 1979 1994 3381 359 + 1 1978 1993 358 3381 + 1 1975 1979 1993 1978 + 1 1975 1979 1994 1993 + 1 1979 1978 3381 1993 + 1 1979 1994 1993 3381 + 1 1983 135 1989 1990 + 1 1993 1989 358 3384 + 1 1996 1990 3384 367 + 1 1983 1993 1996 1990 + 1 1983 1993 1990 1989 + 1 1993 1996 1990 3384 + 1 1993 1989 3384 1990 + 1 1994 359 3390 3381 + 1 1993 3381 3384 358 + 1 1996 3390 367 3384 + 1 1994 1993 3390 1996 + 1 1994 1993 3381 3390 + 1 1993 1996 3384 3390 + 1 1993 3381 3390 3384 + 1 973 34 977 978 + 1 1972 977 352 3348 + 1 1973 978 3348 353 + 1 973 1972 1973 978 + 1 973 1972 978 977 + 1 1972 1973 978 3348 + 1 1972 977 3348 978 + 1 1987 352 1002 3352 + 1 998 1002 37 1004 + 1 1990 3352 1004 367 + 1 1987 998 1990 3352 + 1 1987 998 3352 1002 + 1 998 1990 3352 1004 + 1 998 1002 1004 3352 + 1 1992 353 3359 1014 + 1 1996 3359 367 1017 + 1 1012 1014 1017 38 + 1 1992 1996 1012 1014 + 1 1992 1996 1014 3359 + 1 1996 1012 1014 1017 + 1 1996 3359 1017 1014 + 1 1968 135 1983 1988 + 1 1969 1983 136 1992 + 1 1973 1988 1992 353 + 1 1968 1969 1973 1988 + 1 1968 1969 1988 1983 + 1 1969 1973 1988 1992 + 1 1969 1983 1992 1988 + 1 1968 135 1988 1987 + 1 1972 1987 3348 352 + 1 1973 1988 353 3348 + 1 1968 1972 1988 1973 + 1 1968 1972 1987 1988 + 1 1972 1973 3348 1988 + 1 1972 1987 1988 3348 + 1 1983 136 1992 1996 + 1 1988 1992 353 3359 + 1 1990 1996 3359 367 + 1 1983 1988 1990 1996 + 1 1983 1988 1996 1992 + 1 1988 1990 1996 3359 + 1 1988 1992 3359 1996 + 1 1987 352 3352 3348 + 1 1988 3348 3359 353 + 1 1990 3352 367 3359 + 1 1987 1988 3352 1990 + 1 1987 1988 3348 3352 + 1 1988 1990 3359 3352 + 1 1988 3348 3352 3359 + 1 964 33 967 968 + 1 1965 967 345 3312 + 1 1966 968 3312 346 + 1 964 1965 1966 968 + 1 964 1965 968 967 + 1 1965 1966 968 3312 + 1 1965 967 3312 968 + 1 1976 345 985 3315 + 1 983 985 35 986 + 1 1978 3315 986 358 + 1 1976 983 1978 3315 + 1 1976 983 3315 985 + 1 983 1978 3315 986 + 1 983 985 986 3315 + 1 1986 346 3320 1001 + 1 1989 3320 358 1003 + 1 998 1001 1003 37 + 1 1986 1989 998 1001 + 1 1986 1989 1001 3320 + 1 1989 998 1001 1003 + 1 1989 3320 1003 1001 + 1 1961 133 1974 1977 + 1 1962 1974 135 1986 + 1 1966 1977 1986 346 + 1 1961 1962 1966 1977 + 1 1961 1962 1977 1974 + 1 1962 1966 1977 1986 + 1 1962 1974 1986 1977 + 1 1961 133 1977 1976 + 1 1965 1976 3312 345 + 1 1966 1977 346 3312 + 1 1961 1965 1977 1966 + 1 1961 1965 1976 1977 + 1 1965 1966 3312 1977 + 1 1965 1976 1977 3312 + 1 1974 135 1986 1989 + 1 1977 1986 346 3320 + 1 1978 1989 3320 358 + 1 1974 1977 1978 1989 + 1 1974 1977 1989 1986 + 1 1977 1978 1989 3320 + 1 1977 1986 3320 1989 + 1 1976 345 3315 3312 + 1 1977 3312 3320 346 + 1 1978 3315 358 3320 + 1 1976 1977 3315 1978 + 1 1976 1977 3312 3315 + 1 1977 1978 3320 3315 + 1 1977 3312 3315 3320 + 1 973 34 978 976 + 1 1973 978 353 3343 + 1 1971 976 3343 351 + 1 973 1973 1971 976 + 1 973 1973 976 978 + 1 1973 1971 976 3343 + 1 1973 978 3343 976 + 1 1992 353 1014 3358 + 1 1012 1014 38 1016 + 1 1995 3358 1016 364 + 1 1992 1012 1995 3358 + 1 1992 1012 3358 1014 + 1 1012 1995 3358 1016 + 1 1012 1014 1016 3358 + 1 1981 351 3345 994 + 1 1982 3345 364 995 + 1 992 994 995 36 + 1 1981 1982 992 994 + 1 1981 1982 994 3345 + 1 1982 992 994 995 + 1 1982 3345 995 994 + 1 1969 136 1980 1991 + 1 1967 1980 134 1981 + 1 1971 1991 1981 351 + 1 1969 1967 1971 1991 + 1 1969 1967 1991 1980 + 1 1967 1971 1991 1981 + 1 1967 1980 1981 1991 + 1 1969 136 1991 1992 + 1 1973 1992 3343 353 + 1 1971 1991 351 3343 + 1 1969 1973 1991 1971 + 1 1969 1973 1992 1991 + 1 1973 1971 3343 1991 + 1 1973 1992 1991 3343 + 1 1980 134 1981 1982 + 1 1991 1981 351 3345 + 1 1995 1982 3345 364 + 1 1980 1991 1995 1982 + 1 1980 1991 1982 1981 + 1 1991 1995 1982 3345 + 1 1991 1981 3345 1982 + 1 1992 353 3358 3343 + 1 1991 3343 3345 351 + 1 1995 3358 364 3345 + 1 1992 1991 3358 1995 + 1 1992 1991 3343 3358 + 1 1991 1995 3345 3358 + 1 1991 3343 3358 3345 + 1 926 28 929 930 + 1 1942 929 323 3215 + 1 1943 930 3215 324 + 1 926 1942 1943 930 + 1 926 1942 930 929 + 1 1942 1943 930 3215 + 1 1942 929 3215 930 + 1 1948 323 942 3218 + 1 940 942 30 943 + 1 1950 3218 943 331 + 1 1948 940 1950 3218 + 1 1948 940 3218 942 + 1 940 1950 3218 943 + 1 940 942 943 3218 + 1 1952 324 3224 949 + 1 1954 3224 331 951 + 1 947 949 951 31 + 1 1952 1954 947 949 + 1 1952 1954 949 3224 + 1 1954 947 949 951 + 1 1954 3224 951 949 + 1 1939 128 1947 1949 + 1 1940 1947 129 1952 + 1 1943 1949 1952 324 + 1 1939 1940 1943 1949 + 1 1939 1940 1949 1947 + 1 1940 1943 1949 1952 + 1 1940 1947 1952 1949 + 1 1939 128 1949 1948 + 1 1942 1948 3215 323 + 1 1943 1949 324 3215 + 1 1939 1942 1949 1943 + 1 1939 1942 1948 1949 + 1 1942 1943 3215 1949 + 1 1942 1948 1949 3215 + 1 1947 129 1952 1954 + 1 1949 1952 324 3224 + 1 1950 1954 3224 331 + 1 1947 1949 1950 1954 + 1 1947 1949 1954 1952 + 1 1949 1950 1954 3224 + 1 1949 1952 3224 1954 + 1 1948 323 3218 3215 + 1 1949 3215 3224 324 + 1 1950 3218 331 3224 + 1 1948 1949 3218 1950 + 1 1948 1949 3215 3218 + 1 1949 1950 3224 3218 + 1 1949 3215 3218 3224 + 1 926 28 930 928 + 1 1943 930 324 3210 + 1 1941 928 3210 322 + 1 926 1943 1941 928 + 1 926 1943 928 930 + 1 1943 1941 928 3210 + 1 1943 930 3210 928 + 1 1952 324 949 3223 + 1 947 949 31 950 + 1 1953 3223 950 328 + 1 1952 947 1953 3223 + 1 1952 947 3223 949 + 1 947 1953 3223 950 + 1 947 949 950 3223 + 1 1945 322 3212 936 + 1 1946 3212 328 937 + 1 934 936 937 29 + 1 1945 1946 934 936 + 1 1945 1946 936 3212 + 1 1946 934 936 937 + 1 1946 3212 937 936 + 1 1940 129 1944 1951 + 1 1938 1944 127 1945 + 1 1941 1951 1945 322 + 1 1940 1938 1941 1951 + 1 1940 1938 1951 1944 + 1 1938 1941 1951 1945 + 1 1938 1944 1945 1951 + 1 1940 129 1951 1952 + 1 1943 1952 3210 324 + 1 1941 1951 322 3210 + 1 1940 1943 1951 1941 + 1 1940 1943 1952 1951 + 1 1943 1941 3210 1951 + 1 1943 1952 1951 3210 + 1 1944 127 1945 1946 + 1 1951 1945 322 3212 + 1 1953 1946 3212 328 + 1 1944 1951 1953 1946 + 1 1944 1951 1946 1945 + 1 1951 1953 1946 3212 + 1 1951 1945 3212 1946 + 1 1952 324 3223 3210 + 1 1951 3210 3212 322 + 1 1953 3223 328 3212 + 1 1952 1951 3223 1953 + 1 1952 1951 3210 3223 + 1 1951 1953 3212 3223 + 1 1951 3210 3223 3212 + 1 1096 48 1102 1101 + 1 2465 1102 427 3685 + 1 2464 1101 3685 426 + 1 1096 2465 2464 1101 + 1 1096 2465 1101 1102 + 1 2465 2464 1101 3685 + 1 2465 1102 3685 1101 + 1 2513 427 1620 3694 + 1 1618 1620 98 1624 + 1 2516 3694 1624 649 + 1 2513 1618 2516 3694 + 1 2513 1618 3694 1620 + 1 1618 2516 3694 1624 + 1 1618 1620 1624 3694 + 1 2506 426 3690 1606 + 1 2511 3690 649 1612 + 1 1604 1606 1612 97 + 1 2506 2511 1604 1606 + 1 2506 2511 1606 3690 + 1 2511 1604 1606 1612 + 1 2511 3690 1612 1606 + 1 2462 221 2505 2512 + 1 2461 2505 220 2506 + 1 2464 2512 2506 426 + 1 2462 2461 2464 2512 + 1 2462 2461 2512 2505 + 1 2461 2464 2512 2506 + 1 2461 2505 2506 2512 + 1 2462 221 2512 2513 + 1 2465 2513 3685 427 + 1 2464 2512 426 3685 + 1 2462 2465 2512 2464 + 1 2462 2465 2513 2512 + 1 2465 2464 3685 2512 + 1 2465 2513 2512 3685 + 1 2505 220 2506 2511 + 1 2512 2506 426 3690 + 1 2516 2511 3690 649 + 1 2505 2512 2516 2511 + 1 2505 2512 2511 2506 + 1 2512 2516 2511 3690 + 1 2512 2506 3690 2511 + 1 2513 427 3694 3685 + 1 2512 3685 3690 426 + 1 2516 3694 649 3690 + 1 2513 2512 3694 2516 + 1 2513 2512 3685 3694 + 1 2512 2516 3690 3694 + 1 2512 3685 3694 3690 + 1 1784 111 1786 1791 + 1 2762 1786 489 3978 + 1 2765 1791 3978 710 + 1 1784 2762 2765 1791 + 1 1784 2762 1791 1786 + 1 2762 2765 1791 3978 + 1 2762 1786 3978 1791 + 1 2695 489 1208 3975 + 1 1202 1208 61 1210 + 1 2697 3975 1210 491 + 1 2695 1202 2697 3975 + 1 2695 1202 3975 1208 + 1 1202 2697 3975 1210 + 1 1202 1208 1210 3975 + 1 2776 710 3988 1814 + 1 2771 3988 491 1806 + 1 1804 1814 1806 113 + 1 2776 2771 1804 1814 + 1 2776 2771 1814 3988 + 1 2771 1804 1814 1806 + 1 2771 3988 1806 1814 + 1 2691 243 2693 2699 + 1 2761 2693 253 2776 + 1 2765 2699 2776 710 + 1 2691 2761 2765 2699 + 1 2691 2761 2699 2693 + 1 2761 2765 2699 2776 + 1 2761 2693 2776 2699 + 1 2691 243 2699 2695 + 1 2762 2695 3978 489 + 1 2765 2699 710 3978 + 1 2691 2762 2699 2765 + 1 2691 2762 2695 2699 + 1 2762 2765 3978 2699 + 1 2762 2695 2699 3978 + 1 2693 253 2776 2771 + 1 2699 2776 710 3988 + 1 2697 2771 3988 491 + 1 2693 2699 2697 2771 + 1 2693 2699 2771 2776 + 1 2699 2697 2771 3988 + 1 2699 2776 3988 2771 + 1 2695 489 3975 3978 + 1 2699 3978 3988 710 + 1 2697 3975 491 3988 + 1 2695 2699 3975 2697 + 1 2695 2699 3978 3975 + 1 2699 2697 3988 3975 + 1 2699 3978 3975 3988 + 1 1714 106 1724 1716 + 1 2672 1724 686 3869 + 1 2667 1716 3869 464 + 1 1714 2672 2667 1716 + 1 1714 2672 1716 1724 + 1 2672 2667 1716 3869 + 1 2672 1724 3869 1716 + 1 2679 686 1736 3874 + 1 1728 1736 107 1730 + 1 2674 3874 1730 465 + 1 2679 1728 2674 3874 + 1 2679 1728 3874 1736 + 1 1728 2674 3874 1730 + 1 1728 1736 1730 3874 + 1 2568 464 3864 1164 + 1 2569 3864 465 1165 + 1 1154 1164 1165 56 + 1 2568 2569 1154 1164 + 1 2568 2569 1164 3864 + 1 2569 1154 1164 1165 + 1 2569 3864 1165 1164 + 1 2665 241 2564 2673 + 1 2563 2564 229 2568 + 1 2667 2673 2568 464 + 1 2665 2563 2667 2673 + 1 2665 2563 2673 2564 + 1 2563 2667 2673 2568 + 1 2563 2564 2568 2673 + 1 2665 241 2673 2679 + 1 2672 2679 3869 686 + 1 2667 2673 464 3869 + 1 2665 2672 2673 2667 + 1 2665 2672 2679 2673 + 1 2672 2667 3869 2673 + 1 2672 2679 2673 3869 + 1 2564 229 2568 2569 + 1 2673 2568 464 3864 + 1 2674 2569 3864 465 + 1 2564 2673 2674 2569 + 1 2564 2673 2569 2568 + 1 2673 2674 2569 3864 + 1 2673 2568 3864 2569 + 1 2679 686 3874 3869 + 1 2673 3869 3864 464 + 1 2674 3874 465 3864 + 1 2679 2673 3874 2674 + 1 2679 2673 3869 3874 + 1 2673 2674 3864 3874 + 1 2673 3869 3874 3864 + 1 1570 94 1574 1575 + 1 2487 1574 627 4544 + 1 2488 1575 4544 634 + 1 1570 2487 2488 1575 + 1 1570 2487 1575 1574 + 1 2487 2488 1575 4544 + 1 2487 1574 4544 1575 + 1 2480 627 1563 4541 + 1 1556 1563 93 1565 + 1 2482 4541 1565 629 + 1 2480 1556 2482 4541 + 1 2480 1556 4541 1563 + 1 1556 2482 4541 1565 + 1 1556 1563 1565 4541 + 1 2508 634 4555 1609 + 1 2507 4555 629 1608 + 1 1604 1609 1608 97 + 1 2508 2507 1604 1609 + 1 2508 2507 1609 4555 + 1 2507 1604 1609 1608 + 1 2507 4555 1608 1609 + 1 2474 216 2476 2483 + 1 2484 2476 220 2508 + 1 2488 2483 2508 634 + 1 2474 2484 2488 2483 + 1 2474 2484 2483 2476 + 1 2484 2488 2483 2508 + 1 2484 2476 2508 2483 + 1 2474 216 2483 2480 + 1 2487 2480 4544 627 + 1 2488 2483 634 4544 + 1 2474 2487 2483 2488 + 1 2474 2487 2480 2483 + 1 2487 2488 4544 2483 + 1 2487 2480 2483 4544 + 1 2476 220 2508 2507 + 1 2483 2508 634 4555 + 1 2482 2507 4555 629 + 1 2476 2483 2482 2507 + 1 2476 2483 2507 2508 + 1 2483 2482 2507 4555 + 1 2483 2508 4555 2507 + 1 2480 627 4541 4544 + 1 2483 4544 4555 634 + 1 2482 4541 629 4555 + 1 2480 2483 4541 2482 + 1 2480 2483 4544 4541 + 1 2483 2482 4555 4541 + 1 2483 4544 4541 4555 + 1 1570 94 1575 1576 + 1 2489 1576 4583 635 + 1 2488 1575 634 4583 + 1 1570 2489 1575 2488 + 1 1570 2489 1576 1575 + 1 2489 2488 4583 1575 + 1 2489 1576 1575 4583 + 1 2515 635 4590 1623 + 1 1618 1623 1624 98 + 1 2516 4590 649 1624 + 1 2515 1618 4590 2516 + 1 2515 1618 1623 4590 + 1 1618 2516 1624 4590 + 1 1618 1623 4590 1624 + 1 2508 634 1609 4585 + 1 2511 4585 1612 649 + 1 1604 1609 97 1612 + 1 2508 2511 1609 1604 + 1 2508 2511 4585 1609 + 1 2511 1604 1612 1609 + 1 2511 4585 1609 1612 + 1 2485 221 2514 2505 + 1 2484 2505 2508 220 + 1 2488 2514 634 2508 + 1 2485 2484 2514 2488 + 1 2485 2484 2505 2514 + 1 2484 2488 2508 2514 + 1 2484 2505 2514 2508 + 1 2485 221 2515 2514 + 1 2489 2515 635 4583 + 1 2488 2514 4583 634 + 1 2485 2489 2488 2514 + 1 2485 2489 2514 2515 + 1 2489 2488 2514 4583 + 1 2489 2515 4583 2514 + 1 2505 220 2511 2508 + 1 2514 2508 4585 634 + 1 2516 2511 649 4585 + 1 2505 2514 2511 2516 + 1 2505 2514 2508 2511 + 1 2514 2516 4585 2511 + 1 2514 2508 2511 4585 + 1 2515 635 4583 4590 + 1 2514 4583 634 4585 + 1 2516 4590 4585 649 + 1 2515 2514 2516 4590 + 1 2515 2514 4590 4583 + 1 2514 2516 4590 4585 + 1 2514 4583 4585 4590 + 1 1659 102 1670 1671 + 1 2731 1670 672 4739 + 1 2732 1671 4739 673 + 1 1659 2731 2732 1671 + 1 1659 2731 1671 1670 + 1 2731 2732 1671 4739 + 1 2731 1670 4739 1671 + 1 2756 672 1776 4742 + 1 1770 1776 110 1780 + 1 2759 4742 1780 706 + 1 2756 1770 2759 4742 + 1 2756 1770 4742 1776 + 1 1770 2759 4742 1780 + 1 1770 1776 1780 4742 + 1 2773 673 4747 1809 + 1 2775 4747 706 1813 + 1 1804 1809 1813 113 + 1 2773 2775 1804 1809 + 1 2773 2775 1809 4747 + 1 2775 1804 1809 1813 + 1 2775 4747 1813 1809 + 1 2725 250 2752 2757 + 1 2726 2752 253 2773 + 1 2732 2757 2773 673 + 1 2725 2726 2732 2757 + 1 2725 2726 2757 2752 + 1 2726 2732 2757 2773 + 1 2726 2752 2773 2757 + 1 2725 250 2757 2756 + 1 2731 2756 4739 672 + 1 2732 2757 673 4739 + 1 2725 2731 2757 2732 + 1 2725 2731 2756 2757 + 1 2731 2732 4739 2757 + 1 2731 2756 2757 4739 + 1 2752 253 2773 2775 + 1 2757 2773 673 4747 + 1 2759 2775 4747 706 + 1 2752 2757 2759 2775 + 1 2752 2757 2775 2773 + 1 2757 2759 2775 4747 + 1 2757 2773 4747 2775 + 1 2756 672 4742 4739 + 1 2757 4739 4747 673 + 1 2759 4742 706 4747 + 1 2756 2757 4742 2759 + 1 2756 2757 4739 4742 + 1 2757 2759 4747 4742 + 1 2757 4739 4742 4747 + 1 1784 111 1791 1790 + 1 2764 1790 4865 705 + 1 2765 1791 710 4865 + 1 1784 2764 1791 2765 + 1 1784 2764 1790 1791 + 1 2764 2765 4865 1791 + 1 2764 1790 1791 4865 + 1 2758 705 4862 1779 + 1 1770 1779 1780 110 + 1 2759 4862 706 1780 + 1 2758 1770 4862 2759 + 1 2758 1770 1779 4862 + 1 1770 2759 1780 4862 + 1 1770 1779 4862 1780 + 1 2776 710 1814 4870 + 1 2775 4870 1813 706 + 1 1804 1814 113 1813 + 1 2776 2775 1814 1804 + 1 2776 2775 4870 1814 + 1 2775 1804 1813 1814 + 1 2775 4870 1814 1813 + 1 2751 250 2760 2752 + 1 2761 2752 2776 253 + 1 2765 2760 710 2776 + 1 2751 2761 2760 2765 + 1 2751 2761 2752 2760 + 1 2761 2765 2776 2760 + 1 2761 2752 2760 2776 + 1 2751 250 2758 2760 + 1 2764 2758 705 4865 + 1 2765 2760 4865 710 + 1 2751 2764 2765 2760 + 1 2751 2764 2760 2758 + 1 2764 2765 2760 4865 + 1 2764 2758 4865 2760 + 1 2752 253 2775 2776 + 1 2760 2776 4870 710 + 1 2759 2775 706 4870 + 1 2752 2760 2775 2759 + 1 2752 2760 2776 2775 + 1 2760 2759 4870 2775 + 1 2760 2776 2775 4870 + 1 2758 705 4865 4862 + 1 2760 4865 710 4870 + 1 2759 4862 4870 706 + 1 2758 2760 2759 4862 + 1 2758 2760 4862 4865 + 1 2760 2759 4862 4870 + 1 2760 4865 4870 4862 + 1 1062 44 1069 1070 + 1 2392 1069 408 3608 + 1 2393 1070 3608 409 + 1 1062 2392 2393 1070 + 1 1062 2392 1070 1069 + 1 2392 2393 1070 3608 + 1 2392 1069 3608 1070 + 1 2439 408 1531 3612 + 1 1528 1531 91 1538 + 1 2445 3612 1538 618 + 1 2439 1528 2445 3612 + 1 2439 1528 3612 1531 + 1 1528 2445 3612 1538 + 1 1528 1531 1538 3612 + 1 2447 409 3617 1544 + 1 2452 3617 618 1550 + 1 1542 1544 1550 92 + 1 2447 2452 1542 1544 + 1 2447 2452 1544 3617 + 1 2452 1542 1544 1550 + 1 2452 3617 1550 1544 + 1 2388 211 2437 2440 + 1 2389 2437 212 2447 + 1 2393 2440 2447 409 + 1 2388 2389 2393 2440 + 1 2388 2389 2440 2437 + 1 2389 2393 2440 2447 + 1 2389 2437 2447 2440 + 1 2388 211 2440 2439 + 1 2392 2439 3608 408 + 1 2393 2440 409 3608 + 1 2388 2392 2440 2393 + 1 2388 2392 2439 2440 + 1 2392 2393 3608 2440 + 1 2392 2439 2440 3608 + 1 2437 212 2447 2452 + 1 2440 2447 409 3617 + 1 2445 2452 3617 618 + 1 2437 2440 2445 2452 + 1 2437 2440 2452 2447 + 1 2440 2445 2452 3617 + 1 2440 2447 3617 2452 + 1 2439 408 3612 3608 + 1 2440 3608 3617 409 + 1 2445 3612 618 3617 + 1 2439 2440 3612 2445 + 1 2439 2440 3608 3612 + 1 2440 2445 3617 3612 + 1 2440 3608 3612 3617 + 1 1686 104 1688 1697 + 1 2650 1688 463 3862 + 1 2655 1697 3862 677 + 1 1686 2650 2655 1697 + 1 1686 2650 1697 1688 + 1 2650 2655 1697 3862 + 1 2650 1688 3862 1697 + 1 2567 463 1163 3857 + 1 1154 1163 56 1165 + 1 2569 3857 1165 465 + 1 2567 1154 2569 3857 + 1 2567 1154 3857 1163 + 1 1154 2569 3857 1165 + 1 1154 1163 1165 3857 + 1 2677 677 3873 1734 + 1 2674 3873 465 1730 + 1 1728 1734 1730 107 + 1 2677 2674 1728 1734 + 1 2677 2674 1734 3873 + 1 2674 1728 1734 1730 + 1 2674 3873 1730 1734 + 1 2562 229 2564 2571 + 1 2649 2564 241 2677 + 1 2655 2571 2677 677 + 1 2562 2649 2655 2571 + 1 2562 2649 2571 2564 + 1 2649 2655 2571 2677 + 1 2649 2564 2677 2571 + 1 2562 229 2571 2567 + 1 2650 2567 3862 463 + 1 2655 2571 677 3862 + 1 2562 2650 2571 2655 + 1 2562 2650 2567 2571 + 1 2650 2655 3862 2571 + 1 2650 2567 2571 3862 + 1 2564 241 2677 2674 + 1 2571 2677 677 3873 + 1 2569 2674 3873 465 + 1 2564 2571 2569 2674 + 1 2564 2571 2674 2677 + 1 2571 2569 2674 3873 + 1 2571 2677 3873 2674 + 1 2567 463 3857 3862 + 1 2571 3862 3873 677 + 1 2569 3857 465 3873 + 1 2567 2571 3857 2569 + 1 2567 2571 3862 3857 + 1 2571 2569 3873 3857 + 1 2571 3862 3857 3873 + 1 1756 109 1766 1758 + 1 2750 1766 701 3973 + 1 2745 1758 3973 488 + 1 1756 2750 2745 1758 + 1 1756 2750 1758 1766 + 1 2750 2745 1758 3973 + 1 2750 1766 3973 1758 + 1 2774 701 1812 3987 + 1 1804 1812 113 1806 + 1 2771 3987 1806 491 + 1 2774 1804 2771 3987 + 1 2774 1804 3987 1812 + 1 1804 2771 3987 1806 + 1 1804 1812 1806 3987 + 1 2694 488 3968 1207 + 1 2697 3968 491 1210 + 1 1202 1207 1210 61 + 1 2694 2697 1202 1207 + 1 2694 2697 1207 3968 + 1 2697 1202 1207 1210 + 1 2697 3968 1210 1207 + 1 2744 253 2693 2770 + 1 2690 2693 243 2694 + 1 2745 2770 2694 488 + 1 2744 2690 2745 2770 + 1 2744 2690 2770 2693 + 1 2690 2745 2770 2694 + 1 2690 2693 2694 2770 + 1 2744 253 2770 2774 + 1 2750 2774 3973 701 + 1 2745 2770 488 3973 + 1 2744 2750 2770 2745 + 1 2744 2750 2774 2770 + 1 2750 2745 3973 2770 + 1 2750 2774 2770 3973 + 1 2693 243 2694 2697 + 1 2770 2694 488 3968 + 1 2771 2697 3968 491 + 1 2693 2770 2771 2697 + 1 2693 2770 2697 2694 + 1 2770 2771 2697 3968 + 1 2770 2694 3968 2697 + 1 2774 701 3987 3973 + 1 2770 3973 3968 488 + 1 2771 3987 491 3968 + 1 2774 2770 3987 2771 + 1 2774 2770 3973 3987 + 1 2770 2771 3968 3987 + 1 2770 3973 3987 3968 + 1 1490 88 1498 1500 + 1 2420 1498 601 4430 + 1 2422 1500 4430 603 + 1 1490 2420 2422 1500 + 1 1490 2420 1500 1498 + 1 2420 2422 1500 4430 + 1 2420 1498 4430 1500 + 1 2428 601 1510 4433 + 1 1504 1510 89 1512 + 1 2431 4433 1512 608 + 1 2428 1504 2431 4433 + 1 2428 1504 4433 1510 + 1 1504 2431 4433 1512 + 1 1504 1510 1512 4433 + 1 2448 603 4443 1547 + 1 2450 4443 608 1548 + 1 1542 1547 1548 92 + 1 2448 2450 1542 1547 + 1 2448 2450 1547 4443 + 1 2450 1542 1547 1548 + 1 2450 4443 1548 1547 + 1 2414 209 2424 2429 + 1 2416 2424 212 2448 + 1 2422 2429 2448 603 + 1 2414 2416 2422 2429 + 1 2414 2416 2429 2424 + 1 2416 2422 2429 2448 + 1 2416 2424 2448 2429 + 1 2414 209 2429 2428 + 1 2420 2428 4430 601 + 1 2422 2429 603 4430 + 1 2414 2420 2429 2422 + 1 2414 2420 2428 2429 + 1 2420 2422 4430 2429 + 1 2420 2428 2429 4430 + 1 2424 212 2448 2450 + 1 2429 2448 603 4443 + 1 2431 2450 4443 608 + 1 2424 2429 2431 2450 + 1 2424 2429 2450 2448 + 1 2429 2431 2450 4443 + 1 2429 2448 4443 2450 + 1 2428 601 4433 4430 + 1 2429 4430 4443 603 + 1 2431 4433 608 4443 + 1 2428 2429 4433 2431 + 1 2428 2429 4430 4433 + 1 2429 2431 4443 4433 + 1 2429 4430 4433 4443 + 1 1490 88 1500 1499 + 1 2421 1499 4436 602 + 1 2422 1500 603 4436 + 1 1490 2421 1500 2422 + 1 1490 2421 1499 1500 + 1 2421 2422 4436 1500 + 1 2421 1499 1500 4436 + 1 2443 602 4439 1537 + 1 1528 1537 1538 91 + 1 2445 4439 618 1538 + 1 2443 1528 4439 2445 + 1 2443 1528 1537 4439 + 1 1528 2445 1538 4439 + 1 1528 1537 4439 1538 + 1 2448 603 1547 4445 + 1 2452 4445 1550 618 + 1 1542 1547 92 1550 + 1 2448 2452 1547 1542 + 1 2448 2452 4445 1547 + 1 2452 1542 1550 1547 + 1 2452 4445 1547 1550 + 1 2415 211 2444 2437 + 1 2416 2437 2448 212 + 1 2422 2444 603 2448 + 1 2415 2416 2444 2422 + 1 2415 2416 2437 2444 + 1 2416 2422 2448 2444 + 1 2416 2437 2444 2448 + 1 2415 211 2443 2444 + 1 2421 2443 602 4436 + 1 2422 2444 4436 603 + 1 2415 2421 2422 2444 + 1 2415 2421 2444 2443 + 1 2421 2422 2444 4436 + 1 2421 2443 4436 2444 + 1 2437 212 2452 2448 + 1 2444 2448 4445 603 + 1 2445 2452 618 4445 + 1 2437 2444 2452 2445 + 1 2437 2444 2448 2452 + 1 2444 2445 4445 2452 + 1 2444 2448 2452 4445 + 1 2443 602 4436 4439 + 1 2444 4436 603 4445 + 1 2445 4439 4445 618 + 1 2443 2444 2445 4439 + 1 2443 2444 4439 4436 + 1 2444 2445 4439 4445 + 1 2444 4436 4445 4439 + 1 1658 102 1666 1668 + 1 2637 1666 668 4717 + 1 2639 1668 4717 670 + 1 1658 2637 2639 1668 + 1 1658 2637 1668 1666 + 1 2637 2639 1668 4717 + 1 2637 1666 4717 1668 + 1 2660 668 1706 4720 + 1 1700 1706 105 1708 + 1 2664 4720 1708 680 + 1 2660 1700 2664 4720 + 1 2660 1700 4720 1706 + 1 1700 2664 4720 1708 + 1 1700 1706 1708 4720 + 1 2676 670 4730 1733 + 1 2678 4730 680 1735 + 1 1728 1733 1735 107 + 1 2676 2678 1728 1733 + 1 2676 2678 1733 4730 + 1 2678 1728 1733 1735 + 1 2678 4730 1735 1733 + 1 2631 239 2656 2661 + 1 2633 2656 241 2676 + 1 2639 2661 2676 670 + 1 2631 2633 2639 2661 + 1 2631 2633 2661 2656 + 1 2633 2639 2661 2676 + 1 2633 2656 2676 2661 + 1 2631 239 2661 2660 + 1 2637 2660 4717 668 + 1 2639 2661 670 4717 + 1 2631 2637 2661 2639 + 1 2631 2637 2660 2661 + 1 2637 2639 4717 2661 + 1 2637 2660 2661 4717 + 1 2656 241 2676 2678 + 1 2661 2676 670 4730 + 1 2664 2678 4730 680 + 1 2656 2661 2664 2678 + 1 2656 2661 2678 2676 + 1 2661 2664 2678 4730 + 1 2661 2676 4730 2678 + 1 2660 668 4720 4717 + 1 2661 4717 4730 670 + 1 2664 4720 680 4730 + 1 2660 2661 4720 2664 + 1 2660 2661 4717 4720 + 1 2661 2664 4730 4720 + 1 2661 4717 4720 4730 + 1 1686 104 1697 1696 + 1 2654 1696 4751 676 + 1 2655 1697 677 4751 + 1 1686 2654 1697 2655 + 1 1686 2654 1696 1697 + 1 2654 2655 4751 1697 + 1 2654 1696 1697 4751 + 1 2662 676 4754 1707 + 1 1700 1707 1708 105 + 1 2664 4754 680 1708 + 1 2662 1700 4754 2664 + 1 2662 1700 1707 4754 + 1 1700 2664 1708 4754 + 1 1700 1707 4754 1708 + 1 2677 677 1734 4758 + 1 2678 4758 1735 680 + 1 1728 1734 107 1735 + 1 2677 2678 1734 1728 + 1 2677 2678 4758 1734 + 1 2678 1728 1735 1734 + 1 2678 4758 1734 1735 + 1 2648 239 2663 2656 + 1 2649 2656 2677 241 + 1 2655 2663 677 2677 + 1 2648 2649 2663 2655 + 1 2648 2649 2656 2663 + 1 2649 2655 2677 2663 + 1 2649 2656 2663 2677 + 1 2648 239 2662 2663 + 1 2654 2662 676 4751 + 1 2655 2663 4751 677 + 1 2648 2654 2655 2663 + 1 2648 2654 2663 2662 + 1 2654 2655 2663 4751 + 1 2654 2662 4751 2663 + 1 2656 241 2678 2677 + 1 2663 2677 4758 677 + 1 2664 2678 680 4758 + 1 2656 2663 2678 2664 + 1 2656 2663 2677 2678 + 1 2663 2664 4758 2678 + 1 2663 2677 2678 4758 + 1 2662 676 4751 4754 + 1 2663 4751 677 4758 + 1 2664 4754 4758 680 + 1 2662 2663 2664 4754 + 1 2662 2663 4754 4751 + 1 2663 2664 4754 4758 + 1 2663 4751 4758 4754 + 1 1031 40 1037 1038 + 1 2325 1037 389 3524 + 1 2326 1038 3524 390 + 1 1031 2325 2326 1038 + 1 1031 2325 1038 1037 + 1 2325 2326 1038 3524 + 1 2325 1037 3524 1038 + 1 2367 389 1458 3527 + 1 1456 1458 85 1462 + 1 2371 3527 1462 589 + 1 2367 1456 2371 3527 + 1 2367 1456 3527 1458 + 1 1456 2371 3527 1462 + 1 1456 1458 1462 3527 + 1 2372 390 3532 1468 + 1 2377 3532 589 1476 + 1 1466 1468 1476 86 + 1 2372 2377 1466 1468 + 1 2372 2377 1468 3532 + 1 2377 1466 1468 1476 + 1 2377 3532 1476 1468 + 1 2322 201 2366 2368 + 1 2323 2366 202 2372 + 1 2326 2368 2372 390 + 1 2322 2323 2326 2368 + 1 2322 2323 2368 2366 + 1 2323 2326 2368 2372 + 1 2323 2366 2372 2368 + 1 2322 201 2368 2367 + 1 2325 2367 3524 389 + 1 2326 2368 390 3524 + 1 2322 2325 2368 2326 + 1 2322 2325 2367 2368 + 1 2325 2326 3524 2368 + 1 2325 2367 2368 3524 + 1 2366 202 2372 2377 + 1 2368 2372 390 3532 + 1 2371 2377 3532 589 + 1 2366 2368 2371 2377 + 1 2366 2368 2377 2372 + 1 2368 2371 2377 3532 + 1 2368 2372 3532 2377 + 1 2367 389 3527 3524 + 1 2368 3524 3532 390 + 1 2371 3527 589 3532 + 1 2367 2368 3527 2371 + 1 2367 2368 3524 3527 + 1 2368 2371 3532 3527 + 1 2368 3524 3527 3532 + 1 1580 95 1582 1587 + 1 2492 1582 425 3683 + 1 2495 1587 3683 640 + 1 1580 2492 2495 1587 + 1 1580 2492 1587 1582 + 1 2492 2495 1587 3683 + 1 2492 1582 3683 1587 + 1 2463 425 1100 3680 + 1 1096 1100 48 1101 + 1 2464 3680 1101 426 + 1 2463 1096 2464 3680 + 1 2463 1096 3680 1100 + 1 1096 2464 3680 1101 + 1 1096 1100 1101 3680 + 1 2509 640 3689 1610 + 1 2506 3689 426 1606 + 1 1604 1610 1606 97 + 1 2509 2506 1604 1610 + 1 2509 2506 1610 3689 + 1 2506 1604 1610 1606 + 1 2506 3689 1606 1610 + 1 2460 214 2461 2466 + 1 2491 2461 220 2509 + 1 2495 2466 2509 640 + 1 2460 2491 2495 2466 + 1 2460 2491 2466 2461 + 1 2491 2495 2466 2509 + 1 2491 2461 2509 2466 + 1 2460 214 2466 2463 + 1 2492 2463 3683 425 + 1 2495 2466 640 3683 + 1 2460 2492 2466 2495 + 1 2460 2492 2463 2466 + 1 2492 2495 3683 2466 + 1 2492 2463 2466 3683 + 1 2461 220 2509 2506 + 1 2466 2509 640 3689 + 1 2464 2506 3689 426 + 1 2461 2466 2464 2506 + 1 2461 2466 2506 2509 + 1 2466 2464 2506 3689 + 1 2466 2509 3689 2506 + 1 2463 425 3680 3683 + 1 2466 3683 3689 640 + 1 2464 3680 426 3689 + 1 2463 2466 3680 2464 + 1 2463 2466 3683 3680 + 1 2466 2464 3689 3680 + 1 2466 3683 3680 3689 + 1 1672 103 1684 1675 + 1 2647 1684 674 3856 + 1 2642 1675 3856 462 + 1 1672 2647 2642 1675 + 1 1672 2647 1675 1684 + 1 2647 2642 1675 3856 + 1 2647 1684 3856 1675 + 1 2671 674 1723 3868 + 1 1714 1723 106 1716 + 1 2667 3868 1716 464 + 1 2671 1714 2667 3868 + 1 2671 1714 3868 1723 + 1 1714 2667 3868 1716 + 1 1714 1723 1716 3868 + 1 2566 462 3852 1162 + 1 2568 3852 464 1164 + 1 1154 1162 1164 56 + 1 2566 2568 1154 1162 + 1 2566 2568 1162 3852 + 1 2568 1154 1162 1164 + 1 2568 3852 1164 1162 + 1 2640 240 2563 2666 + 1 2561 2563 229 2566 + 1 2642 2666 2566 462 + 1 2640 2561 2642 2666 + 1 2640 2561 2666 2563 + 1 2561 2642 2666 2566 + 1 2561 2563 2566 2666 + 1 2640 240 2666 2671 + 1 2647 2671 3856 674 + 1 2642 2666 462 3856 + 1 2640 2647 2666 2642 + 1 2640 2647 2671 2666 + 1 2647 2642 3856 2666 + 1 2647 2671 2666 3856 + 1 2563 229 2566 2568 + 1 2666 2566 462 3852 + 1 2667 2568 3852 464 + 1 2563 2666 2667 2568 + 1 2563 2666 2568 2566 + 1 2666 2667 2568 3852 + 1 2666 2566 3852 2568 + 1 2671 674 3868 3856 + 1 2666 3856 3852 462 + 1 2667 3868 464 3852 + 1 2671 2666 3868 2667 + 1 2671 2666 3856 3868 + 1 2666 2667 3852 3868 + 1 2666 3856 3868 3852 + 1 1432 83 1436 1438 + 1 2355 1436 579 4331 + 1 2357 1438 4331 581 + 1 1432 2355 2357 1438 + 1 1432 2355 1438 1436 + 1 2355 2357 1438 4331 + 1 2355 1436 4331 1438 + 1 2363 579 1451 4334 + 1 1442 1451 84 1452 + 1 2365 4334 1452 585 + 1 2363 1442 2365 4334 + 1 2363 1442 4334 1451 + 1 1442 2365 4334 1452 + 1 1442 1451 1452 4334 + 1 2375 581 4344 1474 + 1 2376 4344 585 1475 + 1 1466 1474 1475 86 + 1 2375 2376 1466 1474 + 1 2375 2376 1474 4344 + 1 2376 1466 1474 1475 + 1 2376 4344 1475 1474 + 1 2351 200 2358 2364 + 1 2353 2358 202 2375 + 1 2357 2364 2375 581 + 1 2351 2353 2357 2364 + 1 2351 2353 2364 2358 + 1 2353 2357 2364 2375 + 1 2353 2358 2375 2364 + 1 2351 200 2364 2363 + 1 2355 2363 4331 579 + 1 2357 2364 581 4331 + 1 2351 2355 2364 2357 + 1 2351 2355 2363 2364 + 1 2355 2357 4331 2364 + 1 2355 2363 2364 4331 + 1 2358 202 2375 2376 + 1 2364 2375 581 4344 + 1 2365 2376 4344 585 + 1 2358 2364 2365 2376 + 1 2358 2364 2376 2375 + 1 2364 2365 2376 4344 + 1 2364 2375 4344 2376 + 1 2363 579 4334 4331 + 1 2364 4331 4344 581 + 1 2365 4334 585 4344 + 1 2363 2364 4334 2365 + 1 2363 2364 4331 4334 + 1 2364 2365 4344 4334 + 1 2364 4331 4334 4344 + 1 1432 83 1438 1437 + 1 2356 1437 4337 580 + 1 2357 1438 581 4337 + 1 1432 2356 1438 2357 + 1 1432 2356 1437 1438 + 1 2356 2357 4337 1438 + 1 2356 1437 1438 4337 + 1 2369 580 4340 1461 + 1 1456 1461 1462 85 + 1 2371 4340 589 1462 + 1 2369 1456 4340 2371 + 1 2369 1456 1461 4340 + 1 1456 2371 1462 4340 + 1 1456 1461 4340 1462 + 1 2375 581 1474 4346 + 1 2377 4346 1476 589 + 1 1466 1474 86 1476 + 1 2375 2377 1474 1466 + 1 2375 2377 4346 1474 + 1 2377 1466 1476 1474 + 1 2377 4346 1474 1476 + 1 2352 201 2370 2366 + 1 2353 2366 2375 202 + 1 2357 2370 581 2375 + 1 2352 2353 2370 2357 + 1 2352 2353 2366 2370 + 1 2353 2357 2375 2370 + 1 2353 2366 2370 2375 + 1 2352 201 2369 2370 + 1 2356 2369 580 4337 + 1 2357 2370 4337 581 + 1 2352 2356 2357 2370 + 1 2352 2356 2370 2369 + 1 2356 2357 2370 4337 + 1 2356 2369 4337 2370 + 1 2366 202 2377 2375 + 1 2370 2375 4346 581 + 1 2371 2377 589 4346 + 1 2366 2370 2377 2371 + 1 2366 2370 2375 2377 + 1 2370 2371 4346 2377 + 1 2370 2375 2377 4346 + 1 2369 580 4337 4340 + 1 2370 4337 581 4346 + 1 2371 4340 4346 589 + 1 2369 2370 2371 4340 + 1 2369 2370 4340 4337 + 1 2370 2371 4340 4346 + 1 2370 4337 4346 4340 + 1 1556 93 1564 1565 + 1 2481 1564 628 4547 + 1 2482 1565 4547 629 + 1 1556 2481 2482 1565 + 1 1556 2481 1565 1564 + 1 2481 2482 1565 4547 + 1 2481 1564 4547 1565 + 1 2500 628 1596 4550 + 1 1590 1596 96 1598 + 1 2504 4550 1598 643 + 1 2500 1590 2504 4550 + 1 2500 1590 4550 1596 + 1 1590 2504 4550 1598 + 1 1590 1596 1598 4550 + 1 2507 629 4556 1608 + 1 2510 4556 643 1611 + 1 1604 1608 1611 97 + 1 2507 2510 1604 1608 + 1 2507 2510 1608 4556 + 1 2510 1604 1608 1611 + 1 2510 4556 1611 1608 + 1 2475 219 2496 2501 + 1 2476 2496 220 2507 + 1 2482 2501 2507 629 + 1 2475 2476 2482 2501 + 1 2475 2476 2501 2496 + 1 2476 2482 2501 2507 + 1 2476 2496 2507 2501 + 1 2475 219 2501 2500 + 1 2481 2500 4547 628 + 1 2482 2501 629 4547 + 1 2475 2481 2501 2482 + 1 2475 2481 2500 2501 + 1 2481 2482 4547 2501 + 1 2481 2500 2501 4547 + 1 2496 220 2507 2510 + 1 2501 2507 629 4556 + 1 2504 2510 4556 643 + 1 2496 2501 2504 2510 + 1 2496 2501 2510 2507 + 1 2501 2504 2510 4556 + 1 2501 2507 4556 2510 + 1 2500 628 4550 4547 + 1 2501 4547 4556 629 + 1 2504 4550 643 4556 + 1 2500 2501 4550 2504 + 1 2500 2501 4547 4550 + 1 2501 2504 4556 4550 + 1 2501 4547 4550 4556 + 1 1580 95 1587 1586 + 1 2494 1586 4603 639 + 1 2495 1587 640 4603 + 1 1580 2494 1587 2495 + 1 1580 2494 1586 1587 + 1 2494 2495 4603 1587 + 1 2494 1586 1587 4603 + 1 2502 639 4606 1597 + 1 1590 1597 1598 96 + 1 2504 4606 643 1598 + 1 2502 1590 4606 2504 + 1 2502 1590 1597 4606 + 1 1590 2504 1598 4606 + 1 1590 1597 4606 1598 + 1 2509 640 1610 4610 + 1 2510 4610 1611 643 + 1 1604 1610 97 1611 + 1 2509 2510 1610 1604 + 1 2509 2510 4610 1610 + 1 2510 1604 1611 1610 + 1 2510 4610 1610 1611 + 1 2490 219 2503 2496 + 1 2491 2496 2509 220 + 1 2495 2503 640 2509 + 1 2490 2491 2503 2495 + 1 2490 2491 2496 2503 + 1 2491 2495 2509 2503 + 1 2491 2496 2503 2509 + 1 2490 219 2502 2503 + 1 2494 2502 639 4603 + 1 2495 2503 4603 640 + 1 2490 2494 2495 2503 + 1 2490 2494 2503 2502 + 1 2494 2495 2503 4603 + 1 2494 2502 4603 2503 + 1 2496 220 2510 2509 + 1 2503 2509 4610 640 + 1 2504 2510 643 4610 + 1 2496 2503 2510 2504 + 1 2496 2503 2509 2510 + 1 2503 2504 4610 2510 + 1 2503 2509 2510 4610 + 1 2502 639 4603 4606 + 1 2503 4603 640 4610 + 1 2504 4606 4610 643 + 1 2502 2503 2504 4606 + 1 2502 2503 4606 4603 + 1 2503 2504 4606 4610 + 1 2503 4603 4610 4606 + 1 1062 44 1070 1068 + 1 2393 1070 409 3604 + 1 2391 1068 3604 407 + 1 1062 2393 2391 1068 + 1 1062 2393 1068 1070 + 1 2393 2391 1068 3604 + 1 2393 1070 3604 1068 + 1 2447 409 1544 3616 + 1 1542 1544 92 1549 + 1 2451 3616 1549 614 + 1 2447 1542 2451 3616 + 1 2447 1542 3616 1544 + 1 1542 2451 3616 1549 + 1 1542 1544 1549 3616 + 1 2433 407 3607 1520 + 1 2436 3607 614 1524 + 1 1518 1520 1524 90 + 1 2433 2436 1518 1520 + 1 2433 2436 1520 3607 + 1 2436 1518 1520 1524 + 1 2436 3607 1524 1520 + 1 2389 212 2432 2446 + 1 2387 2432 210 2433 + 1 2391 2446 2433 407 + 1 2389 2387 2391 2446 + 1 2389 2387 2446 2432 + 1 2387 2391 2446 2433 + 1 2387 2432 2433 2446 + 1 2389 212 2446 2447 + 1 2393 2447 3604 409 + 1 2391 2446 407 3604 + 1 2389 2393 2446 2391 + 1 2389 2393 2447 2446 + 1 2393 2391 3604 2446 + 1 2393 2447 2446 3604 + 1 2432 210 2433 2436 + 1 2446 2433 407 3607 + 1 2451 2436 3607 614 + 1 2432 2446 2451 2436 + 1 2432 2446 2436 2433 + 1 2446 2451 2436 3607 + 1 2446 2433 3607 2436 + 1 2447 409 3616 3604 + 1 2446 3604 3607 407 + 1 2451 3616 614 3607 + 1 2447 2446 3616 2451 + 1 2447 2446 3604 3616 + 1 2446 2451 3607 3616 + 1 2446 3604 3616 3607 + 1 1756 109 1758 1765 + 1 2745 1758 488 3972 + 1 2749 1765 3972 700 + 1 1756 2745 2749 1765 + 1 1756 2745 1765 1758 + 1 2745 2749 1765 3972 + 1 2745 1758 3972 1765 + 1 2694 488 1207 3967 + 1 1202 1207 61 1209 + 1 2696 3967 1209 490 + 1 2694 1202 2696 3967 + 1 2694 1202 3967 1207 + 1 1202 2696 3967 1209 + 1 1202 1207 1209 3967 + 1 2769 700 3982 1801 + 1 2766 3982 490 1796 + 1 1794 1801 1796 112 + 1 2769 2766 1794 1801 + 1 2769 2766 1801 3982 + 1 2766 1794 1801 1796 + 1 2766 3982 1796 1801 + 1 2690 243 2692 2698 + 1 2743 2692 252 2769 + 1 2749 2698 2769 700 + 1 2690 2743 2749 2698 + 1 2690 2743 2698 2692 + 1 2743 2749 2698 2769 + 1 2743 2692 2769 2698 + 1 2690 243 2698 2694 + 1 2745 2694 3972 488 + 1 2749 2698 700 3972 + 1 2690 2745 2698 2749 + 1 2690 2745 2694 2698 + 1 2745 2749 3972 2698 + 1 2745 2694 2698 3972 + 1 2692 252 2769 2766 + 1 2698 2769 700 3982 + 1 2696 2766 3982 490 + 1 2692 2698 2696 2766 + 1 2692 2698 2766 2769 + 1 2698 2696 2766 3982 + 1 2698 2769 3982 2766 + 1 2694 488 3967 3972 + 1 2698 3972 3982 700 + 1 2696 3967 490 3982 + 1 2694 2698 3967 2696 + 1 2694 2698 3972 3967 + 1 2698 2696 3982 3967 + 1 2698 3972 3967 3982 + 1 1638 100 1645 1640 + 1 2542 1645 662 3745 + 1 2539 1640 3745 441 + 1 1638 2542 2539 1640 + 1 1638 2542 1640 1645 + 1 2542 2539 1640 3745 + 1 2542 1645 3745 1640 + 1 2547 662 1654 3748 + 1 1648 1654 101 1650 + 1 2544 3748 1650 442 + 1 2547 1648 2544 3748 + 1 2547 1648 3748 1654 + 1 1648 2544 3748 1650 + 1 1648 1654 1650 3748 + 1 2523 441 3742 1129 + 1 2524 3742 442 1130 + 1 1126 1129 1130 52 + 1 2523 2524 1126 1129 + 1 2523 2524 1129 3742 + 1 2524 1126 1129 1130 + 1 2524 3742 1130 1129 + 1 2538 227 2522 2543 + 1 2521 2522 223 2523 + 1 2539 2543 2523 441 + 1 2538 2521 2539 2543 + 1 2538 2521 2543 2522 + 1 2521 2539 2543 2523 + 1 2521 2522 2523 2543 + 1 2538 227 2543 2547 + 1 2542 2547 3745 662 + 1 2539 2543 441 3745 + 1 2538 2542 2543 2539 + 1 2538 2542 2547 2543 + 1 2542 2539 3745 2543 + 1 2542 2547 2543 3745 + 1 2522 223 2523 2524 + 1 2543 2523 441 3742 + 1 2544 2524 3742 442 + 1 2522 2543 2544 2524 + 1 2522 2543 2524 2523 + 1 2543 2544 2524 3742 + 1 2543 2523 3742 2524 + 1 2547 662 3748 3745 + 1 2543 3745 3742 441 + 1 2544 3748 442 3742 + 1 2547 2543 3748 2544 + 1 2547 2543 3745 3748 + 1 2543 2544 3742 3748 + 1 2543 3745 3748 3742 + 1 1504 89 1509 1511 + 1 2427 1509 596 4405 + 1 2430 1511 4405 607 + 1 1504 2427 2430 1511 + 1 1504 2427 1511 1509 + 1 2427 2430 1511 4405 + 1 2427 1509 4405 1511 + 1 2411 596 1485 4402 + 1 1480 1485 87 1486 + 1 2412 4402 1486 597 + 1 2411 1480 2412 4402 + 1 2411 1480 4402 1485 + 1 1480 2412 4402 1486 + 1 1480 1485 1486 4402 + 1 2435 607 4410 1523 + 1 2434 4410 597 1522 + 1 1518 1523 1522 90 + 1 2435 2434 1518 1523 + 1 2435 2434 1523 4410 + 1 2434 1518 1523 1522 + 1 2434 4410 1522 1523 + 1 2407 207 2408 2413 + 1 2423 2408 210 2435 + 1 2430 2413 2435 607 + 1 2407 2423 2430 2413 + 1 2407 2423 2413 2408 + 1 2423 2430 2413 2435 + 1 2423 2408 2435 2413 + 1 2407 207 2413 2411 + 1 2427 2411 4405 596 + 1 2430 2413 607 4405 + 1 2407 2427 2413 2430 + 1 2407 2427 2411 2413 + 1 2427 2430 4405 2413 + 1 2427 2411 2413 4405 + 1 2408 210 2435 2434 + 1 2413 2435 607 4410 + 1 2412 2434 4410 597 + 1 2408 2413 2412 2434 + 1 2408 2413 2434 2435 + 1 2413 2412 2434 4410 + 1 2413 2435 4410 2434 + 1 2411 596 4402 4405 + 1 2413 4405 4410 607 + 1 2412 4402 597 4410 + 1 2411 2413 4402 2412 + 1 2411 2413 4405 4402 + 1 2413 2412 4410 4402 + 1 2413 4405 4402 4410 + 1 1504 89 1511 1512 + 1 2431 1512 4461 608 + 1 2430 1511 607 4461 + 1 1504 2431 1511 2430 + 1 1504 2431 1512 1511 + 1 2431 2430 4461 1511 + 1 2431 1512 1511 4461 + 1 2450 608 4469 1548 + 1 1542 1548 1549 92 + 1 2451 4469 614 1549 + 1 2450 1542 4469 2451 + 1 2450 1542 1548 4469 + 1 1542 2451 1549 4469 + 1 1542 1548 4469 1549 + 1 2435 607 1523 4463 + 1 2436 4463 1524 614 + 1 1518 1523 90 1524 + 1 2435 2436 1523 1518 + 1 2435 2436 4463 1523 + 1 2436 1518 1524 1523 + 1 2436 4463 1523 1524 + 1 2424 212 2449 2432 + 1 2423 2432 2435 210 + 1 2430 2449 607 2435 + 1 2424 2423 2449 2430 + 1 2424 2423 2432 2449 + 1 2423 2430 2435 2449 + 1 2423 2432 2449 2435 + 1 2424 212 2450 2449 + 1 2431 2450 608 4461 + 1 2430 2449 4461 607 + 1 2424 2431 2430 2449 + 1 2424 2431 2449 2450 + 1 2431 2430 2449 4461 + 1 2431 2450 4461 2449 + 1 2432 210 2436 2435 + 1 2449 2435 4463 607 + 1 2451 2436 614 4463 + 1 2432 2449 2436 2451 + 1 2432 2449 2435 2436 + 1 2449 2451 4463 2436 + 1 2449 2435 2436 4463 + 1 2450 608 4461 4469 + 1 2449 4461 607 4463 + 1 2451 4469 4463 614 + 1 2450 2449 2451 4469 + 1 2450 2449 4469 4461 + 1 2449 2451 4469 4463 + 1 2449 4461 4463 4469 + 1 1629 99 1636 1637 + 1 2722 1636 660 4690 + 1 2723 1637 4690 661 + 1 1629 2722 2723 1637 + 1 1629 2722 1637 1636 + 1 2722 2723 1637 4690 + 1 2722 1636 4690 1637 + 1 2738 660 1748 4693 + 1 1742 1748 108 1752 + 1 2741 4693 1752 696 + 1 2738 1742 2741 4693 + 1 2738 1742 4693 1748 + 1 1742 2741 4693 1752 + 1 1742 1748 1752 4693 + 1 2767 661 4696 1798 + 1 2768 4696 696 1800 + 1 1794 1798 1800 112 + 1 2767 2768 1794 1798 + 1 2767 2768 1798 4696 + 1 2768 1794 1798 1800 + 1 2768 4696 1800 1798 + 1 2718 248 2734 2739 + 1 2719 2734 252 2767 + 1 2723 2739 2767 661 + 1 2718 2719 2723 2739 + 1 2718 2719 2739 2734 + 1 2719 2723 2739 2767 + 1 2719 2734 2767 2739 + 1 2718 248 2739 2738 + 1 2722 2738 4690 660 + 1 2723 2739 661 4690 + 1 2718 2722 2739 2723 + 1 2718 2722 2738 2739 + 1 2722 2723 4690 2739 + 1 2722 2738 2739 4690 + 1 2734 252 2767 2768 + 1 2739 2767 661 4696 + 1 2741 2768 4696 696 + 1 2734 2739 2741 2768 + 1 2734 2739 2768 2767 + 1 2739 2741 2768 4696 + 1 2739 2767 4696 2768 + 1 2738 660 4693 4690 + 1 2739 4690 4696 661 + 1 2741 4693 696 4696 + 1 2738 2739 4693 2741 + 1 2738 2739 4690 4693 + 1 2739 2741 4696 4693 + 1 2739 4690 4693 4696 + 1 1756 109 1765 1764 + 1 2748 1764 4828 695 + 1 2749 1765 700 4828 + 1 1756 2748 1765 2749 + 1 1756 2748 1764 1765 + 1 2748 2749 4828 1765 + 1 2748 1764 1765 4828 + 1 2740 695 4825 1751 + 1 1742 1751 1752 108 + 1 2741 4825 696 1752 + 1 2740 1742 4825 2741 + 1 2740 1742 1751 4825 + 1 1742 2741 1752 4825 + 1 1742 1751 4825 1752 + 1 2769 700 1801 4833 + 1 2768 4833 1800 696 + 1 1794 1801 112 1800 + 1 2769 2768 1801 1794 + 1 2769 2768 4833 1801 + 1 2768 1794 1800 1801 + 1 2768 4833 1801 1800 + 1 2733 248 2742 2734 + 1 2743 2734 2769 252 + 1 2749 2742 700 2769 + 1 2733 2743 2742 2749 + 1 2733 2743 2734 2742 + 1 2743 2749 2769 2742 + 1 2743 2734 2742 2769 + 1 2733 248 2740 2742 + 1 2748 2740 695 4828 + 1 2749 2742 4828 700 + 1 2733 2748 2749 2742 + 1 2733 2748 2742 2740 + 1 2748 2749 2742 4828 + 1 2748 2740 4828 2742 + 1 2734 252 2768 2769 + 1 2742 2769 4833 700 + 1 2741 2768 696 4833 + 1 2734 2742 2768 2741 + 1 2734 2742 2769 2768 + 1 2742 2741 4833 2768 + 1 2742 2769 2768 4833 + 1 2740 695 4828 4825 + 1 2742 4828 700 4833 + 1 2741 4825 4833 696 + 1 2740 2742 2741 4825 + 1 2740 2742 4825 4828 + 1 2742 2741 4825 4833 + 1 2742 4828 4833 4825 + 1 957 32 962 963 + 1 2134 962 343 3303 + 1 2135 963 3303 344 + 1 957 2134 2135 963 + 1 957 2134 963 962 + 1 2134 2135 963 3303 + 1 2134 962 3303 963 + 1 2165 343 1288 3306 + 1 1286 1288 70 1292 + 1 2169 3306 1292 530 + 1 2165 1286 2169 3306 + 1 2165 1286 3306 1288 + 1 1286 2169 3306 1292 + 1 1286 1288 1292 3306 + 1 2171 344 3311 1298 + 1 2176 3311 530 1304 + 1 1296 1298 1304 71 + 1 2171 2176 1296 1298 + 1 2171 2176 1298 3311 + 1 2176 1296 1298 1304 + 1 2176 3311 1304 1298 + 1 2131 170 2164 2166 + 1 2132 2164 171 2171 + 1 2135 2166 2171 344 + 1 2131 2132 2135 2166 + 1 2131 2132 2166 2164 + 1 2132 2135 2166 2171 + 1 2132 2164 2171 2166 + 1 2131 170 2166 2165 + 1 2134 2165 3303 343 + 1 2135 2166 344 3303 + 1 2131 2134 2166 2135 + 1 2131 2134 2165 2166 + 1 2134 2135 3303 2166 + 1 2134 2165 2166 3303 + 1 2164 171 2171 2176 + 1 2166 2171 344 3311 + 1 2169 2176 3311 530 + 1 2164 2166 2169 2176 + 1 2164 2166 2176 2171 + 1 2166 2169 2176 3311 + 1 2166 2171 3311 2176 + 1 2165 343 3306 3303 + 1 2166 3303 3311 344 + 1 2169 3306 530 3311 + 1 2165 2166 3306 2169 + 1 2165 2166 3303 3306 + 1 2166 2169 3311 3306 + 1 2166 3303 3306 3311 + 1 1350 76 1352 1357 + 1 2233 1352 400 3570 + 1 2236 1357 3570 554 + 1 1350 2233 2236 1357 + 1 1350 2233 1357 1352 + 1 2233 2236 1357 3570 + 1 2233 1352 3570 1357 + 1 2215 400 1058 3567 + 1 1055 1058 43 1059 + 1 2216 3567 1059 401 + 1 2215 1055 2216 3567 + 1 2215 1055 3567 1058 + 1 1055 2216 3567 1059 + 1 1055 1058 1059 3567 + 1 2248 554 3574 1379 + 1 2246 3574 401 1376 + 1 1374 1379 1376 78 + 1 2248 2246 1374 1379 + 1 2248 2246 1379 3574 + 1 2246 1374 1379 1376 + 1 2246 3574 1376 1379 + 1 2213 179 2214 2217 + 1 2232 2214 184 2248 + 1 2236 2217 2248 554 + 1 2213 2232 2236 2217 + 1 2213 2232 2217 2214 + 1 2232 2236 2217 2248 + 1 2232 2214 2248 2217 + 1 2213 179 2217 2215 + 1 2233 2215 3570 400 + 1 2236 2217 554 3570 + 1 2213 2233 2217 2236 + 1 2213 2233 2215 2217 + 1 2233 2236 3570 2217 + 1 2233 2215 2217 3570 + 1 2214 184 2248 2246 + 1 2217 2248 554 3574 + 1 2216 2246 3574 401 + 1 2214 2217 2216 2246 + 1 2214 2217 2246 2248 + 1 2217 2216 2246 3574 + 1 2217 2248 3574 2246 + 1 2215 400 3567 3570 + 1 2217 3570 3574 554 + 1 2216 3567 401 3574 + 1 2215 2217 3567 2216 + 1 2215 2217 3570 3567 + 1 2217 2216 3574 3567 + 1 2217 3570 3567 3574 + 1 1398 80 1408 1400 + 1 2304 1408 572 3794 + 1 2299 1400 3794 452 + 1 1398 2304 2299 1400 + 1 1398 2304 1400 1408 + 1 2304 2299 1400 3794 + 1 2304 1408 3794 1400 + 1 2313 572 1430 3802 + 1 1422 1430 82 1424 + 1 2310 3802 1424 454 + 1 2313 1422 2310 3802 + 1 2313 1422 3802 1430 + 1 1422 2310 3802 1424 + 1 1422 1430 1424 3802 + 1 2260 452 3789 1149 + 1 2262 3789 454 1151 + 1 1145 1149 1151 55 + 1 2260 2262 1145 1149 + 1 2260 2262 1149 3789 + 1 2262 1145 1149 1151 + 1 2262 3789 1151 1149 + 1 2298 193 2259 2309 + 1 2257 2259 186 2260 + 1 2299 2309 2260 452 + 1 2298 2257 2299 2309 + 1 2298 2257 2309 2259 + 1 2257 2299 2309 2260 + 1 2257 2259 2260 2309 + 1 2298 193 2309 2313 + 1 2304 2313 3794 572 + 1 2299 2309 452 3794 + 1 2298 2304 2309 2299 + 1 2298 2304 2313 2309 + 1 2304 2299 3794 2309 + 1 2304 2313 2309 3794 + 1 2259 186 2260 2262 + 1 2309 2260 452 3789 + 1 2310 2262 3789 454 + 1 2259 2309 2310 2262 + 1 2259 2309 2262 2260 + 1 2309 2310 2262 3789 + 1 2309 2260 3789 2262 + 1 2313 572 3802 3794 + 1 2309 3794 3789 452 + 1 2310 3802 454 3789 + 1 2313 2309 3802 2310 + 1 2313 2309 3794 3802 + 1 2309 2310 3789 3802 + 1 2309 3794 3802 3789 + 1 1252 67 1256 1258 + 1 2147 1256 513 4072 + 1 2149 1258 4072 515 + 1 1252 2147 2149 1258 + 1 1252 2147 1258 1256 + 1 2147 2149 1258 4072 + 1 2147 1256 4072 1258 + 1 2155 513 1268 4075 + 1 1262 1268 68 1270 + 1 2158 4075 1270 520 + 1 2155 1262 2158 4075 + 1 2155 1262 4075 1268 + 1 1262 2158 4075 1270 + 1 1262 1268 1270 4075 + 1 2172 515 4085 1301 + 1 2174 4085 520 1302 + 1 1296 1301 1302 71 + 1 2172 2174 1296 1301 + 1 2172 2174 1301 4085 + 1 2174 1296 1301 1302 + 1 2174 4085 1302 1301 + 1 2143 168 2151 2156 + 1 2145 2151 171 2172 + 1 2149 2156 2172 515 + 1 2143 2145 2149 2156 + 1 2143 2145 2156 2151 + 1 2145 2149 2156 2172 + 1 2145 2151 2172 2156 + 1 2143 168 2156 2155 + 1 2147 2155 4072 513 + 1 2149 2156 515 4072 + 1 2143 2147 2156 2149 + 1 2143 2147 2155 2156 + 1 2147 2149 4072 2156 + 1 2147 2155 2156 4072 + 1 2151 171 2172 2174 + 1 2156 2172 515 4085 + 1 2158 2174 4085 520 + 1 2151 2156 2158 2174 + 1 2151 2156 2174 2172 + 1 2156 2158 2174 4085 + 1 2156 2172 4085 2174 + 1 2155 513 4075 4072 + 1 2156 4072 4085 515 + 1 2158 4075 520 4085 + 1 2155 2156 4075 2158 + 1 2155 2156 4072 4075 + 1 2156 2158 4085 4075 + 1 2156 4072 4075 4085 + 1 1252 67 1258 1257 + 1 2148 1257 4078 514 + 1 2149 1258 515 4078 + 1 1252 2148 1258 2149 + 1 1252 2148 1257 1258 + 1 2148 2149 4078 1258 + 1 2148 1257 1258 4078 + 1 2167 514 4081 1291 + 1 1286 1291 1292 70 + 1 2169 4081 530 1292 + 1 2167 1286 4081 2169 + 1 2167 1286 1291 4081 + 1 1286 2169 1292 4081 + 1 1286 1291 4081 1292 + 1 2172 515 1301 4087 + 1 2176 4087 1304 530 + 1 1296 1301 71 1304 + 1 2172 2176 1301 1296 + 1 2172 2176 4087 1301 + 1 2176 1296 1304 1301 + 1 2176 4087 1301 1304 + 1 2144 170 2168 2164 + 1 2145 2164 2172 171 + 1 2149 2168 515 2172 + 1 2144 2145 2168 2149 + 1 2144 2145 2164 2168 + 1 2145 2149 2172 2168 + 1 2145 2164 2168 2172 + 1 2144 170 2167 2168 + 1 2148 2167 514 4078 + 1 2149 2168 4078 515 + 1 2144 2148 2149 2168 + 1 2144 2148 2168 2167 + 1 2148 2149 2168 4078 + 1 2148 2167 4078 2168 + 1 2164 171 2176 2172 + 1 2168 2172 4087 515 + 1 2169 2176 530 4087 + 1 2164 2168 2176 2169 + 1 2164 2168 2172 2176 + 1 2168 2169 4087 2176 + 1 2168 2172 2176 4087 + 1 2167 514 4078 4081 + 1 2168 4078 515 4087 + 1 2169 4081 4087 530 + 1 2167 2168 2169 4081 + 1 2167 2168 4081 4078 + 1 2168 2169 4081 4087 + 1 2168 4078 4087 4081 + 1 1340 75 1346 1347 + 1 2229 1346 549 4220 + 1 2230 1347 4220 550 + 1 1340 2229 2230 1347 + 1 1340 2229 1347 1346 + 1 2229 2230 1347 4220 + 1 2229 1346 4220 1347 + 1 2241 549 1366 4223 + 1 1360 1366 77 1368 + 1 2245 4223 1368 557 + 1 2241 1360 2245 4223 + 1 2241 1360 4223 1366 + 1 1360 2245 4223 1368 + 1 1360 1366 1368 4223 + 1 2247 550 4227 1378 + 1 2249 4227 557 1380 + 1 1374 1378 1380 78 + 1 2247 2249 1374 1378 + 1 2247 2249 1378 4227 + 1 2249 1374 1378 1380 + 1 2249 4227 1380 1378 + 1 2225 183 2237 2242 + 1 2226 2237 184 2247 + 1 2230 2242 2247 550 + 1 2225 2226 2230 2242 + 1 2225 2226 2242 2237 + 1 2226 2230 2242 2247 + 1 2226 2237 2247 2242 + 1 2225 183 2242 2241 + 1 2229 2241 4220 549 + 1 2230 2242 550 4220 + 1 2225 2229 2242 2230 + 1 2225 2229 2241 2242 + 1 2229 2230 4220 2242 + 1 2229 2241 2242 4220 + 1 2237 184 2247 2249 + 1 2242 2247 550 4227 + 1 2245 2249 4227 557 + 1 2237 2242 2245 2249 + 1 2237 2242 2249 2247 + 1 2242 2245 2249 4227 + 1 2242 2247 4227 2249 + 1 2241 549 4223 4220 + 1 2242 4220 4227 550 + 1 2245 4223 557 4227 + 1 2241 2242 4223 2245 + 1 2241 2242 4220 4223 + 1 2242 2245 4227 4223 + 1 2242 4220 4223 4227 + 1 1350 76 1357 1356 + 1 2235 1356 4237 553 + 1 2236 1357 554 4237 + 1 1350 2235 1357 2236 + 1 1350 2235 1356 1357 + 1 2235 2236 4237 1357 + 1 2235 1356 1357 4237 + 1 2243 553 4240 1367 + 1 1360 1367 1368 77 + 1 2245 4240 557 1368 + 1 2243 1360 4240 2245 + 1 2243 1360 1367 4240 + 1 1360 2245 1368 4240 + 1 1360 1367 4240 1368 + 1 2248 554 1379 4244 + 1 2249 4244 1380 557 + 1 1374 1379 78 1380 + 1 2248 2249 1379 1374 + 1 2248 2249 4244 1379 + 1 2249 1374 1380 1379 + 1 2249 4244 1379 1380 + 1 2231 183 2244 2237 + 1 2232 2237 2248 184 + 1 2236 2244 554 2248 + 1 2231 2232 2244 2236 + 1 2231 2232 2237 2244 + 1 2232 2236 2248 2244 + 1 2232 2237 2244 2248 + 1 2231 183 2243 2244 + 1 2235 2243 553 4237 + 1 2236 2244 4237 554 + 1 2231 2235 2236 2244 + 1 2231 2235 2244 2243 + 1 2235 2236 2244 4237 + 1 2235 2243 4237 2244 + 1 2237 184 2249 2248 + 1 2244 2248 4244 554 + 1 2245 2249 557 4244 + 1 2237 2244 2249 2245 + 1 2237 2244 2248 2249 + 1 2244 2245 4244 2249 + 1 2244 2248 2249 4244 + 1 2243 553 4237 4240 + 1 2244 4237 554 4244 + 1 2245 4240 4244 557 + 1 2243 2244 2245 4240 + 1 2243 2244 4240 4237 + 1 2244 2245 4240 4244 + 1 2244 4237 4244 4240 + 1 957 32 963 961 + 1 2135 963 344 3299 + 1 2133 961 3299 342 + 1 957 2135 2133 961 + 1 957 2135 961 963 + 1 2135 2133 961 3299 + 1 2135 963 3299 961 + 1 2171 344 1298 3310 + 1 1296 1298 71 1303 + 1 2175 3310 1303 526 + 1 2171 1296 2175 3310 + 1 2171 1296 3310 1298 + 1 1296 2175 3310 1303 + 1 1296 1298 1303 3310 + 1 2160 342 3302 1278 + 1 2163 3302 526 1282 + 1 1276 1278 1282 69 + 1 2160 2163 1276 1278 + 1 2160 2163 1278 3302 + 1 2163 1276 1278 1282 + 1 2163 3302 1282 1278 + 1 2132 171 2159 2170 + 1 2130 2159 169 2160 + 1 2133 2170 2160 342 + 1 2132 2130 2133 2170 + 1 2132 2130 2170 2159 + 1 2130 2133 2170 2160 + 1 2130 2159 2160 2170 + 1 2132 171 2170 2171 + 1 2135 2171 3299 344 + 1 2133 2170 342 3299 + 1 2132 2135 2170 2133 + 1 2132 2135 2171 2170 + 1 2135 2133 3299 2170 + 1 2135 2171 2170 3299 + 1 2159 169 2160 2163 + 1 2170 2160 342 3302 + 1 2175 2163 3302 526 + 1 2159 2170 2175 2163 + 1 2159 2170 2163 2160 + 1 2170 2175 2163 3302 + 1 2170 2160 3302 2163 + 1 2171 344 3310 3299 + 1 2170 3299 3302 342 + 1 2175 3310 526 3302 + 1 2171 2170 3310 2175 + 1 2171 2170 3299 3310 + 1 2170 2175 3302 3310 + 1 2170 3299 3310 3302 + 1 1398 80 1400 1407 + 1 2299 1400 452 3793 + 1 2303 1407 3793 571 + 1 1398 2299 2303 1407 + 1 1398 2299 1407 1400 + 1 2299 2303 1407 3793 + 1 2299 1400 3793 1407 + 1 2260 452 1149 3788 + 1 1145 1149 55 1150 + 1 2261 3788 1150 453 + 1 2260 1145 2261 3788 + 1 2260 1145 3788 1149 + 1 1145 2261 3788 1150 + 1 1145 1149 1150 3788 + 1 2308 571 3798 1419 + 1 2305 3798 453 1414 + 1 1412 1419 1414 81 + 1 2308 2305 1412 1419 + 1 2308 2305 1419 3798 + 1 2305 1412 1419 1414 + 1 2305 3798 1414 1419 + 1 2257 186 2258 2263 + 1 2297 2258 192 2308 + 1 2303 2263 2308 571 + 1 2257 2297 2303 2263 + 1 2257 2297 2263 2258 + 1 2297 2303 2263 2308 + 1 2297 2258 2308 2263 + 1 2257 186 2263 2260 + 1 2299 2260 3793 452 + 1 2303 2263 571 3793 + 1 2257 2299 2263 2303 + 1 2257 2299 2260 2263 + 1 2299 2303 3793 2263 + 1 2299 2260 2263 3793 + 1 2258 192 2308 2305 + 1 2263 2308 571 3798 + 1 2261 2305 3798 453 + 1 2258 2263 2261 2305 + 1 2258 2263 2305 2308 + 1 2263 2261 2305 3798 + 1 2263 2308 3798 2305 + 1 2260 452 3788 3793 + 1 2263 3793 3798 571 + 1 2261 3788 453 3798 + 1 2260 2263 3788 2261 + 1 2260 2263 3793 3788 + 1 2263 2261 3798 3788 + 1 2263 3793 3788 3798 + 1 1320 73 1327 1322 + 1 2202 1327 543 3498 + 1 2199 1322 3498 383 + 1 1320 2202 2199 1322 + 1 1320 2202 1322 1327 + 1 2202 2199 1322 3498 + 1 2202 1327 3498 1322 + 1 2207 543 1336 3501 + 1 1330 1336 74 1332 + 1 2204 3501 1332 384 + 1 2207 1330 2204 3501 + 1 2207 1330 3501 1336 + 1 1330 2204 3501 1332 + 1 1330 1336 1332 3501 + 1 2183 383 3495 1028 + 1 2184 3495 384 1029 + 1 1025 1028 1029 39 + 1 2183 2184 1025 1028 + 1 2183 2184 1028 3495 + 1 2184 1025 1028 1029 + 1 2184 3495 1029 1028 + 1 2198 177 2182 2203 + 1 2181 2182 173 2183 + 1 2199 2203 2183 383 + 1 2198 2181 2199 2203 + 1 2198 2181 2203 2182 + 1 2181 2199 2203 2183 + 1 2181 2182 2183 2203 + 1 2198 177 2203 2207 + 1 2202 2207 3498 543 + 1 2199 2203 383 3498 + 1 2198 2202 2203 2199 + 1 2198 2202 2207 2203 + 1 2202 2199 3498 2203 + 1 2202 2207 2203 3498 + 1 2182 173 2183 2184 + 1 2203 2183 383 3495 + 1 2204 2184 3495 384 + 1 2182 2203 2204 2184 + 1 2182 2203 2184 2183 + 1 2203 2204 2184 3495 + 1 2203 2183 3495 2184 + 1 2207 543 3501 3498 + 1 2203 3498 3495 383 + 1 2204 3501 384 3495 + 1 2207 2203 3501 2204 + 1 2207 2203 3498 3501 + 1 2203 2204 3495 3501 + 1 2203 3498 3501 3495 + 1 1262 68 1267 1269 + 1 2154 1267 508 4047 + 1 2157 1269 4047 519 + 1 1262 2154 2157 1269 + 1 1262 2154 1269 1267 + 1 2154 2157 1269 4047 + 1 2154 1267 4047 1269 + 1 2140 508 1247 4044 + 1 1242 1247 66 1248 + 1 2141 4044 1248 509 + 1 2140 1242 2141 4044 + 1 2140 1242 4044 1247 + 1 1242 2141 4044 1248 + 1 1242 1247 1248 4044 + 1 2162 519 4052 1281 + 1 2161 4052 509 1280 + 1 1276 1281 1280 69 + 1 2162 2161 1276 1281 + 1 2162 2161 1281 4052 + 1 2161 1276 1281 1280 + 1 2161 4052 1280 1281 + 1 2136 166 2137 2142 + 1 2150 2137 169 2162 + 1 2157 2142 2162 519 + 1 2136 2150 2157 2142 + 1 2136 2150 2142 2137 + 1 2150 2157 2142 2162 + 1 2150 2137 2162 2142 + 1 2136 166 2142 2140 + 1 2154 2140 4047 508 + 1 2157 2142 519 4047 + 1 2136 2154 2142 2157 + 1 2136 2154 2140 2142 + 1 2154 2157 4047 2142 + 1 2154 2140 2142 4047 + 1 2137 169 2162 2161 + 1 2142 2162 519 4052 + 1 2141 2161 4052 509 + 1 2137 2142 2141 2161 + 1 2137 2142 2161 2162 + 1 2142 2141 2161 4052 + 1 2142 2162 4052 2161 + 1 2140 508 4044 4047 + 1 2142 4047 4052 519 + 1 2141 4044 509 4052 + 1 2140 2142 4044 2141 + 1 2140 2142 4047 4044 + 1 2142 2141 4052 4044 + 1 2142 4047 4044 4052 + 1 1262 68 1269 1270 + 1 2158 1270 4103 520 + 1 2157 1269 519 4103 + 1 1262 2158 1269 2157 + 1 1262 2158 1270 1269 + 1 2158 2157 4103 1269 + 1 2158 1270 1269 4103 + 1 2174 520 4111 1302 + 1 1296 1302 1303 71 + 1 2175 4111 526 1303 + 1 2174 1296 4111 2175 + 1 2174 1296 1302 4111 + 1 1296 2175 1303 4111 + 1 1296 1302 4111 1303 + 1 2162 519 1281 4105 + 1 2163 4105 1282 526 + 1 1276 1281 69 1282 + 1 2162 2163 1281 1276 + 1 2162 2163 4105 1281 + 1 2163 1276 1282 1281 + 1 2163 4105 1281 1282 + 1 2151 171 2173 2159 + 1 2150 2159 2162 169 + 1 2157 2173 519 2162 + 1 2151 2150 2173 2157 + 1 2151 2150 2159 2173 + 1 2150 2157 2162 2173 + 1 2150 2159 2173 2162 + 1 2151 171 2174 2173 + 1 2158 2174 520 4103 + 1 2157 2173 4103 519 + 1 2151 2158 2157 2173 + 1 2151 2158 2173 2174 + 1 2158 2157 2173 4103 + 1 2158 2174 4103 2173 + 1 2159 169 2163 2162 + 1 2173 2162 4105 519 + 1 2175 2163 526 4105 + 1 2159 2173 2163 2175 + 1 2159 2173 2162 2163 + 1 2173 2175 4105 2163 + 1 2173 2162 2163 4105 + 1 2174 520 4103 4111 + 1 2173 4103 519 4105 + 1 2175 4111 4105 526 + 1 2174 2173 2175 4111 + 1 2174 2173 4111 4103 + 1 2173 2175 4111 4105 + 1 2173 4103 4105 4111 + 1 1311 72 1318 1319 + 1 2279 1318 541 4193 + 1 2280 1319 4193 542 + 1 1311 2279 2280 1319 + 1 1311 2279 1319 1318 + 1 2279 2280 1319 4193 + 1 2279 1318 4193 1319 + 1 2292 541 1390 4196 + 1 1384 1390 79 1394 + 1 2295 4196 1394 567 + 1 2292 1384 2295 4196 + 1 2292 1384 4196 1390 + 1 1384 2295 4196 1394 + 1 1384 1390 1394 4196 + 1 2306 542 4199 1416 + 1 2307 4199 567 1418 + 1 1412 1416 1418 81 + 1 2306 2307 1412 1416 + 1 2306 2307 1416 4199 + 1 2307 1412 1416 1418 + 1 2307 4199 1418 1416 + 1 2275 190 2288 2293 + 1 2276 2288 192 2306 + 1 2280 2293 2306 542 + 1 2275 2276 2280 2293 + 1 2275 2276 2293 2288 + 1 2276 2280 2293 2306 + 1 2276 2288 2306 2293 + 1 2275 190 2293 2292 + 1 2279 2292 4193 541 + 1 2280 2293 542 4193 + 1 2275 2279 2293 2280 + 1 2275 2279 2292 2293 + 1 2279 2280 4193 2293 + 1 2279 2292 2293 4193 + 1 2288 192 2306 2307 + 1 2293 2306 542 4199 + 1 2295 2307 4199 567 + 1 2288 2293 2295 2307 + 1 2288 2293 2307 2306 + 1 2293 2295 2307 4199 + 1 2293 2306 4199 2307 + 1 2292 541 4196 4193 + 1 2293 4193 4199 542 + 1 2295 4196 567 4199 + 1 2292 2293 4196 2295 + 1 2292 2293 4193 4196 + 1 2293 2295 4199 4196 + 1 2293 4193 4196 4199 + 1 1398 80 1407 1406 + 1 2302 1406 4294 566 + 1 2303 1407 571 4294 + 1 1398 2302 1407 2303 + 1 1398 2302 1406 1407 + 1 2302 2303 4294 1407 + 1 2302 1406 1407 4294 + 1 2294 566 4291 1393 + 1 1384 1393 1394 79 + 1 2295 4291 567 1394 + 1 2294 1384 4291 2295 + 1 2294 1384 1393 4291 + 1 1384 2295 1394 4291 + 1 1384 1393 4291 1394 + 1 2308 571 1419 4299 + 1 2307 4299 1418 567 + 1 1412 1419 81 1418 + 1 2308 2307 1419 1412 + 1 2308 2307 4299 1419 + 1 2307 1412 1418 1419 + 1 2307 4299 1419 1418 + 1 2287 190 2296 2288 + 1 2297 2288 2308 192 + 1 2303 2296 571 2308 + 1 2287 2297 2296 2303 + 1 2287 2297 2288 2296 + 1 2297 2303 2308 2296 + 1 2297 2288 2296 2308 + 1 2287 190 2294 2296 + 1 2302 2294 566 4294 + 1 2303 2296 4294 571 + 1 2287 2302 2303 2296 + 1 2287 2302 2296 2294 + 1 2302 2303 2296 4294 + 1 2302 2294 4294 2296 + 1 2288 192 2307 2308 + 1 2296 2308 4299 571 + 1 2295 2307 567 4299 + 1 2288 2296 2307 2295 + 1 2288 2296 2308 2307 + 1 2296 2295 4299 2307 + 1 2296 2308 2307 4299 + 1 2294 566 4294 4291 + 1 2296 4294 571 4299 + 1 2295 4291 4299 567 + 1 2294 2296 2295 4291 + 1 2294 2296 4291 4294 + 1 2296 2295 4291 4299 + 1 2296 4294 4299 4291 + 1 817 15 821 820 + 1 2455 821 217 2474 + 1 2454 820 2474 216 + 1 817 2455 2454 820 + 1 817 2455 820 821 + 1 2455 2454 820 2474 + 1 2455 821 2474 820 + 1 2486 217 1570 2487 + 1 1572 1570 94 1574 + 1 3411 2487 1574 627 + 1 2486 1572 3411 2487 + 1 2486 1572 2487 1570 + 1 1572 3411 2487 1574 + 1 1572 1570 1574 2487 + 1 2477 216 2480 1556 + 1 3408 2480 627 1563 + 1 1558 1556 1563 93 + 1 2477 3408 1558 1556 + 1 2477 3408 1556 2480 + 1 3408 1558 1556 1563 + 1 3408 2480 1563 1556 + 1 2458 363 3403 2478 + 1 2457 3403 362 2477 + 1 2454 2478 2477 216 + 1 2458 2457 2454 2478 + 1 2458 2457 2478 3403 + 1 2457 2454 2478 2477 + 1 2457 3403 2477 2478 + 1 2458 363 2478 2486 + 1 2455 2486 2474 217 + 1 2454 2478 216 2474 + 1 2458 2455 2478 2454 + 1 2458 2455 2486 2478 + 1 2455 2454 2474 2478 + 1 2455 2486 2478 2474 + 1 3403 362 2477 3408 + 1 2478 2477 216 2480 + 1 3411 3408 2480 627 + 1 3403 2478 3411 3408 + 1 3403 2478 3408 2477 + 1 2478 3411 3408 2480 + 1 2478 2477 2480 3408 + 1 2486 217 2487 2474 + 1 2478 2474 2480 216 + 1 3411 2487 627 2480 + 1 2486 2478 2487 3411 + 1 2486 2478 2474 2487 + 1 2478 3411 2480 2487 + 1 2478 2474 2487 2480 + 1 1573 94 1571 1577 + 1 2714 1571 245 2715 + 1 3479 1577 2715 636 + 1 1573 2714 3479 1577 + 1 1573 2714 1577 1571 + 1 2714 3479 1577 2715 + 1 2714 1571 2715 1577 + 1 2681 245 849 2711 + 1 846 849 18 851 + 1 2683 2711 851 247 + 1 2681 846 2683 2711 + 1 2681 846 2711 849 + 1 846 2683 2711 851 + 1 846 849 851 2711 + 1 3484 636 2729 1665 + 1 2727 2729 247 1659 + 1 1661 1665 1659 102 + 1 3484 2727 1661 1665 + 1 3484 2727 1665 2729 + 1 2727 1661 1665 1659 + 1 2727 2729 1659 1665 + 1 2685 242 2687 2689 + 1 3477 2687 380 3484 + 1 3479 2689 3484 636 + 1 2685 3477 3479 2689 + 1 2685 3477 2689 2687 + 1 3477 3479 2689 3484 + 1 3477 2687 3484 2689 + 1 2685 242 2689 2681 + 1 2714 2681 2715 245 + 1 3479 2689 636 2715 + 1 2685 2714 2689 3479 + 1 2685 2714 2681 2689 + 1 2714 3479 2715 2689 + 1 2714 2681 2689 2715 + 1 2687 380 3484 2727 + 1 2689 3484 636 2729 + 1 2683 2727 2729 247 + 1 2687 2689 2683 2727 + 1 2687 2689 2727 3484 + 1 2689 2683 2727 2729 + 1 2689 3484 2729 2727 + 1 2681 245 2711 2715 + 1 2689 2715 2729 636 + 1 2683 2711 247 2729 + 1 2681 2689 2711 2683 + 1 2681 2689 2715 2711 + 1 2689 2683 2729 2711 + 1 2689 2715 2711 2729 + 1 1559 93 1566 1557 + 1 3456 1566 630 2627 + 1 2624 1557 2627 235 + 1 1559 3456 2624 1557 + 1 1559 3456 1557 1566 + 1 3456 2624 1557 2627 + 1 3456 1566 2627 1557 + 1 3461 630 1664 2636 + 1 1660 1664 102 1658 + 1 2634 2636 1658 236 + 1 3461 1660 2634 2636 + 1 3461 1660 2636 1664 + 1 1660 2634 2636 1658 + 1 1660 1664 1658 2636 + 1 2551 235 2621 839 + 1 2552 2621 236 840 + 1 832 839 840 17 + 1 2551 2552 832 839 + 1 2551 2552 839 2621 + 1 2552 832 839 840 + 1 2552 2621 840 839 + 1 3453 374 2557 2625 + 1 2556 2557 228 2551 + 1 2624 2625 2551 235 + 1 3453 2556 2624 2625 + 1 3453 2556 2625 2557 + 1 2556 2624 2625 2551 + 1 2556 2557 2551 2625 + 1 3453 374 2625 3461 + 1 3456 3461 2627 630 + 1 2624 2625 235 2627 + 1 3453 3456 2625 2624 + 1 3453 3456 3461 2625 + 1 3456 2624 2627 2625 + 1 3456 3461 2625 2627 + 1 2557 228 2551 2552 + 1 2625 2551 235 2621 + 1 2634 2552 2621 236 + 1 2557 2625 2634 2552 + 1 2557 2625 2552 2551 + 1 2625 2634 2552 2621 + 1 2625 2551 2621 2552 + 1 3461 630 2636 2627 + 1 2625 2627 2621 235 + 1 2634 2636 236 2621 + 1 3461 2625 2636 2634 + 1 3461 2625 2627 2636 + 1 2625 2634 2621 2636 + 1 2625 2627 2636 2621 + 1 1015 38 1017 1020 + 1 3390 1017 367 3426 + 1 3391 1020 3426 377 + 1 1015 3390 3391 1020 + 1 1015 3390 1020 1017 + 1 3390 3391 1020 3426 + 1 3390 1017 3426 1020 + 1 3384 367 1004 3423 + 1 1003 1004 37 1010 + 1 3386 3423 1010 373 + 1 3384 1003 3386 3423 + 1 3384 1003 3423 1004 + 1 1003 3386 3423 1010 + 1 1003 1004 1010 3423 + 1 3405 377 3454 1560 + 1 3404 3454 373 1559 + 1 1558 1560 1559 93 + 1 3405 3404 1558 1560 + 1 3405 3404 1560 3454 + 1 3404 1558 1560 1559 + 1 3404 3454 1559 1560 + 1 3381 358 3383 3387 + 1 3388 3383 362 3405 + 1 3391 3387 3405 377 + 1 3381 3388 3391 3387 + 1 3381 3388 3387 3383 + 1 3388 3391 3387 3405 + 1 3388 3383 3405 3387 + 1 3381 358 3387 3384 + 1 3390 3384 3426 367 + 1 3391 3387 377 3426 + 1 3381 3390 3387 3391 + 1 3381 3390 3384 3387 + 1 3390 3391 3426 3387 + 1 3390 3384 3387 3426 + 1 3383 362 3405 3404 + 1 3387 3405 377 3454 + 1 3386 3404 3454 373 + 1 3383 3387 3386 3404 + 1 3383 3387 3404 3405 + 1 3387 3386 3404 3454 + 1 3387 3405 3454 3404 + 1 3384 367 3423 3426 + 1 3387 3426 3454 377 + 1 3386 3423 373 3454 + 1 3384 3387 3423 3386 + 1 3384 3387 3426 3423 + 1 3387 3386 3454 3423 + 1 3387 3426 3423 3454 + 1 1015 38 1020 1021 + 1 3392 1021 3472 378 + 1 3391 1020 377 3472 + 1 1015 3392 1020 3391 + 1 1015 3392 1021 1020 + 1 3392 3391 3472 1020 + 1 3392 1021 1020 3472 + 1 3410 378 3478 1573 + 1 1572 1573 1574 94 + 1 3411 3478 627 1574 + 1 3410 1572 3478 3411 + 1 3410 1572 1573 3478 + 1 1572 3411 1574 3478 + 1 1572 1573 3478 1574 + 1 3405 377 1560 3474 + 1 3408 3474 1563 627 + 1 1558 1560 93 1563 + 1 3405 3408 1560 1558 + 1 3405 3408 3474 1560 + 1 3408 1558 1563 1560 + 1 3408 3474 1560 1563 + 1 3389 363 3409 3403 + 1 3388 3403 3405 362 + 1 3391 3409 377 3405 + 1 3389 3388 3409 3391 + 1 3389 3388 3403 3409 + 1 3388 3391 3405 3409 + 1 3388 3403 3409 3405 + 1 3389 363 3410 3409 + 1 3392 3410 378 3472 + 1 3391 3409 3472 377 + 1 3389 3392 3391 3409 + 1 3389 3392 3409 3410 + 1 3392 3391 3409 3472 + 1 3392 3410 3472 3409 + 1 3403 362 3408 3405 + 1 3409 3405 3474 377 + 1 3411 3408 627 3474 + 1 3403 3409 3408 3411 + 1 3403 3409 3405 3408 + 1 3409 3411 3474 3408 + 1 3409 3405 3408 3474 + 1 3410 378 3472 3478 + 1 3409 3472 377 3474 + 1 3411 3478 3474 627 + 1 3410 3409 3411 3478 + 1 3410 3409 3478 3472 + 1 3409 3411 3478 3474 + 1 3409 3472 3474 3478 + 1 1004 37 1010 1011 + 1 3423 1010 373 3453 + 1 3424 1011 3453 374 + 1 1004 3423 3424 1011 + 1 1004 3423 1011 1010 + 1 3423 3424 1011 3453 + 1 3423 1010 3453 1011 + 1 3454 373 1559 3456 + 1 1560 1559 93 1566 + 1 3475 3456 1566 630 + 1 3454 1560 3475 3456 + 1 3454 1560 3456 1559 + 1 1560 3475 3456 1566 + 1 1560 1559 1566 3456 + 1 3458 374 3461 1660 + 1 3483 3461 630 1664 + 1 1661 1660 1664 102 + 1 3458 3483 1661 1660 + 1 3458 3483 1660 3461 + 1 3483 1661 1660 1664 + 1 3483 3461 1664 1660 + 1 3426 377 3473 3457 + 1 3427 3473 380 3458 + 1 3424 3457 3458 374 + 1 3426 3427 3424 3457 + 1 3426 3427 3457 3473 + 1 3427 3424 3457 3458 + 1 3427 3473 3458 3457 + 1 3426 377 3457 3454 + 1 3423 3454 3453 373 + 1 3424 3457 374 3453 + 1 3426 3423 3457 3424 + 1 3426 3423 3454 3457 + 1 3423 3424 3453 3457 + 1 3423 3454 3457 3453 + 1 3473 380 3458 3483 + 1 3457 3458 374 3461 + 1 3475 3483 3461 630 + 1 3473 3457 3475 3483 + 1 3473 3457 3483 3458 + 1 3457 3475 3483 3461 + 1 3457 3458 3461 3483 + 1 3454 373 3456 3453 + 1 3457 3453 3461 374 + 1 3475 3456 630 3461 + 1 3454 3457 3456 3475 + 1 3454 3457 3453 3456 + 1 3457 3475 3461 3456 + 1 3457 3453 3456 3461 + 1 1573 94 1577 1574 + 1 3478 1574 4545 627 + 1 3479 1577 636 4545 + 1 1573 3478 1577 3479 + 1 1573 3478 1574 1577 + 1 3478 3479 4545 1577 + 1 3478 1574 1577 4545 + 1 3474 627 4542 1563 + 1 1560 1563 1566 93 + 1 3475 4542 630 1566 + 1 3474 1560 4542 3475 + 1 3474 1560 1563 4542 + 1 1560 3475 1566 4542 + 1 1560 1563 4542 1566 + 1 3484 636 1665 4562 + 1 3483 4562 1664 630 + 1 1661 1665 102 1664 + 1 3484 3483 1665 1661 + 1 3484 3483 4562 1665 + 1 3483 1661 1664 1665 + 1 3483 4562 1665 1664 + 1 3472 377 3476 3473 + 1 3477 3473 3484 380 + 1 3479 3476 636 3484 + 1 3472 3477 3476 3479 + 1 3472 3477 3473 3476 + 1 3477 3479 3484 3476 + 1 3477 3473 3476 3484 + 1 3472 377 3474 3476 + 1 3478 3474 627 4545 + 1 3479 3476 4545 636 + 1 3472 3478 3479 3476 + 1 3472 3478 3476 3474 + 1 3478 3479 3476 4545 + 1 3478 3474 4545 3476 + 1 3473 380 3483 3484 + 1 3476 3484 4562 636 + 1 3475 3483 630 4562 + 1 3473 3476 3483 3475 + 1 3473 3476 3484 3483 + 1 3476 3475 4562 3483 + 1 3476 3484 3483 4562 + 1 3474 627 4545 4542 + 1 3476 4545 636 4562 + 1 3475 4542 4562 630 + 1 3474 3476 3475 4542 + 1 3474 3476 4542 4545 + 1 3476 3475 4542 4562 + 1 3476 4545 4562 4542 + 1 807 14 812 813 + 1 2380 812 208 2414 + 1 2381 813 2414 209 + 1 807 2380 2381 813 + 1 807 2380 813 812 + 1 2380 2381 813 2414 + 1 2380 812 2414 813 + 1 2417 208 1490 2420 + 1 1492 1490 88 1498 + 1 3375 2420 1498 601 + 1 2417 1492 3375 2420 + 1 2417 1492 2420 1490 + 1 1492 3375 2420 1498 + 1 1492 1490 1498 2420 + 1 2426 209 2428 1504 + 1 3380 2428 601 1510 + 1 1506 1504 1510 89 + 1 2426 3380 1506 1504 + 1 2426 3380 1504 2428 + 1 3380 1506 1504 1510 + 1 3380 2428 1510 1504 + 1 2384 356 3370 2425 + 1 2385 3370 357 2426 + 1 2381 2425 2426 209 + 1 2384 2385 2381 2425 + 1 2384 2385 2425 3370 + 1 2385 2381 2425 2426 + 1 2385 3370 2426 2425 + 1 2384 356 2425 2417 + 1 2380 2417 2414 208 + 1 2381 2425 209 2414 + 1 2384 2380 2425 2381 + 1 2384 2380 2417 2425 + 1 2380 2381 2414 2425 + 1 2380 2417 2425 2414 + 1 3370 357 2426 3380 + 1 2425 2426 209 2428 + 1 3375 3380 2428 601 + 1 3370 2425 3375 3380 + 1 3370 2425 3380 2426 + 1 2425 3375 3380 2428 + 1 2425 2426 2428 3380 + 1 2417 208 2420 2414 + 1 2425 2414 2428 209 + 1 3375 2420 601 2428 + 1 2417 2425 2420 3375 + 1 2417 2425 2414 2420 + 1 2425 3375 2428 2420 + 1 2425 2414 2420 2428 + 1 1493 88 1491 1501 + 1 2615 1491 234 2618 + 1 3446 1501 2618 604 + 1 1493 2615 3446 1501 + 1 1493 2615 1501 1491 + 1 2615 3446 1501 2618 + 1 2615 1491 2618 1501 + 1 2550 234 838 2612 + 1 832 838 17 840 + 1 2552 2612 840 236 + 1 2550 832 2552 2612 + 1 2550 832 2612 838 + 1 832 2552 2612 840 + 1 832 838 840 2612 + 1 3459 604 2635 1662 + 1 2634 2635 236 1658 + 1 1660 1662 1658 102 + 1 3459 2634 1660 1662 + 1 3459 2634 1662 2635 + 1 2634 1660 1662 1658 + 1 2634 2635 1658 1662 + 1 2555 228 2557 2559 + 1 3442 2557 374 3459 + 1 3446 2559 3459 604 + 1 2555 3442 3446 2559 + 1 2555 3442 2559 2557 + 1 3442 3446 2559 3459 + 1 3442 2557 3459 2559 + 1 2555 228 2559 2550 + 1 2615 2550 2618 234 + 1 3446 2559 604 2618 + 1 2555 2615 2559 3446 + 1 2555 2615 2550 2559 + 1 2615 3446 2618 2559 + 1 2615 2550 2559 2618 + 1 2557 374 3459 2634 + 1 2559 3459 604 2635 + 1 2552 2634 2635 236 + 1 2557 2559 2552 2634 + 1 2557 2559 2634 3459 + 1 2559 2552 2634 2635 + 1 2559 3459 2635 2634 + 1 2550 234 2612 2618 + 1 2559 2618 2635 604 + 1 2552 2612 236 2635 + 1 2550 2559 2612 2552 + 1 2550 2559 2618 2612 + 1 2559 2552 2635 2612 + 1 2559 2618 2612 2635 + 1 1508 89 1514 1505 + 1 3471 1514 610 2707 + 1 2704 1505 2707 244 + 1 1508 3471 2704 1505 + 1 1508 3471 1505 1514 + 1 3471 2704 1505 2707 + 1 3471 1514 2707 1505 + 1 3482 610 1663 2728 + 1 1661 1663 102 1659 + 1 2727 2728 1659 247 + 1 3482 1661 2727 2728 + 1 3482 1661 2728 1663 + 1 1661 2727 2728 1659 + 1 1661 1663 1659 2728 + 1 2680 244 2701 848 + 1 2683 2701 247 851 + 1 846 848 851 18 + 1 2680 2683 846 848 + 1 2680 2683 848 2701 + 1 2683 846 848 851 + 1 2683 2701 851 848 + 1 3468 380 2687 2705 + 1 2684 2687 242 2680 + 1 2704 2705 2680 244 + 1 3468 2684 2704 2705 + 1 3468 2684 2705 2687 + 1 2684 2704 2705 2680 + 1 2684 2687 2680 2705 + 1 3468 380 2705 3482 + 1 3471 3482 2707 610 + 1 2704 2705 244 2707 + 1 3468 3471 2705 2704 + 1 3468 3471 3482 2705 + 1 3471 2704 2707 2705 + 1 3471 3482 2705 2707 + 1 2687 242 2680 2683 + 1 2705 2680 244 2701 + 1 2727 2683 2701 247 + 1 2687 2705 2727 2683 + 1 2687 2705 2683 2680 + 1 2705 2727 2683 2701 + 1 2705 2680 2701 2683 + 1 3482 610 2728 2707 + 1 2705 2707 2701 244 + 1 2727 2728 247 2701 + 1 3482 2705 2728 2727 + 1 3482 2705 2707 2728 + 1 2705 2727 2701 2728 + 1 2705 2707 2728 2701 + 1 1002 37 1004 1009 + 1 3352 1004 367 3422 + 1 3355 1009 3422 372 + 1 1002 3352 3355 1009 + 1 1002 3352 1009 1004 + 1 3352 3355 1009 3422 + 1 3352 1004 3422 1009 + 1 3359 367 1017 3425 + 1 1014 1017 38 1019 + 1 3362 3425 1019 376 + 1 3359 1014 3362 3425 + 1 3359 1014 3425 1017 + 1 1014 3362 3425 1019 + 1 1014 1017 1019 3425 + 1 3376 372 3448 1507 + 1 3378 3448 376 1508 + 1 1506 1507 1508 89 + 1 3376 3378 1506 1507 + 1 3376 3378 1507 3448 + 1 3378 1506 1507 1508 + 1 3378 3448 1508 1507 + 1 3348 353 3357 3360 + 1 3351 3357 357 3376 + 1 3355 3360 3376 372 + 1 3348 3351 3355 3360 + 1 3348 3351 3360 3357 + 1 3351 3355 3360 3376 + 1 3351 3357 3376 3360 + 1 3348 353 3360 3359 + 1 3352 3359 3422 367 + 1 3355 3360 372 3422 + 1 3348 3352 3360 3355 + 1 3348 3352 3359 3360 + 1 3352 3355 3422 3360 + 1 3352 3359 3360 3422 + 1 3357 357 3376 3378 + 1 3360 3376 372 3448 + 1 3362 3378 3448 376 + 1 3357 3360 3362 3378 + 1 3357 3360 3378 3376 + 1 3360 3362 3378 3448 + 1 3360 3376 3448 3378 + 1 3359 367 3425 3422 + 1 3360 3422 3448 372 + 1 3362 3425 376 3448 + 1 3359 3360 3425 3362 + 1 3359 3360 3422 3425 + 1 3360 3362 3448 3425 + 1 3360 3422 3425 3448 + 1 1002 37 1009 1008 + 1 3354 1008 3441 371 + 1 3355 1009 372 3441 + 1 1002 3354 1009 3355 + 1 1002 3354 1008 1009 + 1 3354 3355 3441 1009 + 1 3354 1008 1009 3441 + 1 3372 371 3445 1493 + 1 1492 1493 1498 88 + 1 3375 3445 601 1498 + 1 3372 1492 3445 3375 + 1 3372 1492 1493 3445 + 1 1492 3375 1498 3445 + 1 1492 1493 3445 1498 + 1 3376 372 1507 3450 + 1 3380 3450 1510 601 + 1 1506 1507 89 1510 + 1 3376 3380 1507 1506 + 1 3376 3380 3450 1507 + 1 3380 1506 1510 1507 + 1 3380 3450 1507 1510 + 1 3350 356 3373 3370 + 1 3351 3370 3376 357 + 1 3355 3373 372 3376 + 1 3350 3351 3373 3355 + 1 3350 3351 3370 3373 + 1 3351 3355 3376 3373 + 1 3351 3370 3373 3376 + 1 3350 356 3372 3373 + 1 3354 3372 371 3441 + 1 3355 3373 3441 372 + 1 3350 3354 3355 3373 + 1 3350 3354 3373 3372 + 1 3354 3355 3373 3441 + 1 3354 3372 3441 3373 + 1 3370 357 3380 3376 + 1 3373 3376 3450 372 + 1 3375 3380 601 3450 + 1 3370 3373 3380 3375 + 1 3370 3373 3376 3380 + 1 3373 3375 3450 3380 + 1 3373 3376 3380 3450 + 1 3372 371 3441 3445 + 1 3373 3441 372 3450 + 1 3375 3445 3450 601 + 1 3372 3373 3375 3445 + 1 3372 3373 3445 3441 + 1 3373 3375 3445 3450 + 1 3373 3441 3450 3445 + 1 1017 38 1019 1023 + 1 3425 1019 376 3468 + 1 3427 1023 3468 380 + 1 1017 3425 3427 1023 + 1 1017 3425 1023 1019 + 1 3425 3427 1023 3468 + 1 3425 1019 3468 1023 + 1 3448 376 1508 3471 + 1 1507 1508 89 1514 + 1 3452 3471 1514 610 + 1 3448 1507 3452 3471 + 1 3448 1507 3471 1508 + 1 1507 3452 3471 1514 + 1 1507 1508 1514 3471 + 1 3458 380 3482 1661 + 1 3460 3482 610 1663 + 1 1660 1661 1663 102 + 1 3458 3460 1660 1661 + 1 3458 3460 1661 3482 + 1 3460 1660 1661 1663 + 1 3460 3482 1663 1661 + 1 3422 372 3447 3449 + 1 3424 3447 374 3458 + 1 3427 3449 3458 380 + 1 3422 3424 3427 3449 + 1 3422 3424 3449 3447 + 1 3424 3427 3449 3458 + 1 3424 3447 3458 3449 + 1 3422 372 3449 3448 + 1 3425 3448 3468 376 + 1 3427 3449 380 3468 + 1 3422 3425 3449 3427 + 1 3422 3425 3448 3449 + 1 3425 3427 3468 3449 + 1 3425 3448 3449 3468 + 1 3447 374 3458 3460 + 1 3449 3458 380 3482 + 1 3452 3460 3482 610 + 1 3447 3449 3452 3460 + 1 3447 3449 3460 3458 + 1 3449 3452 3460 3482 + 1 3449 3458 3482 3460 + 1 3448 376 3471 3468 + 1 3449 3468 3482 380 + 1 3452 3471 610 3482 + 1 3448 3449 3471 3452 + 1 3448 3449 3468 3471 + 1 3449 3452 3482 3471 + 1 3449 3468 3471 3482 + 1 1493 88 1501 1498 + 1 3445 1498 4431 601 + 1 3446 1501 604 4431 + 1 1493 3445 1501 3446 + 1 1493 3445 1498 1501 + 1 3445 3446 4431 1501 + 1 3445 1498 1501 4431 + 1 3450 601 4434 1510 + 1 1507 1510 1514 89 + 1 3452 4434 610 1514 + 1 3450 1507 4434 3452 + 1 3450 1507 1510 4434 + 1 1507 3452 1514 4434 + 1 1507 1510 4434 1514 + 1 3459 604 1662 4449 + 1 3460 4449 1663 610 + 1 1660 1662 102 1663 + 1 3459 3460 1662 1660 + 1 3459 3460 4449 1662 + 1 3460 1660 1663 1662 + 1 3460 4449 1662 1663 + 1 3441 372 3451 3447 + 1 3442 3447 3459 374 + 1 3446 3451 604 3459 + 1 3441 3442 3451 3446 + 1 3441 3442 3447 3451 + 1 3442 3446 3459 3451 + 1 3442 3447 3451 3459 + 1 3441 372 3450 3451 + 1 3445 3450 601 4431 + 1 3446 3451 4431 604 + 1 3441 3445 3446 3451 + 1 3441 3445 3451 3450 + 1 3445 3446 3451 4431 + 1 3445 3450 4431 3451 + 1 3447 374 3460 3459 + 1 3451 3459 4449 604 + 1 3452 3460 610 4449 + 1 3447 3451 3460 3452 + 1 3447 3451 3459 3460 + 1 3451 3452 4449 3460 + 1 3451 3459 3460 4449 + 1 3450 601 4431 4434 + 1 3451 4431 604 4449 + 1 3452 4434 4449 610 + 1 3450 3451 3452 4434 + 1 3450 3451 4434 4431 + 1 3451 3452 4434 4449 + 1 3451 4431 4449 4434 + 1 798 13 803 804 + 1 2315 803 199 2351 + 1 2316 804 2351 200 + 1 798 2315 2316 804 + 1 798 2315 804 803 + 1 2315 2316 804 2351 + 1 2315 803 2351 804 + 1 2354 199 1432 2355 + 1 1434 1432 83 1436 + 1 3337 2355 1436 579 + 1 2354 1434 3337 2355 + 1 2354 1434 2355 1432 + 1 1434 3337 2355 1436 + 1 1434 1432 1436 2355 + 1 2360 200 2363 1442 + 1 3342 2363 579 1451 + 1 1444 1442 1451 84 + 1 2360 3342 1444 1442 + 1 2360 3342 1442 2363 + 1 3342 1444 1442 1451 + 1 3342 2363 1451 1442 + 1 2318 349 3334 2359 + 1 2319 3334 350 2360 + 1 2316 2359 2360 200 + 1 2318 2319 2316 2359 + 1 2318 2319 2359 3334 + 1 2319 2316 2359 2360 + 1 2319 3334 2360 2359 + 1 2318 349 2359 2354 + 1 2315 2354 2351 199 + 1 2316 2359 200 2351 + 1 2318 2315 2359 2316 + 1 2318 2315 2354 2359 + 1 2315 2316 2351 2359 + 1 2315 2354 2359 2351 + 1 3334 350 2360 3342 + 1 2359 2360 200 2363 + 1 3337 3342 2363 579 + 1 3334 2359 3337 3342 + 1 3334 2359 3342 2360 + 1 2359 3337 3342 2363 + 1 2359 2360 2363 3342 + 1 2354 199 2355 2351 + 1 2359 2351 2363 200 + 1 3337 2355 579 2363 + 1 2354 2359 2355 3337 + 1 2354 2359 2351 2355 + 1 2359 3337 2363 2355 + 1 2359 2351 2355 2363 + 1 1435 83 1433 1439 + 1 2470 1433 215 2471 + 1 3396 1439 2471 582 + 1 1435 2470 3396 1439 + 1 1435 2470 1439 1433 + 1 2470 3396 1439 2471 + 1 2470 1433 2471 1439 + 1 2453 215 819 2467 + 1 817 819 15 820 + 1 2454 2467 820 216 + 1 2453 817 2454 2467 + 1 2453 817 2467 819 + 1 817 2454 2467 820 + 1 817 819 820 2467 + 1 3406 582 2479 1561 + 1 2477 2479 216 1556 + 1 1558 1561 1556 93 + 1 3406 2477 1558 1561 + 1 3406 2477 1561 2479 + 1 2477 1558 1561 1556 + 1 2477 2479 1556 1561 + 1 2456 213 2457 2459 + 1 3394 2457 362 3406 + 1 3396 2459 3406 582 + 1 2456 3394 3396 2459 + 1 2456 3394 2459 2457 + 1 3394 3396 2459 3406 + 1 3394 2457 3406 2459 + 1 2456 213 2459 2453 + 1 2470 2453 2471 215 + 1 3396 2459 582 2471 + 1 2456 2470 2459 3396 + 1 2456 2470 2453 2459 + 1 2470 3396 2471 2459 + 1 2470 2453 2459 2471 + 1 2457 362 3406 2477 + 1 2459 3406 582 2479 + 1 2454 2477 2479 216 + 1 2457 2459 2454 2477 + 1 2457 2459 2477 3406 + 1 2459 2454 2477 2479 + 1 2459 3406 2479 2477 + 1 2453 215 2467 2471 + 1 2459 2471 2479 582 + 1 2454 2467 216 2479 + 1 2453 2459 2467 2454 + 1 2453 2459 2471 2467 + 1 2459 2454 2479 2467 + 1 2459 2471 2467 2479 + 1 1446 84 1453 1443 + 1 3440 1453 586 2609 + 1 2605 1443 2609 233 + 1 1446 3440 2605 1443 + 1 1446 3440 1443 1453 + 1 3440 2605 1443 2609 + 1 3440 1453 2609 1443 + 1 3455 586 1562 2626 + 1 1559 1562 93 1557 + 1 2624 2626 1557 235 + 1 3455 1559 2624 2626 + 1 3455 1559 2626 1562 + 1 1559 2624 2626 1557 + 1 1559 1562 1557 2626 + 1 2549 233 2603 837 + 1 2551 2603 235 839 + 1 832 837 839 17 + 1 2549 2551 832 837 + 1 2549 2551 837 2603 + 1 2551 832 837 839 + 1 2551 2603 839 837 + 1 3438 373 2556 2606 + 1 2554 2556 228 2549 + 1 2605 2606 2549 233 + 1 3438 2554 2605 2606 + 1 3438 2554 2606 2556 + 1 2554 2605 2606 2549 + 1 2554 2556 2549 2606 + 1 3438 373 2606 3455 + 1 3440 3455 2609 586 + 1 2605 2606 233 2609 + 1 3438 3440 2606 2605 + 1 3438 3440 3455 2606 + 1 3440 2605 2609 2606 + 1 3440 3455 2606 2609 + 1 2556 228 2549 2551 + 1 2606 2549 233 2603 + 1 2624 2551 2603 235 + 1 2556 2606 2624 2551 + 1 2556 2606 2551 2549 + 1 2606 2624 2551 2603 + 1 2606 2549 2603 2551 + 1 3455 586 2626 2609 + 1 2606 2609 2603 233 + 1 2624 2626 235 2603 + 1 3455 2606 2626 2624 + 1 3455 2606 2609 2626 + 1 2606 2624 2603 2626 + 1 2606 2609 2626 2603 + 1 985 35 986 989 + 1 3315 986 358 3382 + 1 3317 989 3382 361 + 1 985 3315 3317 989 + 1 985 3315 989 986 + 1 3315 3317 989 3382 + 1 3315 986 3382 989 + 1 3320 358 1003 3385 + 1 1001 1003 37 1007 + 1 3323 3385 1007 370 + 1 3320 1001 3323 3385 + 1 3320 1001 3385 1003 + 1 1001 3323 3385 1007 + 1 1001 1003 1007 3385 + 1 3338 361 3398 1445 + 1 3339 3398 370 1446 + 1 1444 1445 1446 84 + 1 3338 3339 1444 1445 + 1 3338 3339 1445 3398 + 1 3339 1444 1445 1446 + 1 3339 3398 1446 1445 + 1 3312 346 3319 3321 + 1 3314 3319 350 3338 + 1 3317 3321 3338 361 + 1 3312 3314 3317 3321 + 1 3312 3314 3321 3319 + 1 3314 3317 3321 3338 + 1 3314 3319 3338 3321 + 1 3312 346 3321 3320 + 1 3315 3320 3382 358 + 1 3317 3321 361 3382 + 1 3312 3315 3321 3317 + 1 3312 3315 3320 3321 + 1 3315 3317 3382 3321 + 1 3315 3320 3321 3382 + 1 3319 350 3338 3339 + 1 3321 3338 361 3398 + 1 3323 3339 3398 370 + 1 3319 3321 3323 3339 + 1 3319 3321 3339 3338 + 1 3321 3323 3339 3398 + 1 3321 3338 3398 3339 + 1 3320 358 3385 3382 + 1 3321 3382 3398 361 + 1 3323 3385 370 3398 + 1 3320 3321 3385 3323 + 1 3320 3321 3382 3385 + 1 3321 3323 3398 3385 + 1 3321 3382 3385 3398 + 1 985 35 989 988 + 1 3316 988 3393 360 + 1 3317 989 361 3393 + 1 985 3316 989 3317 + 1 985 3316 988 989 + 1 3316 3317 3393 989 + 1 3316 988 989 3393 + 1 3335 360 3395 1435 + 1 1434 1435 1436 83 + 1 3337 3395 579 1436 + 1 3335 1434 3395 3337 + 1 3335 1434 1435 3395 + 1 1434 3337 1436 3395 + 1 1434 1435 3395 1436 + 1 3338 361 1445 3400 + 1 3342 3400 1451 579 + 1 1444 1445 84 1451 + 1 3338 3342 1445 1444 + 1 3338 3342 3400 1445 + 1 3342 1444 1451 1445 + 1 3342 3400 1445 1451 + 1 3313 349 3336 3334 + 1 3314 3334 3338 350 + 1 3317 3336 361 3338 + 1 3313 3314 3336 3317 + 1 3313 3314 3334 3336 + 1 3314 3317 3338 3336 + 1 3314 3334 3336 3338 + 1 3313 349 3335 3336 + 1 3316 3335 360 3393 + 1 3317 3336 3393 361 + 1 3313 3316 3317 3336 + 1 3313 3316 3336 3335 + 1 3316 3317 3336 3393 + 1 3316 3335 3393 3336 + 1 3334 350 3342 3338 + 1 3336 3338 3400 361 + 1 3337 3342 579 3400 + 1 3334 3336 3342 3337 + 1 3334 3336 3338 3342 + 1 3336 3337 3400 3342 + 1 3336 3338 3342 3400 + 1 3335 360 3393 3395 + 1 3336 3393 361 3400 + 1 3337 3395 3400 579 + 1 3335 3336 3337 3395 + 1 3335 3336 3395 3393 + 1 3336 3337 3395 3400 + 1 3336 3393 3400 3395 + 1 1003 37 1007 1010 + 1 3385 1007 370 3438 + 1 3386 1010 3438 373 + 1 1003 3385 3386 1010 + 1 1003 3385 1010 1007 + 1 3385 3386 1010 3438 + 1 3385 1007 3438 1010 + 1 3398 370 1446 3440 + 1 1445 1446 84 1453 + 1 3402 3440 1453 586 + 1 3398 1445 3402 3440 + 1 3398 1445 3440 1446 + 1 1445 3402 3440 1453 + 1 1445 1446 1453 3440 + 1 3404 373 3455 1559 + 1 3407 3455 586 1562 + 1 1558 1559 1562 93 + 1 3404 3407 1558 1559 + 1 3404 3407 1559 3455 + 1 3407 1558 1559 1562 + 1 3407 3455 1562 1559 + 1 3382 361 3397 3399 + 1 3383 3397 362 3404 + 1 3386 3399 3404 373 + 1 3382 3383 3386 3399 + 1 3382 3383 3399 3397 + 1 3383 3386 3399 3404 + 1 3383 3397 3404 3399 + 1 3382 361 3399 3398 + 1 3385 3398 3438 370 + 1 3386 3399 373 3438 + 1 3382 3385 3399 3386 + 1 3382 3385 3398 3399 + 1 3385 3386 3438 3399 + 1 3385 3398 3399 3438 + 1 3397 362 3404 3407 + 1 3399 3404 373 3455 + 1 3402 3407 3455 586 + 1 3397 3399 3402 3407 + 1 3397 3399 3407 3404 + 1 3399 3402 3407 3455 + 1 3399 3404 3455 3407 + 1 3398 370 3440 3438 + 1 3399 3438 3455 373 + 1 3402 3440 586 3455 + 1 3398 3399 3440 3402 + 1 3398 3399 3438 3440 + 1 3399 3402 3455 3440 + 1 3399 3438 3440 3455 + 1 1435 83 1439 1436 + 1 3395 1436 4332 579 + 1 3396 1439 582 4332 + 1 1435 3395 1439 3396 + 1 1435 3395 1436 1439 + 1 3395 3396 4332 1439 + 1 3395 1436 1439 4332 + 1 3400 579 4335 1451 + 1 1445 1451 1453 84 + 1 3402 4335 586 1453 + 1 3400 1445 4335 3402 + 1 3400 1445 1451 4335 + 1 1445 3402 1453 4335 + 1 1445 1451 4335 1453 + 1 3406 582 1561 4350 + 1 3407 4350 1562 586 + 1 1558 1561 93 1562 + 1 3406 3407 1561 1558 + 1 3406 3407 4350 1561 + 1 3407 1558 1562 1561 + 1 3407 4350 1561 1562 + 1 3393 361 3401 3397 + 1 3394 3397 3406 362 + 1 3396 3401 582 3406 + 1 3393 3394 3401 3396 + 1 3393 3394 3397 3401 + 1 3394 3396 3406 3401 + 1 3394 3397 3401 3406 + 1 3393 361 3400 3401 + 1 3395 3400 579 4332 + 1 3396 3401 4332 582 + 1 3393 3395 3396 3401 + 1 3393 3395 3401 3400 + 1 3395 3396 3401 4332 + 1 3395 3400 4332 3401 + 1 3397 362 3407 3406 + 1 3401 3406 4350 582 + 1 3402 3407 586 4350 + 1 3397 3401 3407 3402 + 1 3397 3401 3406 3407 + 1 3401 3402 4350 3407 + 1 3401 3406 3407 4350 + 1 3400 579 4332 4335 + 1 3401 4332 582 4350 + 1 3402 4335 4350 586 + 1 3400 3401 3402 4335 + 1 3400 3401 4335 4332 + 1 3401 3402 4335 4350 + 1 3401 4332 4350 4335 + 1 807 14 813 811 + 1 2381 813 209 2407 + 1 2379 811 2407 207 + 1 807 2381 2379 811 + 1 807 2381 811 813 + 1 2381 2379 811 2407 + 1 2381 813 2407 811 + 1 2426 209 1504 2427 + 1 1506 1504 89 1509 + 1 3379 2427 1509 596 + 1 2426 1506 3379 2427 + 1 2426 1506 2427 1504 + 1 1506 3379 2427 1509 + 1 1506 1504 1509 2427 + 1 2409 207 2411 1480 + 1 3369 2411 596 1485 + 1 1482 1480 1485 87 + 1 2409 3369 1482 1480 + 1 2409 3369 1480 2411 + 1 3369 1482 1480 1485 + 1 3369 2411 1485 1480 + 1 2385 357 3366 2410 + 1 2383 3366 355 2409 + 1 2379 2410 2409 207 + 1 2385 2383 2379 2410 + 1 2385 2383 2410 3366 + 1 2383 2379 2410 2409 + 1 2383 3366 2409 2410 + 1 2385 357 2410 2426 + 1 2381 2426 2407 209 + 1 2379 2410 207 2407 + 1 2385 2381 2410 2379 + 1 2385 2381 2426 2410 + 1 2381 2379 2407 2410 + 1 2381 2426 2410 2407 + 1 3366 355 2409 3369 + 1 2410 2409 207 2411 + 1 3379 3369 2411 596 + 1 3366 2410 3379 3369 + 1 3366 2410 3369 2409 + 1 2410 3379 3369 2411 + 1 2410 2409 2411 3369 + 1 2426 209 2427 2407 + 1 2410 2407 2411 207 + 1 3379 2427 596 2411 + 1 2426 2410 2427 3379 + 1 2426 2410 2407 2427 + 1 2410 3379 2411 2427 + 1 2410 2407 2427 2411 + 1 1508 89 1505 1513 + 1 2704 1505 244 2706 + 1 3470 1513 2706 609 + 1 1508 2704 3470 1513 + 1 1508 2704 1513 1505 + 1 2704 3470 1513 2706 + 1 2704 1505 2706 1513 + 1 2680 244 848 2700 + 1 846 848 18 850 + 1 2682 2700 850 246 + 1 2680 846 2682 2700 + 1 2680 846 2700 848 + 1 846 2682 2700 850 + 1 846 848 850 2700 + 1 3481 609 2721 1633 + 1 2720 2721 246 1629 + 1 1631 1633 1629 99 + 1 3481 2720 1631 1633 + 1 3481 2720 1633 2721 + 1 2720 1631 1633 1629 + 1 2720 2721 1629 1633 + 1 2684 242 2686 2688 + 1 3467 2686 379 3481 + 1 3470 2688 3481 609 + 1 2684 3467 3470 2688 + 1 2684 3467 2688 2686 + 1 3467 3470 2688 3481 + 1 3467 2686 3481 2688 + 1 2684 242 2688 2680 + 1 2704 2680 2706 244 + 1 3470 2688 609 2706 + 1 2684 2704 2688 3470 + 1 2684 2704 2680 2688 + 1 2704 3470 2706 2688 + 1 2704 2680 2688 2706 + 1 2686 379 3481 2720 + 1 2688 3481 609 2721 + 1 2682 2720 2721 246 + 1 2686 2688 2682 2720 + 1 2686 2688 2720 3481 + 1 2688 2682 2720 2721 + 1 2688 3481 2721 2720 + 1 2680 244 2700 2706 + 1 2688 2706 2721 609 + 1 2682 2700 246 2721 + 1 2680 2688 2700 2682 + 1 2680 2688 2706 2700 + 1 2688 2682 2721 2700 + 1 2688 2706 2700 2721 + 1 1483 87 1487 1481 + 1 3418 1487 598 2529 + 1 2527 1481 2529 224 + 1 1483 3418 2527 1481 + 1 1483 3418 1481 1487 + 1 3418 2527 1481 2529 + 1 3418 1487 2529 1481 + 1 3421 598 1632 2535 + 1 1630 1632 99 1628 + 1 2534 2535 1628 225 + 1 3421 1630 2534 2535 + 1 3421 1630 2535 1632 + 1 1630 2534 2535 1628 + 1 1630 1632 1628 2535 + 1 2517 224 2525 828 + 1 2518 2525 225 829 + 1 826 828 829 16 + 1 2517 2518 826 828 + 1 2517 2518 828 2525 + 1 2518 826 828 829 + 1 2518 2525 829 828 + 1 3416 366 2520 2528 + 1 2519 2520 222 2517 + 1 2527 2528 2517 224 + 1 3416 2519 2527 2528 + 1 3416 2519 2528 2520 + 1 2519 2527 2528 2517 + 1 2519 2520 2517 2528 + 1 3416 366 2528 3421 + 1 3418 3421 2529 598 + 1 2527 2528 224 2529 + 1 3416 3418 2528 2527 + 1 3416 3418 3421 2528 + 1 3418 2527 2529 2528 + 1 3418 3421 2528 2529 + 1 2520 222 2517 2518 + 1 2528 2517 224 2525 + 1 2534 2518 2525 225 + 1 2520 2528 2534 2518 + 1 2520 2528 2518 2517 + 1 2528 2534 2518 2525 + 1 2528 2517 2525 2518 + 1 3421 598 2535 2529 + 1 2528 2529 2525 224 + 1 2534 2535 225 2525 + 1 3421 2528 2535 2534 + 1 3421 2528 2529 2535 + 1 2528 2534 2525 2535 + 1 2528 2529 2535 2525 + 1 1014 38 1016 1018 + 1 3358 1016 364 3414 + 1 3361 1018 3414 375 + 1 1014 3358 3361 1018 + 1 1014 3358 1018 1016 + 1 3358 3361 1018 3414 + 1 3358 1016 3414 1018 + 1 3345 364 995 3412 + 1 994 995 36 996 + 1 3346 3412 996 365 + 1 3345 994 3346 3412 + 1 3345 994 3412 995 + 1 994 3346 3412 996 + 1 994 995 996 3412 + 1 3368 375 3417 1484 + 1 3367 3417 365 1483 + 1 1482 1484 1483 87 + 1 3368 3367 1482 1484 + 1 3368 3367 1484 3417 + 1 3367 1482 1484 1483 + 1 3367 3417 1483 1484 + 1 3343 351 3344 3347 + 1 3356 3344 355 3368 + 1 3361 3347 3368 375 + 1 3343 3356 3361 3347 + 1 3343 3356 3347 3344 + 1 3356 3361 3347 3368 + 1 3356 3344 3368 3347 + 1 3343 351 3347 3345 + 1 3358 3345 3414 364 + 1 3361 3347 375 3414 + 1 3343 3358 3347 3361 + 1 3343 3358 3345 3347 + 1 3358 3361 3414 3347 + 1 3358 3345 3347 3414 + 1 3344 355 3368 3367 + 1 3347 3368 375 3417 + 1 3346 3367 3417 365 + 1 3344 3347 3346 3367 + 1 3344 3347 3367 3368 + 1 3347 3346 3367 3417 + 1 3347 3368 3417 3367 + 1 3345 364 3412 3414 + 1 3347 3414 3417 375 + 1 3346 3412 365 3417 + 1 3345 3347 3412 3346 + 1 3345 3347 3414 3412 + 1 3347 3346 3417 3412 + 1 3347 3414 3412 3417 + 1 1014 38 1018 1019 + 1 3362 1019 3462 376 + 1 3361 1018 375 3462 + 1 1014 3362 1018 3361 + 1 1014 3362 1019 1018 + 1 3362 3361 3462 1018 + 1 3362 1019 1018 3462 + 1 3378 376 3469 1508 + 1 1506 1508 1509 89 + 1 3379 3469 596 1509 + 1 3378 1506 3469 3379 + 1 3378 1506 1508 3469 + 1 1506 3379 1509 3469 + 1 1506 1508 3469 1509 + 1 3368 375 1484 3464 + 1 3369 3464 1485 596 + 1 1482 1484 87 1485 + 1 3368 3369 1484 1482 + 1 3368 3369 3464 1484 + 1 3369 1482 1485 1484 + 1 3369 3464 1484 1485 + 1 3357 357 3377 3366 + 1 3356 3366 3368 355 + 1 3361 3377 375 3368 + 1 3357 3356 3377 3361 + 1 3357 3356 3366 3377 + 1 3356 3361 3368 3377 + 1 3356 3366 3377 3368 + 1 3357 357 3378 3377 + 1 3362 3378 376 3462 + 1 3361 3377 3462 375 + 1 3357 3362 3361 3377 + 1 3357 3362 3377 3378 + 1 3362 3361 3377 3462 + 1 3362 3378 3462 3377 + 1 3366 355 3369 3368 + 1 3377 3368 3464 375 + 1 3379 3369 596 3464 + 1 3366 3377 3369 3379 + 1 3366 3377 3368 3369 + 1 3377 3379 3464 3369 + 1 3377 3368 3369 3464 + 1 3378 376 3462 3469 + 1 3377 3462 375 3464 + 1 3379 3469 3464 596 + 1 3378 3377 3379 3469 + 1 3378 3377 3469 3462 + 1 3377 3379 3469 3464 + 1 3377 3462 3464 3469 + 1 995 36 996 997 + 1 3412 996 365 3416 + 1 3413 997 3416 366 + 1 995 3412 3413 997 + 1 995 3412 997 996 + 1 3412 3413 997 3416 + 1 3412 996 3416 997 + 1 3417 365 1483 3418 + 1 1484 1483 87 1487 + 1 3465 3418 1487 598 + 1 3417 1484 3465 3418 + 1 3417 1484 3418 1483 + 1 1484 3465 3418 1487 + 1 1484 1483 1487 3418 + 1 3420 366 3421 1630 + 1 3480 3421 598 1632 + 1 1631 1630 1632 99 + 1 3420 3480 1631 1630 + 1 3420 3480 1630 3421 + 1 3480 1631 1630 1632 + 1 3480 3421 1632 1630 + 1 3414 375 3463 3419 + 1 3415 3463 379 3420 + 1 3413 3419 3420 366 + 1 3414 3415 3413 3419 + 1 3414 3415 3419 3463 + 1 3415 3413 3419 3420 + 1 3415 3463 3420 3419 + 1 3414 375 3419 3417 + 1 3412 3417 3416 365 + 1 3413 3419 366 3416 + 1 3414 3412 3419 3413 + 1 3414 3412 3417 3419 + 1 3412 3413 3416 3419 + 1 3412 3417 3419 3416 + 1 3463 379 3420 3480 + 1 3419 3420 366 3421 + 1 3465 3480 3421 598 + 1 3463 3419 3465 3480 + 1 3463 3419 3480 3420 + 1 3419 3465 3480 3421 + 1 3419 3420 3421 3480 + 1 3417 365 3418 3416 + 1 3419 3416 3421 366 + 1 3465 3418 598 3421 + 1 3417 3419 3418 3465 + 1 3417 3419 3416 3418 + 1 3419 3465 3421 3418 + 1 3419 3416 3418 3421 + 1 1508 89 1513 1509 + 1 3469 1509 4406 596 + 1 3470 1513 609 4406 + 1 1508 3469 1513 3470 + 1 1508 3469 1509 1513 + 1 3469 3470 4406 1513 + 1 3469 1509 1513 4406 + 1 3464 596 4403 1485 + 1 1484 1485 1487 87 + 1 3465 4403 598 1487 + 1 3464 1484 4403 3465 + 1 3464 1484 1485 4403 + 1 1484 3465 1487 4403 + 1 1484 1485 4403 1487 + 1 3481 609 1633 4415 + 1 3480 4415 1632 598 + 1 1631 1633 99 1632 + 1 3481 3480 1633 1631 + 1 3481 3480 4415 1633 + 1 3480 1631 1632 1633 + 1 3480 4415 1633 1632 + 1 3462 375 3466 3463 + 1 3467 3463 3481 379 + 1 3470 3466 609 3481 + 1 3462 3467 3466 3470 + 1 3462 3467 3463 3466 + 1 3467 3470 3481 3466 + 1 3467 3463 3466 3481 + 1 3462 375 3464 3466 + 1 3469 3464 596 4406 + 1 3470 3466 4406 609 + 1 3462 3469 3470 3466 + 1 3462 3469 3466 3464 + 1 3469 3470 3466 4406 + 1 3469 3464 4406 3466 + 1 3463 379 3480 3481 + 1 3466 3481 4415 609 + 1 3465 3480 598 4415 + 1 3463 3466 3480 3465 + 1 3463 3466 3481 3480 + 1 3466 3465 4415 3480 + 1 3466 3481 3480 4415 + 1 3464 596 4406 4403 + 1 3466 4406 609 4415 + 1 3465 4403 4415 598 + 1 3464 3466 3465 4403 + 1 3464 3466 4403 4406 + 1 3466 3465 4403 4415 + 1 3466 4406 4415 4403 + 1 768 9 771 772 + 1 2125 771 167 2143 + 1 2126 772 2143 168 + 1 768 2125 2126 772 + 1 768 2125 772 771 + 1 2125 2126 772 2143 + 1 2125 771 2143 772 + 1 2146 167 1252 2147 + 1 1254 1252 67 1256 + 1 3235 2147 1256 513 + 1 2146 1254 3235 2147 + 1 2146 1254 2147 1252 + 1 1254 3235 2147 1256 + 1 1254 1252 1256 2147 + 1 2153 168 2155 1262 + 1 3240 2155 513 1268 + 1 1264 1262 1268 68 + 1 2153 3240 1264 1262 + 1 2153 3240 1262 2155 + 1 3240 1264 1262 1268 + 1 3240 2155 1268 1262 + 1 2128 326 3232 2152 + 1 2129 3232 327 2153 + 1 2126 2152 2153 168 + 1 2128 2129 2126 2152 + 1 2128 2129 2152 3232 + 1 2129 2126 2152 2153 + 1 2129 3232 2153 2152 + 1 2128 326 2152 2146 + 1 2125 2146 2143 167 + 1 2126 2152 168 2143 + 1 2128 2125 2152 2126 + 1 2128 2125 2146 2152 + 1 2125 2126 2143 2152 + 1 2125 2146 2152 2143 + 1 3232 327 2153 3240 + 1 2152 2153 168 2155 + 1 3235 3240 2155 513 + 1 3232 2152 3235 3240 + 1 3232 2152 3240 2153 + 1 2152 3235 3240 2155 + 1 2152 2153 2155 3240 + 1 2146 167 2147 2143 + 1 2152 2143 2155 168 + 1 3235 2147 513 2155 + 1 2146 2152 2147 3235 + 1 2146 2152 2143 2147 + 1 2152 3235 2155 2147 + 1 2152 2143 2147 2155 + 1 1255 67 1253 1259 + 1 2221 1253 180 2222 + 1 3258 1259 2222 516 + 1 1255 2221 3258 1259 + 1 1255 2221 1259 1253 + 1 2221 3258 1259 2222 + 1 2221 1253 2222 1259 + 1 2208 180 784 2218 + 1 782 784 11 785 + 1 2209 2218 785 181 + 1 2208 782 2209 2218 + 1 2208 782 2218 784 + 1 782 2209 2218 785 + 1 782 784 785 2218 + 1 3266 516 2228 1344 + 1 2227 2228 181 1340 + 1 1342 1344 1340 75 + 1 3266 2227 1342 1344 + 1 3266 2227 1344 2228 + 1 2227 1342 1344 1340 + 1 2227 2228 1340 1344 + 1 2210 178 2211 2212 + 1 3256 2211 334 3266 + 1 3258 2212 3266 516 + 1 2210 3256 3258 2212 + 1 2210 3256 2212 2211 + 1 3256 3258 2212 3266 + 1 3256 2211 3266 2212 + 1 2210 178 2212 2208 + 1 2221 2208 2222 180 + 1 3258 2212 516 2222 + 1 2210 2221 2212 3258 + 1 2210 2221 2208 2212 + 1 2221 3258 2222 2212 + 1 2221 2208 2212 2222 + 1 2211 334 3266 2227 + 1 2212 3266 516 2228 + 1 2209 2227 2228 181 + 1 2211 2212 2209 2227 + 1 2211 2212 2227 3266 + 1 2212 2209 2227 2228 + 1 2212 3266 2228 2227 + 1 2208 180 2218 2222 + 1 2212 2222 2228 516 + 1 2209 2218 181 2228 + 1 2208 2212 2218 2209 + 1 2208 2212 2222 2218 + 1 2212 2209 2228 2218 + 1 2212 2222 2218 2228 + 1 1266 68 1272 1263 + 1 3277 1272 522 2271 + 1 2268 1263 2271 187 + 1 1266 3277 2268 1263 + 1 1266 3277 1263 1272 + 1 3277 2268 1263 2271 + 1 3277 1272 2271 1263 + 1 3280 522 1345 2284 + 1 1343 1345 75 1341 + 1 2283 2284 1341 189 + 1 3280 1343 2283 2284 + 1 3280 1343 2284 1345 + 1 1343 2283 2284 1341 + 1 1343 1345 1341 2284 + 1 2250 187 2265 791 + 1 2252 2265 189 793 + 1 789 791 793 12 + 1 2250 2252 789 791 + 1 2250 2252 791 2265 + 1 2252 789 791 793 + 1 2252 2265 793 791 + 1 3274 338 2255 2269 + 1 2253 2255 185 2250 + 1 2268 2269 2250 187 + 1 3274 2253 2268 2269 + 1 3274 2253 2269 2255 + 1 2253 2268 2269 2250 + 1 2253 2255 2250 2269 + 1 3274 338 2269 3280 + 1 3277 3280 2271 522 + 1 2268 2269 187 2271 + 1 3274 3277 2269 2268 + 1 3274 3277 3280 2269 + 1 3277 2268 2271 2269 + 1 3277 3280 2269 2271 + 1 2255 185 2250 2252 + 1 2269 2250 187 2265 + 1 2283 2252 2265 189 + 1 2255 2269 2283 2252 + 1 2255 2269 2252 2250 + 1 2269 2283 2252 2265 + 1 2269 2250 2265 2252 + 1 3280 522 2284 2271 + 1 2269 2271 2265 187 + 1 2283 2284 189 2265 + 1 3280 2269 2284 2283 + 1 3280 2269 2271 2284 + 1 2269 2283 2265 2284 + 1 2269 2271 2284 2265 + 1 942 30 943 945 + 1 3218 943 331 3251 + 1 3220 945 3251 333 + 1 942 3218 3220 945 + 1 942 3218 945 943 + 1 3218 3220 945 3251 + 1 3218 943 3251 945 + 1 3224 331 951 3253 + 1 949 951 31 953 + 1 3227 3253 953 336 + 1 3224 949 3227 3253 + 1 3224 949 3253 951 + 1 949 3227 3253 953 + 1 949 951 953 3253 + 1 3236 333 3260 1265 + 1 3238 3260 336 1266 + 1 1264 1265 1266 68 + 1 3236 3238 1264 1265 + 1 3236 3238 1265 3260 + 1 3238 1264 1265 1266 + 1 3238 3260 1266 1265 + 1 3215 324 3222 3225 + 1 3217 3222 327 3236 + 1 3220 3225 3236 333 + 1 3215 3217 3220 3225 + 1 3215 3217 3225 3222 + 1 3217 3220 3225 3236 + 1 3217 3222 3236 3225 + 1 3215 324 3225 3224 + 1 3218 3224 3251 331 + 1 3220 3225 333 3251 + 1 3215 3218 3225 3220 + 1 3215 3218 3224 3225 + 1 3218 3220 3251 3225 + 1 3218 3224 3225 3251 + 1 3222 327 3236 3238 + 1 3225 3236 333 3260 + 1 3227 3238 3260 336 + 1 3222 3225 3227 3238 + 1 3222 3225 3238 3236 + 1 3225 3227 3238 3260 + 1 3225 3236 3260 3238 + 1 3224 331 3253 3251 + 1 3225 3251 3260 333 + 1 3227 3253 336 3260 + 1 3224 3225 3253 3227 + 1 3224 3225 3251 3253 + 1 3225 3227 3260 3253 + 1 3225 3251 3253 3260 + 1 942 30 945 944 + 1 3219 944 3255 332 + 1 3220 945 333 3255 + 1 942 3219 945 3220 + 1 942 3219 944 945 + 1 3219 3220 3255 945 + 1 3219 944 945 3255 + 1 3233 332 3257 1255 + 1 1254 1255 1256 67 + 1 3235 3257 513 1256 + 1 3233 1254 3257 3235 + 1 3233 1254 1255 3257 + 1 1254 3235 1256 3257 + 1 1254 1255 3257 1256 + 1 3236 333 1265 3262 + 1 3240 3262 1268 513 + 1 1264 1265 68 1268 + 1 3236 3240 1265 1264 + 1 3236 3240 3262 1265 + 1 3240 1264 1268 1265 + 1 3240 3262 1265 1268 + 1 3216 326 3234 3232 + 1 3217 3232 3236 327 + 1 3220 3234 333 3236 + 1 3216 3217 3234 3220 + 1 3216 3217 3232 3234 + 1 3217 3220 3236 3234 + 1 3217 3232 3234 3236 + 1 3216 326 3233 3234 + 1 3219 3233 332 3255 + 1 3220 3234 3255 333 + 1 3216 3219 3220 3234 + 1 3216 3219 3234 3233 + 1 3219 3220 3234 3255 + 1 3219 3233 3255 3234 + 1 3232 327 3240 3236 + 1 3234 3236 3262 333 + 1 3235 3240 513 3262 + 1 3232 3234 3240 3235 + 1 3232 3234 3236 3240 + 1 3234 3235 3262 3240 + 1 3234 3236 3240 3262 + 1 3233 332 3255 3257 + 1 3234 3255 333 3262 + 1 3235 3257 3262 513 + 1 3233 3234 3235 3257 + 1 3233 3234 3257 3255 + 1 3234 3235 3257 3262 + 1 3234 3255 3262 3257 + 1 951 31 953 955 + 1 3253 953 336 3274 + 1 3254 955 3274 338 + 1 951 3253 3254 955 + 1 951 3253 955 953 + 1 3253 3254 955 3274 + 1 3253 953 3274 955 + 1 3260 336 1266 3277 + 1 1265 1266 68 1272 + 1 3264 3277 1272 522 + 1 3260 1265 3264 3277 + 1 3260 1265 3277 1266 + 1 1265 3264 3277 1272 + 1 1265 1266 1272 3277 + 1 3265 338 3280 1343 + 1 3267 3280 522 1345 + 1 1342 1343 1345 75 + 1 3265 3267 1342 1343 + 1 3265 3267 1343 3280 + 1 3267 1342 1343 1345 + 1 3267 3280 1345 1343 + 1 3251 333 3259 3261 + 1 3252 3259 334 3265 + 1 3254 3261 3265 338 + 1 3251 3252 3254 3261 + 1 3251 3252 3261 3259 + 1 3252 3254 3261 3265 + 1 3252 3259 3265 3261 + 1 3251 333 3261 3260 + 1 3253 3260 3274 336 + 1 3254 3261 338 3274 + 1 3251 3253 3261 3254 + 1 3251 3253 3260 3261 + 1 3253 3254 3274 3261 + 1 3253 3260 3261 3274 + 1 3259 334 3265 3267 + 1 3261 3265 338 3280 + 1 3264 3267 3280 522 + 1 3259 3261 3264 3267 + 1 3259 3261 3267 3265 + 1 3261 3264 3267 3280 + 1 3261 3265 3280 3267 + 1 3260 336 3277 3274 + 1 3261 3274 3280 338 + 1 3264 3277 522 3280 + 1 3260 3261 3277 3264 + 1 3260 3261 3274 3277 + 1 3261 3264 3280 3277 + 1 3261 3274 3277 3280 + 1 1255 67 1259 1256 + 1 3257 1256 4073 513 + 1 3258 1259 516 4073 + 1 1255 3257 1259 3258 + 1 1255 3257 1256 1259 + 1 3257 3258 4073 1259 + 1 3257 1256 1259 4073 + 1 3262 513 4076 1268 + 1 1265 1268 1272 68 + 1 3264 4076 522 1272 + 1 3262 1265 4076 3264 + 1 3262 1265 1268 4076 + 1 1265 3264 1272 4076 + 1 1265 1268 4076 1272 + 1 3266 516 1344 4091 + 1 3267 4091 1345 522 + 1 1342 1344 75 1345 + 1 3266 3267 1344 1342 + 1 3266 3267 4091 1344 + 1 3267 1342 1345 1344 + 1 3267 4091 1344 1345 + 1 3255 333 3263 3259 + 1 3256 3259 3266 334 + 1 3258 3263 516 3266 + 1 3255 3256 3263 3258 + 1 3255 3256 3259 3263 + 1 3256 3258 3266 3263 + 1 3256 3259 3263 3266 + 1 3255 333 3262 3263 + 1 3257 3262 513 4073 + 1 3258 3263 4073 516 + 1 3255 3257 3258 3263 + 1 3255 3257 3263 3262 + 1 3257 3258 3263 4073 + 1 3257 3262 4073 3263 + 1 3259 334 3267 3266 + 1 3263 3266 4091 516 + 1 3264 3267 522 4091 + 1 3259 3263 3267 3264 + 1 3259 3263 3266 3267 + 1 3263 3264 4091 3267 + 1 3263 3266 3267 4091 + 1 3262 513 4073 4076 + 1 3263 4073 516 4091 + 1 3264 4076 4091 522 + 1 3262 3263 3264 4076 + 1 3262 3263 4076 4073 + 1 3263 3264 4076 4091 + 1 3263 4073 4091 4076 + 1 768 9 772 770 + 1 2126 772 168 2136 + 1 2124 770 2136 166 + 1 768 2126 2124 770 + 1 768 2126 770 772 + 1 2126 2124 770 2136 + 1 2126 772 2136 770 + 1 2153 168 1262 2154 + 1 1264 1262 68 1267 + 1 3239 2154 1267 508 + 1 2153 1264 3239 2154 + 1 2153 1264 2154 1262 + 1 1264 3239 2154 1267 + 1 1264 1262 1267 2154 + 1 2138 166 2140 1242 + 1 3231 2140 508 1247 + 1 1244 1242 1247 66 + 1 2138 3231 1244 1242 + 1 2138 3231 1242 2140 + 1 3231 1244 1242 1247 + 1 3231 2140 1247 1242 + 1 2129 327 3228 2139 + 1 2127 3228 325 2138 + 1 2124 2139 2138 166 + 1 2129 2127 2124 2139 + 1 2129 2127 2139 3228 + 1 2127 2124 2139 2138 + 1 2127 3228 2138 2139 + 1 2129 327 2139 2153 + 1 2126 2153 2136 168 + 1 2124 2139 166 2136 + 1 2129 2126 2139 2124 + 1 2129 2126 2153 2139 + 1 2126 2124 2136 2139 + 1 2126 2153 2139 2136 + 1 3228 325 2138 3231 + 1 2139 2138 166 2140 + 1 3239 3231 2140 508 + 1 3228 2139 3239 3231 + 1 3228 2139 3231 2138 + 1 2139 3239 3231 2140 + 1 2139 2138 2140 3231 + 1 2153 168 2154 2136 + 1 2139 2136 2140 166 + 1 3239 2154 508 2140 + 1 2153 2139 2154 3239 + 1 2153 2139 2136 2154 + 1 2139 3239 2140 2154 + 1 2139 2136 2154 2140 + 1 1266 68 1263 1271 + 1 2268 1263 187 2270 + 1 3276 1271 2270 521 + 1 1266 2268 3276 1271 + 1 1266 2268 1271 1263 + 1 2268 3276 1271 2270 + 1 2268 1263 2270 1271 + 1 2250 187 791 2264 + 1 789 791 12 792 + 1 2251 2264 792 188 + 1 2250 789 2251 2264 + 1 2250 789 2264 791 + 1 789 2251 2264 792 + 1 789 791 792 2264 + 1 3279 521 2278 1315 + 1 2277 2278 188 1311 + 1 1313 1315 1311 72 + 1 3279 2277 1313 1315 + 1 3279 2277 1315 2278 + 1 2277 1313 1315 1311 + 1 2277 2278 1311 1315 + 1 2253 185 2254 2256 + 1 3273 2254 337 3279 + 1 3276 2256 3279 521 + 1 2253 3273 3276 2256 + 1 2253 3273 2256 2254 + 1 3273 3276 2256 3279 + 1 3273 2254 3279 2256 + 1 2253 185 2256 2250 + 1 2268 2250 2270 187 + 1 3276 2256 521 2270 + 1 2253 2268 2256 3276 + 1 2253 2268 2250 2256 + 1 2268 3276 2270 2256 + 1 2268 2250 2256 2270 + 1 2254 337 3279 2277 + 1 2256 3279 521 2278 + 1 2251 2277 2278 188 + 1 2254 2256 2251 2277 + 1 2254 2256 2277 3279 + 1 2256 2251 2277 2278 + 1 2256 3279 2278 2277 + 1 2250 187 2264 2270 + 1 2256 2270 2278 521 + 1 2251 2264 188 2278 + 1 2250 2256 2264 2251 + 1 2250 2256 2270 2264 + 1 2256 2251 2278 2264 + 1 2256 2270 2264 2278 + 1 1245 66 1249 1243 + 1 3247 1249 510 2189 + 1 2187 1243 2189 174 + 1 1245 3247 2187 1243 + 1 1245 3247 1243 1249 + 1 3247 2187 1243 2189 + 1 3247 1249 2189 1243 + 1 3250 510 1314 2195 + 1 1312 1314 72 1310 + 1 2194 2195 1310 175 + 1 3250 1312 2194 2195 + 1 3250 1312 2195 1314 + 1 1312 2194 2195 1310 + 1 1312 1314 1310 2195 + 1 2177 174 2185 778 + 1 2178 2185 175 779 + 1 776 778 779 10 + 1 2177 2178 776 778 + 1 2177 2178 778 2185 + 1 2178 776 778 779 + 1 2178 2185 779 778 + 1 3245 330 2180 2188 + 1 2179 2180 172 2177 + 1 2187 2188 2177 174 + 1 3245 2179 2187 2188 + 1 3245 2179 2188 2180 + 1 2179 2187 2188 2177 + 1 2179 2180 2177 2188 + 1 3245 330 2188 3250 + 1 3247 3250 2189 510 + 1 2187 2188 174 2189 + 1 3245 3247 2188 2187 + 1 3245 3247 3250 2188 + 1 3247 2187 2189 2188 + 1 3247 3250 2188 2189 + 1 2180 172 2177 2178 + 1 2188 2177 174 2185 + 1 2194 2178 2185 175 + 1 2180 2188 2194 2178 + 1 2180 2188 2178 2177 + 1 2188 2194 2178 2185 + 1 2188 2177 2185 2178 + 1 3250 510 2195 2189 + 1 2188 2189 2185 174 + 1 2194 2195 175 2185 + 1 3250 2188 2195 2194 + 1 3250 2188 2189 2195 + 1 2188 2194 2185 2195 + 1 2188 2189 2195 2185 + 1 949 31 950 952 + 1 3223 950 328 3243 + 1 3226 952 3243 335 + 1 949 3223 3226 952 + 1 949 3223 952 950 + 1 3223 3226 952 3243 + 1 3223 950 3243 952 + 1 3212 328 937 3241 + 1 936 937 29 938 + 1 3213 3241 938 329 + 1 3212 936 3213 3241 + 1 3212 936 3241 937 + 1 936 3213 3241 938 + 1 936 937 938 3241 + 1 3230 335 3246 1246 + 1 3229 3246 329 1245 + 1 1244 1246 1245 66 + 1 3230 3229 1244 1246 + 1 3230 3229 1246 3246 + 1 3229 1244 1246 1245 + 1 3229 3246 1245 1246 + 1 3210 322 3211 3214 + 1 3221 3211 325 3230 + 1 3226 3214 3230 335 + 1 3210 3221 3226 3214 + 1 3210 3221 3214 3211 + 1 3221 3226 3214 3230 + 1 3221 3211 3230 3214 + 1 3210 322 3214 3212 + 1 3223 3212 3243 328 + 1 3226 3214 335 3243 + 1 3210 3223 3214 3226 + 1 3210 3223 3212 3214 + 1 3223 3226 3243 3214 + 1 3223 3212 3214 3243 + 1 3211 325 3230 3229 + 1 3214 3230 335 3246 + 1 3213 3229 3246 329 + 1 3211 3214 3213 3229 + 1 3211 3214 3229 3230 + 1 3214 3213 3229 3246 + 1 3214 3230 3246 3229 + 1 3212 328 3241 3243 + 1 3214 3243 3246 335 + 1 3213 3241 329 3246 + 1 3212 3214 3241 3213 + 1 3212 3214 3243 3241 + 1 3214 3213 3246 3241 + 1 3214 3243 3241 3246 + 1 949 31 952 953 + 1 3227 953 3268 336 + 1 3226 952 335 3268 + 1 949 3227 952 3226 + 1 949 3227 953 952 + 1 3227 3226 3268 952 + 1 3227 953 952 3268 + 1 3238 336 3275 1266 + 1 1264 1266 1267 68 + 1 3239 3275 508 1267 + 1 3238 1264 3275 3239 + 1 3238 1264 1266 3275 + 1 1264 3239 1267 3275 + 1 1264 1266 3275 1267 + 1 3230 335 1246 3270 + 1 3231 3270 1247 508 + 1 1244 1246 66 1247 + 1 3230 3231 1246 1244 + 1 3230 3231 3270 1246 + 1 3231 1244 1247 1246 + 1 3231 3270 1246 1247 + 1 3222 327 3237 3228 + 1 3221 3228 3230 325 + 1 3226 3237 335 3230 + 1 3222 3221 3237 3226 + 1 3222 3221 3228 3237 + 1 3221 3226 3230 3237 + 1 3221 3228 3237 3230 + 1 3222 327 3238 3237 + 1 3227 3238 336 3268 + 1 3226 3237 3268 335 + 1 3222 3227 3226 3237 + 1 3222 3227 3237 3238 + 1 3227 3226 3237 3268 + 1 3227 3238 3268 3237 + 1 3228 325 3231 3230 + 1 3237 3230 3270 335 + 1 3239 3231 508 3270 + 1 3228 3237 3231 3239 + 1 3228 3237 3230 3231 + 1 3237 3239 3270 3231 + 1 3237 3230 3231 3270 + 1 3238 336 3268 3275 + 1 3237 3268 335 3270 + 1 3239 3275 3270 508 + 1 3238 3237 3239 3275 + 1 3238 3237 3275 3268 + 1 3237 3239 3275 3270 + 1 3237 3268 3270 3275 + 1 937 29 938 939 + 1 3241 938 329 3245 + 1 3242 939 3245 330 + 1 937 3241 3242 939 + 1 937 3241 939 938 + 1 3241 3242 939 3245 + 1 3241 938 3245 939 + 1 3246 329 1245 3247 + 1 1246 1245 66 1249 + 1 3271 3247 1249 510 + 1 3246 1246 3271 3247 + 1 3246 1246 3247 1245 + 1 1246 3271 3247 1249 + 1 1246 1245 1249 3247 + 1 3249 330 3250 1312 + 1 3278 3250 510 1314 + 1 1313 1312 1314 72 + 1 3249 3278 1313 1312 + 1 3249 3278 1312 3250 + 1 3278 1313 1312 1314 + 1 3278 3250 1314 1312 + 1 3243 335 3269 3248 + 1 3244 3269 337 3249 + 1 3242 3248 3249 330 + 1 3243 3244 3242 3248 + 1 3243 3244 3248 3269 + 1 3244 3242 3248 3249 + 1 3244 3269 3249 3248 + 1 3243 335 3248 3246 + 1 3241 3246 3245 329 + 1 3242 3248 330 3245 + 1 3243 3241 3248 3242 + 1 3243 3241 3246 3248 + 1 3241 3242 3245 3248 + 1 3241 3246 3248 3245 + 1 3269 337 3249 3278 + 1 3248 3249 330 3250 + 1 3271 3278 3250 510 + 1 3269 3248 3271 3278 + 1 3269 3248 3278 3249 + 1 3248 3271 3278 3250 + 1 3248 3249 3250 3278 + 1 3246 329 3247 3245 + 1 3248 3245 3250 330 + 1 3271 3247 510 3250 + 1 3246 3248 3247 3271 + 1 3246 3248 3245 3247 + 1 3248 3271 3250 3247 + 1 3248 3245 3247 3250 + 1 1266 68 1271 1267 + 1 3275 1267 4048 508 + 1 3276 1271 521 4048 + 1 1266 3275 1271 3276 + 1 1266 3275 1267 1271 + 1 3275 3276 4048 1271 + 1 3275 1267 1271 4048 + 1 3270 508 4045 1247 + 1 1246 1247 1249 66 + 1 3271 4045 510 1249 + 1 3270 1246 4045 3271 + 1 3270 1246 1247 4045 + 1 1246 3271 1249 4045 + 1 1246 1247 4045 1249 + 1 3279 521 1315 4057 + 1 3278 4057 1314 510 + 1 1313 1315 72 1314 + 1 3279 3278 1315 1313 + 1 3279 3278 4057 1315 + 1 3278 1313 1314 1315 + 1 3278 4057 1315 1314 + 1 3268 335 3272 3269 + 1 3273 3269 3279 337 + 1 3276 3272 521 3279 + 1 3268 3273 3272 3276 + 1 3268 3273 3269 3272 + 1 3273 3276 3279 3272 + 1 3273 3269 3272 3279 + 1 3268 335 3270 3272 + 1 3275 3270 508 4048 + 1 3276 3272 4048 521 + 1 3268 3275 3276 3272 + 1 3268 3275 3272 3270 + 1 3275 3276 3272 4048 + 1 3275 3270 4048 3272 + 1 3269 337 3278 3279 + 1 3272 3279 4057 521 + 1 3271 3278 510 4057 + 1 3269 3272 3278 3271 + 1 3269 3272 3279 3278 + 1 3272 3271 4057 3278 + 1 3272 3279 3278 4057 + 1 3270 508 4048 4045 + 1 3272 4048 521 4057 + 1 3271 4045 4057 510 + 1 3270 3272 3271 4045 + 1 3270 3272 4045 4048 + 1 3272 3271 4045 4057 + 1 3272 4048 4057 4045 + 1 750 5 753 752 + 1 2040 753 149 2048 + 1 2039 752 2048 148 + 1 750 2040 2039 752 + 1 750 2040 752 753 + 1 2040 2039 752 2048 + 1 2040 753 2048 752 + 1 2053 149 1119 2054 + 1 1121 1119 51 1122 + 1 3677 2054 1122 432 + 1 2053 1121 3677 2054 + 1 2053 1121 2054 1119 + 1 1121 3677 2054 1122 + 1 1121 1119 1122 2054 + 1 2049 148 2052 1110 + 1 3672 2052 432 1114 + 1 1112 1110 1114 50 + 1 2049 3672 1112 1110 + 1 2049 3672 1110 2052 + 1 3672 1112 1110 1114 + 1 3672 2052 1114 1110 + 1 2043 424 3667 2050 + 1 2042 3667 423 2049 + 1 2039 2050 2049 148 + 1 2043 2042 2039 2050 + 1 2043 2042 2050 3667 + 1 2042 2039 2050 2049 + 1 2042 3667 2049 2050 + 1 2043 424 2050 2053 + 1 2040 2053 2048 149 + 1 2039 2050 148 2048 + 1 2043 2040 2050 2039 + 1 2043 2040 2053 2050 + 1 2040 2039 2048 2050 + 1 2040 2053 2050 2048 + 1 3667 423 2049 3672 + 1 2050 2049 148 2052 + 1 3677 3672 2052 432 + 1 3667 2050 3677 3672 + 1 3667 2050 3672 2049 + 1 2050 3677 3672 2052 + 1 2050 2049 2052 3672 + 1 2053 149 2054 2048 + 1 2050 2048 2052 148 + 1 3677 2054 432 2052 + 1 2053 2050 2054 3677 + 1 2053 2050 2048 2054 + 1 2050 3677 2052 2054 + 1 2050 2048 2054 2052 + 1 1123 51 1120 1124 + 1 3097 1120 302 3098 + 1 3729 1124 3098 438 + 1 1123 3097 3729 1124 + 1 1123 3097 1124 1120 + 1 3097 3729 1124 3098 + 1 3097 1120 3098 1124 + 1 3095 302 906 3096 + 1 908 906 25 910 + 1 3104 3096 910 306 + 1 3095 908 3104 3096 + 1 3095 908 3096 906 + 1 908 3104 3096 910 + 1 908 906 910 3096 + 1 3731 438 3117 1911 + 1 3118 3117 306 1909 + 1 1913 1911 1909 123 + 1 3731 3118 1913 1911 + 1 3731 3118 1911 3117 + 1 3118 1913 1911 1909 + 1 3118 3117 1909 1911 + 1 3105 304 3108 3106 + 1 3730 3108 657 3731 + 1 3729 3106 3731 438 + 1 3105 3730 3729 3106 + 1 3105 3730 3106 3108 + 1 3730 3729 3106 3731 + 1 3730 3108 3731 3106 + 1 3105 304 3106 3095 + 1 3097 3095 3098 302 + 1 3729 3106 438 3098 + 1 3105 3097 3106 3729 + 1 3105 3097 3095 3106 + 1 3097 3729 3098 3106 + 1 3097 3095 3106 3098 + 1 3108 657 3731 3118 + 1 3106 3731 438 3117 + 1 3104 3118 3117 306 + 1 3108 3106 3104 3118 + 1 3108 3106 3118 3731 + 1 3106 3104 3118 3117 + 1 3106 3731 3117 3118 + 1 3095 302 3096 3098 + 1 3106 3098 3117 438 + 1 3104 3096 306 3117 + 1 3095 3106 3096 3104 + 1 3095 3106 3098 3096 + 1 3106 3104 3117 3096 + 1 3106 3098 3096 3117 + 1 1115 50 1118 1111 + 1 3715 1118 436 3036 + 1 3034 1111 3036 293 + 1 1115 3715 3034 1111 + 1 1115 3715 1111 1118 + 1 3715 3034 1111 3036 + 1 3715 1118 3036 1111 + 1 3727 436 1910 3087 + 1 1912 1910 123 1908 + 1 3088 3087 1908 300 + 1 3727 1912 3088 3087 + 1 3727 1912 3087 1910 + 1 1912 3088 3087 1908 + 1 1912 1910 1908 3087 + 1 3031 293 3033 897 + 1 3049 3033 300 904 + 1 899 897 904 24 + 1 3031 3049 899 897 + 1 3031 3049 897 3033 + 1 3049 899 897 904 + 1 3049 3033 904 897 + 1 3718 654 3055 3037 + 1 3050 3055 295 3031 + 1 3034 3037 3031 293 + 1 3718 3050 3034 3037 + 1 3718 3050 3037 3055 + 1 3050 3034 3037 3031 + 1 3050 3055 3031 3037 + 1 3718 654 3037 3727 + 1 3715 3727 3036 436 + 1 3034 3037 293 3036 + 1 3718 3715 3037 3034 + 1 3718 3715 3727 3037 + 1 3715 3034 3036 3037 + 1 3715 3727 3037 3036 + 1 3055 295 3031 3049 + 1 3037 3031 293 3033 + 1 3088 3049 3033 300 + 1 3055 3037 3088 3049 + 1 3055 3037 3049 3031 + 1 3037 3088 3049 3033 + 1 3037 3031 3033 3049 + 1 3727 436 3087 3036 + 1 3037 3036 3033 293 + 1 3088 3087 300 3033 + 1 3727 3037 3087 3088 + 1 3727 3037 3036 3087 + 1 3037 3088 3033 3087 + 1 3037 3036 3087 3033 + 1 1620 98 1624 1621 + 1 3694 1624 649 3722 + 1 3692 1621 3722 434 + 1 1620 3694 3692 1621 + 1 1620 3694 1621 1624 + 1 3694 3692 1621 3722 + 1 3694 1624 3722 1621 + 1 3690 649 1612 3716 + 1 1606 1612 97 1607 + 1 3687 3716 1607 433 + 1 3690 1606 3687 3716 + 1 3690 1606 3716 1612 + 1 1606 3687 3716 1607 + 1 1606 1612 1607 3716 + 1 3674 434 3713 1116 + 1 3673 3713 433 1115 + 1 1112 1116 1115 50 + 1 3674 3673 1112 1116 + 1 3674 3673 1116 3713 + 1 3673 1112 1116 1115 + 1 3673 3713 1115 1116 + 1 3685 426 3668 3688 + 1 3669 3668 423 3674 + 1 3692 3688 3674 434 + 1 3685 3669 3692 3688 + 1 3685 3669 3688 3668 + 1 3669 3692 3688 3674 + 1 3669 3668 3674 3688 + 1 3685 426 3688 3690 + 1 3694 3690 3722 649 + 1 3692 3688 434 3722 + 1 3685 3694 3688 3692 + 1 3685 3694 3690 3688 + 1 3694 3692 3722 3688 + 1 3694 3690 3688 3722 + 1 3668 423 3674 3673 + 1 3688 3674 434 3713 + 1 3687 3673 3713 433 + 1 3668 3688 3687 3673 + 1 3668 3688 3673 3674 + 1 3688 3687 3673 3713 + 1 3688 3674 3713 3673 + 1 3690 649 3716 3722 + 1 3688 3722 3713 434 + 1 3687 3716 433 3713 + 1 3690 3688 3716 3687 + 1 3690 3688 3722 3716 + 1 3688 3687 3713 3716 + 1 3688 3722 3716 3713 + 1 1620 98 1621 1622 + 1 3693 1622 3720 437 + 1 3692 1621 434 3720 + 1 1620 3693 1621 3692 + 1 1620 3693 1622 1621 + 1 3693 3692 3720 1621 + 1 3693 1622 1621 3720 + 1 3679 437 3711 1123 + 1 1121 1123 1122 51 + 1 3677 3711 432 1122 + 1 3679 1121 3711 3677 + 1 3679 1121 1123 3711 + 1 1121 3677 1122 3711 + 1 1121 1123 3711 1122 + 1 3674 434 1116 3709 + 1 3672 3709 1114 432 + 1 1112 1116 50 1114 + 1 3674 3672 1116 1112 + 1 3674 3672 3709 1116 + 1 3672 1112 1114 1116 + 1 3672 3709 1116 1114 + 1 3676 424 3678 3667 + 1 3669 3667 3674 423 + 1 3692 3678 434 3674 + 1 3676 3669 3678 3692 + 1 3676 3669 3667 3678 + 1 3669 3692 3674 3678 + 1 3669 3667 3678 3674 + 1 3676 424 3679 3678 + 1 3693 3679 437 3720 + 1 3692 3678 3720 434 + 1 3676 3693 3692 3678 + 1 3676 3693 3678 3679 + 1 3693 3692 3678 3720 + 1 3693 3679 3720 3678 + 1 3667 423 3672 3674 + 1 3678 3674 3709 434 + 1 3677 3672 432 3709 + 1 3667 3678 3672 3677 + 1 3667 3678 3674 3672 + 1 3678 3677 3709 3672 + 1 3678 3674 3672 3709 + 1 3679 437 3720 3711 + 1 3678 3720 434 3709 + 1 3677 3711 3709 432 + 1 3679 3678 3677 3711 + 1 3679 3678 3711 3720 + 1 3678 3677 3711 3709 + 1 3678 3720 3709 3711 + 1 1612 97 1607 1617 + 1 3716 1607 433 3718 + 1 4652 1617 3718 654 + 1 1612 3716 4652 1617 + 1 1612 3716 1617 1607 + 1 3716 4652 1617 3718 + 1 3716 1607 3718 1617 + 1 3713 433 1115 3715 + 1 1116 1115 50 1118 + 1 3719 3715 1118 436 + 1 3713 1116 3719 3715 + 1 3713 1116 3715 1115 + 1 1116 3719 3715 1118 + 1 1116 1115 1118 3715 + 1 4668 654 3727 1912 + 1 3728 3727 436 1910 + 1 1913 1912 1910 123 + 1 4668 3728 1913 1912 + 1 4668 3728 1912 3727 + 1 3728 1913 1912 1910 + 1 3728 3727 1910 1912 + 1 3722 434 3724 3723 + 1 4654 3724 657 4668 + 1 4652 3723 4668 654 + 1 3722 4654 4652 3723 + 1 3722 4654 3723 3724 + 1 4654 4652 3723 4668 + 1 4654 3724 4668 3723 + 1 3722 434 3723 3713 + 1 3716 3713 3718 433 + 1 4652 3723 654 3718 + 1 3722 3716 3723 4652 + 1 3722 3716 3713 3723 + 1 3716 4652 3718 3723 + 1 3716 3713 3723 3718 + 1 3724 657 4668 3728 + 1 3723 4668 654 3727 + 1 3719 3728 3727 436 + 1 3724 3723 3719 3728 + 1 3724 3723 3728 4668 + 1 3723 3719 3728 3727 + 1 3723 4668 3727 3728 + 1 3713 433 3715 3718 + 1 3723 3718 3727 654 + 1 3719 3715 436 3727 + 1 3713 3723 3715 3719 + 1 3713 3723 3718 3715 + 1 3723 3719 3727 3715 + 1 3723 3718 3715 3727 + 1 1123 51 1124 1122 + 1 3711 1122 3712 432 + 1 3729 1124 438 3712 + 1 1123 3711 1124 3729 + 1 1123 3711 1122 1124 + 1 3711 3729 3712 1124 + 1 3711 1122 1124 3712 + 1 3709 432 3710 1114 + 1 1116 1114 1118 50 + 1 3719 3710 436 1118 + 1 3709 1116 3710 3719 + 1 3709 1116 1114 3710 + 1 1116 3719 1118 3710 + 1 1116 1114 3710 1118 + 1 3731 438 1911 3726 + 1 3728 3726 1910 436 + 1 1913 1911 123 1910 + 1 3731 3728 1911 1913 + 1 3731 3728 3726 1911 + 1 3728 1913 1910 1911 + 1 3728 3726 1911 1910 + 1 3720 434 3721 3724 + 1 3730 3724 3731 657 + 1 3729 3721 438 3731 + 1 3720 3730 3721 3729 + 1 3720 3730 3724 3721 + 1 3730 3729 3731 3721 + 1 3730 3724 3721 3731 + 1 3720 434 3709 3721 + 1 3711 3709 432 3712 + 1 3729 3721 3712 438 + 1 3720 3711 3729 3721 + 1 3720 3711 3721 3709 + 1 3711 3729 3721 3712 + 1 3711 3709 3712 3721 + 1 3724 657 3728 3731 + 1 3721 3731 3726 438 + 1 3719 3728 436 3726 + 1 3724 3721 3728 3719 + 1 3724 3721 3731 3728 + 1 3721 3719 3726 3728 + 1 3721 3731 3728 3726 + 1 3709 432 3712 3710 + 1 3721 3712 438 3726 + 1 3719 3710 3726 436 + 1 3709 3721 3719 3710 + 1 3709 3721 3710 3712 + 1 3721 3719 3710 3726 + 1 3721 3712 3726 3710 + 1 909 25 907 911 + 1 3099 907 303 3100 + 1 3111 911 3100 307 + 1 909 3099 3111 911 + 1 909 3099 911 907 + 1 3099 3111 911 3100 + 1 3099 907 3100 911 + 1 3101 303 1223 3102 + 1 1226 1223 63 1227 + 1 4031 3102 1227 502 + 1 3101 1226 4031 3102 + 1 3101 1226 3102 1223 + 1 1226 4031 3102 1227 + 1 1226 1223 1227 3102 + 1 3124 307 3122 1928 + 1 4034 3122 502 1931 + 1 1934 1928 1931 125 + 1 3124 4034 1934 1928 + 1 3124 4034 1928 3122 + 1 4034 1934 1928 1931 + 1 4034 3122 1931 1928 + 1 3112 501 4032 3121 + 1 3115 4032 712 3124 + 1 3111 3121 3124 307 + 1 3112 3115 3111 3121 + 1 3112 3115 3121 4032 + 1 3115 3111 3121 3124 + 1 3115 4032 3124 3121 + 1 3112 501 3121 3101 + 1 3099 3101 3100 303 + 1 3111 3121 307 3100 + 1 3112 3099 3121 3111 + 1 3112 3099 3101 3121 + 1 3099 3111 3100 3121 + 1 3099 3101 3121 3100 + 1 4032 712 3124 4034 + 1 3121 3124 307 3122 + 1 4031 4034 3122 502 + 1 4032 3121 4031 4034 + 1 4032 3121 4034 3124 + 1 3121 4031 4034 3122 + 1 3121 3124 3122 4034 + 1 3101 303 3102 3100 + 1 3121 3100 3122 307 + 1 4031 3102 502 3122 + 1 3101 3121 3102 4031 + 1 3101 3121 3100 3102 + 1 3121 4031 3122 3102 + 1 3121 3100 3102 3122 + 1 1224 63 1222 1225 + 1 2117 1222 161 2118 + 1 3952 1225 2118 500 + 1 1224 2117 3952 1225 + 1 1224 2117 1225 1222 + 1 2117 3952 1225 2118 + 1 2117 1222 2118 1225 + 1 2101 161 765 2116 + 1 763 765 8 767 + 1 2103 2116 767 163 + 1 2101 763 2103 2116 + 1 2101 763 2116 765 + 1 763 2103 2116 767 + 1 763 765 767 2116 + 1 3964 500 2123 1238 + 1 2121 2123 163 1234 + 1 1236 1238 1234 65 + 1 3964 2121 1236 1238 + 1 3964 2121 1238 2123 + 1 2121 1236 1238 1234 + 1 2121 2123 1234 1238 + 1 2105 159 2107 2109 + 1 3949 2107 487 3964 + 1 3952 2109 3964 500 + 1 2105 3949 3952 2109 + 1 2105 3949 2109 2107 + 1 3949 3952 2109 3964 + 1 3949 2107 3964 2109 + 1 2105 159 2109 2101 + 1 2117 2101 2118 161 + 1 3952 2109 500 2118 + 1 2105 2117 2109 3952 + 1 2105 2117 2101 2109 + 1 2117 3952 2118 2109 + 1 2117 2101 2109 2118 + 1 2107 487 3964 2121 + 1 2109 3964 500 2123 + 1 2103 2121 2123 163 + 1 2107 2109 2103 2121 + 1 2107 2109 2121 3964 + 1 2109 2103 2121 2123 + 1 2109 3964 2123 2121 + 1 2101 161 2116 2118 + 1 2109 2118 2123 500 + 1 2103 2116 163 2123 + 1 2101 2109 2116 2103 + 1 2101 2109 2118 2116 + 1 2109 2103 2123 2116 + 1 2109 2118 2116 2123 + 1 1935 125 1932 1929 + 1 4043 1932 507 3206 + 1 3208 1929 3206 321 + 1 1935 4043 3208 1929 + 1 1935 4043 1929 1932 + 1 4043 3208 1929 3206 + 1 4043 1932 3206 1929 + 1 4039 507 1241 3168 + 1 1239 1241 65 1235 + 1 3166 3168 1235 315 + 1 4039 1239 3166 3168 + 1 4039 1239 3168 1241 + 1 1239 3166 3168 1235 + 1 1239 1241 1235 3168 + 1 3182 321 3165 925 + 1 3163 3165 315 919 + 1 921 925 919 27 + 1 3182 3163 921 925 + 1 3182 3163 925 3165 + 1 3163 921 925 919 + 1 3163 3165 919 925 + 1 4041 505 3183 3205 + 1 3189 3183 317 3182 + 1 3208 3205 3182 321 + 1 4041 3189 3208 3205 + 1 4041 3189 3205 3183 + 1 3189 3208 3205 3182 + 1 3189 3183 3182 3205 + 1 4041 505 3205 4039 + 1 4043 4039 3206 507 + 1 3208 3205 321 3206 + 1 4041 4043 3205 3208 + 1 4041 4043 4039 3205 + 1 4043 3208 3206 3205 + 1 4043 4039 3205 3206 + 1 3183 317 3182 3163 + 1 3205 3182 321 3165 + 1 3166 3163 3165 315 + 1 3183 3205 3166 3163 + 1 3183 3205 3163 3182 + 1 3205 3166 3163 3165 + 1 3205 3182 3165 3163 + 1 4039 507 3168 3206 + 1 3205 3206 3165 321 + 1 3166 3168 315 3165 + 1 4039 3205 3168 3166 + 1 4039 3205 3206 3168 + 1 3205 3166 3165 3168 + 1 3205 3206 3168 3165 + 1 1208 61 1210 1212 + 1 3975 1210 491 3984 + 1 3976 1212 3984 493 + 1 1208 3975 3976 1212 + 1 1208 3975 1212 1210 + 1 3975 3976 1212 3984 + 1 3975 1210 3984 1212 + 1 3988 491 1806 3989 + 1 1814 1806 113 1817 + 1 4891 3989 1817 717 + 1 3988 1814 4891 3989 + 1 3988 1814 3989 1806 + 1 1814 4891 3989 1817 + 1 1814 1806 1817 3989 + 1 4004 493 4005 1930 + 1 4894 4005 717 1935 + 1 1934 1930 1935 125 + 1 4004 4894 1934 1930 + 1 4004 4894 1930 4005 + 1 4894 1934 1930 1935 + 1 4894 4005 1935 1930 + 1 3978 710 4890 4003 + 1 3979 4890 712 4004 + 1 3976 4003 4004 493 + 1 3978 3979 3976 4003 + 1 3978 3979 4003 4890 + 1 3979 3976 4003 4004 + 1 3979 4890 4004 4003 + 1 3978 710 4003 3988 + 1 3975 3988 3984 491 + 1 3976 4003 493 3984 + 1 3978 3975 4003 3976 + 1 3978 3975 3988 4003 + 1 3975 3976 3984 4003 + 1 3975 3988 4003 3984 + 1 4890 712 4004 4894 + 1 4003 4004 493 4005 + 1 4891 4894 4005 717 + 1 4890 4003 4891 4894 + 1 4890 4003 4894 4004 + 1 4003 4891 4894 4005 + 1 4003 4004 4005 4894 + 1 3988 491 3989 3984 + 1 4003 3984 4005 493 + 1 4891 3989 717 4005 + 1 3988 4003 3989 4891 + 1 3988 4003 3984 3989 + 1 4003 4891 4005 3989 + 1 4003 3984 3989 4005 + 1 1208 61 1212 1204 + 1 3950 1204 3951 485 + 1 3976 1212 493 3951 + 1 1208 3950 1212 3976 + 1 1208 3950 1204 1212 + 1 3950 3976 3951 1212 + 1 3950 1204 1212 3951 + 1 3953 485 3954 1224 + 1 1226 1224 1227 63 + 1 4031 3954 502 1227 + 1 3953 1226 3954 4031 + 1 3953 1226 1224 3954 + 1 1226 4031 1227 3954 + 1 1226 1224 3954 1227 + 1 4004 493 1930 4000 + 1 4034 4000 1931 502 + 1 1934 1930 125 1931 + 1 4004 4034 1930 1934 + 1 4004 4034 4000 1930 + 1 4034 1934 1931 1930 + 1 4034 4000 1930 1931 + 1 3977 501 3999 4032 + 1 3979 4032 4004 712 + 1 3976 3999 493 4004 + 1 3977 3979 3999 3976 + 1 3977 3979 4032 3999 + 1 3979 3976 4004 3999 + 1 3979 4032 3999 4004 + 1 3977 501 3953 3999 + 1 3950 3953 485 3951 + 1 3976 3999 3951 493 + 1 3977 3950 3976 3999 + 1 3977 3950 3999 3953 + 1 3950 3976 3999 3951 + 1 3950 3953 3951 3999 + 1 4032 712 4034 4004 + 1 3999 4004 4000 493 + 1 4031 4034 502 4000 + 1 4032 3999 4034 4031 + 1 4032 3999 4004 4034 + 1 3999 4031 4000 4034 + 1 3999 4004 4034 4000 + 1 3953 485 3951 3954 + 1 3999 3951 493 4000 + 1 4031 3954 4000 502 + 1 3953 3999 4031 3954 + 1 3953 3999 3954 3951 + 1 3999 4031 3954 4000 + 1 3999 3951 4000 3954 + 1 1806 113 1817 1808 + 1 3989 1817 717 4041 + 1 3986 1808 4041 505 + 1 1806 3989 3986 1808 + 1 1806 3989 1808 1817 + 1 3989 3986 1808 4041 + 1 3989 1817 4041 1808 + 1 4005 717 1935 4043 + 1 1930 1935 125 1932 + 1 4002 4043 1932 507 + 1 4005 1930 4002 4043 + 1 4005 1930 4043 1935 + 1 1930 4002 4043 1932 + 1 1930 1935 1932 4043 + 1 3965 505 4039 1239 + 1 3966 4039 507 1241 + 1 1236 1239 1241 65 + 1 3965 3966 1236 1239 + 1 3965 3966 1239 4039 + 1 3966 1236 1239 1241 + 1 3966 4039 1241 1239 + 1 3984 493 3961 4001 + 1 3960 3961 487 3965 + 1 3986 4001 3965 505 + 1 3984 3960 3986 4001 + 1 3984 3960 4001 3961 + 1 3960 3986 4001 3965 + 1 3960 3961 3965 4001 + 1 3984 493 4001 4005 + 1 3989 4005 4041 717 + 1 3986 4001 505 4041 + 1 3984 3989 4001 3986 + 1 3984 3989 4005 4001 + 1 3989 3986 4041 4001 + 1 3989 4005 4001 4041 + 1 3961 487 3965 3966 + 1 4001 3965 505 4039 + 1 4002 3966 4039 507 + 1 3961 4001 4002 3966 + 1 3961 4001 3966 3965 + 1 4001 4002 3966 4039 + 1 4001 3965 4039 3966 + 1 4005 717 4043 4041 + 1 4001 4041 4039 505 + 1 4002 4043 507 4039 + 1 4005 4001 4043 4002 + 1 4005 4001 4041 4043 + 1 4001 4002 4039 4043 + 1 4001 4041 4043 4039 + 1 1224 63 1225 1227 + 1 3954 1227 4029 502 + 1 3952 1225 500 4029 + 1 1224 3954 1225 3952 + 1 1224 3954 1227 1225 + 1 3954 3952 4029 1225 + 1 3954 1227 1225 4029 + 1 4000 502 4033 1931 + 1 1930 1931 1932 125 + 1 4002 4033 507 1932 + 1 4000 1930 4033 4002 + 1 4000 1930 1931 4033 + 1 1930 4002 1932 4033 + 1 1930 1931 4033 1932 + 1 3964 500 1238 4030 + 1 3966 4030 1241 507 + 1 1236 1238 65 1241 + 1 3964 3966 1238 1236 + 1 3964 3966 4030 1238 + 1 3966 1236 1241 1238 + 1 3966 4030 1238 1241 + 1 3951 493 3998 3961 + 1 3949 3961 3964 487 + 1 3952 3998 500 3964 + 1 3951 3949 3998 3952 + 1 3951 3949 3961 3998 + 1 3949 3952 3964 3998 + 1 3949 3961 3998 3964 + 1 3951 493 4000 3998 + 1 3954 4000 502 4029 + 1 3952 3998 4029 500 + 1 3951 3954 3952 3998 + 1 3951 3954 3998 4000 + 1 3954 3952 3998 4029 + 1 3954 4000 4029 3998 + 1 3961 487 3966 3964 + 1 3998 3964 4030 500 + 1 4002 3966 507 4030 + 1 3961 3998 3966 4002 + 1 3961 3998 3964 3966 + 1 3998 4002 4030 3966 + 1 3998 3964 3966 4030 + 1 4000 502 4029 4033 + 1 3998 4029 500 4030 + 1 4002 4033 4030 507 + 1 4000 3998 4002 4033 + 1 4000 3998 4033 4029 + 1 3998 4002 4033 4030 + 1 3998 4029 4030 4033 + 1 900 24 905 898 + 1 3058 905 301 3040 + 1 3038 898 3040 294 + 1 900 3058 3038 898 + 1 900 3058 898 905 + 1 3058 3038 898 3040 + 1 3058 905 3040 898 + 1 3092 301 1918 3091 + 1 1922 1918 124 1920 + 1 3931 3091 1920 480 + 1 3092 1922 3931 3091 + 1 3092 1922 3091 1918 + 1 1922 3931 3091 1920 + 1 1922 1918 1920 3091 + 1 3041 294 3043 1185 + 1 3919 3043 480 1192 + 1 1189 1185 1192 59 + 1 3041 3919 1189 1185 + 1 3041 3919 1185 3043 + 1 3919 1189 1185 1192 + 1 3919 3043 1192 1185 + 1 3065 689 3922 3044 + 1 3059 3922 477 3041 + 1 3038 3044 3041 294 + 1 3065 3059 3038 3044 + 1 3065 3059 3044 3922 + 1 3059 3038 3044 3041 + 1 3059 3922 3041 3044 + 1 3065 689 3044 3092 + 1 3058 3092 3040 301 + 1 3038 3044 294 3040 + 1 3065 3058 3044 3038 + 1 3065 3058 3092 3044 + 1 3058 3038 3040 3044 + 1 3058 3092 3044 3040 + 1 3922 477 3041 3919 + 1 3044 3041 294 3043 + 1 3931 3919 3043 480 + 1 3922 3044 3931 3919 + 1 3922 3044 3919 3041 + 1 3044 3931 3919 3043 + 1 3044 3041 3043 3919 + 1 3092 301 3091 3040 + 1 3044 3040 3043 294 + 1 3931 3091 480 3043 + 1 3092 3044 3091 3931 + 1 3092 3044 3040 3091 + 1 3044 3931 3043 3091 + 1 3044 3040 3091 3043 + 1 1923 124 1919 1921 + 1 3202 1919 320 3201 + 1 3938 1921 3201 483 + 1 1923 3202 3938 1921 + 1 1923 3202 1921 1919 + 1 3202 3938 1921 3201 + 1 3202 1919 3201 1921 + 1 3172 320 924 3159 + 1 920 924 27 918 + 1 3157 3159 918 314 + 1 3172 920 3157 3159 + 1 3172 920 3159 924 + 1 920 3157 3159 918 + 1 920 924 918 3159 + 1 3934 483 3162 1200 + 1 3160 3162 314 1194 + 1 1198 1200 1194 60 + 1 3934 3160 1198 1200 + 1 3934 3160 1200 3162 + 1 3160 1198 1200 1194 + 1 3160 3162 1194 1200 + 1 3178 316 3173 3174 + 1 3936 3173 481 3934 + 1 3938 3174 3934 483 + 1 3178 3936 3938 3174 + 1 3178 3936 3174 3173 + 1 3936 3938 3174 3934 + 1 3936 3173 3934 3174 + 1 3178 316 3174 3172 + 1 3202 3172 3201 320 + 1 3938 3174 483 3201 + 1 3178 3202 3174 3938 + 1 3178 3202 3172 3174 + 1 3202 3938 3201 3174 + 1 3202 3172 3174 3201 + 1 3173 481 3934 3160 + 1 3174 3934 483 3162 + 1 3157 3160 3162 314 + 1 3173 3174 3157 3160 + 1 3173 3174 3160 3934 + 1 3174 3157 3160 3162 + 1 3174 3934 3162 3160 + 1 3172 320 3159 3201 + 1 3174 3201 3162 483 + 1 3157 3159 314 3162 + 1 3172 3174 3159 3157 + 1 3172 3174 3201 3159 + 1 3174 3157 3162 3159 + 1 3174 3201 3159 3162 + 1 1186 59 1188 1184 + 1 3830 1188 476 2096 + 1 2093 1184 2096 157 + 1 1186 3830 2093 1184 + 1 1186 3830 1184 1188 + 1 3830 2093 1184 2096 + 1 3830 1188 2096 1184 + 1 3836 476 1197 2099 + 1 1195 1197 60 1193 + 1 2097 2099 1193 158 + 1 3836 1195 2097 2099 + 1 3836 1195 2099 1197 + 1 1195 2097 2099 1193 + 1 1195 1197 1193 2099 + 1 2074 157 2092 761 + 1 2075 2092 158 762 + 1 758 761 762 7 + 1 2074 2075 758 761 + 1 2074 2075 761 2092 + 1 2075 758 761 762 + 1 2075 2092 762 761 + 1 3825 459 2081 2094 + 1 2080 2081 154 2074 + 1 2093 2094 2074 157 + 1 3825 2080 2093 2094 + 1 3825 2080 2094 2081 + 1 2080 2093 2094 2074 + 1 2080 2081 2074 2094 + 1 3825 459 2094 3836 + 1 3830 3836 2096 476 + 1 2093 2094 157 2096 + 1 3825 3830 2094 2093 + 1 3825 3830 3836 2094 + 1 3830 2093 2096 2094 + 1 3830 3836 2094 2096 + 1 2081 154 2074 2075 + 1 2094 2074 157 2092 + 1 2097 2075 2092 158 + 1 2081 2094 2097 2075 + 1 2081 2094 2075 2074 + 1 2094 2097 2075 2092 + 1 2094 2074 2092 2075 + 1 3836 476 2099 2096 + 1 2094 2096 2092 157 + 1 2097 2099 158 2092 + 1 3836 2094 2099 2097 + 1 3836 2094 2096 2099 + 1 2094 2097 2092 2099 + 1 2094 2096 2099 2092 + 1 1736 107 1730 1731 + 1 3874 1730 465 3871 + 1 3926 1731 3871 478 + 1 1736 3874 3926 1731 + 1 1736 3874 1731 1730 + 1 3874 3926 1731 3871 + 1 3874 1730 3871 1731 + 1 3864 465 1165 3827 + 1 1164 1165 56 1158 + 1 3826 3827 1158 458 + 1 3864 1164 3826 3827 + 1 3864 1164 3827 1165 + 1 1164 3826 3827 1158 + 1 1164 1165 1158 3827 + 1 3917 478 3832 1190 + 1 3831 3832 458 1186 + 1 1189 1190 1186 59 + 1 3917 3831 1189 1190 + 1 3917 3831 1190 3832 + 1 3831 1189 1190 1186 + 1 3831 3832 1186 1190 + 1 3869 464 3866 3867 + 1 3920 3866 477 3917 + 1 3926 3867 3917 478 + 1 3869 3920 3926 3867 + 1 3869 3920 3867 3866 + 1 3920 3926 3867 3917 + 1 3920 3866 3917 3867 + 1 3869 464 3867 3864 + 1 3874 3864 3871 465 + 1 3926 3867 478 3871 + 1 3869 3874 3867 3926 + 1 3869 3874 3864 3867 + 1 3874 3926 3871 3867 + 1 3874 3864 3867 3871 + 1 3866 477 3917 3831 + 1 3867 3917 478 3832 + 1 3826 3831 3832 458 + 1 3866 3867 3826 3831 + 1 3866 3867 3831 3917 + 1 3867 3826 3831 3832 + 1 3867 3917 3832 3831 + 1 3864 465 3827 3871 + 1 3867 3871 3832 478 + 1 3826 3827 458 3832 + 1 3864 3867 3827 3826 + 1 3864 3867 3871 3827 + 1 3867 3826 3832 3827 + 1 3867 3871 3827 3832 + 1 1736 107 1731 1741 + 1 4802 1741 3928 694 + 1 3926 1731 478 3928 + 1 1736 4802 1731 3926 + 1 1736 4802 1741 1731 + 1 4802 3926 3928 1731 + 1 4802 1741 1731 3928 + 1 4807 694 3932 1923 + 1 1922 1923 1920 124 + 1 3931 3932 480 1920 + 1 4807 1922 3932 3931 + 1 4807 1922 1923 3932 + 1 1922 3931 1920 3932 + 1 1922 1923 3932 1920 + 1 3917 478 1190 3923 + 1 3919 3923 1192 480 + 1 1189 1190 59 1192 + 1 3917 3919 1190 1189 + 1 3917 3919 3923 1190 + 1 3919 1189 1192 1190 + 1 3919 3923 1190 1192 + 1 4800 689 3927 3922 + 1 3920 3922 3917 477 + 1 3926 3927 478 3917 + 1 4800 3920 3927 3926 + 1 4800 3920 3922 3927 + 1 3920 3926 3917 3927 + 1 3920 3922 3927 3917 + 1 4800 689 4807 3927 + 1 4802 4807 694 3928 + 1 3926 3927 3928 478 + 1 4800 4802 3926 3927 + 1 4800 4802 3927 4807 + 1 4802 3926 3927 3928 + 1 4802 4807 3928 3927 + 1 3922 477 3919 3917 + 1 3927 3917 3923 478 + 1 3931 3919 480 3923 + 1 3922 3927 3919 3931 + 1 3922 3927 3917 3919 + 1 3927 3931 3923 3919 + 1 3927 3917 3919 3923 + 1 4807 694 3928 3932 + 1 3927 3928 478 3923 + 1 3931 3932 3923 480 + 1 4807 3927 3931 3932 + 1 4807 3927 3932 3928 + 1 3927 3931 3932 3923 + 1 3927 3928 3923 3932 + 1 1165 56 1158 1159 + 1 3827 1158 458 3825 + 1 3833 1159 3825 459 + 1 1165 3827 3833 1159 + 1 1165 3827 1159 1158 + 1 3827 3833 1159 3825 + 1 3827 1158 3825 1159 + 1 3832 458 1186 3830 + 1 1190 1186 59 1188 + 1 3913 3830 1188 476 + 1 3832 1190 3913 3830 + 1 3832 1190 3830 1186 + 1 1190 3913 3830 1188 + 1 1190 1186 1188 3830 + 1 3838 459 3836 1195 + 1 3915 3836 476 1197 + 1 1198 1195 1197 60 + 1 3838 3915 1198 1195 + 1 3838 3915 1195 3836 + 1 3915 1198 1195 1197 + 1 3915 3836 1197 1195 + 1 3871 478 3924 3837 + 1 3872 3924 481 3838 + 1 3833 3837 3838 459 + 1 3871 3872 3833 3837 + 1 3871 3872 3837 3924 + 1 3872 3833 3837 3838 + 1 3872 3924 3838 3837 + 1 3871 478 3837 3832 + 1 3827 3832 3825 458 + 1 3833 3837 459 3825 + 1 3871 3827 3837 3833 + 1 3871 3827 3832 3837 + 1 3827 3833 3825 3837 + 1 3827 3832 3837 3825 + 1 3924 481 3838 3915 + 1 3837 3838 459 3836 + 1 3913 3915 3836 476 + 1 3924 3837 3913 3915 + 1 3924 3837 3915 3838 + 1 3837 3913 3915 3836 + 1 3837 3838 3836 3915 + 1 3832 458 3830 3825 + 1 3837 3825 3836 459 + 1 3913 3830 476 3836 + 1 3832 3837 3830 3913 + 1 3832 3837 3825 3830 + 1 3837 3913 3836 3830 + 1 3837 3825 3830 3836 + 1 1923 124 1921 1920 + 1 3932 1920 3930 480 + 1 3938 1921 483 3930 + 1 1923 3932 1921 3938 + 1 1923 3932 1920 1921 + 1 3932 3938 3930 1921 + 1 3932 1920 1921 3930 + 1 3923 480 3914 1192 + 1 1190 1192 1188 59 + 1 3913 3914 476 1188 + 1 3923 1190 3914 3913 + 1 3923 1190 1192 3914 + 1 1190 3913 1188 3914 + 1 1190 1192 3914 1188 + 1 3934 483 1200 3916 + 1 3915 3916 1197 476 + 1 1198 1200 60 1197 + 1 3934 3915 1200 1198 + 1 3934 3915 3916 1200 + 1 3915 1198 1197 1200 + 1 3915 3916 1200 1197 + 1 3928 478 3925 3924 + 1 3936 3924 3934 481 + 1 3938 3925 483 3934 + 1 3928 3936 3925 3938 + 1 3928 3936 3924 3925 + 1 3936 3938 3934 3925 + 1 3936 3924 3925 3934 + 1 3928 478 3923 3925 + 1 3932 3923 480 3930 + 1 3938 3925 3930 483 + 1 3928 3932 3938 3925 + 1 3928 3932 3925 3923 + 1 3932 3938 3925 3930 + 1 3932 3923 3930 3925 + 1 3924 481 3915 3934 + 1 3925 3934 3916 483 + 1 3913 3915 476 3916 + 1 3924 3925 3915 3913 + 1 3924 3925 3934 3915 + 1 3925 3913 3916 3915 + 1 3925 3934 3915 3916 + 1 3923 480 3930 3914 + 1 3925 3930 483 3916 + 1 3913 3914 3916 476 + 1 3923 3925 3913 3914 + 1 3923 3925 3914 3930 + 1 3925 3913 3914 3916 + 1 3925 3930 3916 3914 + 1 849 18 851 854 + 1 2711 851 247 2725 + 1 2712 854 2725 250 + 1 849 2711 2712 854 + 1 849 2711 854 851 + 1 2711 2712 854 2725 + 1 2711 851 2725 854 + 1 2729 247 1659 2731 + 1 1665 1659 102 1670 + 1 4594 2731 1670 672 + 1 2729 1665 4594 2731 + 1 2729 1665 2731 1659 + 1 1665 4594 2731 1670 + 1 1665 1659 1670 2731 + 1 2754 250 2756 1770 + 1 4598 2756 672 1776 + 1 1773 1770 1776 110 + 1 2754 4598 1773 1770 + 1 2754 4598 1770 2756 + 1 4598 1773 1770 1776 + 1 4598 2756 1776 1770 + 1 2715 636 4593 2753 + 1 2716 4593 637 2754 + 1 2712 2753 2754 250 + 1 2715 2716 2712 2753 + 1 2715 2716 2753 4593 + 1 2716 2712 2753 2754 + 1 2716 4593 2754 2753 + 1 2715 636 2753 2729 + 1 2711 2729 2725 247 + 1 2712 2753 250 2725 + 1 2715 2711 2753 2712 + 1 2715 2711 2729 2753 + 1 2711 2712 2725 2753 + 1 2711 2729 2753 2725 + 1 4593 637 2754 4598 + 1 2753 2754 250 2756 + 1 4594 4598 2756 672 + 1 4593 2753 4594 4598 + 1 4593 2753 4598 2754 + 1 2753 4594 4598 2756 + 1 2753 2754 2756 4598 + 1 2729 247 2731 2725 + 1 2753 2725 2756 250 + 1 4594 2731 672 2756 + 1 2729 2753 2731 4594 + 1 2729 2753 2725 2731 + 1 2753 4594 2756 2731 + 1 2753 2725 2731 2756 + 1 1664 102 1658 1667 + 1 2636 1658 236 2638 + 1 4563 1667 2638 669 + 1 1664 2636 4563 1667 + 1 1664 2636 1667 1658 + 1 2636 4563 1667 2638 + 1 2636 1658 2638 1667 + 1 2621 236 840 2632 + 1 839 840 17 844 + 1 2623 2632 844 240 + 1 2621 839 2623 2632 + 1 2621 839 2632 840 + 1 839 2623 2632 844 + 1 839 840 844 2632 + 1 4572 669 2670 1722 + 1 2669 2670 240 1714 + 1 1719 1722 1714 106 + 1 4572 2669 1719 1722 + 1 4572 2669 1722 2670 + 1 2669 1719 1722 1714 + 1 2669 2670 1714 1722 + 1 2627 235 2629 2630 + 1 4560 2629 632 4572 + 1 4563 2630 4572 669 + 1 2627 4560 4563 2630 + 1 2627 4560 2630 2629 + 1 4560 4563 2630 4572 + 1 4560 2629 4572 2630 + 1 2627 235 2630 2621 + 1 2636 2621 2638 236 + 1 4563 2630 669 2638 + 1 2627 2636 2630 4563 + 1 2627 2636 2621 2630 + 1 2636 4563 2638 2630 + 1 2636 2621 2630 2638 + 1 2629 632 4572 2669 + 1 2630 4572 669 2670 + 1 2623 2669 2670 240 + 1 2629 2630 2623 2669 + 1 2629 2630 2669 4572 + 1 2630 2623 2669 2670 + 1 2630 4572 2670 2669 + 1 2621 236 2632 2638 + 1 2630 2638 2670 669 + 1 2623 2632 240 2670 + 1 2621 2630 2632 2623 + 1 2621 2630 2638 2632 + 1 2630 2623 2670 2632 + 1 2630 2638 2632 2670 + 1 1774 110 1777 1771 + 1 4661 1777 687 3071 + 1 3069 1771 3071 297 + 1 1774 4661 3069 1771 + 1 1774 4661 1771 1777 + 1 4661 3069 1771 3071 + 1 4661 1777 3071 1771 + 1 4657 687 1725 3063 + 1 1721 1725 106 1715 + 1 3061 3063 1715 296 + 1 4657 1721 3061 3063 + 1 4657 1721 3063 1725 + 1 1721 3061 3063 1715 + 1 1721 1725 1715 3063 + 1 3046 297 3056 901 + 1 3045 3056 296 900 + 1 899 901 900 24 + 1 3046 3045 899 901 + 1 3046 3045 901 3056 + 1 3045 899 901 900 + 1 3045 3056 900 901 + 1 4655 650 3051 3068 + 1 3052 3051 295 3046 + 1 3069 3068 3046 297 + 1 4655 3052 3069 3068 + 1 4655 3052 3068 3051 + 1 3052 3069 3068 3046 + 1 3052 3051 3046 3068 + 1 4655 650 3068 4657 + 1 4661 4657 3071 687 + 1 3069 3068 297 3071 + 1 4655 4661 3068 3069 + 1 4655 4661 4657 3068 + 1 4661 3069 3071 3068 + 1 4661 4657 3068 3071 + 1 3051 295 3046 3045 + 1 3068 3046 297 3056 + 1 3061 3045 3056 296 + 1 3051 3068 3061 3045 + 1 3051 3068 3045 3046 + 1 3068 3061 3045 3056 + 1 3068 3046 3056 3045 + 1 4657 687 3063 3071 + 1 3068 3071 3056 297 + 1 3061 3063 296 3056 + 1 4657 3068 3063 3061 + 1 4657 3068 3071 3063 + 1 3068 3061 3056 3063 + 1 3068 3071 3063 3056 + 1 1563 93 1565 1569 + 1 4541 1565 629 4554 + 1 4543 1569 4554 633 + 1 1563 4541 4543 1569 + 1 1563 4541 1569 1565 + 1 4541 4543 1569 4554 + 1 4541 1565 4554 1569 + 1 4555 629 1608 4559 + 1 1609 1608 97 1614 + 1 4586 4559 1614 651 + 1 4555 1609 4586 4559 + 1 4555 1609 4559 1608 + 1 1609 4586 4559 1614 + 1 1609 1608 1614 4559 + 1 4577 633 4579 1772 + 1 4596 4579 651 1774 + 1 1773 1772 1774 110 + 1 4577 4596 1773 1772 + 1 4577 4596 1772 4579 + 1 4596 1773 1772 1774 + 1 4596 4579 1774 1772 + 1 4544 634 4584 4575 + 1 4546 4584 637 4577 + 1 4543 4575 4577 633 + 1 4544 4546 4543 4575 + 1 4544 4546 4575 4584 + 1 4546 4543 4575 4577 + 1 4546 4584 4577 4575 + 1 4544 634 4575 4555 + 1 4541 4555 4554 629 + 1 4543 4575 633 4554 + 1 4544 4541 4575 4543 + 1 4544 4541 4555 4575 + 1 4541 4543 4554 4575 + 1 4541 4555 4575 4554 + 1 4584 637 4577 4596 + 1 4575 4577 633 4579 + 1 4586 4596 4579 651 + 1 4584 4575 4586 4596 + 1 4584 4575 4596 4577 + 1 4575 4586 4596 4579 + 1 4575 4577 4579 4596 + 1 4555 629 4559 4554 + 1 4575 4554 4579 633 + 1 4586 4559 651 4579 + 1 4555 4575 4559 4586 + 1 4555 4575 4554 4559 + 1 4575 4586 4579 4559 + 1 4575 4554 4559 4579 + 1 1563 93 1569 1566 + 1 4542 1566 4561 630 + 1 4543 1569 633 4561 + 1 1563 4542 1569 4543 + 1 1563 4542 1566 1569 + 1 4542 4543 4561 1569 + 1 4542 1566 1569 4561 + 1 4562 630 4564 1664 + 1 1665 1664 1670 102 + 1 4594 4564 672 1670 + 1 4562 1665 4564 4594 + 1 4562 1665 1664 4564 + 1 1665 4594 1670 4564 + 1 1665 1664 4564 1670 + 1 4577 633 1772 4581 + 1 4598 4581 1776 672 + 1 1773 1772 110 1776 + 1 4577 4598 1772 1773 + 1 4577 4598 4581 1772 + 1 4598 1773 1776 1772 + 1 4598 4581 1772 1776 + 1 4545 636 4576 4593 + 1 4546 4593 4577 637 + 1 4543 4576 633 4577 + 1 4545 4546 4576 4543 + 1 4545 4546 4593 4576 + 1 4546 4543 4577 4576 + 1 4546 4593 4576 4577 + 1 4545 636 4562 4576 + 1 4542 4562 630 4561 + 1 4543 4576 4561 633 + 1 4545 4542 4543 4576 + 1 4545 4542 4576 4562 + 1 4542 4543 4576 4561 + 1 4542 4562 4561 4576 + 1 4593 637 4598 4577 + 1 4576 4577 4581 633 + 1 4594 4598 672 4581 + 1 4593 4576 4598 4594 + 1 4593 4576 4577 4598 + 1 4576 4594 4581 4598 + 1 4576 4577 4598 4581 + 1 4562 630 4561 4564 + 1 4576 4561 633 4581 + 1 4594 4564 4581 672 + 1 4562 4576 4594 4564 + 1 4562 4576 4564 4561 + 1 4576 4594 4564 4581 + 1 4576 4561 4581 4564 + 1 1608 97 1614 1613 + 1 4559 1614 651 4655 + 1 4558 1613 4655 650 + 1 1608 4559 4558 1613 + 1 1608 4559 1613 1614 + 1 4559 4558 1613 4655 + 1 4559 1614 4655 1613 + 1 4579 651 1774 4661 + 1 1772 1774 110 1777 + 1 4582 4661 1777 687 + 1 4579 1772 4582 4661 + 1 4579 1772 4661 1774 + 1 1772 4582 4661 1777 + 1 1772 1774 1777 4661 + 1 4571 650 4657 1721 + 1 4574 4657 687 1725 + 1 1719 1721 1725 106 + 1 4571 4574 1719 1721 + 1 4571 4574 1721 4657 + 1 4574 1719 1721 1725 + 1 4574 4657 1725 1721 + 1 4554 633 4569 4578 + 1 4553 4569 632 4571 + 1 4558 4578 4571 650 + 1 4554 4553 4558 4578 + 1 4554 4553 4578 4569 + 1 4553 4558 4578 4571 + 1 4553 4569 4571 4578 + 1 4554 633 4578 4579 + 1 4559 4579 4655 651 + 1 4558 4578 650 4655 + 1 4554 4559 4578 4558 + 1 4554 4559 4579 4578 + 1 4559 4558 4655 4578 + 1 4559 4579 4578 4655 + 1 4569 632 4571 4574 + 1 4578 4571 650 4657 + 1 4582 4574 4657 687 + 1 4569 4578 4582 4574 + 1 4569 4578 4574 4571 + 1 4578 4582 4574 4657 + 1 4578 4571 4657 4574 + 1 4579 651 4661 4655 + 1 4578 4655 4657 650 + 1 4582 4661 687 4657 + 1 4579 4578 4661 4582 + 1 4579 4578 4655 4661 + 1 4578 4582 4657 4661 + 1 4578 4655 4661 4657 + 1 1664 102 1667 1670 + 1 4564 1670 4724 672 + 1 4563 1667 669 4724 + 1 1664 4564 1667 4563 + 1 1664 4564 1670 1667 + 1 4564 4563 4724 1667 + 1 4564 1670 1667 4724 + 1 4581 672 4740 1776 + 1 1772 1776 1777 110 + 1 4582 4740 687 1777 + 1 4581 1772 4740 4582 + 1 4581 1772 1776 4740 + 1 1772 4582 1777 4740 + 1 1772 1776 4740 1777 + 1 4572 669 1722 4726 + 1 4574 4726 1725 687 + 1 1719 1722 106 1725 + 1 4572 4574 1722 1719 + 1 4572 4574 4726 1722 + 1 4574 1719 1725 1722 + 1 4574 4726 1722 1725 + 1 4561 633 4580 4569 + 1 4560 4569 4572 632 + 1 4563 4580 669 4572 + 1 4561 4560 4580 4563 + 1 4561 4560 4569 4580 + 1 4560 4563 4572 4580 + 1 4560 4569 4580 4572 + 1 4561 633 4581 4580 + 1 4564 4581 672 4724 + 1 4563 4580 4724 669 + 1 4561 4564 4563 4580 + 1 4561 4564 4580 4581 + 1 4564 4563 4580 4724 + 1 4564 4581 4724 4580 + 1 4569 632 4574 4572 + 1 4580 4572 4726 669 + 1 4582 4574 687 4726 + 1 4569 4580 4574 4582 + 1 4569 4580 4572 4574 + 1 4580 4582 4726 4574 + 1 4580 4572 4574 4726 + 1 4581 672 4724 4740 + 1 4580 4724 669 4726 + 1 4582 4740 4726 687 + 1 4581 4580 4582 4740 + 1 4581 4580 4740 4724 + 1 4580 4582 4740 4726 + 1 4580 4724 4726 4740 + 1 849 18 854 855 + 1 2713 855 2751 251 + 1 2712 854 250 2751 + 1 849 2713 854 2712 + 1 849 2713 855 854 + 1 2713 2712 2751 854 + 1 2713 855 854 2751 + 1 2763 251 2764 1784 + 1 1788 1784 1790 111 + 1 4602 2764 705 1790 + 1 2763 1788 2764 4602 + 1 2763 1788 1784 2764 + 1 1788 4602 1790 2764 + 1 1788 1784 2764 1790 + 1 2754 250 1770 2758 + 1 4599 2758 1779 705 + 1 1773 1770 110 1779 + 1 2754 4599 1770 1773 + 1 2754 4599 2758 1770 + 1 4599 1773 1779 1770 + 1 4599 2758 1770 1779 + 1 2717 638 2755 4595 + 1 2716 4595 2754 637 + 1 2712 2755 250 2754 + 1 2717 2716 2755 2712 + 1 2717 2716 4595 2755 + 1 2716 2712 2754 2755 + 1 2716 4595 2755 2754 + 1 2717 638 2763 2755 + 1 2713 2763 251 2751 + 1 2712 2755 2751 250 + 1 2717 2713 2712 2755 + 1 2717 2713 2755 2763 + 1 2713 2712 2755 2751 + 1 2713 2763 2751 2755 + 1 4595 637 4599 2754 + 1 2755 2754 2758 250 + 1 4602 4599 705 2758 + 1 4595 2755 4599 4602 + 1 4595 2755 2754 4599 + 1 2755 4602 2758 4599 + 1 2755 2754 4599 2758 + 1 2763 251 2751 2764 + 1 2755 2751 250 2758 + 1 4602 2764 2758 705 + 1 2763 2755 4602 2764 + 1 2763 2755 2764 2751 + 1 2755 4602 2764 2758 + 1 2755 2751 2758 2764 + 1 1789 111 1792 1785 + 1 3113 1785 3114 305 + 1 4677 1792 711 3114 + 1 1789 3113 1792 4677 + 1 1789 3113 1785 1792 + 1 3113 4677 3114 1792 + 1 3113 1785 1792 3114 + 1 3103 305 3110 909 + 1 908 909 910 25 + 1 3104 3110 306 910 + 1 3103 908 3110 3104 + 1 3103 908 909 3110 + 1 908 3104 910 3110 + 1 908 909 3110 910 + 1 4679 711 1915 3119 + 1 3118 3119 1909 306 + 1 1913 1915 123 1909 + 1 4679 3118 1915 1913 + 1 4679 3118 3119 1915 + 1 3118 1913 1909 1915 + 1 3118 3119 1915 1909 + 1 3107 304 3109 3108 + 1 4675 3108 4679 657 + 1 4677 3109 711 4679 + 1 3107 4675 3109 4677 + 1 3107 4675 3108 3109 + 1 4675 4677 4679 3109 + 1 4675 3108 3109 4679 + 1 3107 304 3103 3109 + 1 3113 3103 305 3114 + 1 4677 3109 3114 711 + 1 3107 3113 4677 3109 + 1 3107 3113 3109 3103 + 1 3113 4677 3109 3114 + 1 3113 3103 3114 3109 + 1 3108 657 3118 4679 + 1 3109 4679 3119 711 + 1 3104 3118 306 3119 + 1 3108 3109 3118 3104 + 1 3108 3109 4679 3118 + 1 3109 3104 3119 3118 + 1 3109 4679 3118 3119 + 1 3103 305 3114 3110 + 1 3109 3114 711 3119 + 1 3104 3110 3119 306 + 1 3103 3109 3104 3110 + 1 3103 3109 3110 3114 + 1 3109 3104 3110 3119 + 1 3109 3114 3119 3110 + 1 1774 110 1771 1781 + 1 4662 1781 3073 707 + 1 3069 1771 297 3073 + 1 1774 4662 1771 3069 + 1 1774 4662 1781 1771 + 1 4662 3069 3073 1771 + 1 4662 1781 1771 3073 + 1 4669 707 3089 1914 + 1 1912 1914 1908 123 + 1 3088 3089 300 1908 + 1 4669 1912 3089 3088 + 1 4669 1912 1914 3089 + 1 1912 3088 1908 3089 + 1 1912 1914 3089 1908 + 1 3046 297 901 3066 + 1 3049 3066 904 300 + 1 899 901 24 904 + 1 3046 3049 901 899 + 1 3046 3049 3066 901 + 1 3049 899 904 901 + 1 3049 3066 901 904 + 1 4659 654 3070 3055 + 1 3052 3055 3046 295 + 1 3069 3070 297 3046 + 1 4659 3052 3070 3069 + 1 4659 3052 3055 3070 + 1 3052 3069 3046 3070 + 1 3052 3055 3070 3046 + 1 4659 654 4669 3070 + 1 4662 4669 707 3073 + 1 3069 3070 3073 297 + 1 4659 4662 3069 3070 + 1 4659 4662 3070 4669 + 1 4662 3069 3070 3073 + 1 4662 4669 3073 3070 + 1 3055 295 3049 3046 + 1 3070 3046 3066 297 + 1 3088 3049 300 3066 + 1 3055 3070 3049 3088 + 1 3055 3070 3046 3049 + 1 3070 3088 3066 3049 + 1 3070 3046 3049 3066 + 1 4669 707 3073 3089 + 1 3070 3073 297 3066 + 1 3088 3089 3066 300 + 1 4669 3070 3088 3089 + 1 4669 3070 3089 3073 + 1 3070 3088 3089 3066 + 1 3070 3073 3066 3089 + 1 1623 98 1625 1624 + 1 4590 1624 4653 649 + 1 4591 1625 655 4653 + 1 1623 4590 1625 4591 + 1 1623 4590 1624 1625 + 1 4590 4591 4653 1625 + 1 4590 1624 1625 4653 + 1 4585 649 4651 1612 + 1 1609 1612 1614 97 + 1 4586 4651 651 1614 + 1 4585 1609 4651 4586 + 1 4585 1609 1612 4651 + 1 1609 4586 1614 4651 + 1 1609 1612 4651 1614 + 1 4597 655 1775 4660 + 1 4596 4660 1774 651 + 1 1773 1775 110 1774 + 1 4597 4596 1775 1773 + 1 4597 4596 4660 1775 + 1 4596 1773 1774 1775 + 1 4596 4660 1775 1774 + 1 4583 634 4587 4584 + 1 4588 4584 4597 637 + 1 4591 4587 655 4597 + 1 4583 4588 4587 4591 + 1 4583 4588 4584 4587 + 1 4588 4591 4597 4587 + 1 4588 4584 4587 4597 + 1 4583 634 4585 4587 + 1 4590 4585 649 4653 + 1 4591 4587 4653 655 + 1 4583 4590 4591 4587 + 1 4583 4590 4587 4585 + 1 4590 4591 4587 4653 + 1 4590 4585 4653 4587 + 1 4584 637 4596 4597 + 1 4587 4597 4660 655 + 1 4586 4596 651 4660 + 1 4584 4587 4596 4586 + 1 4584 4587 4597 4596 + 1 4587 4586 4660 4596 + 1 4587 4597 4596 4660 + 1 4585 649 4653 4651 + 1 4587 4653 655 4660 + 1 4586 4651 4660 651 + 1 4585 4587 4586 4651 + 1 4585 4587 4651 4653 + 1 4587 4586 4651 4660 + 1 4587 4653 4660 4651 + 1 1623 98 1626 1625 + 1 4592 1626 656 4670 + 1 4591 1625 4670 655 + 1 1623 4592 4591 1625 + 1 1623 4592 1625 1626 + 1 4592 4591 1625 4670 + 1 4592 1626 4670 1625 + 1 4601 656 1789 4676 + 1 1788 1789 111 1790 + 1 4602 4676 1790 705 + 1 4601 1788 4602 4676 + 1 4601 1788 4676 1789 + 1 1788 4602 4676 1790 + 1 1788 1789 1790 4676 + 1 4597 655 4672 1775 + 1 4599 4672 705 1779 + 1 1773 1775 1779 110 + 1 4597 4599 1773 1775 + 1 4597 4599 1775 4672 + 1 4599 1773 1775 1779 + 1 4599 4672 1779 1775 + 1 4589 638 4595 4600 + 1 4588 4595 637 4597 + 1 4591 4600 4597 655 + 1 4589 4588 4591 4600 + 1 4589 4588 4600 4595 + 1 4588 4591 4600 4597 + 1 4588 4595 4597 4600 + 1 4589 638 4600 4601 + 1 4592 4601 4670 656 + 1 4591 4600 655 4670 + 1 4589 4592 4600 4591 + 1 4589 4592 4601 4600 + 1 4592 4591 4670 4600 + 1 4592 4601 4600 4670 + 1 4595 637 4597 4599 + 1 4600 4597 655 4672 + 1 4602 4599 4672 705 + 1 4595 4600 4602 4599 + 1 4595 4600 4599 4597 + 1 4600 4602 4599 4672 + 1 4600 4597 4672 4599 + 1 4601 656 4676 4670 + 1 4600 4670 4672 655 + 1 4602 4676 705 4672 + 1 4601 4600 4676 4602 + 1 4601 4600 4670 4676 + 1 4600 4602 4672 4676 + 1 4600 4670 4676 4672 + 1 1612 97 1617 1614 + 1 4651 1614 4659 651 + 1 4652 1617 654 4659 + 1 1612 4651 1617 4652 + 1 1612 4651 1614 1617 + 1 4651 4652 4659 1617 + 1 4651 1614 1617 4659 + 1 4660 651 4662 1774 + 1 1775 1774 1781 110 + 1 4673 4662 707 1781 + 1 4660 1775 4662 4673 + 1 4660 1775 1774 4662 + 1 1775 4673 1781 4662 + 1 1775 1774 4662 1781 + 1 4668 654 1912 4669 + 1 4678 4669 1914 707 + 1 1913 1912 123 1914 + 1 4668 4678 1912 1913 + 1 4668 4678 4669 1912 + 1 4678 1913 1914 1912 + 1 4678 4669 1912 1914 + 1 4653 655 4667 4671 + 1 4654 4671 4668 657 + 1 4652 4667 654 4668 + 1 4653 4654 4667 4652 + 1 4653 4654 4671 4667 + 1 4654 4652 4668 4667 + 1 4654 4671 4667 4668 + 1 4653 655 4660 4667 + 1 4651 4660 651 4659 + 1 4652 4667 4659 654 + 1 4653 4651 4652 4667 + 1 4653 4651 4667 4660 + 1 4651 4652 4667 4659 + 1 4651 4660 4659 4667 + 1 4671 657 4678 4668 + 1 4667 4668 4669 654 + 1 4673 4678 707 4669 + 1 4671 4667 4678 4673 + 1 4671 4667 4668 4678 + 1 4667 4673 4669 4678 + 1 4667 4668 4678 4669 + 1 4660 651 4659 4662 + 1 4667 4659 654 4669 + 1 4673 4662 4669 707 + 1 4660 4667 4673 4662 + 1 4660 4667 4662 4659 + 1 4667 4673 4662 4669 + 1 4667 4659 4669 4662 + 1 1789 111 1790 1792 + 1 4676 1790 705 4866 + 1 4677 1792 4866 711 + 1 1789 4676 4677 1792 + 1 1789 4676 1792 1790 + 1 4676 4677 1792 4866 + 1 4676 1790 4866 1792 + 1 4672 705 1779 4863 + 1 1775 1779 110 1781 + 1 4673 4863 1781 707 + 1 4672 1775 4673 4863 + 1 4672 1775 4863 1779 + 1 1775 4673 4863 1781 + 1 1775 1779 1781 4863 + 1 4679 711 4875 1915 + 1 4678 4875 707 1914 + 1 1913 1915 1914 123 + 1 4679 4678 1913 1915 + 1 4679 4678 1915 4875 + 1 4678 1913 1915 1914 + 1 4678 4875 1914 1915 + 1 4670 655 4671 4674 + 1 4675 4671 657 4679 + 1 4677 4674 4679 711 + 1 4670 4675 4677 4674 + 1 4670 4675 4674 4671 + 1 4675 4677 4674 4679 + 1 4675 4671 4679 4674 + 1 4670 655 4674 4672 + 1 4676 4672 4866 705 + 1 4677 4674 711 4866 + 1 4670 4676 4674 4677 + 1 4670 4676 4672 4674 + 1 4676 4677 4866 4674 + 1 4676 4672 4674 4866 + 1 4671 657 4679 4678 + 1 4674 4679 711 4875 + 1 4673 4678 4875 707 + 1 4671 4674 4673 4678 + 1 4671 4674 4678 4679 + 1 4674 4673 4678 4875 + 1 4674 4679 4875 4678 + 1 4672 705 4863 4866 + 1 4674 4866 4875 711 + 1 4673 4863 707 4875 + 1 4672 4674 4863 4673 + 1 4672 4674 4866 4863 + 1 4674 4673 4875 4863 + 1 4674 4866 4863 4875 + 1 840 17 844 845 + 1 2632 844 240 2665 + 1 2633 845 2665 241 + 1 840 2632 2633 845 + 1 840 2632 845 844 + 1 2632 2633 845 2665 + 1 2632 844 2665 845 + 1 2670 240 1714 2672 + 1 1722 1714 106 1724 + 1 4725 2672 1724 686 + 1 2670 1722 4725 2672 + 1 2670 1722 2672 1714 + 1 1722 4725 2672 1724 + 1 1722 1714 1724 2672 + 1 2676 241 2679 1728 + 1 4732 2679 686 1736 + 1 1733 1728 1736 107 + 1 2676 4732 1733 1728 + 1 2676 4732 1728 2679 + 1 4732 1733 1728 1736 + 1 4732 2679 1736 1728 + 1 2638 669 4723 2675 + 1 2639 4723 670 2676 + 1 2633 2675 2676 241 + 1 2638 2639 2633 2675 + 1 2638 2639 2675 4723 + 1 2639 2633 2675 2676 + 1 2639 4723 2676 2675 + 1 2638 669 2675 2670 + 1 2632 2670 2665 240 + 1 2633 2675 241 2665 + 1 2638 2632 2675 2633 + 1 2638 2632 2670 2675 + 1 2632 2633 2665 2675 + 1 2632 2670 2675 2665 + 1 4723 670 2676 4732 + 1 2675 2676 241 2679 + 1 4725 4732 2679 686 + 1 4723 2675 4725 4732 + 1 4723 2675 4732 2676 + 1 2675 4725 4732 2679 + 1 2675 2676 2679 4732 + 1 2670 240 2672 2665 + 1 2675 2665 2679 241 + 1 4725 2672 686 2679 + 1 2670 2675 2672 4725 + 1 2670 2675 2665 2672 + 1 2675 4725 2679 2672 + 1 2675 2665 2672 2679 + 1 1725 106 1715 1727 + 1 3063 1715 296 3065 + 1 4803 1727 3065 689 + 1 1725 3063 4803 1727 + 1 1725 3063 1727 1715 + 1 3063 4803 1727 3065 + 1 3063 1715 3065 1727 + 1 3056 296 900 3058 + 1 901 900 24 905 + 1 3067 3058 905 301 + 1 3056 901 3067 3058 + 1 3056 901 3058 900 + 1 901 3067 3058 905 + 1 901 900 905 3058 + 1 4808 689 3092 1922 + 1 3093 3092 301 1918 + 1 1924 1922 1918 124 + 1 4808 3093 1924 1922 + 1 4808 3093 1922 3092 + 1 3093 1924 1922 1918 + 1 3093 3092 1918 1922 + 1 3071 297 3074 3072 + 1 4805 3074 708 4808 + 1 4803 3072 4808 689 + 1 3071 4805 4803 3072 + 1 3071 4805 3072 3074 + 1 4805 4803 3072 4808 + 1 4805 3074 4808 3072 + 1 3071 297 3072 3056 + 1 3063 3056 3065 296 + 1 4803 3072 689 3065 + 1 3071 3063 3072 4803 + 1 3071 3063 3056 3072 + 1 3063 4803 3065 3072 + 1 3063 3056 3072 3065 + 1 3074 708 4808 3093 + 1 3072 4808 689 3092 + 1 3067 3093 3092 301 + 1 3074 3072 3067 3093 + 1 3074 3072 3093 4808 + 1 3072 3067 3093 3092 + 1 3072 4808 3092 3093 + 1 3056 296 3058 3065 + 1 3072 3065 3092 689 + 1 3067 3058 301 3092 + 1 3056 3072 3058 3067 + 1 3056 3072 3065 3058 + 1 3072 3067 3092 3058 + 1 3072 3065 3058 3092 + 1 1738 107 1741 1729 + 1 4815 1741 694 3178 + 1 3175 1729 3178 316 + 1 1738 4815 3175 1729 + 1 1738 4815 1729 1741 + 1 4815 3175 1729 3178 + 1 4815 1741 3178 1729 + 1 4824 694 1923 3202 + 1 1925 1923 124 1919 + 1 3203 3202 1919 320 + 1 4824 1925 3203 3202 + 1 4824 1925 3202 1923 + 1 1925 3203 3202 1919 + 1 1925 1923 1919 3202 + 1 3169 316 3172 920 + 1 3181 3172 320 924 + 1 921 920 924 27 + 1 3169 3181 921 920 + 1 3169 3181 920 3172 + 1 3181 921 920 924 + 1 3181 3172 924 920 + 1 4818 716 3188 3179 + 1 3185 3188 317 3169 + 1 3175 3179 3169 316 + 1 4818 3185 3175 3179 + 1 4818 3185 3179 3188 + 1 3185 3175 3179 3169 + 1 3185 3188 3169 3179 + 1 4818 716 3179 4824 + 1 4815 4824 3178 694 + 1 3175 3179 316 3178 + 1 4818 4815 3179 3175 + 1 4818 4815 4824 3179 + 1 4815 3175 3178 3179 + 1 4815 4824 3179 3178 + 1 3188 317 3169 3181 + 1 3179 3169 316 3172 + 1 3203 3181 3172 320 + 1 3188 3179 3203 3181 + 1 3188 3179 3181 3169 + 1 3179 3203 3181 3172 + 1 3179 3169 3172 3181 + 1 4824 694 3202 3178 + 1 3179 3178 3172 316 + 1 3203 3202 320 3172 + 1 4824 3179 3202 3203 + 1 4824 3179 3178 3202 + 1 3179 3203 3172 3202 + 1 3179 3178 3202 3172 + 1 1776 110 1780 1778 + 1 4742 1780 706 4811 + 1 4741 1778 4811 690 + 1 1776 4742 4741 1778 + 1 1776 4742 1778 1780 + 1 4742 4741 1778 4811 + 1 4742 1780 4811 1778 + 1 4747 706 1813 4816 + 1 1809 1813 113 1811 + 1 4745 4816 1811 691 + 1 4747 1809 4745 4816 + 1 4747 1809 4816 1813 + 1 1809 4745 4816 1811 + 1 1809 1813 1811 4816 + 1 4733 690 4809 1737 + 1 4734 4809 691 1738 + 1 1733 1737 1738 107 + 1 4733 4734 1733 1737 + 1 4733 4734 1737 4809 + 1 4734 1733 1737 1738 + 1 4734 4809 1738 1737 + 1 4739 673 4729 4744 + 1 4728 4729 670 4733 + 1 4741 4744 4733 690 + 1 4739 4728 4741 4744 + 1 4739 4728 4744 4729 + 1 4728 4741 4744 4733 + 1 4728 4729 4733 4744 + 1 4739 673 4744 4747 + 1 4742 4747 4811 706 + 1 4741 4744 690 4811 + 1 4739 4742 4744 4741 + 1 4739 4742 4747 4744 + 1 4742 4741 4811 4744 + 1 4742 4747 4744 4811 + 1 4729 670 4733 4734 + 1 4744 4733 690 4809 + 1 4745 4734 4809 691 + 1 4729 4744 4745 4734 + 1 4729 4744 4734 4733 + 1 4744 4745 4734 4809 + 1 4744 4733 4809 4734 + 1 4747 706 4816 4811 + 1 4744 4811 4809 690 + 1 4745 4816 691 4809 + 1 4747 4744 4816 4745 + 1 4747 4744 4811 4816 + 1 4744 4745 4809 4816 + 1 4744 4811 4816 4809 + 1 1776 110 1778 1777 + 1 4740 1777 4804 687 + 1 4741 1778 690 4804 + 1 1776 4740 1778 4741 + 1 1776 4740 1777 1778 + 1 4740 4741 4804 1778 + 1 4740 1777 1778 4804 + 1 4726 687 4799 1725 + 1 1722 1725 1724 106 + 1 4725 4799 686 1724 + 1 4726 1722 4799 4725 + 1 4726 1722 1725 4799 + 1 1722 4725 1724 4799 + 1 1722 1725 4799 1724 + 1 4733 690 1737 4801 + 1 4732 4801 1736 686 + 1 1733 1737 107 1736 + 1 4733 4732 1737 1733 + 1 4733 4732 4801 1737 + 1 4732 1733 1736 1737 + 1 4732 4801 1737 1736 + 1 4724 669 4727 4723 + 1 4728 4723 4733 670 + 1 4741 4727 690 4733 + 1 4724 4728 4727 4741 + 1 4724 4728 4723 4727 + 1 4728 4741 4733 4727 + 1 4728 4723 4727 4733 + 1 4724 669 4726 4727 + 1 4740 4726 687 4804 + 1 4741 4727 4804 690 + 1 4724 4740 4741 4727 + 1 4724 4740 4727 4726 + 1 4740 4741 4727 4804 + 1 4740 4726 4804 4727 + 1 4723 670 4732 4733 + 1 4727 4733 4801 690 + 1 4725 4732 686 4801 + 1 4723 4727 4732 4725 + 1 4723 4727 4733 4732 + 1 4727 4725 4801 4732 + 1 4727 4733 4732 4801 + 1 4726 687 4804 4799 + 1 4727 4804 690 4801 + 1 4725 4799 4801 686 + 1 4726 4727 4725 4799 + 1 4726 4727 4799 4804 + 1 4727 4725 4799 4801 + 1 4727 4804 4801 4799 + 1 1813 113 1811 1816 + 1 4816 1811 691 4818 + 1 4871 1816 4818 716 + 1 1813 4816 4871 1816 + 1 1813 4816 1816 1811 + 1 4816 4871 1816 4818 + 1 4816 1811 4818 1816 + 1 4809 691 1738 4815 + 1 1737 1738 107 1741 + 1 4810 4815 1741 694 + 1 4809 1737 4810 4815 + 1 4809 1737 4815 1738 + 1 1737 4810 4815 1741 + 1 1737 1738 1741 4815 + 1 4879 716 4824 1925 + 1 4823 4824 694 1923 + 1 1924 1925 1923 124 + 1 4879 4823 1924 1925 + 1 4879 4823 1925 4824 + 1 4823 1924 1925 1923 + 1 4823 4824 1923 1925 + 1 4811 690 4812 4813 + 1 4868 4812 708 4879 + 1 4871 4813 4879 716 + 1 4811 4868 4871 4813 + 1 4811 4868 4813 4812 + 1 4868 4871 4813 4879 + 1 4868 4812 4879 4813 + 1 4811 690 4813 4809 + 1 4816 4809 4818 691 + 1 4871 4813 716 4818 + 1 4811 4816 4813 4871 + 1 4811 4816 4809 4813 + 1 4816 4871 4818 4813 + 1 4816 4809 4813 4818 + 1 4812 708 4879 4823 + 1 4813 4879 716 4824 + 1 4810 4823 4824 694 + 1 4812 4813 4810 4823 + 1 4812 4813 4823 4879 + 1 4813 4810 4823 4824 + 1 4813 4879 4824 4823 + 1 4809 691 4815 4818 + 1 4813 4818 4824 716 + 1 4810 4815 694 4824 + 1 4809 4813 4815 4810 + 1 4809 4813 4818 4815 + 1 4813 4810 4824 4815 + 1 4813 4818 4815 4824 + 1 1725 106 1727 1724 + 1 4799 1724 4800 686 + 1 4803 1727 689 4800 + 1 1725 4799 1727 4803 + 1 1725 4799 1724 1727 + 1 4799 4803 4800 1727 + 1 4799 1724 1727 4800 + 1 4801 686 4802 1736 + 1 1737 1736 1741 107 + 1 4810 4802 694 1741 + 1 4801 1737 4802 4810 + 1 4801 1737 1736 4802 + 1 1737 4810 1741 4802 + 1 1737 1736 4802 1741 + 1 4808 689 1922 4807 + 1 4823 4807 1923 694 + 1 1924 1922 124 1923 + 1 4808 4823 1922 1924 + 1 4808 4823 4807 1922 + 1 4823 1924 1923 1922 + 1 4823 4807 1922 1923 + 1 4804 690 4806 4812 + 1 4805 4812 4808 708 + 1 4803 4806 689 4808 + 1 4804 4805 4806 4803 + 1 4804 4805 4812 4806 + 1 4805 4803 4808 4806 + 1 4805 4812 4806 4808 + 1 4804 690 4801 4806 + 1 4799 4801 686 4800 + 1 4803 4806 4800 689 + 1 4804 4799 4803 4806 + 1 4804 4799 4806 4801 + 1 4799 4803 4806 4800 + 1 4799 4801 4800 4806 + 1 4812 708 4823 4808 + 1 4806 4808 4807 689 + 1 4810 4823 694 4807 + 1 4812 4806 4823 4810 + 1 4812 4806 4808 4823 + 1 4806 4810 4807 4823 + 1 4806 4808 4823 4807 + 1 4801 686 4800 4802 + 1 4806 4800 689 4807 + 1 4810 4802 4807 694 + 1 4801 4806 4810 4802 + 1 4801 4806 4802 4800 + 1 4806 4810 4802 4807 + 1 4806 4800 4807 4802 + 1 909 25 911 910 + 1 3110 910 3116 306 + 1 3111 911 307 3116 + 1 909 3110 911 3111 + 1 909 3110 910 911 + 1 3110 3111 3116 911 + 1 3110 910 911 3116 + 1 3119 306 3120 1909 + 1 1915 1909 1917 123 + 1 4893 3120 728 1917 + 1 3119 1915 3120 4893 + 1 3119 1915 1909 3120 + 1 1915 4893 1917 3120 + 1 1915 1909 3120 1917 + 1 3124 307 1928 3125 + 1 4895 3125 1936 728 + 1 1934 1928 125 1936 + 1 3124 4895 1928 1934 + 1 3124 4895 3125 1928 + 1 4895 1934 1936 1928 + 1 4895 3125 1928 1936 + 1 3114 711 3123 4892 + 1 3115 4892 3124 712 + 1 3111 3123 307 3124 + 1 3114 3115 3123 3111 + 1 3114 3115 4892 3123 + 1 3115 3111 3124 3123 + 1 3115 4892 3123 3124 + 1 3114 711 3119 3123 + 1 3110 3119 306 3116 + 1 3111 3123 3116 307 + 1 3114 3110 3111 3123 + 1 3114 3110 3123 3119 + 1 3110 3111 3123 3116 + 1 3110 3119 3116 3123 + 1 4892 712 4895 3124 + 1 3123 3124 3125 307 + 1 4893 4895 728 3125 + 1 4892 3123 4895 4893 + 1 4892 3123 3124 4895 + 1 3123 4893 3125 4895 + 1 3123 3124 4895 3125 + 1 3119 306 3116 3120 + 1 3123 3116 307 3125 + 1 4893 3120 3125 728 + 1 3119 3123 4893 3120 + 1 3119 3123 3120 3116 + 1 3123 4893 3120 3125 + 1 3123 3116 3125 3120 + 1 1914 123 1916 1908 + 1 3089 1908 3090 300 + 1 4876 1916 727 3090 + 1 1914 3089 1916 4876 + 1 1914 3089 1908 1916 + 1 3089 4876 3090 1916 + 1 3089 1908 1916 3090 + 1 3066 300 3086 904 + 1 901 904 905 24 + 1 3067 3086 301 905 + 1 3066 901 3086 3067 + 1 3066 901 904 3086 + 1 901 3067 905 3086 + 1 901 904 3086 905 + 1 4880 727 1926 3094 + 1 3093 3094 1918 301 + 1 1924 1926 124 1918 + 1 4880 3093 1926 1924 + 1 4880 3093 3094 1926 + 1 3093 1924 1918 1926 + 1 3093 3094 1926 1918 + 1 3073 297 3075 3074 + 1 4873 3074 4880 708 + 1 4876 3075 727 4880 + 1 3073 4873 3075 4876 + 1 3073 4873 3074 3075 + 1 4873 4876 4880 3075 + 1 4873 3074 3075 4880 + 1 3073 297 3066 3075 + 1 3089 3066 300 3090 + 1 4876 3075 3090 727 + 1 3073 3089 4876 3075 + 1 3073 3089 3075 3066 + 1 3089 4876 3075 3090 + 1 3089 3066 3090 3075 + 1 3074 708 3093 4880 + 1 3075 4880 3094 727 + 1 3067 3093 301 3094 + 1 3074 3075 3093 3067 + 1 3074 3075 4880 3093 + 1 3075 3067 3094 3093 + 1 3075 4880 3093 3094 + 1 3066 300 3090 3086 + 1 3075 3090 727 3094 + 1 3067 3086 3094 301 + 1 3066 3075 3067 3086 + 1 3066 3075 3086 3090 + 1 3075 3067 3086 3094 + 1 3075 3090 3094 3086 + 1 1935 125 1929 1937 + 1 4901 1937 3209 729 + 1 3208 1929 321 3209 + 1 1935 4901 1929 3208 + 1 1935 4901 1937 1929 + 1 4901 3208 3209 1929 + 1 4901 1937 1929 3209 + 1 4900 729 3204 1927 + 1 1925 1927 1919 124 + 1 3203 3204 320 1919 + 1 4900 1925 3204 3203 + 1 4900 1925 1927 3204 + 1 1925 3203 1919 3204 + 1 1925 1927 3204 1919 + 1 3182 321 925 3200 + 1 3181 3200 924 320 + 1 921 925 27 924 + 1 3182 3181 925 921 + 1 3182 3181 3200 925 + 1 3181 921 924 925 + 1 3181 3200 925 924 + 1 4899 716 3207 3188 + 1 3189 3188 3182 317 + 1 3208 3207 321 3182 + 1 4899 3189 3207 3208 + 1 4899 3189 3188 3207 + 1 3189 3208 3182 3207 + 1 3189 3188 3207 3182 + 1 4899 716 4900 3207 + 1 4901 4900 729 3209 + 1 3208 3207 3209 321 + 1 4899 4901 3208 3207 + 1 4899 4901 3207 4900 + 1 4901 3208 3207 3209 + 1 4901 4900 3209 3207 + 1 3188 317 3181 3182 + 1 3207 3182 3200 321 + 1 3203 3181 320 3200 + 1 3188 3207 3181 3203 + 1 3188 3207 3182 3181 + 1 3207 3203 3200 3181 + 1 3207 3182 3181 3200 + 1 4900 729 3209 3204 + 1 3207 3209 321 3200 + 1 3203 3204 3200 320 + 1 4900 3207 3203 3204 + 1 4900 3207 3204 3209 + 1 3207 3203 3204 3200 + 1 3207 3209 3200 3204 + 1 1779 110 1783 1780 + 1 4862 1780 4869 706 + 1 4864 1783 709 4869 + 1 1779 4862 1783 4864 + 1 1779 4862 1780 1783 + 1 4862 4864 4869 1783 + 1 4862 1780 1783 4869 + 1 4870 706 4872 1813 + 1 1814 1813 1817 113 + 1 4891 4872 717 1817 + 1 4870 1814 4872 4891 + 1 4870 1814 1813 4872 + 1 1814 4891 1817 4872 + 1 1814 1813 4872 1817 + 1 4884 709 1933 4886 + 1 4894 4886 1935 717 + 1 1934 1933 125 1935 + 1 4884 4894 1933 1934 + 1 4884 4894 4886 1933 + 1 4894 1934 1935 1933 + 1 4894 4886 1933 1935 + 1 4865 710 4882 4890 + 1 4867 4890 4884 712 + 1 4864 4882 709 4884 + 1 4865 4867 4882 4864 + 1 4865 4867 4890 4882 + 1 4867 4864 4884 4882 + 1 4867 4890 4882 4884 + 1 4865 710 4870 4882 + 1 4862 4870 706 4869 + 1 4864 4882 4869 709 + 1 4865 4862 4864 4882 + 1 4865 4862 4882 4870 + 1 4862 4864 4882 4869 + 1 4862 4870 4869 4882 + 1 4890 712 4894 4884 + 1 4882 4884 4886 709 + 1 4891 4894 717 4886 + 1 4890 4882 4894 4891 + 1 4890 4882 4884 4894 + 1 4882 4891 4886 4894 + 1 4882 4884 4894 4886 + 1 4870 706 4869 4872 + 1 4882 4869 709 4886 + 1 4891 4872 4886 717 + 1 4870 4882 4891 4872 + 1 4870 4882 4872 4869 + 1 4882 4891 4872 4886 + 1 4882 4869 4886 4872 + 1 1779 110 1781 1783 + 1 4863 1781 707 4874 + 1 4864 1783 4874 709 + 1 1779 4863 4864 1783 + 1 1779 4863 1783 1781 + 1 4863 4864 1783 4874 + 1 4863 1781 4874 1783 + 1 4875 707 1914 4877 + 1 1915 1914 123 1917 + 1 4893 4877 1917 728 + 1 4875 1915 4893 4877 + 1 4875 1915 4877 1914 + 1 1915 4893 4877 1917 + 1 1915 1914 1917 4877 + 1 4884 709 4888 1933 + 1 4895 4888 728 1936 + 1 1934 1933 1936 125 + 1 4884 4895 1934 1933 + 1 4884 4895 1933 4888 + 1 4895 1934 1933 1936 + 1 4895 4888 1936 1933 + 1 4866 711 4892 4883 + 1 4867 4892 712 4884 + 1 4864 4883 4884 709 + 1 4866 4867 4864 4883 + 1 4866 4867 4883 4892 + 1 4867 4864 4883 4884 + 1 4867 4892 4884 4883 + 1 4866 711 4883 4875 + 1 4863 4875 4874 707 + 1 4864 4883 709 4874 + 1 4866 4863 4883 4864 + 1 4866 4863 4875 4883 + 1 4863 4864 4874 4883 + 1 4863 4875 4883 4874 + 1 4892 712 4884 4895 + 1 4883 4884 709 4888 + 1 4893 4895 4888 728 + 1 4892 4883 4893 4895 + 1 4892 4883 4895 4884 + 1 4883 4893 4895 4888 + 1 4883 4884 4888 4895 + 1 4875 707 4877 4874 + 1 4883 4874 4888 709 + 1 4893 4877 728 4888 + 1 4875 4883 4877 4893 + 1 4875 4883 4874 4877 + 1 4883 4893 4888 4877 + 1 4883 4874 4877 4888 + 1 1813 113 1816 1817 + 1 4872 1817 4899 717 + 1 4871 1816 716 4899 + 1 1813 4872 1816 4871 + 1 1813 4872 1817 1816 + 1 4872 4871 4899 1816 + 1 4872 1817 1816 4899 + 1 4886 717 4901 1935 + 1 1933 1935 1937 125 + 1 4889 4901 729 1937 + 1 4886 1933 4901 4889 + 1 4886 1933 1935 4901 + 1 1933 4889 1937 4901 + 1 1933 1935 4901 1937 + 1 4879 716 1925 4900 + 1 4881 4900 1927 729 + 1 1924 1925 124 1927 + 1 4879 4881 1925 1924 + 1 4879 4881 4900 1925 + 1 4881 1924 1927 1925 + 1 4881 4900 1925 1927 + 1 4869 709 4885 4878 + 1 4868 4878 4879 708 + 1 4871 4885 716 4879 + 1 4869 4868 4885 4871 + 1 4869 4868 4878 4885 + 1 4868 4871 4879 4885 + 1 4868 4878 4885 4879 + 1 4869 709 4886 4885 + 1 4872 4886 717 4899 + 1 4871 4885 4899 716 + 1 4869 4872 4871 4885 + 1 4869 4872 4885 4886 + 1 4872 4871 4885 4899 + 1 4872 4886 4899 4885 + 1 4878 708 4881 4879 + 1 4885 4879 4900 716 + 1 4889 4881 729 4900 + 1 4878 4885 4881 4889 + 1 4878 4885 4879 4881 + 1 4885 4889 4900 4881 + 1 4885 4879 4881 4900 + 1 4886 717 4899 4901 + 1 4885 4899 716 4900 + 1 4889 4901 4900 729 + 1 4886 4885 4889 4901 + 1 4886 4885 4901 4899 + 1 4885 4889 4901 4900 + 1 4885 4899 4900 4901 + 1 1914 123 1917 1916 + 1 4877 1917 728 4911 + 1 4876 1916 4911 727 + 1 1914 4877 4876 1916 + 1 1914 4877 1916 1917 + 1 4877 4876 1916 4911 + 1 4877 1917 4911 1916 + 1 4888 728 1936 4913 + 1 1933 1936 125 1937 + 1 4889 4913 1937 729 + 1 4888 1933 4889 4913 + 1 4888 1933 4913 1936 + 1 1933 4889 4913 1937 + 1 1933 1936 1937 4913 + 1 4880 727 4912 1926 + 1 4881 4912 729 1927 + 1 1924 1926 1927 124 + 1 4880 4881 1924 1926 + 1 4880 4881 1926 4912 + 1 4881 1924 1926 1927 + 1 4881 4912 1927 1926 + 1 4874 709 4878 4887 + 1 4873 4878 708 4880 + 1 4876 4887 4880 727 + 1 4874 4873 4876 4887 + 1 4874 4873 4887 4878 + 1 4873 4876 4887 4880 + 1 4873 4878 4880 4887 + 1 4874 709 4887 4888 + 1 4877 4888 4911 728 + 1 4876 4887 727 4911 + 1 4874 4877 4887 4876 + 1 4874 4877 4888 4887 + 1 4877 4876 4911 4887 + 1 4877 4888 4887 4911 + 1 4878 708 4880 4881 + 1 4887 4880 727 4912 + 1 4889 4881 4912 729 + 1 4878 4887 4889 4881 + 1 4878 4887 4881 4880 + 1 4887 4889 4881 4912 + 1 4887 4880 4912 4881 + 1 4888 728 4913 4911 + 1 4887 4911 4912 727 + 1 4889 4913 729 4912 + 1 4888 4887 4913 4889 + 1 4888 4887 4911 4913 + 1 4887 4889 4912 4913 + 1 4887 4911 4913 4912 + 1 746 4 748 749 + 1 2020 748 144 2030 + 1 2021 749 2030 145 + 1 746 2020 2021 749 + 1 746 2020 749 748 + 1 2020 2021 749 2030 + 1 2020 748 2030 749 + 1 2032 144 1078 2033 + 1 1081 1078 46 1082 + 1 3592 2033 1082 414 + 1 2032 1081 3592 2033 + 1 2032 1081 2033 1078 + 1 1081 3592 2033 1082 + 1 1081 1078 1082 2033 + 1 2035 145 2037 1086 + 1 3599 2037 414 1090 + 1 1088 1086 1090 47 + 1 2035 3599 1088 1086 + 1 2035 3599 1086 2037 + 1 3599 1088 1086 1090 + 1 3599 2037 1090 1086 + 1 2024 404 3590 2034 + 1 2025 3590 405 2035 + 1 2021 2034 2035 145 + 1 2024 2025 2021 2034 + 1 2024 2025 2034 3590 + 1 2025 2021 2034 2035 + 1 2025 3590 2035 2034 + 1 2024 404 2034 2032 + 1 2020 2032 2030 144 + 1 2021 2034 145 2030 + 1 2024 2020 2034 2021 + 1 2024 2020 2032 2034 + 1 2020 2021 2030 2034 + 1 2020 2032 2034 2030 + 1 3590 405 2035 3599 + 1 2034 2035 145 2037 + 1 3592 3599 2037 414 + 1 3590 2034 3592 3599 + 1 3590 2034 3599 2035 + 1 2034 3592 3599 2037 + 1 2034 2035 2037 3599 + 1 2032 144 2033 2030 + 1 2034 2030 2037 145 + 1 3592 2033 414 2037 + 1 2032 2034 2033 3592 + 1 2032 2034 2030 2033 + 1 2034 3592 2037 2033 + 1 2034 2030 2033 2037 + 1 1084 46 1079 1085 + 1 2918 1079 276 2919 + 1 3641 1085 2919 417 + 1 1084 2918 3641 1085 + 1 1084 2918 1085 1079 + 1 2918 3641 1085 2919 + 1 2918 1079 2919 1085 + 1 2915 276 880 2916 + 1 884 880 22 886 + 1 2940 2916 886 282 + 1 2915 884 2940 2916 + 1 2915 884 2916 880 + 1 884 2940 2916 886 + 1 884 880 886 2916 + 1 3647 417 2958 1870 + 1 2959 2958 282 1868 + 1 1872 1870 1868 119 + 1 3647 2959 1872 1870 + 1 3647 2959 1870 2958 + 1 2959 1872 1870 1868 + 1 2959 2958 1868 1870 + 1 2942 280 2947 2943 + 1 3644 2947 621 3647 + 1 3641 2943 3647 417 + 1 2942 3644 3641 2943 + 1 2942 3644 2943 2947 + 1 3644 3641 2943 3647 + 1 3644 2947 3647 2943 + 1 2942 280 2943 2915 + 1 2918 2915 2919 276 + 1 3641 2943 417 2919 + 1 2942 2918 2943 3641 + 1 2942 2918 2915 2943 + 1 2918 3641 2919 2943 + 1 2918 2915 2943 2919 + 1 2947 621 3647 2959 + 1 2943 3647 417 2958 + 1 2940 2959 2958 282 + 1 2947 2943 2940 2959 + 1 2947 2943 2959 3647 + 1 2943 2940 2959 2958 + 1 2943 3647 2958 2959 + 1 2915 276 2916 2919 + 1 2943 2919 2958 417 + 1 2940 2916 282 2958 + 1 2915 2943 2916 2940 + 1 2915 2943 2919 2916 + 1 2943 2940 2958 2916 + 1 2943 2919 2916 2958 + 1 1092 47 1094 1087 + 1 3654 1094 421 2972 + 1 2970 1087 2972 284 + 1 1092 3654 2970 1087 + 1 1092 3654 1087 1094 + 1 3654 2970 1087 2972 + 1 3654 1094 2972 1087 + 1 3660 421 1871 3018 + 1 1873 1871 119 1869 + 1 3019 3018 1869 290 + 1 3660 1873 3019 3018 + 1 3660 1873 3018 1871 + 1 1873 3019 3018 1869 + 1 1873 1871 1869 3018 + 1 2967 284 2969 888 + 1 2984 2969 290 894 + 1 890 888 894 23 + 1 2967 2984 890 888 + 1 2967 2984 888 2969 + 1 2984 890 888 894 + 1 2984 2969 894 888 + 1 3657 626 2990 2973 + 1 2985 2990 286 2967 + 1 2970 2973 2967 284 + 1 3657 2985 2970 2973 + 1 3657 2985 2973 2990 + 1 2985 2970 2973 2967 + 1 2985 2990 2967 2973 + 1 3657 626 2973 3660 + 1 3654 3660 2972 421 + 1 2970 2973 284 2972 + 1 3657 3654 2973 2970 + 1 3657 3654 3660 2973 + 1 3654 2970 2972 2973 + 1 3654 3660 2973 2972 + 1 2990 286 2967 2984 + 1 2973 2967 284 2969 + 1 3019 2984 2969 290 + 1 2990 2973 3019 2984 + 1 2990 2973 2984 2967 + 1 2973 3019 2984 2969 + 1 2973 2967 2969 2984 + 1 3660 421 3018 2972 + 1 2973 2972 2969 284 + 1 3019 3018 290 2969 + 1 3660 2973 3018 3019 + 1 3660 2973 2972 3018 + 1 2973 3019 2969 3018 + 1 2973 2972 3018 2969 + 1 1531 91 1538 1533 + 1 3612 1538 618 3650 + 1 3610 1533 3650 418 + 1 1531 3612 3610 1533 + 1 1531 3612 1533 1538 + 1 3612 3610 1533 3650 + 1 3612 1538 3650 1533 + 1 3617 618 1550 3655 + 1 1544 1550 92 1546 + 1 3615 3655 1546 419 + 1 3617 1544 3615 3655 + 1 3617 1544 3655 1550 + 1 1544 3615 3655 1546 + 1 1544 1550 1546 3655 + 1 3600 418 3648 1091 + 1 3601 3648 419 1092 + 1 1088 1091 1092 47 + 1 3600 3601 1088 1091 + 1 3600 3601 1091 3648 + 1 3601 1088 1091 1092 + 1 3601 3648 1092 1091 + 1 3608 409 3596 3614 + 1 3595 3596 405 3600 + 1 3610 3614 3600 418 + 1 3608 3595 3610 3614 + 1 3608 3595 3614 3596 + 1 3595 3610 3614 3600 + 1 3595 3596 3600 3614 + 1 3608 409 3614 3617 + 1 3612 3617 3650 618 + 1 3610 3614 418 3650 + 1 3608 3612 3614 3610 + 1 3608 3612 3617 3614 + 1 3612 3610 3650 3614 + 1 3612 3617 3614 3650 + 1 3596 405 3600 3601 + 1 3614 3600 418 3648 + 1 3615 3601 3648 419 + 1 3596 3614 3615 3601 + 1 3596 3614 3601 3600 + 1 3614 3615 3601 3648 + 1 3614 3600 3648 3601 + 1 3617 618 3655 3650 + 1 3614 3650 3648 418 + 1 3615 3655 419 3648 + 1 3617 3614 3655 3615 + 1 3617 3614 3650 3655 + 1 3614 3615 3648 3655 + 1 3614 3650 3655 3648 + 1 1531 91 1533 1532 + 1 3609 1532 3642 416 + 1 3610 1533 418 3642 + 1 1531 3609 1533 3610 + 1 1531 3609 1532 1533 + 1 3609 3610 3642 1533 + 1 3609 1532 1533 3642 + 1 3593 416 3635 1084 + 1 1081 1084 1082 46 + 1 3592 3635 414 1082 + 1 3593 1081 3635 3592 + 1 3593 1081 1084 3635 + 1 1081 3592 1082 3635 + 1 1081 1084 3635 1082 + 1 3600 418 1091 3637 + 1 3599 3637 1090 414 + 1 1088 1091 47 1090 + 1 3600 3599 1091 1088 + 1 3600 3599 3637 1091 + 1 3599 1088 1090 1091 + 1 3599 3637 1091 1090 + 1 3591 404 3594 3590 + 1 3595 3590 3600 405 + 1 3610 3594 418 3600 + 1 3591 3595 3594 3610 + 1 3591 3595 3590 3594 + 1 3595 3610 3600 3594 + 1 3595 3590 3594 3600 + 1 3591 404 3593 3594 + 1 3609 3593 416 3642 + 1 3610 3594 3642 418 + 1 3591 3609 3610 3594 + 1 3591 3609 3594 3593 + 1 3609 3610 3594 3642 + 1 3609 3593 3642 3594 + 1 3590 405 3599 3600 + 1 3594 3600 3637 418 + 1 3592 3599 414 3637 + 1 3590 3594 3599 3592 + 1 3590 3594 3600 3599 + 1 3594 3592 3637 3599 + 1 3594 3600 3599 3637 + 1 3593 416 3642 3635 + 1 3594 3642 418 3637 + 1 3592 3635 3637 414 + 1 3593 3594 3592 3635 + 1 3593 3594 3635 3642 + 1 3594 3592 3635 3637 + 1 3594 3642 3637 3635 + 1 1550 92 1546 1555 + 1 3655 1546 419 3657 + 1 4511 1555 3657 626 + 1 1550 3655 4511 1555 + 1 1550 3655 1555 1546 + 1 3655 4511 1555 3657 + 1 3655 1546 3657 1555 + 1 3648 419 1092 3654 + 1 1091 1092 47 1094 + 1 3649 3654 1094 421 + 1 3648 1091 3649 3654 + 1 3648 1091 3654 1092 + 1 1091 3649 3654 1094 + 1 1091 1092 1094 3654 + 1 4522 626 3660 1873 + 1 3659 3660 421 1871 + 1 1872 1873 1871 119 + 1 4522 3659 1872 1873 + 1 4522 3659 1873 3660 + 1 3659 1872 1873 1871 + 1 3659 3660 1871 1873 + 1 3650 418 3651 3652 + 1 4509 3651 621 4522 + 1 4511 3652 4522 626 + 1 3650 4509 4511 3652 + 1 3650 4509 3652 3651 + 1 4509 4511 3652 4522 + 1 4509 3651 4522 3652 + 1 3650 418 3652 3648 + 1 3655 3648 3657 419 + 1 4511 3652 626 3657 + 1 3650 3655 3652 4511 + 1 3650 3655 3648 3652 + 1 3655 4511 3657 3652 + 1 3655 3648 3652 3657 + 1 3651 621 4522 3659 + 1 3652 4522 626 3660 + 1 3649 3659 3660 421 + 1 3651 3652 3649 3659 + 1 3651 3652 3659 4522 + 1 3652 3649 3659 3660 + 1 3652 4522 3660 3659 + 1 3648 419 3654 3657 + 1 3652 3657 3660 626 + 1 3649 3654 421 3660 + 1 3648 3652 3654 3649 + 1 3648 3652 3657 3654 + 1 3652 3649 3660 3654 + 1 3652 3657 3654 3660 + 1 1084 46 1085 1082 + 1 3635 1082 3636 414 + 1 3641 1085 417 3636 + 1 1084 3635 1085 3641 + 1 1084 3635 1082 1085 + 1 3635 3641 3636 1085 + 1 3635 1082 1085 3636 + 1 3637 414 3638 1090 + 1 1091 1090 1094 47 + 1 3649 3638 421 1094 + 1 3637 1091 3638 3649 + 1 3637 1091 1090 3638 + 1 1091 3649 1094 3638 + 1 1091 1090 3638 1094 + 1 3647 417 1870 3646 + 1 3659 3646 1871 421 + 1 1872 1870 119 1871 + 1 3647 3659 1870 1872 + 1 3647 3659 3646 1870 + 1 3659 1872 1871 1870 + 1 3659 3646 1870 1871 + 1 3642 418 3645 3651 + 1 3644 3651 3647 621 + 1 3641 3645 417 3647 + 1 3642 3644 3645 3641 + 1 3642 3644 3651 3645 + 1 3644 3641 3647 3645 + 1 3644 3651 3645 3647 + 1 3642 418 3637 3645 + 1 3635 3637 414 3636 + 1 3641 3645 3636 417 + 1 3642 3635 3641 3645 + 1 3642 3635 3645 3637 + 1 3635 3641 3645 3636 + 1 3635 3637 3636 3645 + 1 3651 621 3659 3647 + 1 3645 3647 3646 417 + 1 3649 3659 421 3646 + 1 3651 3645 3659 3649 + 1 3651 3645 3647 3659 + 1 3645 3649 3646 3659 + 1 3645 3647 3659 3646 + 1 3637 414 3636 3638 + 1 3645 3636 417 3646 + 1 3649 3638 3646 421 + 1 3637 3645 3649 3638 + 1 3637 3645 3638 3636 + 1 3645 3649 3638 3646 + 1 3645 3636 3646 3638 + 1 885 22 881 887 + 1 2921 881 277 2922 + 1 2950 887 2922 283 + 1 885 2921 2950 887 + 1 885 2921 887 881 + 1 2921 2950 887 2922 + 1 2921 881 2922 887 + 1 2924 277 1177 2925 + 1 1182 1177 58 1183 + 1 3908 2925 1183 475 + 1 2924 1182 3908 2925 + 1 2924 1182 2925 1177 + 1 1182 3908 2925 1183 + 1 1182 1177 1183 2925 + 1 2965 283 2963 1878 + 1 3912 2963 475 1881 + 1 1883 1878 1881 120 + 1 2965 3912 1883 1878 + 1 2965 3912 1878 2963 + 1 3912 1883 1878 1881 + 1 3912 2963 1881 1878 + 1 2951 474 3910 2962 + 1 2956 3910 679 2965 + 1 2950 2962 2965 283 + 1 2951 2956 2950 2962 + 1 2951 2956 2962 3910 + 1 2956 2950 2962 2965 + 1 2956 3910 2965 2962 + 1 2951 474 2962 2924 + 1 2921 2924 2922 277 + 1 2950 2962 283 2922 + 1 2951 2921 2962 2950 + 1 2951 2921 2924 2962 + 1 2921 2950 2922 2962 + 1 2921 2924 2962 2922 + 1 3910 679 2965 3912 + 1 2962 2965 283 2963 + 1 3908 3912 2963 475 + 1 3910 2962 3908 3912 + 1 3910 2962 3912 2965 + 1 2962 3908 3912 2963 + 1 2962 2965 2963 3912 + 1 2924 277 2925 2922 + 1 2962 2922 2963 283 + 1 3908 2925 475 2963 + 1 2924 2962 2925 3908 + 1 2924 2962 2922 2925 + 1 2962 3908 2963 2925 + 1 2962 2922 2925 2963 + 1 1179 58 1176 1180 + 1 2090 1176 156 2091 + 1 3821 1180 2091 472 + 1 1179 2090 3821 1180 + 1 1179 2090 1180 1176 + 1 2090 3821 1180 2091 + 1 2090 1176 2091 1180 + 1 2073 156 760 2088 + 1 758 760 7 762 + 1 2075 2088 762 158 + 1 2073 758 2075 2088 + 1 2073 758 2088 760 + 1 758 2075 2088 762 + 1 758 760 762 2088 + 1 3835 472 2098 1196 + 1 2097 2098 158 1193 + 1 1195 1196 1193 60 + 1 3835 2097 1195 1196 + 1 3835 2097 1196 2098 + 1 2097 1195 1196 1193 + 1 2097 2098 1193 1196 + 1 2079 154 2081 2082 + 1 3817 2081 459 3835 + 1 3821 2082 3835 472 + 1 2079 3817 3821 2082 + 1 2079 3817 2082 2081 + 1 3817 3821 2082 3835 + 1 3817 2081 3835 2082 + 1 2079 154 2082 2073 + 1 2090 2073 2091 156 + 1 3821 2082 472 2091 + 1 2079 2090 2082 3821 + 1 2079 2090 2073 2082 + 1 2090 3821 2091 2082 + 1 2090 2073 2082 2091 + 1 2081 459 3835 2097 + 1 2082 3835 472 2098 + 1 2075 2097 2098 158 + 1 2081 2082 2075 2097 + 1 2081 2082 2097 3835 + 1 2082 2075 2097 2098 + 1 2082 3835 2098 2097 + 1 2073 156 2088 2091 + 1 2082 2091 2098 472 + 1 2075 2088 158 2098 + 1 2073 2082 2088 2075 + 1 2073 2082 2091 2088 + 1 2082 2075 2098 2088 + 1 2082 2091 2088 2098 + 1 1885 120 1882 1879 + 1 3937 1882 482 3192 + 1 3193 1879 3192 318 + 1 1885 3937 3193 1879 + 1 1885 3937 1879 1882 + 1 3937 3193 1879 3192 + 1 3937 1882 3192 1879 + 1 3933 482 1199 3161 + 1 1198 1199 60 1194 + 1 3160 3161 1194 314 + 1 3933 1198 3160 3161 + 1 3933 1198 3161 1199 + 1 1198 3160 3161 1194 + 1 1198 1199 1194 3161 + 1 3170 318 3158 922 + 1 3157 3158 314 918 + 1 920 922 918 27 + 1 3170 3157 920 922 + 1 3170 3157 922 3158 + 1 3157 920 922 918 + 1 3157 3158 918 922 + 1 3935 481 3173 3191 + 1 3176 3173 316 3170 + 1 3193 3191 3170 318 + 1 3935 3176 3193 3191 + 1 3935 3176 3191 3173 + 1 3176 3193 3191 3170 + 1 3176 3173 3170 3191 + 1 3935 481 3191 3933 + 1 3937 3933 3192 482 + 1 3193 3191 318 3192 + 1 3935 3937 3191 3193 + 1 3935 3937 3933 3191 + 1 3937 3193 3192 3191 + 1 3937 3933 3191 3192 + 1 3173 316 3170 3157 + 1 3191 3170 318 3158 + 1 3160 3157 3158 314 + 1 3173 3191 3160 3157 + 1 3173 3191 3157 3170 + 1 3191 3160 3157 3158 + 1 3191 3170 3158 3157 + 1 3933 482 3161 3192 + 1 3191 3192 3158 318 + 1 3160 3161 314 3158 + 1 3933 3191 3161 3160 + 1 3933 3191 3192 3161 + 1 3191 3160 3158 3161 + 1 3191 3192 3161 3158 + 1 1163 56 1165 1166 + 1 3857 1165 465 3870 + 1 3858 1166 3870 466 + 1 1163 3857 3858 1166 + 1 1163 3857 1166 1165 + 1 3857 3858 1166 3870 + 1 3857 1165 3870 1166 + 1 3873 465 1730 3875 + 1 1734 1730 107 1739 + 1 4760 3875 1739 692 + 1 3873 1734 4760 3875 + 1 3873 1734 3875 1730 + 1 1734 4760 3875 1739 + 1 1734 1730 1739 3875 + 1 3882 466 3883 1880 + 1 4766 3883 692 1885 + 1 1883 1880 1885 120 + 1 3882 4766 1883 1880 + 1 3882 4766 1880 3883 + 1 4766 1883 1880 1885 + 1 4766 3883 1885 1880 + 1 3862 677 4757 3881 + 1 3863 4757 679 3882 + 1 3858 3881 3882 466 + 1 3862 3863 3858 3881 + 1 3862 3863 3881 4757 + 1 3863 3858 3881 3882 + 1 3863 4757 3882 3881 + 1 3862 677 3881 3873 + 1 3857 3873 3870 465 + 1 3858 3881 466 3870 + 1 3862 3857 3881 3858 + 1 3862 3857 3873 3881 + 1 3857 3858 3870 3881 + 1 3857 3873 3881 3870 + 1 4757 679 3882 4766 + 1 3881 3882 466 3883 + 1 4760 4766 3883 692 + 1 4757 3881 4760 4766 + 1 4757 3881 4766 3882 + 1 3881 4760 4766 3883 + 1 3881 3882 3883 4766 + 1 3873 465 3875 3870 + 1 3881 3870 3883 466 + 1 4760 3875 692 3883 + 1 3873 3881 3875 4760 + 1 3873 3881 3870 3875 + 1 3881 4760 3883 3875 + 1 3881 3870 3875 3883 + 1 1163 56 1166 1157 + 1 3819 1157 3820 457 + 1 3858 1166 466 3820 + 1 1163 3819 1166 3858 + 1 1163 3819 1157 1166 + 1 3819 3858 3820 1166 + 1 3819 1157 1166 3820 + 1 3823 457 3824 1179 + 1 1182 1179 1183 58 + 1 3908 3824 475 1183 + 1 3823 1182 3824 3908 + 1 3823 1182 1179 3824 + 1 1182 3908 1183 3824 + 1 1182 1179 3824 1183 + 1 3882 466 1880 3878 + 1 3912 3878 1881 475 + 1 1883 1880 120 1881 + 1 3882 3912 1880 1883 + 1 3882 3912 3878 1880 + 1 3912 1883 1881 1880 + 1 3912 3878 1880 1881 + 1 3859 474 3877 3910 + 1 3863 3910 3882 679 + 1 3858 3877 466 3882 + 1 3859 3863 3877 3858 + 1 3859 3863 3910 3877 + 1 3863 3858 3882 3877 + 1 3863 3910 3877 3882 + 1 3859 474 3823 3877 + 1 3819 3823 457 3820 + 1 3858 3877 3820 466 + 1 3859 3819 3858 3877 + 1 3859 3819 3877 3823 + 1 3819 3858 3877 3820 + 1 3819 3823 3820 3877 + 1 3910 679 3912 3882 + 1 3877 3882 3878 466 + 1 3908 3912 475 3878 + 1 3910 3877 3912 3908 + 1 3910 3877 3882 3912 + 1 3877 3908 3878 3912 + 1 3877 3882 3912 3878 + 1 3823 457 3820 3824 + 1 3877 3820 466 3878 + 1 3908 3824 3878 475 + 1 3823 3877 3908 3824 + 1 3823 3877 3824 3820 + 1 3877 3908 3824 3878 + 1 3877 3820 3878 3824 + 1 1730 107 1739 1732 + 1 3875 1739 692 3935 + 1 3872 1732 3935 481 + 1 1730 3875 3872 1732 + 1 1730 3875 1732 1739 + 1 3875 3872 1732 3935 + 1 3875 1739 3935 1732 + 1 3883 692 1885 3937 + 1 1880 1885 120 1882 + 1 3880 3937 1882 482 + 1 3883 1880 3880 3937 + 1 3883 1880 3937 1885 + 1 1880 3880 3937 1882 + 1 1880 1885 1882 3937 + 1 3838 481 3933 1198 + 1 3839 3933 482 1199 + 1 1195 1198 1199 60 + 1 3838 3839 1195 1198 + 1 3838 3839 1198 3933 + 1 3839 1195 1198 1199 + 1 3839 3933 1199 1198 + 1 3870 466 3834 3879 + 1 3833 3834 459 3838 + 1 3872 3879 3838 481 + 1 3870 3833 3872 3879 + 1 3870 3833 3879 3834 + 1 3833 3872 3879 3838 + 1 3833 3834 3838 3879 + 1 3870 466 3879 3883 + 1 3875 3883 3935 692 + 1 3872 3879 481 3935 + 1 3870 3875 3879 3872 + 1 3870 3875 3883 3879 + 1 3875 3872 3935 3879 + 1 3875 3883 3879 3935 + 1 3834 459 3838 3839 + 1 3879 3838 481 3933 + 1 3880 3839 3933 482 + 1 3834 3879 3880 3839 + 1 3834 3879 3839 3838 + 1 3879 3880 3839 3933 + 1 3879 3838 3933 3839 + 1 3883 692 3937 3935 + 1 3879 3935 3933 481 + 1 3880 3937 482 3933 + 1 3883 3879 3937 3880 + 1 3883 3879 3935 3937 + 1 3879 3880 3933 3937 + 1 3879 3935 3937 3933 + 1 1179 58 1180 1183 + 1 3824 1183 3904 475 + 1 3821 1180 472 3904 + 1 1179 3824 1180 3821 + 1 1179 3824 1183 1180 + 1 3824 3821 3904 1180 + 1 3824 1183 1180 3904 + 1 3878 475 3911 1881 + 1 1880 1881 1882 120 + 1 3880 3911 482 1882 + 1 3878 1880 3911 3880 + 1 3878 1880 1881 3911 + 1 1880 3880 1882 3911 + 1 1880 1881 3911 1882 + 1 3835 472 1196 3905 + 1 3839 3905 1199 482 + 1 1195 1196 60 1199 + 1 3835 3839 1196 1195 + 1 3835 3839 3905 1196 + 1 3839 1195 1199 1196 + 1 3839 3905 1196 1199 + 1 3820 466 3876 3834 + 1 3817 3834 3835 459 + 1 3821 3876 472 3835 + 1 3820 3817 3876 3821 + 1 3820 3817 3834 3876 + 1 3817 3821 3835 3876 + 1 3817 3834 3876 3835 + 1 3820 466 3878 3876 + 1 3824 3878 475 3904 + 1 3821 3876 3904 472 + 1 3820 3824 3821 3876 + 1 3820 3824 3876 3878 + 1 3824 3821 3876 3904 + 1 3824 3878 3904 3876 + 1 3834 459 3839 3835 + 1 3876 3835 3905 472 + 1 3880 3839 482 3905 + 1 3834 3876 3839 3880 + 1 3834 3876 3835 3839 + 1 3876 3880 3905 3839 + 1 3876 3835 3839 3905 + 1 3878 475 3904 3911 + 1 3876 3904 472 3905 + 1 3880 3911 3905 482 + 1 3878 3876 3880 3911 + 1 3878 3876 3911 3904 + 1 3876 3880 3911 3905 + 1 3876 3904 3905 3911 + 1 892 23 896 889 + 1 3005 896 292 2976 + 1 2974 889 2976 285 + 1 892 3005 2974 889 + 1 892 3005 889 896 + 1 3005 2974 889 2976 + 1 3005 896 2976 889 + 1 3029 292 1898 3027 + 1 1904 1898 122 1900 + 1 4027 3027 1900 499 + 1 3029 1904 4027 3027 + 1 3029 1904 3027 1898 + 1 1904 4027 3027 1900 + 1 1904 1898 1900 3027 + 1 2977 285 2979 1214 + 1 4014 2979 499 1221 + 1 1218 1214 1221 62 + 1 2977 4014 1218 1214 + 1 2977 4014 1214 2979 + 1 4014 1218 1214 1221 + 1 4014 2979 1221 1214 + 1 3011 704 4017 2980 + 1 3006 4017 496 2977 + 1 2974 2980 2977 285 + 1 3011 3006 2974 2980 + 1 3011 3006 2980 4017 + 1 3006 2974 2980 2977 + 1 3006 4017 2977 2980 + 1 3011 704 2980 3029 + 1 3005 3029 2976 292 + 1 2974 2980 285 2976 + 1 3011 3005 2980 2974 + 1 3011 3005 3029 2980 + 1 3005 2974 2976 2980 + 1 3005 3029 2980 2976 + 1 4017 496 2977 4014 + 1 2980 2977 285 2979 + 1 4027 4014 2979 499 + 1 4017 2980 4027 4014 + 1 4017 2980 4014 2977 + 1 2980 4027 4014 2979 + 1 2980 2977 2979 4014 + 1 3029 292 3027 2976 + 1 2980 2976 2979 285 + 1 4027 3027 499 2979 + 1 3029 2980 3027 4027 + 1 3029 2980 2976 3027 + 1 2980 4027 2979 3027 + 1 2980 2976 3027 2979 + 1 1905 122 1899 1901 + 1 3198 1899 319 3196 + 1 4042 1901 3196 506 + 1 1905 3198 4042 1901 + 1 1905 3198 1901 1899 + 1 3198 4042 1901 3196 + 1 3198 1899 3196 1901 + 1 3180 319 923 3164 + 1 921 923 27 919 + 1 3163 3164 919 315 + 1 3180 921 3163 3164 + 1 3180 921 3164 923 + 1 921 3163 3164 919 + 1 921 923 919 3164 + 1 4038 506 3167 1240 + 1 3166 3167 315 1235 + 1 1239 1240 1235 65 + 1 4038 3166 1239 1240 + 1 4038 3166 1240 3167 + 1 3166 1239 1240 1235 + 1 3166 3167 1235 1240 + 1 3187 317 3183 3184 + 1 4040 3183 505 4038 + 1 4042 3184 4038 506 + 1 3187 4040 4042 3184 + 1 3187 4040 3184 3183 + 1 4040 4042 3184 4038 + 1 4040 3183 4038 3184 + 1 3187 317 3184 3180 + 1 3198 3180 3196 319 + 1 4042 3184 506 3196 + 1 3187 3198 3184 4042 + 1 3187 3198 3180 3184 + 1 3198 4042 3196 3184 + 1 3198 3180 3184 3196 + 1 3183 505 4038 3166 + 1 3184 4038 506 3167 + 1 3163 3166 3167 315 + 1 3183 3184 3163 3166 + 1 3183 3184 3166 4038 + 1 3184 3163 3166 3167 + 1 3184 4038 3167 3166 + 1 3180 319 3164 3196 + 1 3184 3196 3167 506 + 1 3163 3164 315 3167 + 1 3180 3184 3164 3163 + 1 3180 3184 3196 3164 + 1 3184 3163 3167 3164 + 1 3184 3196 3164 3167 + 1 1215 62 1217 1213 + 1 3945 1217 495 2115 + 1 2112 1213 2115 160 + 1 1215 3945 2112 1213 + 1 1215 3945 1213 1217 + 1 3945 2112 1213 2115 + 1 3945 1217 2115 1213 + 1 3962 495 1237 2122 + 1 1236 1237 65 1234 + 1 2121 2122 1234 163 + 1 3962 1236 2121 2122 + 1 3962 1236 2122 1237 + 1 1236 2121 2122 1234 + 1 1236 1237 1234 2122 + 1 2100 160 2111 764 + 1 2103 2111 163 767 + 1 763 764 767 8 + 1 2100 2103 763 764 + 1 2100 2103 764 2111 + 1 2103 763 764 767 + 1 2103 2111 767 764 + 1 3940 487 2107 2113 + 1 2104 2107 159 2100 + 1 2112 2113 2100 160 + 1 3940 2104 2112 2113 + 1 3940 2104 2113 2107 + 1 2104 2112 2113 2100 + 1 2104 2107 2100 2113 + 1 3940 487 2113 3962 + 1 3945 3962 2115 495 + 1 2112 2113 160 2115 + 1 3940 3945 2113 2112 + 1 3940 3945 3962 2113 + 1 3945 2112 2115 2113 + 1 3945 3962 2113 2115 + 1 2107 159 2100 2103 + 1 2113 2100 160 2111 + 1 2121 2103 2111 163 + 1 2107 2113 2121 2103 + 1 2107 2113 2103 2100 + 1 2113 2121 2103 2111 + 1 2113 2100 2111 2103 + 1 3962 495 2122 2115 + 1 2113 2115 2111 160 + 1 2121 2122 163 2111 + 1 3962 2113 2122 2121 + 1 3962 2113 2115 2122 + 1 2113 2121 2111 2122 + 1 2113 2115 2122 2111 + 1 1812 113 1806 1807 + 1 3987 1806 491 3985 + 1 4021 1807 3985 497 + 1 1812 3987 4021 1807 + 1 1812 3987 1807 1806 + 1 3987 4021 1807 3985 + 1 3987 1806 3985 1807 + 1 3968 491 1210 3942 + 1 1207 1210 61 1203 + 1 3941 3942 1203 484 + 1 3968 1207 3941 3942 + 1 3968 1207 3942 1210 + 1 1207 3941 3942 1203 + 1 1207 1210 1203 3942 + 1 4012 497 3947 1219 + 1 3946 3947 484 1215 + 1 1218 1219 1215 62 + 1 4012 3946 1218 1219 + 1 4012 3946 1219 3947 + 1 3946 1218 1219 1215 + 1 3946 3947 1215 1219 + 1 3973 488 3970 3971 + 1 4015 3970 496 4012 + 1 4021 3971 4012 497 + 1 3973 4015 4021 3971 + 1 3973 4015 3971 3970 + 1 4015 4021 3971 4012 + 1 4015 3970 4012 3971 + 1 3973 488 3971 3968 + 1 3987 3968 3985 491 + 1 4021 3971 497 3985 + 1 3973 3987 3971 4021 + 1 3973 3987 3968 3971 + 1 3987 4021 3985 3971 + 1 3987 3968 3971 3985 + 1 3970 496 4012 3946 + 1 3971 4012 497 3947 + 1 3941 3946 3947 484 + 1 3970 3971 3941 3946 + 1 3970 3971 3946 4012 + 1 3971 3941 3946 3947 + 1 3971 4012 3947 3946 + 1 3968 491 3942 3985 + 1 3971 3985 3947 497 + 1 3941 3942 484 3947 + 1 3968 3971 3942 3941 + 1 3968 3971 3985 3942 + 1 3971 3941 3947 3942 + 1 3971 3985 3942 3947 + 1 1812 113 1807 1815 + 1 4856 1815 4023 715 + 1 4021 1807 497 4023 + 1 1812 4856 1807 4021 + 1 1812 4856 1815 1807 + 1 4856 4021 4023 1807 + 1 4856 1815 1807 4023 + 1 4861 715 4028 1905 + 1 1904 1905 1900 122 + 1 4027 4028 499 1900 + 1 4861 1904 4028 4027 + 1 4861 1904 1905 4028 + 1 1904 4027 1900 4028 + 1 1904 1905 4028 1900 + 1 4012 497 1219 4018 + 1 4014 4018 1221 499 + 1 1218 1219 62 1221 + 1 4012 4014 1219 1218 + 1 4012 4014 4018 1219 + 1 4014 1218 1221 1219 + 1 4014 4018 1219 1221 + 1 4855 704 4022 4017 + 1 4015 4017 4012 496 + 1 4021 4022 497 4012 + 1 4855 4015 4022 4021 + 1 4855 4015 4017 4022 + 1 4015 4021 4012 4022 + 1 4015 4017 4022 4012 + 1 4855 704 4861 4022 + 1 4856 4861 715 4023 + 1 4021 4022 4023 497 + 1 4855 4856 4021 4022 + 1 4855 4856 4022 4861 + 1 4856 4021 4022 4023 + 1 4856 4861 4023 4022 + 1 4017 496 4014 4012 + 1 4022 4012 4018 497 + 1 4027 4014 499 4018 + 1 4017 4022 4014 4027 + 1 4017 4022 4012 4014 + 1 4022 4027 4018 4014 + 1 4022 4012 4014 4018 + 1 4861 715 4023 4028 + 1 4022 4023 497 4018 + 1 4027 4028 4018 499 + 1 4861 4022 4027 4028 + 1 4861 4022 4028 4023 + 1 4022 4027 4028 4018 + 1 4022 4023 4018 4028 + 1 1210 61 1203 1206 + 1 3942 1203 484 3940 + 1 3960 1206 3940 487 + 1 1210 3942 3960 1206 + 1 1210 3942 1206 1203 + 1 3942 3960 1206 3940 + 1 3942 1203 3940 1206 + 1 3947 484 1215 3945 + 1 1219 1215 62 1217 + 1 4008 3945 1217 495 + 1 3947 1219 4008 3945 + 1 3947 1219 3945 1215 + 1 1219 4008 3945 1217 + 1 1219 1215 1217 3945 + 1 3965 487 3962 1236 + 1 4010 3962 495 1237 + 1 1239 1236 1237 65 + 1 3965 4010 1239 1236 + 1 3965 4010 1236 3962 + 1 4010 1239 1236 1237 + 1 4010 3962 1237 1236 + 1 3985 497 4019 3963 + 1 3986 4019 505 3965 + 1 3960 3963 3965 487 + 1 3985 3986 3960 3963 + 1 3985 3986 3963 4019 + 1 3986 3960 3963 3965 + 1 3986 4019 3965 3963 + 1 3985 497 3963 3947 + 1 3942 3947 3940 484 + 1 3960 3963 487 3940 + 1 3985 3942 3963 3960 + 1 3985 3942 3947 3963 + 1 3942 3960 3940 3963 + 1 3942 3947 3963 3940 + 1 4019 505 3965 4010 + 1 3963 3965 487 3962 + 1 4008 4010 3962 495 + 1 4019 3963 4008 4010 + 1 4019 3963 4010 3965 + 1 3963 4008 4010 3962 + 1 3963 3965 3962 4010 + 1 3947 484 3945 3940 + 1 3963 3940 3962 487 + 1 4008 3945 495 3962 + 1 3947 3963 3945 4008 + 1 3947 3963 3940 3945 + 1 3963 4008 3962 3945 + 1 3963 3940 3945 3962 + 1 1905 122 1901 1900 + 1 4028 1900 4026 499 + 1 4042 1901 506 4026 + 1 1905 4028 1901 4042 + 1 1905 4028 1900 1901 + 1 4028 4042 4026 1901 + 1 4028 1900 1901 4026 + 1 4018 499 4009 1221 + 1 1219 1221 1217 62 + 1 4008 4009 495 1217 + 1 4018 1219 4009 4008 + 1 4018 1219 1221 4009 + 1 1219 4008 1217 4009 + 1 1219 1221 4009 1217 + 1 4038 506 1240 4011 + 1 4010 4011 1237 495 + 1 1239 1240 65 1237 + 1 4038 4010 1240 1239 + 1 4038 4010 4011 1240 + 1 4010 1239 1237 1240 + 1 4010 4011 1240 1237 + 1 4023 497 4020 4019 + 1 4040 4019 4038 505 + 1 4042 4020 506 4038 + 1 4023 4040 4020 4042 + 1 4023 4040 4019 4020 + 1 4040 4042 4038 4020 + 1 4040 4019 4020 4038 + 1 4023 497 4018 4020 + 1 4028 4018 499 4026 + 1 4042 4020 4026 506 + 1 4023 4028 4042 4020 + 1 4023 4028 4020 4018 + 1 4028 4042 4020 4026 + 1 4028 4018 4026 4020 + 1 4019 505 4010 4038 + 1 4020 4038 4011 506 + 1 4008 4010 495 4011 + 1 4019 4020 4010 4008 + 1 4019 4020 4038 4010 + 1 4020 4008 4011 4010 + 1 4020 4038 4010 4011 + 1 4018 499 4026 4009 + 1 4020 4026 506 4011 + 1 4008 4009 4011 495 + 1 4018 4020 4008 4009 + 1 4018 4020 4009 4026 + 1 4020 4008 4009 4011 + 1 4020 4026 4011 4009 + 1 838 17 840 843 + 1 2612 840 236 2631 + 1 2614 843 2631 239 + 1 838 2612 2614 843 + 1 838 2612 843 840 + 1 2612 2614 843 2631 + 1 2612 840 2631 843 + 1 2635 236 1658 2637 + 1 1662 1658 102 1666 + 1 4451 2637 1666 668 + 1 2635 1662 4451 2637 + 1 2635 1662 2637 1658 + 1 1662 4451 2637 1666 + 1 1662 1658 1666 2637 + 1 2659 239 2660 1700 + 1 4459 2660 668 1706 + 1 1702 1700 1706 105 + 1 2659 4459 1702 1700 + 1 2659 4459 1700 2660 + 1 4459 1702 1700 1706 + 1 4459 2660 1706 1700 + 1 2618 604 4448 2657 + 1 2620 4448 606 2659 + 1 2614 2657 2659 239 + 1 2618 2620 2614 2657 + 1 2618 2620 2657 4448 + 1 2620 2614 2657 2659 + 1 2620 4448 2659 2657 + 1 2618 604 2657 2635 + 1 2612 2635 2631 236 + 1 2614 2657 239 2631 + 1 2618 2612 2657 2614 + 1 2618 2612 2635 2657 + 1 2612 2614 2631 2657 + 1 2612 2635 2657 2631 + 1 4448 606 2659 4459 + 1 2657 2659 239 2660 + 1 4451 4459 2660 668 + 1 4448 2657 4451 4459 + 1 4448 2657 4459 2659 + 1 2657 4451 4459 2660 + 1 2657 2659 2660 4459 + 1 2635 236 2637 2631 + 1 2657 2631 2660 239 + 1 4451 2637 668 2660 + 1 2635 2657 2637 4451 + 1 2635 2657 2631 2637 + 1 2657 4451 2660 2637 + 1 2657 2631 2637 2660 + 1 1663 102 1659 1669 + 1 2728 1659 247 2730 + 1 4478 1669 2730 671 + 1 1663 2728 4478 1669 + 1 1663 2728 1669 1659 + 1 2728 4478 1669 2730 + 1 2728 1659 2730 1669 + 1 2701 247 851 2724 + 1 848 851 18 853 + 1 2703 2724 853 249 + 1 2701 848 2703 2724 + 1 2701 848 2724 851 + 1 848 2703 2724 853 + 1 848 851 853 2724 + 1 4492 671 2747 1762 + 1 2746 2747 249 1756 + 1 1760 1762 1756 109 + 1 4492 2746 1760 1762 + 1 4492 2746 1762 2747 + 1 2746 1760 1762 1756 + 1 2746 2747 1756 1762 + 1 2707 244 2709 2710 + 1 4476 2709 613 4492 + 1 4478 2710 4492 671 + 1 2707 4476 4478 2710 + 1 2707 4476 2710 2709 + 1 4476 4478 2710 4492 + 1 4476 2709 4492 2710 + 1 2707 244 2710 2701 + 1 2728 2701 2730 247 + 1 4478 2710 671 2730 + 1 2707 2728 2710 4478 + 1 2707 2728 2701 2710 + 1 2728 4478 2730 2710 + 1 2728 2701 2710 2730 + 1 2709 613 4492 2746 + 1 2710 4492 671 2747 + 1 2703 2746 2747 249 + 1 2709 2710 2703 2746 + 1 2709 2710 2746 4492 + 1 2710 2703 2746 2747 + 1 2710 4492 2747 2746 + 1 2701 247 2724 2730 + 1 2710 2730 2747 671 + 1 2703 2724 249 2747 + 1 2701 2710 2724 2703 + 1 2701 2710 2730 2724 + 1 2710 2703 2747 2724 + 1 2710 2730 2724 2747 + 1 1705 105 1709 1701 + 1 4527 1709 681 2998 + 1 2995 1701 2998 287 + 1 1705 4527 2995 1701 + 1 1705 4527 1701 1709 + 1 4527 2995 1701 2998 + 1 4527 1709 2998 1701 + 1 4535 681 1763 3008 + 1 1761 1763 109 1757 + 1 3007 3008 1757 288 + 1 4535 1761 3007 3008 + 1 4535 1761 3008 1763 + 1 1761 3007 3008 1757 + 1 1761 1763 1757 3008 + 1 2981 287 2992 891 + 1 2982 2992 288 892 + 1 890 891 892 23 + 1 2981 2982 890 891 + 1 2981 2982 891 2992 + 1 2982 890 891 892 + 1 2982 2992 892 891 + 1 4525 624 2988 2996 + 1 2987 2988 286 2981 + 1 2995 2996 2981 287 + 1 4525 2987 2995 2996 + 1 4525 2987 2996 2988 + 1 2987 2995 2996 2981 + 1 2987 2988 2981 2996 + 1 4525 624 2996 4535 + 1 4527 4535 2998 681 + 1 2995 2996 287 2998 + 1 4525 4527 2996 2995 + 1 4525 4527 4535 2996 + 1 4527 2995 2998 2996 + 1 4527 4535 2996 2998 + 1 2988 286 2981 2982 + 1 2996 2981 287 2992 + 1 3007 2982 2992 288 + 1 2988 2996 3007 2982 + 1 2988 2996 2982 2981 + 1 2996 3007 2982 2992 + 1 2996 2981 2992 2982 + 1 4535 681 3008 2998 + 1 2996 2998 2992 287 + 1 3007 3008 288 2992 + 1 4535 2996 3008 3007 + 1 4535 2996 2998 3008 + 1 2996 3007 2992 3008 + 1 2996 2998 3008 2992 + 1 1510 89 1512 1515 + 1 4433 1512 608 4466 + 1 4435 1515 4466 611 + 1 1510 4433 4435 1515 + 1 1510 4433 1515 1512 + 1 4433 4435 1515 4466 + 1 4433 1512 4466 1515 + 1 4443 608 1548 4470 + 1 1547 1548 92 1551 + 1 4447 4470 1551 622 + 1 4443 1547 4447 4470 + 1 4443 1547 4470 1548 + 1 1547 4447 4470 1551 + 1 1547 1548 1551 4470 + 1 4456 611 4480 1703 + 1 4458 4480 622 1705 + 1 1702 1703 1705 105 + 1 4456 4458 1702 1703 + 1 4456 4458 1703 4480 + 1 4458 1702 1703 1705 + 1 4458 4480 1705 1703 + 1 4430 603 4442 4444 + 1 4432 4442 606 4456 + 1 4435 4444 4456 611 + 1 4430 4432 4435 4444 + 1 4430 4432 4444 4442 + 1 4432 4435 4444 4456 + 1 4432 4442 4456 4444 + 1 4430 603 4444 4443 + 1 4433 4443 4466 608 + 1 4435 4444 611 4466 + 1 4430 4433 4444 4435 + 1 4430 4433 4443 4444 + 1 4433 4435 4466 4444 + 1 4433 4443 4444 4466 + 1 4442 606 4456 4458 + 1 4444 4456 611 4480 + 1 4447 4458 4480 622 + 1 4442 4444 4447 4458 + 1 4442 4444 4458 4456 + 1 4444 4447 4458 4480 + 1 4444 4456 4480 4458 + 1 4443 608 4470 4466 + 1 4444 4466 4480 611 + 1 4447 4470 622 4480 + 1 4443 4444 4470 4447 + 1 4443 4444 4466 4470 + 1 4444 4447 4480 4470 + 1 4444 4466 4470 4480 + 1 1510 89 1515 1514 + 1 4434 1514 4475 610 + 1 4435 1515 611 4475 + 1 1510 4434 1515 4435 + 1 1510 4434 1514 1515 + 1 4434 4435 4475 1515 + 1 4434 1514 1515 4475 + 1 4449 610 4477 1663 + 1 1662 1663 1666 102 + 1 4451 4477 668 1666 + 1 4449 1662 4477 4451 + 1 4449 1662 1663 4477 + 1 1662 4451 1666 4477 + 1 1662 1663 4477 1666 + 1 4456 611 1703 4482 + 1 4459 4482 1706 668 + 1 1702 1703 105 1706 + 1 4456 4459 1703 1702 + 1 4456 4459 4482 1703 + 1 4459 1702 1706 1703 + 1 4459 4482 1703 1706 + 1 4431 604 4450 4448 + 1 4432 4448 4456 606 + 1 4435 4450 611 4456 + 1 4431 4432 4450 4435 + 1 4431 4432 4448 4450 + 1 4432 4435 4456 4450 + 1 4432 4448 4450 4456 + 1 4431 604 4449 4450 + 1 4434 4449 610 4475 + 1 4435 4450 4475 611 + 1 4431 4434 4435 4450 + 1 4431 4434 4450 4449 + 1 4434 4435 4450 4475 + 1 4434 4449 4475 4450 + 1 4448 606 4459 4456 + 1 4450 4456 4482 611 + 1 4451 4459 668 4482 + 1 4448 4450 4459 4451 + 1 4448 4450 4456 4459 + 1 4450 4451 4482 4459 + 1 4450 4456 4459 4482 + 1 4449 610 4475 4477 + 1 4450 4475 611 4482 + 1 4451 4477 4482 668 + 1 4449 4450 4451 4477 + 1 4449 4450 4477 4475 + 1 4450 4451 4477 4482 + 1 4450 4475 4482 4477 + 1 1548 92 1551 1553 + 1 4470 1551 622 4525 + 1 4472 1553 4525 624 + 1 1548 4470 4472 1553 + 1 1548 4470 1553 1551 + 1 4470 4472 1553 4525 + 1 4470 1551 4525 1553 + 1 4480 622 1705 4527 + 1 1703 1705 105 1709 + 1 4484 4527 1709 681 + 1 4480 1703 4484 4527 + 1 4480 1703 4527 1705 + 1 1703 4484 4527 1709 + 1 1703 1705 1709 4527 + 1 4491 624 4535 1761 + 1 4493 4535 681 1763 + 1 1760 1761 1763 109 + 1 4491 4493 1760 1761 + 1 4491 4493 1761 4535 + 1 4493 1760 1761 1763 + 1 4493 4535 1763 1761 + 1 4466 611 4479 4481 + 1 4468 4479 613 4491 + 1 4472 4481 4491 624 + 1 4466 4468 4472 4481 + 1 4466 4468 4481 4479 + 1 4468 4472 4481 4491 + 1 4468 4479 4491 4481 + 1 4466 611 4481 4480 + 1 4470 4480 4525 622 + 1 4472 4481 624 4525 + 1 4466 4470 4481 4472 + 1 4466 4470 4480 4481 + 1 4470 4472 4525 4481 + 1 4470 4480 4481 4525 + 1 4479 613 4491 4493 + 1 4481 4491 624 4535 + 1 4484 4493 4535 681 + 1 4479 4481 4484 4493 + 1 4479 4481 4493 4491 + 1 4481 4484 4493 4535 + 1 4481 4491 4535 4493 + 1 4480 622 4527 4525 + 1 4481 4525 4535 624 + 1 4484 4527 681 4535 + 1 4480 4481 4527 4484 + 1 4480 4481 4525 4527 + 1 4481 4484 4535 4527 + 1 4481 4525 4527 4535 + 1 1663 102 1669 1666 + 1 4477 1666 4718 668 + 1 4478 1669 671 4718 + 1 1663 4477 1669 4478 + 1 1663 4477 1666 1669 + 1 4477 4478 4718 1669 + 1 4477 1666 1669 4718 + 1 4482 668 4721 1706 + 1 1703 1706 1709 105 + 1 4484 4721 681 1709 + 1 4482 1703 4721 4484 + 1 4482 1703 1706 4721 + 1 1703 4484 1709 4721 + 1 1703 1706 4721 1709 + 1 4492 671 1762 4736 + 1 4493 4736 1763 681 + 1 1760 1762 109 1763 + 1 4492 4493 1762 1760 + 1 4492 4493 4736 1762 + 1 4493 1760 1763 1762 + 1 4493 4736 1762 1763 + 1 4475 611 4483 4479 + 1 4476 4479 4492 613 + 1 4478 4483 671 4492 + 1 4475 4476 4483 4478 + 1 4475 4476 4479 4483 + 1 4476 4478 4492 4483 + 1 4476 4479 4483 4492 + 1 4475 611 4482 4483 + 1 4477 4482 668 4718 + 1 4478 4483 4718 671 + 1 4475 4477 4478 4483 + 1 4475 4477 4483 4482 + 1 4477 4478 4483 4718 + 1 4477 4482 4718 4483 + 1 4479 613 4493 4492 + 1 4483 4492 4736 671 + 1 4484 4493 681 4736 + 1 4479 4483 4493 4484 + 1 4479 4483 4492 4493 + 1 4483 4484 4736 4493 + 1 4483 4492 4493 4736 + 1 4482 668 4718 4721 + 1 4483 4718 671 4736 + 1 4484 4721 4736 681 + 1 4482 4483 4484 4721 + 1 4482 4483 4721 4718 + 1 4483 4484 4721 4736 + 1 4483 4718 4736 4721 + 1 838 17 843 842 + 1 2613 842 2648 238 + 1 2614 843 239 2648 + 1 838 2613 843 2614 + 1 838 2613 842 843 + 1 2613 2614 2648 843 + 1 2613 842 843 2648 + 1 2653 238 2654 1686 + 1 1694 1686 1696 104 + 1 4455 2654 676 1696 + 1 2653 1694 2654 4455 + 1 2653 1694 1686 2654 + 1 1694 4455 1696 2654 + 1 1694 1686 2654 1696 + 1 2659 239 1700 2662 + 1 4460 2662 1707 676 + 1 1702 1700 105 1707 + 1 2659 4460 1700 1702 + 1 2659 4460 2662 1700 + 1 4460 1702 1707 1700 + 1 4460 2662 1700 1707 + 1 2619 605 2658 4452 + 1 2620 4452 2659 606 + 1 2614 2658 239 2659 + 1 2619 2620 2658 2614 + 1 2619 2620 4452 2658 + 1 2620 2614 2659 2658 + 1 2620 4452 2658 2659 + 1 2619 605 2653 2658 + 1 2613 2653 238 2648 + 1 2614 2658 2648 239 + 1 2619 2613 2614 2658 + 1 2619 2613 2658 2653 + 1 2613 2614 2658 2648 + 1 2613 2653 2648 2658 + 1 4452 606 4460 2659 + 1 2658 2659 2662 239 + 1 4455 4460 676 2662 + 1 4452 2658 4460 4455 + 1 4452 2658 2659 4460 + 1 2658 4455 2662 4460 + 1 2658 2659 4460 2662 + 1 2653 238 2648 2654 + 1 2658 2648 239 2662 + 1 4455 2654 2662 676 + 1 2653 2658 4455 2654 + 1 2653 2658 2654 2648 + 1 2658 4455 2654 2662 + 1 2658 2648 2662 2654 + 1 1695 104 1698 1687 + 1 2954 1687 2955 281 + 1 4515 1698 678 2955 + 1 1695 2954 1698 4515 + 1 1695 2954 1687 1698 + 1 2954 4515 2955 1698 + 1 2954 1687 1698 2955 + 1 2939 281 2949 885 + 1 884 885 886 22 + 1 2940 2949 282 886 + 1 2939 884 2949 2940 + 1 2939 884 885 2949 + 1 884 2940 886 2949 + 1 884 885 2949 886 + 1 4523 678 1874 2960 + 1 2959 2960 1868 282 + 1 1872 1874 119 1868 + 1 4523 2959 1874 1872 + 1 4523 2959 2960 1874 + 1 2959 1872 1868 1874 + 1 2959 2960 1874 1868 + 1 2946 280 2948 2947 + 1 4513 2947 4523 621 + 1 4515 2948 678 4523 + 1 2946 4513 2948 4515 + 1 2946 4513 2947 2948 + 1 4513 4515 4523 2948 + 1 4513 2947 2948 4523 + 1 2946 280 2939 2948 + 1 2954 2939 281 2955 + 1 4515 2948 2955 678 + 1 2946 2954 4515 2948 + 1 2946 2954 2948 2939 + 1 2954 4515 2948 2955 + 1 2954 2939 2955 2948 + 1 2947 621 2959 4523 + 1 2948 4523 2960 678 + 1 2940 2959 282 2960 + 1 2947 2948 2959 2940 + 1 2947 2948 4523 2959 + 1 2948 2940 2960 2959 + 1 2948 4523 2959 2960 + 1 2939 281 2955 2949 + 1 2948 2955 678 2960 + 1 2940 2949 2960 282 + 1 2939 2948 2940 2949 + 1 2939 2948 2949 2955 + 1 2948 2940 2949 2960 + 1 2948 2955 2960 2949 + 1 1705 105 1701 1711 + 1 4528 1711 2999 683 + 1 2995 1701 287 2999 + 1 1705 4528 1701 2995 + 1 1705 4528 1711 1701 + 1 4528 2995 2999 1701 + 1 4528 1711 1701 2999 + 1 4540 683 3020 1875 + 1 1873 1875 1869 119 + 1 3019 3020 290 1869 + 1 4540 1873 3020 3019 + 1 4540 1873 1875 3020 + 1 1873 3019 1869 3020 + 1 1873 1875 3020 1869 + 1 2981 287 891 2993 + 1 2984 2993 894 290 + 1 890 891 23 894 + 1 2981 2984 891 890 + 1 2981 2984 2993 891 + 1 2984 890 894 891 + 1 2984 2993 891 894 + 1 4526 626 2997 2990 + 1 2987 2990 2981 286 + 1 2995 2997 287 2981 + 1 4526 2987 2997 2995 + 1 4526 2987 2990 2997 + 1 2987 2995 2981 2997 + 1 2987 2990 2997 2981 + 1 4526 626 4540 2997 + 1 4528 4540 683 2999 + 1 2995 2997 2999 287 + 1 4526 4528 2995 2997 + 1 4526 4528 2997 4540 + 1 4528 2995 2997 2999 + 1 4528 4540 2999 2997 + 1 2990 286 2984 2981 + 1 2997 2981 2993 287 + 1 3019 2984 290 2993 + 1 2990 2997 2984 3019 + 1 2990 2997 2981 2984 + 1 2997 3019 2993 2984 + 1 2997 2981 2984 2993 + 1 4540 683 2999 3020 + 1 2997 2999 287 2993 + 1 3019 3020 2993 290 + 1 4540 2997 3019 3020 + 1 4540 2997 3020 2999 + 1 2997 3019 3020 2993 + 1 2997 2999 2993 3020 + 1 1537 91 1540 1538 + 1 4439 1538 4508 618 + 1 4441 1540 620 4508 + 1 1537 4439 1540 4441 + 1 1537 4439 1538 1540 + 1 4439 4441 4508 1540 + 1 4439 1538 1540 4508 + 1 4445 618 4510 1550 + 1 1547 1550 1551 92 + 1 4447 4510 622 1551 + 1 4445 1547 4510 4447 + 1 4445 1547 1550 4510 + 1 1547 4447 1551 4510 + 1 1547 1550 4510 1551 + 1 4457 620 1704 4517 + 1 4458 4517 1705 622 + 1 1702 1704 105 1705 + 1 4457 4458 1704 1702 + 1 4457 4458 4517 1704 + 1 4458 1702 1705 1704 + 1 4458 4517 1704 1705 + 1 4436 603 4446 4442 + 1 4438 4442 4457 606 + 1 4441 4446 620 4457 + 1 4436 4438 4446 4441 + 1 4436 4438 4442 4446 + 1 4438 4441 4457 4446 + 1 4438 4442 4446 4457 + 1 4436 603 4445 4446 + 1 4439 4445 618 4508 + 1 4441 4446 4508 620 + 1 4436 4439 4441 4446 + 1 4436 4439 4446 4445 + 1 4439 4441 4446 4508 + 1 4439 4445 4508 4446 + 1 4442 606 4458 4457 + 1 4446 4457 4517 620 + 1 4447 4458 622 4517 + 1 4442 4446 4458 4447 + 1 4442 4446 4457 4458 + 1 4446 4447 4517 4458 + 1 4446 4457 4458 4517 + 1 4445 618 4508 4510 + 1 4446 4508 620 4517 + 1 4447 4510 4517 622 + 1 4445 4446 4447 4510 + 1 4445 4446 4510 4508 + 1 4446 4447 4510 4517 + 1 4446 4508 4517 4510 + 1 1537 91 1539 1540 + 1 4440 1539 619 4512 + 1 4441 1540 4512 620 + 1 1537 4440 4441 1540 + 1 1537 4440 1540 1539 + 1 4440 4441 1540 4512 + 1 4440 1539 4512 1540 + 1 4453 619 1695 4514 + 1 1694 1695 104 1696 + 1 4455 4514 1696 676 + 1 4453 1694 4455 4514 + 1 4453 1694 4514 1695 + 1 1694 4455 4514 1696 + 1 1694 1695 1696 4514 + 1 4457 620 4519 1704 + 1 4460 4519 676 1707 + 1 1702 1704 1707 105 + 1 4457 4460 1702 1704 + 1 4457 4460 1704 4519 + 1 4460 1702 1704 1707 + 1 4460 4519 1707 1704 + 1 4437 605 4452 4454 + 1 4438 4452 606 4457 + 1 4441 4454 4457 620 + 1 4437 4438 4441 4454 + 1 4437 4438 4454 4452 + 1 4438 4441 4454 4457 + 1 4438 4452 4457 4454 + 1 4437 605 4454 4453 + 1 4440 4453 4512 619 + 1 4441 4454 620 4512 + 1 4437 4440 4454 4441 + 1 4437 4440 4453 4454 + 1 4440 4441 4512 4454 + 1 4440 4453 4454 4512 + 1 4452 606 4457 4460 + 1 4454 4457 620 4519 + 1 4455 4460 4519 676 + 1 4452 4454 4455 4460 + 1 4452 4454 4460 4457 + 1 4454 4455 4460 4519 + 1 4454 4457 4519 4460 + 1 4453 619 4514 4512 + 1 4454 4512 4519 620 + 1 4455 4514 676 4519 + 1 4453 4454 4514 4455 + 1 4453 4454 4512 4514 + 1 4454 4455 4519 4514 + 1 4454 4512 4514 4519 + 1 1550 92 1555 1551 + 1 4510 1551 4526 622 + 1 4511 1555 626 4526 + 1 1550 4510 1555 4511 + 1 1550 4510 1551 1555 + 1 4510 4511 4526 1555 + 1 4510 1551 1555 4526 + 1 4517 622 4528 1705 + 1 1704 1705 1711 105 + 1 4521 4528 683 1711 + 1 4517 1704 4528 4521 + 1 4517 1704 1705 4528 + 1 1704 4521 1711 4528 + 1 1704 1705 4528 1711 + 1 4522 626 1873 4540 + 1 4524 4540 1875 683 + 1 1872 1873 119 1875 + 1 4522 4524 1873 1872 + 1 4522 4524 4540 1873 + 1 4524 1872 1875 1873 + 1 4524 4540 1873 1875 + 1 4508 620 4518 4516 + 1 4509 4516 4522 621 + 1 4511 4518 626 4522 + 1 4508 4509 4518 4511 + 1 4508 4509 4516 4518 + 1 4509 4511 4522 4518 + 1 4509 4516 4518 4522 + 1 4508 620 4517 4518 + 1 4510 4517 622 4526 + 1 4511 4518 4526 626 + 1 4508 4510 4511 4518 + 1 4508 4510 4518 4517 + 1 4510 4511 4518 4526 + 1 4510 4517 4526 4518 + 1 4516 621 4524 4522 + 1 4518 4522 4540 626 + 1 4521 4524 683 4540 + 1 4516 4518 4524 4521 + 1 4516 4518 4522 4524 + 1 4518 4521 4540 4524 + 1 4518 4522 4524 4540 + 1 4517 622 4526 4528 + 1 4518 4526 626 4540 + 1 4521 4528 4540 683 + 1 4517 4518 4521 4528 + 1 4517 4518 4528 4526 + 1 4518 4521 4528 4540 + 1 4518 4526 4540 4528 + 1 1695 104 1696 1698 + 1 4514 1696 676 4752 + 1 4515 1698 4752 678 + 1 1695 4514 4515 1698 + 1 1695 4514 1698 1696 + 1 4514 4515 1698 4752 + 1 4514 1696 4752 1698 + 1 4519 676 1707 4755 + 1 1704 1707 105 1711 + 1 4521 4755 1711 683 + 1 4519 1704 4521 4755 + 1 4519 1704 4755 1707 + 1 1704 4521 4755 1711 + 1 1704 1707 1711 4755 + 1 4523 678 4762 1874 + 1 4524 4762 683 1875 + 1 1872 1874 1875 119 + 1 4523 4524 1872 1874 + 1 4523 4524 1874 4762 + 1 4524 1872 1874 1875 + 1 4524 4762 1875 1874 + 1 4512 620 4516 4520 + 1 4513 4516 621 4523 + 1 4515 4520 4523 678 + 1 4512 4513 4515 4520 + 1 4512 4513 4520 4516 + 1 4513 4515 4520 4523 + 1 4513 4516 4523 4520 + 1 4512 620 4520 4519 + 1 4514 4519 4752 676 + 1 4515 4520 678 4752 + 1 4512 4514 4520 4515 + 1 4512 4514 4519 4520 + 1 4514 4515 4752 4520 + 1 4514 4519 4520 4752 + 1 4516 621 4523 4524 + 1 4520 4523 678 4762 + 1 4521 4524 4762 683 + 1 4516 4520 4521 4524 + 1 4516 4520 4524 4523 + 1 4520 4521 4524 4762 + 1 4520 4523 4762 4524 + 1 4519 676 4755 4752 + 1 4520 4752 4762 678 + 1 4521 4755 683 4762 + 1 4519 4520 4755 4521 + 1 4519 4520 4752 4755 + 1 4520 4521 4762 4755 + 1 4520 4752 4755 4762 + 1 851 18 853 857 + 1 2724 853 249 2744 + 1 2726 857 2744 253 + 1 851 2724 2726 857 + 1 851 2724 857 853 + 1 2724 2726 857 2744 + 1 2724 853 2744 857 + 1 2747 249 1756 2750 + 1 1762 1756 109 1766 + 1 4738 2750 1766 701 + 1 2747 1762 4738 2750 + 1 2747 1762 2750 1756 + 1 1762 4738 2750 1766 + 1 1762 1756 1766 2750 + 1 2773 253 2774 1804 + 1 4746 2774 701 1812 + 1 1809 1804 1812 113 + 1 2773 4746 1809 1804 + 1 2773 4746 1804 2774 + 1 4746 1809 1804 1812 + 1 4746 2774 1812 1804 + 1 2730 671 4735 2772 + 1 2732 4735 673 2773 + 1 2726 2772 2773 253 + 1 2730 2732 2726 2772 + 1 2730 2732 2772 4735 + 1 2732 2726 2772 2773 + 1 2732 4735 2773 2772 + 1 2730 671 2772 2747 + 1 2724 2747 2744 249 + 1 2726 2772 253 2744 + 1 2730 2724 2772 2726 + 1 2730 2724 2747 2772 + 1 2724 2726 2744 2772 + 1 2724 2747 2772 2744 + 1 4735 673 2773 4746 + 1 2772 2773 253 2774 + 1 4738 4746 2774 701 + 1 4735 2772 4738 4746 + 1 4735 2772 4746 2773 + 1 2772 4738 4746 2774 + 1 2772 2773 2774 4746 + 1 2747 249 2750 2744 + 1 2772 2744 2774 253 + 1 4738 2750 701 2774 + 1 2747 2772 2750 4738 + 1 2747 2772 2744 2750 + 1 2772 4738 2774 2750 + 1 2772 2744 2750 2774 + 1 1763 109 1757 1769 + 1 3008 1757 288 3011 + 1 4777 1769 3011 704 + 1 1763 3008 4777 1769 + 1 1763 3008 1769 1757 + 1 3008 4777 1769 3011 + 1 3008 1757 3011 1769 + 1 2992 288 892 3005 + 1 891 892 23 896 + 1 2994 3005 896 292 + 1 2992 891 2994 3005 + 1 2992 891 3005 892 + 1 891 2994 3005 896 + 1 891 892 896 3005 + 1 4795 704 3029 1904 + 1 3028 3029 292 1898 + 1 1902 1904 1898 122 + 1 4795 3028 1902 1904 + 1 4795 3028 1904 3029 + 1 3028 1902 1904 1898 + 1 3028 3029 1898 1904 + 1 2998 287 3000 3001 + 1 4775 3000 685 4795 + 1 4777 3001 4795 704 + 1 2998 4775 4777 3001 + 1 2998 4775 3001 3000 + 1 4775 4777 3001 4795 + 1 4775 3000 4795 3001 + 1 2998 287 3001 2992 + 1 3008 2992 3011 288 + 1 4777 3001 704 3011 + 1 2998 3008 3001 4777 + 1 2998 3008 2992 3001 + 1 3008 4777 3011 3001 + 1 3008 2992 3001 3011 + 1 3000 685 4795 3028 + 1 3001 4795 704 3029 + 1 2994 3028 3029 292 + 1 3000 3001 2994 3028 + 1 3000 3001 3028 4795 + 1 3001 2994 3028 3029 + 1 3001 4795 3029 3028 + 1 2992 288 3005 3011 + 1 3001 3011 3029 704 + 1 2994 3005 292 3029 + 1 2992 3001 3005 2994 + 1 2992 3001 3011 3005 + 1 3001 2994 3029 3005 + 1 3001 3011 3005 3029 + 1 1811 113 1815 1805 + 1 4817 1815 715 3187 + 1 3185 1805 3187 317 + 1 1811 4817 3185 1805 + 1 1811 4817 1805 1815 + 1 4817 3185 1805 3187 + 1 4817 1815 3187 1805 + 1 4821 715 1905 3198 + 1 1903 1905 122 1899 + 1 3197 3198 1899 319 + 1 4821 1903 3197 3198 + 1 4821 1903 3198 1905 + 1 1903 3197 3198 1899 + 1 1903 1905 1899 3198 + 1 3169 317 3180 921 + 1 3171 3180 319 923 + 1 920 921 923 27 + 1 3169 3171 920 921 + 1 3169 3171 921 3180 + 1 3171 920 921 923 + 1 3171 3180 923 921 + 1 4814 693 3177 3186 + 1 3175 3177 316 3169 + 1 3185 3186 3169 317 + 1 4814 3175 3185 3186 + 1 4814 3175 3186 3177 + 1 3175 3185 3186 3169 + 1 3175 3177 3169 3186 + 1 4814 693 3186 4821 + 1 4817 4821 3187 715 + 1 3185 3186 317 3187 + 1 4814 4817 3186 3185 + 1 4814 4817 4821 3186 + 1 4817 3185 3187 3186 + 1 4817 4821 3186 3187 + 1 3177 316 3169 3171 + 1 3186 3169 317 3180 + 1 3197 3171 3180 319 + 1 3177 3186 3197 3171 + 1 3177 3186 3171 3169 + 1 3186 3197 3171 3180 + 1 3186 3169 3180 3171 + 1 4821 715 3198 3187 + 1 3186 3187 3180 317 + 1 3197 3198 319 3180 + 1 4821 3186 3198 3197 + 1 4821 3186 3187 3198 + 1 3186 3197 3180 3198 + 1 3186 3187 3198 3180 + 1 1706 105 1708 1710 + 1 4720 1708 680 4768 + 1 4722 1710 4768 682 + 1 1706 4720 4722 1710 + 1 1706 4720 1710 1708 + 1 4720 4722 1710 4768 + 1 4720 1708 4768 1710 + 1 4730 680 1735 4771 + 1 1733 1735 107 1738 + 1 4734 4771 1738 691 + 1 4730 1733 4734 4771 + 1 4730 1733 4771 1735 + 1 1733 4734 4771 1738 + 1 1733 1735 1738 4771 + 1 4743 682 4779 1810 + 1 4745 4779 691 1811 + 1 1809 1810 1811 113 + 1 4743 4745 1809 1810 + 1 4743 4745 1810 4779 + 1 4745 1809 1810 1811 + 1 4745 4779 1811 1810 + 1 4717 670 4729 4731 + 1 4719 4729 673 4743 + 1 4722 4731 4743 682 + 1 4717 4719 4722 4731 + 1 4717 4719 4731 4729 + 1 4719 4722 4731 4743 + 1 4719 4729 4743 4731 + 1 4717 670 4731 4730 + 1 4720 4730 4768 680 + 1 4722 4731 682 4768 + 1 4717 4720 4731 4722 + 1 4717 4720 4730 4731 + 1 4720 4722 4768 4731 + 1 4720 4730 4731 4768 + 1 4729 673 4743 4745 + 1 4731 4743 682 4779 + 1 4734 4745 4779 691 + 1 4729 4731 4734 4745 + 1 4729 4731 4745 4743 + 1 4731 4734 4745 4779 + 1 4731 4743 4779 4745 + 1 4730 680 4771 4768 + 1 4731 4768 4779 682 + 1 4734 4771 691 4779 + 1 4730 4731 4771 4734 + 1 4730 4731 4768 4771 + 1 4731 4734 4779 4771 + 1 4731 4768 4771 4779 + 1 1706 105 1710 1709 + 1 4721 1709 4774 681 + 1 4722 1710 682 4774 + 1 1706 4721 1710 4722 + 1 1706 4721 1709 1710 + 1 4721 4722 4774 1710 + 1 4721 1709 1710 4774 + 1 4736 681 4776 1763 + 1 1762 1763 1766 109 + 1 4738 4776 701 1766 + 1 4736 1762 4776 4738 + 1 4736 1762 1763 4776 + 1 1762 4738 1766 4776 + 1 1762 1763 4776 1766 + 1 4743 682 1810 4781 + 1 4746 4781 1812 701 + 1 1809 1810 113 1812 + 1 4743 4746 1810 1809 + 1 4743 4746 4781 1810 + 1 4746 1809 1812 1810 + 1 4746 4781 1810 1812 + 1 4718 671 4737 4735 + 1 4719 4735 4743 673 + 1 4722 4737 682 4743 + 1 4718 4719 4737 4722 + 1 4718 4719 4735 4737 + 1 4719 4722 4743 4737 + 1 4719 4735 4737 4743 + 1 4718 671 4736 4737 + 1 4721 4736 681 4774 + 1 4722 4737 4774 682 + 1 4718 4721 4722 4737 + 1 4718 4721 4737 4736 + 1 4721 4722 4737 4774 + 1 4721 4736 4774 4737 + 1 4735 673 4746 4743 + 1 4737 4743 4781 682 + 1 4738 4746 701 4781 + 1 4735 4737 4746 4738 + 1 4735 4737 4743 4746 + 1 4737 4738 4781 4746 + 1 4737 4743 4746 4781 + 1 4736 681 4774 4776 + 1 4737 4774 682 4781 + 1 4738 4776 4781 701 + 1 4736 4737 4738 4776 + 1 4736 4737 4776 4774 + 1 4737 4738 4776 4781 + 1 4737 4774 4781 4776 + 1 1735 107 1738 1740 + 1 4771 1738 691 4814 + 1 4773 1740 4814 693 + 1 1735 4771 4773 1740 + 1 1735 4771 1740 1738 + 1 4771 4773 1740 4814 + 1 4771 1738 4814 1740 + 1 4779 691 1811 4817 + 1 1810 1811 113 1815 + 1 4783 4817 1815 715 + 1 4779 1810 4783 4817 + 1 4779 1810 4817 1811 + 1 1810 4783 4817 1815 + 1 1810 1811 1815 4817 + 1 4794 693 4821 1903 + 1 4796 4821 715 1905 + 1 1902 1903 1905 122 + 1 4794 4796 1902 1903 + 1 4794 4796 1903 4821 + 1 4796 1902 1903 1905 + 1 4796 4821 1905 1903 + 1 4768 682 4778 4780 + 1 4770 4778 685 4794 + 1 4773 4780 4794 693 + 1 4768 4770 4773 4780 + 1 4768 4770 4780 4778 + 1 4770 4773 4780 4794 + 1 4770 4778 4794 4780 + 1 4768 682 4780 4779 + 1 4771 4779 4814 691 + 1 4773 4780 693 4814 + 1 4768 4771 4780 4773 + 1 4768 4771 4779 4780 + 1 4771 4773 4814 4780 + 1 4771 4779 4780 4814 + 1 4778 685 4794 4796 + 1 4780 4794 693 4821 + 1 4783 4796 4821 715 + 1 4778 4780 4783 4796 + 1 4778 4780 4796 4794 + 1 4780 4783 4796 4821 + 1 4780 4794 4821 4796 + 1 4779 691 4817 4814 + 1 4780 4814 4821 693 + 1 4783 4817 715 4821 + 1 4779 4780 4817 4783 + 1 4779 4780 4814 4817 + 1 4780 4783 4821 4817 + 1 4780 4814 4817 4821 + 1 1763 109 1769 1766 + 1 4776 1766 4855 701 + 1 4777 1769 704 4855 + 1 1763 4776 1769 4777 + 1 1763 4776 1766 1769 + 1 4776 4777 4855 1769 + 1 4776 1766 1769 4855 + 1 4781 701 4856 1812 + 1 1810 1812 1815 113 + 1 4783 4856 715 1815 + 1 4781 1810 4856 4783 + 1 4781 1810 1812 4856 + 1 1810 4783 1815 4856 + 1 1810 1812 4856 1815 + 1 4795 704 1904 4861 + 1 4796 4861 1905 715 + 1 1902 1904 122 1905 + 1 4795 4796 1904 1902 + 1 4795 4796 4861 1904 + 1 4796 1902 1905 1904 + 1 4796 4861 1904 1905 + 1 4774 682 4782 4778 + 1 4775 4778 4795 685 + 1 4777 4782 704 4795 + 1 4774 4775 4782 4777 + 1 4774 4775 4778 4782 + 1 4775 4777 4795 4782 + 1 4775 4778 4782 4795 + 1 4774 682 4781 4782 + 1 4776 4781 701 4855 + 1 4777 4782 4855 704 + 1 4774 4776 4777 4782 + 1 4774 4776 4782 4781 + 1 4776 4777 4782 4855 + 1 4776 4781 4855 4782 + 1 4778 685 4796 4795 + 1 4782 4795 4861 704 + 1 4783 4796 715 4861 + 1 4778 4782 4796 4783 + 1 4778 4782 4795 4796 + 1 4782 4783 4861 4796 + 1 4782 4795 4796 4861 + 1 4781 701 4855 4856 + 1 4782 4855 704 4861 + 1 4783 4856 4861 715 + 1 4781 4782 4783 4856 + 1 4781 4782 4856 4855 + 1 4782 4783 4856 4861 + 1 4782 4855 4861 4856 + 1 885 22 887 886 + 1 2949 886 2957 282 + 1 2950 887 283 2957 + 1 885 2949 887 2950 + 1 885 2949 886 887 + 1 2949 2950 2957 887 + 1 2949 886 887 2957 + 1 2960 282 2961 1868 + 1 1874 1868 1876 119 + 1 4764 2961 724 1876 + 1 2960 1874 2961 4764 + 1 2960 1874 1868 2961 + 1 1874 4764 1876 2961 + 1 1874 1868 2961 1876 + 1 2965 283 1878 2966 + 1 4767 2966 1886 724 + 1 1883 1878 120 1886 + 1 2965 4767 1878 1883 + 1 2965 4767 2966 1878 + 1 4767 1883 1886 1878 + 1 4767 2966 1878 1886 + 1 2955 678 2964 4761 + 1 2956 4761 2965 679 + 1 2950 2964 283 2965 + 1 2955 2956 2964 2950 + 1 2955 2956 4761 2964 + 1 2956 2950 2965 2964 + 1 2956 4761 2964 2965 + 1 2955 678 2960 2964 + 1 2949 2960 282 2957 + 1 2950 2964 2957 283 + 1 2955 2949 2950 2964 + 1 2955 2949 2964 2960 + 1 2949 2950 2964 2957 + 1 2949 2960 2957 2964 + 1 4761 679 4767 2965 + 1 2964 2965 2966 283 + 1 4764 4767 724 2966 + 1 4761 2964 4767 4764 + 1 4761 2964 2965 4767 + 1 2964 4764 2966 4767 + 1 2964 2965 4767 2966 + 1 2960 282 2957 2961 + 1 2964 2957 283 2966 + 1 4764 2961 2966 724 + 1 2960 2964 4764 2961 + 1 2960 2964 2961 2957 + 1 2964 4764 2961 2966 + 1 2964 2957 2966 2961 + 1 1875 119 1877 1869 + 1 3020 1869 3021 290 + 1 4787 1877 725 3021 + 1 1875 3020 1877 4787 + 1 1875 3020 1869 1877 + 1 3020 4787 3021 1877 + 1 3020 1869 1877 3021 + 1 2993 290 3017 894 + 1 891 894 896 23 + 1 2994 3017 292 896 + 1 2993 891 3017 2994 + 1 2993 891 894 3017 + 1 891 2994 896 3017 + 1 891 894 3017 896 + 1 4797 725 1906 3030 + 1 3028 3030 1898 292 + 1 1902 1906 122 1898 + 1 4797 3028 1906 1902 + 1 4797 3028 3030 1906 + 1 3028 1902 1898 1906 + 1 3028 3030 1906 1898 + 1 2999 287 3002 3000 + 1 4785 3000 4797 685 + 1 4787 3002 725 4797 + 1 2999 4785 3002 4787 + 1 2999 4785 3000 3002 + 1 4785 4787 4797 3002 + 1 4785 3000 3002 4797 + 1 2999 287 2993 3002 + 1 3020 2993 290 3021 + 1 4787 3002 3021 725 + 1 2999 3020 4787 3002 + 1 2999 3020 3002 2993 + 1 3020 4787 3002 3021 + 1 3020 2993 3021 3002 + 1 3000 685 3028 4797 + 1 3002 4797 3030 725 + 1 2994 3028 292 3030 + 1 3000 3002 3028 2994 + 1 3000 3002 4797 3028 + 1 3002 2994 3030 3028 + 1 3002 4797 3028 3030 + 1 2993 290 3021 3017 + 1 3002 3021 725 3030 + 1 2994 3017 3030 292 + 1 2993 3002 2994 3017 + 1 2993 3002 3017 3021 + 1 3002 2994 3017 3030 + 1 3002 3021 3030 3017 + 1 1885 120 1879 1887 + 1 4820 1887 3195 726 + 1 3193 1879 318 3195 + 1 1885 4820 1879 3193 + 1 1885 4820 1887 1879 + 1 4820 3193 3195 1879 + 1 4820 1887 1879 3195 + 1 4822 726 3199 1907 + 1 1903 1907 1899 122 + 1 3197 3199 319 1899 + 1 4822 1903 3199 3197 + 1 4822 1903 1907 3199 + 1 1903 3197 1899 3199 + 1 1903 1907 3199 1899 + 1 3170 318 922 3190 + 1 3171 3190 923 319 + 1 920 922 27 923 + 1 3170 3171 922 920 + 1 3170 3171 3190 922 + 1 3171 920 923 922 + 1 3171 3190 922 923 + 1 4819 693 3194 3177 + 1 3176 3177 3170 316 + 1 3193 3194 318 3170 + 1 4819 3176 3194 3193 + 1 4819 3176 3177 3194 + 1 3176 3193 3170 3194 + 1 3176 3177 3194 3170 + 1 4819 693 4822 3194 + 1 4820 4822 726 3195 + 1 3193 3194 3195 318 + 1 4819 4820 3193 3194 + 1 4819 4820 3194 4822 + 1 4820 3193 3194 3195 + 1 4820 4822 3195 3194 + 1 3177 316 3171 3170 + 1 3194 3170 3190 318 + 1 3197 3171 319 3190 + 1 3177 3194 3171 3197 + 1 3177 3194 3170 3171 + 1 3194 3197 3190 3171 + 1 3194 3170 3171 3190 + 1 4822 726 3195 3199 + 1 3194 3195 318 3190 + 1 3197 3199 3190 319 + 1 4822 3194 3197 3199 + 1 4822 3194 3199 3195 + 1 3194 3197 3199 3190 + 1 3194 3195 3190 3199 + 1 1707 105 1712 1708 + 1 4754 1708 4769 680 + 1 4756 1712 684 4769 + 1 1707 4754 1712 4756 + 1 1707 4754 1708 1712 + 1 4754 4756 4769 1712 + 1 4754 1708 1712 4769 + 1 4758 680 4772 1735 + 1 1734 1735 1739 107 + 1 4760 4772 692 1739 + 1 4758 1734 4772 4760 + 1 4758 1734 1735 4772 + 1 1734 4760 1739 4772 + 1 1734 1735 4772 1739 + 1 4765 684 1884 4789 + 1 4766 4789 1885 692 + 1 1883 1884 120 1885 + 1 4765 4766 1884 1883 + 1 4765 4766 4789 1884 + 1 4766 1883 1885 1884 + 1 4766 4789 1884 1885 + 1 4751 677 4759 4757 + 1 4753 4757 4765 679 + 1 4756 4759 684 4765 + 1 4751 4753 4759 4756 + 1 4751 4753 4757 4759 + 1 4753 4756 4765 4759 + 1 4753 4757 4759 4765 + 1 4751 677 4758 4759 + 1 4754 4758 680 4769 + 1 4756 4759 4769 684 + 1 4751 4754 4756 4759 + 1 4751 4754 4759 4758 + 1 4754 4756 4759 4769 + 1 4754 4758 4769 4759 + 1 4757 679 4766 4765 + 1 4759 4765 4789 684 + 1 4760 4766 692 4789 + 1 4757 4759 4766 4760 + 1 4757 4759 4765 4766 + 1 4759 4760 4789 4766 + 1 4759 4765 4766 4789 + 1 4758 680 4769 4772 + 1 4759 4769 684 4789 + 1 4760 4772 4789 692 + 1 4758 4759 4760 4772 + 1 4758 4759 4772 4769 + 1 4759 4760 4772 4789 + 1 4759 4769 4789 4772 + 1 1707 105 1711 1712 + 1 4755 1711 683 4784 + 1 4756 1712 4784 684 + 1 1707 4755 4756 1712 + 1 1707 4755 1712 1711 + 1 4755 4756 1712 4784 + 1 4755 1711 4784 1712 + 1 4762 683 1875 4786 + 1 1874 1875 119 1876 + 1 4764 4786 1876 724 + 1 4762 1874 4764 4786 + 1 4762 1874 4786 1875 + 1 1874 4764 4786 1876 + 1 1874 1875 1876 4786 + 1 4765 684 4791 1884 + 1 4767 4791 724 1886 + 1 1883 1884 1886 120 + 1 4765 4767 1883 1884 + 1 4765 4767 1884 4791 + 1 4767 1883 1884 1886 + 1 4767 4791 1886 1884 + 1 4752 678 4761 4763 + 1 4753 4761 679 4765 + 1 4756 4763 4765 684 + 1 4752 4753 4756 4763 + 1 4752 4753 4763 4761 + 1 4753 4756 4763 4765 + 1 4753 4761 4765 4763 + 1 4752 678 4763 4762 + 1 4755 4762 4784 683 + 1 4756 4763 684 4784 + 1 4752 4755 4763 4756 + 1 4752 4755 4762 4763 + 1 4755 4756 4784 4763 + 1 4755 4762 4763 4784 + 1 4761 679 4765 4767 + 1 4763 4765 684 4791 + 1 4764 4767 4791 724 + 1 4761 4763 4764 4767 + 1 4761 4763 4767 4765 + 1 4763 4764 4767 4791 + 1 4763 4765 4791 4767 + 1 4762 683 4786 4784 + 1 4763 4784 4791 684 + 1 4764 4786 724 4791 + 1 4762 4763 4786 4764 + 1 4762 4763 4784 4786 + 1 4763 4764 4791 4786 + 1 4763 4784 4786 4791 + 1 1735 107 1740 1739 + 1 4772 1739 4819 692 + 1 4773 1740 693 4819 + 1 1735 4772 1740 4773 + 1 1735 4772 1739 1740 + 1 4772 4773 4819 1740 + 1 4772 1739 1740 4819 + 1 4789 692 4820 1885 + 1 1884 1885 1887 120 + 1 4793 4820 726 1887 + 1 4789 1884 4820 4793 + 1 4789 1884 1885 4820 + 1 1884 4793 1887 4820 + 1 1884 1885 4820 1887 + 1 4794 693 1903 4822 + 1 4798 4822 1907 726 + 1 1902 1903 122 1907 + 1 4794 4798 1903 1902 + 1 4794 4798 4822 1903 + 1 4798 1902 1907 1903 + 1 4798 4822 1903 1907 + 1 4769 684 4790 4788 + 1 4770 4788 4794 685 + 1 4773 4790 693 4794 + 1 4769 4770 4790 4773 + 1 4769 4770 4788 4790 + 1 4770 4773 4794 4790 + 1 4770 4788 4790 4794 + 1 4769 684 4789 4790 + 1 4772 4789 692 4819 + 1 4773 4790 4819 693 + 1 4769 4772 4773 4790 + 1 4769 4772 4790 4789 + 1 4772 4773 4790 4819 + 1 4772 4789 4819 4790 + 1 4788 685 4798 4794 + 1 4790 4794 4822 693 + 1 4793 4798 726 4822 + 1 4788 4790 4798 4793 + 1 4788 4790 4794 4798 + 1 4790 4793 4822 4798 + 1 4790 4794 4798 4822 + 1 4789 692 4819 4820 + 1 4790 4819 693 4822 + 1 4793 4820 4822 726 + 1 4789 4790 4793 4820 + 1 4789 4790 4820 4819 + 1 4790 4793 4820 4822 + 1 4790 4819 4822 4820 + 1 1875 119 1876 1877 + 1 4786 1876 724 4908 + 1 4787 1877 4908 725 + 1 1875 4786 4787 1877 + 1 1875 4786 1877 1876 + 1 4786 4787 1877 4908 + 1 4786 1876 4908 1877 + 1 4791 724 1886 4909 + 1 1884 1886 120 1887 + 1 4793 4909 1887 726 + 1 4791 1884 4793 4909 + 1 4791 1884 4909 1886 + 1 1884 4793 4909 1887 + 1 1884 1886 1887 4909 + 1 4797 725 4910 1906 + 1 4798 4910 726 1907 + 1 1902 1906 1907 122 + 1 4797 4798 1902 1906 + 1 4797 4798 1906 4910 + 1 4798 1902 1906 1907 + 1 4798 4910 1907 1906 + 1 4784 684 4788 4792 + 1 4785 4788 685 4797 + 1 4787 4792 4797 725 + 1 4784 4785 4787 4792 + 1 4784 4785 4792 4788 + 1 4785 4787 4792 4797 + 1 4785 4788 4797 4792 + 1 4784 684 4792 4791 + 1 4786 4791 4908 724 + 1 4787 4792 725 4908 + 1 4784 4786 4792 4787 + 1 4784 4786 4791 4792 + 1 4786 4787 4908 4792 + 1 4786 4791 4792 4908 + 1 4788 685 4797 4798 + 1 4792 4797 725 4910 + 1 4793 4798 4910 726 + 1 4788 4792 4793 4798 + 1 4788 4792 4798 4797 + 1 4792 4793 4798 4910 + 1 4792 4797 4910 4798 + 1 4791 724 4909 4908 + 1 4792 4908 4910 725 + 1 4793 4909 726 4910 + 1 4791 4792 4909 4793 + 1 4791 4792 4908 4909 + 1 4792 4793 4910 4909 + 1 4792 4908 4909 4910 + 1 742 3 743 744 + 1 2001 743 139 2007 + 1 2002 744 2007 140 + 1 742 2001 2002 744 + 1 742 2001 744 743 + 1 2001 2002 744 2007 + 1 2001 743 2007 744 + 1 2008 139 1039 2009 + 1 1041 1039 41 1042 + 1 3504 2009 1042 391 + 1 2008 1041 3504 2009 + 1 2008 1041 2009 1039 + 1 1041 3504 2009 1042 + 1 1041 1039 1042 2009 + 1 2012 140 2013 1045 + 1 3510 2013 391 1049 + 1 1048 1045 1049 42 + 1 2012 3510 1048 1045 + 1 2012 3510 1045 2013 + 1 3510 1048 1045 1049 + 1 3510 2013 1049 1045 + 1 2005 385 3502 2011 + 1 2006 3502 386 2012 + 1 2002 2011 2012 140 + 1 2005 2006 2002 2011 + 1 2005 2006 2011 3502 + 1 2006 2002 2011 2012 + 1 2006 3502 2012 2011 + 1 2005 385 2011 2008 + 1 2001 2008 2007 139 + 1 2002 2011 140 2007 + 1 2005 2001 2011 2002 + 1 2005 2001 2008 2011 + 1 2001 2002 2007 2011 + 1 2001 2008 2011 2007 + 1 3502 386 2012 3510 + 1 2011 2012 140 2013 + 1 3504 3510 2013 391 + 1 3502 2011 3504 3510 + 1 3502 2011 3510 2012 + 1 2011 3504 3510 2013 + 1 2011 2012 2013 3510 + 1 2008 139 2009 2007 + 1 2011 2007 2013 140 + 1 3504 2009 391 2013 + 1 2008 2011 2009 3504 + 1 2008 2011 2007 2009 + 1 2011 3504 2013 2009 + 1 2011 2007 2009 2013 + 1 1043 41 1040 1044 + 1 2779 1040 254 2780 + 1 3537 1044 2780 393 + 1 1043 2779 3537 1044 + 1 1043 2779 1044 1040 + 1 2779 3537 1044 2780 + 1 2779 1040 2780 1044 + 1 2777 254 858 2778 + 1 860 858 19 862 + 1 2786 2778 862 258 + 1 2777 860 2786 2778 + 1 2777 860 2778 858 + 1 860 2786 2778 862 + 1 860 858 862 2778 + 1 3542 393 2799 1820 + 1 2800 2799 258 1818 + 1 1822 1820 1818 114 + 1 3542 2800 1822 1820 + 1 3542 2800 1820 2799 + 1 2800 1822 1820 1818 + 1 2800 2799 1818 1820 + 1 2787 256 2790 2788 + 1 3539 2790 592 3542 + 1 3537 2788 3542 393 + 1 2787 3539 3537 2788 + 1 2787 3539 2788 2790 + 1 3539 3537 2788 3542 + 1 3539 2790 3542 2788 + 1 2787 256 2788 2777 + 1 2779 2777 2780 254 + 1 3537 2788 393 2780 + 1 2787 2779 2788 3537 + 1 2787 2779 2777 2788 + 1 2779 3537 2780 2788 + 1 2779 2777 2788 2780 + 1 2790 592 3542 2800 + 1 2788 3542 393 2799 + 1 2786 2800 2799 258 + 1 2790 2788 2786 2800 + 1 2790 2788 2800 3542 + 1 2788 2786 2800 2799 + 1 2788 3542 2799 2800 + 1 2777 254 2778 2780 + 1 2788 2780 2799 393 + 1 2786 2778 258 2799 + 1 2777 2788 2778 2786 + 1 2777 2788 2780 2778 + 1 2788 2786 2799 2778 + 1 2788 2780 2778 2799 + 1 1052 42 1053 1046 + 1 3550 1053 397 2813 + 1 2812 1046 2813 260 + 1 1052 3550 2812 1046 + 1 1052 3550 1046 1053 + 1 3550 2812 1046 2813 + 1 3550 1053 2813 1046 + 1 3555 397 1821 2864 + 1 1823 1821 114 1819 + 1 2865 2864 1819 267 + 1 3555 1823 2865 2864 + 1 3555 1823 2864 1821 + 1 1823 2865 2864 1819 + 1 1823 1821 1819 2864 + 1 2809 260 2810 864 + 1 2837 2810 267 871 + 1 868 864 871 20 + 1 2809 2837 868 864 + 1 2809 2837 864 2810 + 1 2837 868 864 871 + 1 2837 2810 871 864 + 1 3553 595 2843 2814 + 1 2838 2843 264 2809 + 1 2812 2814 2809 260 + 1 3553 2838 2812 2814 + 1 3553 2838 2814 2843 + 1 2838 2812 2814 2809 + 1 2838 2843 2809 2814 + 1 3553 595 2814 3555 + 1 3550 3555 2813 397 + 1 2812 2814 260 2813 + 1 3553 3550 2814 2812 + 1 3553 3550 3555 2814 + 1 3550 2812 2813 2814 + 1 3550 3555 2814 2813 + 1 2843 264 2809 2837 + 1 2814 2809 260 2810 + 1 2865 2837 2810 267 + 1 2843 2814 2865 2837 + 1 2843 2814 2837 2809 + 1 2814 2865 2837 2810 + 1 2814 2809 2810 2837 + 1 3555 397 2864 2813 + 1 2814 2813 2810 260 + 1 2865 2864 267 2810 + 1 3555 2814 2864 2865 + 1 3555 2814 2813 2864 + 1 2814 2865 2810 2864 + 1 2814 2813 2864 2810 + 1 1458 85 1462 1460 + 1 3527 1462 589 3547 + 1 3526 1460 3547 395 + 1 1458 3527 3526 1460 + 1 1458 3527 1460 1462 + 1 3527 3526 1460 3547 + 1 3527 1462 3547 1460 + 1 3532 589 1476 3552 + 1 1468 1476 86 1469 + 1 3529 3552 1469 396 + 1 3532 1468 3529 3552 + 1 3532 1468 3552 1476 + 1 1468 3529 3552 1469 + 1 1468 1476 1469 3552 + 1 3512 395 3545 1051 + 1 3513 3545 396 1052 + 1 1048 1051 1052 42 + 1 3512 3513 1048 1051 + 1 3512 3513 1051 3545 + 1 3513 1048 1051 1052 + 1 3513 3545 1052 1051 + 1 3524 390 3509 3528 + 1 3508 3509 386 3512 + 1 3526 3528 3512 395 + 1 3524 3508 3526 3528 + 1 3524 3508 3528 3509 + 1 3508 3526 3528 3512 + 1 3508 3509 3512 3528 + 1 3524 390 3528 3532 + 1 3527 3532 3547 589 + 1 3526 3528 395 3547 + 1 3524 3527 3528 3526 + 1 3524 3527 3532 3528 + 1 3527 3526 3547 3528 + 1 3527 3532 3528 3547 + 1 3509 386 3512 3513 + 1 3528 3512 395 3545 + 1 3529 3513 3545 396 + 1 3509 3528 3529 3513 + 1 3509 3528 3513 3512 + 1 3528 3529 3513 3545 + 1 3528 3512 3545 3513 + 1 3532 589 3552 3547 + 1 3528 3547 3545 395 + 1 3529 3552 396 3545 + 1 3532 3528 3552 3529 + 1 3532 3528 3547 3552 + 1 3528 3529 3545 3552 + 1 3528 3547 3552 3545 + 1 1458 85 1460 1459 + 1 3525 1459 3538 392 + 1 3526 1460 395 3538 + 1 1458 3525 1460 3526 + 1 1458 3525 1459 1460 + 1 3525 3526 3538 1460 + 1 3525 1459 1460 3538 + 1 3505 392 3533 1043 + 1 1041 1043 1042 41 + 1 3504 3533 391 1042 + 1 3505 1041 3533 3504 + 1 3505 1041 1043 3533 + 1 1041 3504 1042 3533 + 1 1041 1043 3533 1042 + 1 3512 395 1051 3535 + 1 3510 3535 1049 391 + 1 1048 1051 42 1049 + 1 3512 3510 1051 1048 + 1 3512 3510 3535 1051 + 1 3510 1048 1049 1051 + 1 3510 3535 1051 1049 + 1 3503 385 3506 3502 + 1 3508 3502 3512 386 + 1 3526 3506 395 3512 + 1 3503 3508 3506 3526 + 1 3503 3508 3502 3506 + 1 3508 3526 3512 3506 + 1 3508 3502 3506 3512 + 1 3503 385 3505 3506 + 1 3525 3505 392 3538 + 1 3526 3506 3538 395 + 1 3503 3525 3526 3506 + 1 3503 3525 3506 3505 + 1 3525 3526 3506 3538 + 1 3525 3505 3538 3506 + 1 3502 386 3510 3512 + 1 3506 3512 3535 395 + 1 3504 3510 391 3535 + 1 3502 3506 3510 3504 + 1 3502 3506 3512 3510 + 1 3506 3504 3535 3510 + 1 3506 3512 3510 3535 + 1 3505 392 3538 3533 + 1 3506 3538 395 3535 + 1 3504 3533 3535 391 + 1 3505 3506 3504 3533 + 1 3505 3506 3533 3538 + 1 3506 3504 3533 3535 + 1 3506 3538 3535 3533 + 1 1476 86 1469 1479 + 1 3552 1469 396 3553 + 1 4382 1479 3553 595 + 1 1476 3552 4382 1479 + 1 1476 3552 1479 1469 + 1 3552 4382 1479 3553 + 1 3552 1469 3553 1479 + 1 3545 396 1052 3550 + 1 1051 1052 42 1053 + 1 3546 3550 1053 397 + 1 3545 1051 3546 3550 + 1 3545 1051 3550 1052 + 1 1051 3546 3550 1053 + 1 1051 1052 1053 3550 + 1 4393 595 3555 1823 + 1 3554 3555 397 1821 + 1 1822 1823 1821 114 + 1 4393 3554 1822 1823 + 1 4393 3554 1823 3555 + 1 3554 1822 1823 1821 + 1 3554 3555 1821 1823 + 1 3547 395 3548 3549 + 1 4380 3548 592 4393 + 1 4382 3549 4393 595 + 1 3547 4380 4382 3549 + 1 3547 4380 3549 3548 + 1 4380 4382 3549 4393 + 1 4380 3548 4393 3549 + 1 3547 395 3549 3545 + 1 3552 3545 3553 396 + 1 4382 3549 595 3553 + 1 3547 3552 3549 4382 + 1 3547 3552 3545 3549 + 1 3552 4382 3553 3549 + 1 3552 3545 3549 3553 + 1 3548 592 4393 3554 + 1 3549 4393 595 3555 + 1 3546 3554 3555 397 + 1 3548 3549 3546 3554 + 1 3548 3549 3554 4393 + 1 3549 3546 3554 3555 + 1 3549 4393 3555 3554 + 1 3545 396 3550 3553 + 1 3549 3553 3555 595 + 1 3546 3550 397 3555 + 1 3545 3549 3550 3546 + 1 3545 3549 3553 3550 + 1 3549 3546 3555 3550 + 1 3549 3553 3550 3555 + 1 1043 41 1044 1042 + 1 3533 1042 3534 391 + 1 3537 1044 393 3534 + 1 1043 3533 1044 3537 + 1 1043 3533 1042 1044 + 1 3533 3537 3534 1044 + 1 3533 1042 1044 3534 + 1 3535 391 3536 1049 + 1 1051 1049 1053 42 + 1 3546 3536 397 1053 + 1 3535 1051 3536 3546 + 1 3535 1051 1049 3536 + 1 1051 3546 1053 3536 + 1 1051 1049 3536 1053 + 1 3542 393 1820 3541 + 1 3554 3541 1821 397 + 1 1822 1820 114 1821 + 1 3542 3554 1820 1822 + 1 3542 3554 3541 1820 + 1 3554 1822 1821 1820 + 1 3554 3541 1820 1821 + 1 3538 395 3540 3548 + 1 3539 3548 3542 592 + 1 3537 3540 393 3542 + 1 3538 3539 3540 3537 + 1 3538 3539 3548 3540 + 1 3539 3537 3542 3540 + 1 3539 3548 3540 3542 + 1 3538 395 3535 3540 + 1 3533 3535 391 3534 + 1 3537 3540 3534 393 + 1 3538 3533 3537 3540 + 1 3538 3533 3540 3535 + 1 3533 3537 3540 3534 + 1 3533 3535 3534 3540 + 1 3548 592 3554 3542 + 1 3540 3542 3541 393 + 1 3546 3554 397 3541 + 1 3548 3540 3554 3546 + 1 3548 3540 3542 3554 + 1 3540 3546 3541 3554 + 1 3540 3542 3554 3541 + 1 3535 391 3534 3536 + 1 3540 3534 393 3541 + 1 3546 3536 3541 397 + 1 3535 3540 3546 3536 + 1 3535 3540 3536 3534 + 1 3540 3546 3536 3541 + 1 3540 3534 3541 3536 + 1 861 19 859 863 + 1 2781 859 255 2782 + 1 2793 863 2782 259 + 1 861 2781 2793 863 + 1 861 2781 863 859 + 1 2781 2793 863 2782 + 1 2781 859 2782 863 + 1 2783 255 1105 2784 + 1 1108 1105 49 1109 + 1 3705 2784 1109 431 + 1 2783 1108 3705 2784 + 1 2783 1108 2784 1105 + 1 1108 3705 2784 1109 + 1 1108 1105 1109 2784 + 1 2806 259 2804 1828 + 1 3708 2804 431 1831 + 1 1833 1828 1831 115 + 1 2806 3708 1833 1828 + 1 2806 3708 1828 2804 + 1 3708 1833 1828 1831 + 1 3708 2804 1831 1828 + 1 2794 430 3706 2803 + 1 2797 3706 642 2806 + 1 2793 2803 2806 259 + 1 2794 2797 2793 2803 + 1 2794 2797 2803 3706 + 1 2797 2793 2803 2806 + 1 2797 3706 2806 2803 + 1 2794 430 2803 2783 + 1 2781 2783 2782 255 + 1 2793 2803 259 2782 + 1 2794 2781 2803 2793 + 1 2794 2781 2783 2803 + 1 2781 2793 2782 2803 + 1 2781 2783 2803 2782 + 1 3706 642 2806 3708 + 1 2803 2806 259 2804 + 1 3705 3708 2804 431 + 1 3706 2803 3705 3708 + 1 3706 2803 3708 2806 + 1 2803 3705 3708 2804 + 1 2803 2806 2804 3708 + 1 2783 255 2784 2782 + 1 2803 2782 2804 259 + 1 3705 2784 431 2804 + 1 2783 2803 2784 3705 + 1 2783 2803 2782 2784 + 1 2803 3705 2804 2784 + 1 2803 2782 2784 2804 + 1 1106 49 1104 1107 + 1 2046 1104 147 2047 + 1 3664 1107 2047 429 + 1 1106 2046 3664 1107 + 1 1106 2046 1107 1104 + 1 2046 3664 1107 2047 + 1 2046 1104 2047 1107 + 1 2038 147 751 2045 + 1 750 751 5 752 + 1 2039 2045 752 148 + 1 2038 750 2039 2045 + 1 2038 750 2045 751 + 1 750 2039 2045 752 + 1 750 751 752 2045 + 1 3671 429 2051 1113 + 1 2049 2051 148 1110 + 1 1112 1113 1110 50 + 1 3671 2049 1112 1113 + 1 3671 2049 1113 2051 + 1 2049 1112 1113 1110 + 1 2049 2051 1110 1113 + 1 2041 146 2042 2044 + 1 3661 2042 423 3671 + 1 3664 2044 3671 429 + 1 2041 3661 3664 2044 + 1 2041 3661 2044 2042 + 1 3661 3664 2044 3671 + 1 3661 2042 3671 2044 + 1 2041 146 2044 2038 + 1 2046 2038 2047 147 + 1 3664 2044 429 2047 + 1 2041 2046 2044 3664 + 1 2041 2046 2038 2044 + 1 2046 3664 2047 2044 + 1 2046 2038 2044 2047 + 1 2042 423 3671 2049 + 1 2044 3671 429 2051 + 1 2039 2049 2051 148 + 1 2042 2044 2039 2049 + 1 2042 2044 2049 3671 + 1 2044 2039 2049 2051 + 1 2044 3671 2051 2049 + 1 2038 147 2045 2047 + 1 2044 2047 2051 429 + 1 2039 2045 148 2051 + 1 2038 2044 2045 2039 + 1 2038 2044 2047 2045 + 1 2044 2039 2051 2045 + 1 2044 2047 2045 2051 + 1 1835 115 1832 1829 + 1 3725 1832 435 3078 + 1 3079 1829 3078 298 + 1 1835 3725 3079 1829 + 1 1835 3725 1829 1832 + 1 3725 3079 1829 3078 + 1 3725 1832 3078 1829 + 1 3714 435 1117 3035 + 1 1115 1117 50 1111 + 1 3034 3035 1111 293 + 1 3714 1115 3034 3035 + 1 3714 1115 3035 1117 + 1 1115 3034 3035 1111 + 1 1115 1117 1111 3035 + 1 3047 298 3032 902 + 1 3031 3032 293 897 + 1 899 902 897 24 + 1 3047 3031 899 902 + 1 3047 3031 902 3032 + 1 3031 899 902 897 + 1 3031 3032 897 902 + 1 3717 433 3050 3077 + 1 3053 3050 295 3047 + 1 3079 3077 3047 298 + 1 3717 3053 3079 3077 + 1 3717 3053 3077 3050 + 1 3053 3079 3077 3047 + 1 3053 3050 3047 3077 + 1 3717 433 3077 3714 + 1 3725 3714 3078 435 + 1 3079 3077 298 3078 + 1 3717 3725 3077 3079 + 1 3717 3725 3714 3077 + 1 3725 3079 3078 3077 + 1 3725 3714 3077 3078 + 1 3050 295 3047 3031 + 1 3077 3047 298 3032 + 1 3034 3031 3032 293 + 1 3050 3077 3034 3031 + 1 3050 3077 3031 3047 + 1 3077 3034 3031 3032 + 1 3077 3047 3032 3031 + 1 3714 435 3035 3078 + 1 3077 3078 3032 298 + 1 3034 3035 293 3032 + 1 3714 3077 3035 3034 + 1 3714 3077 3078 3035 + 1 3077 3034 3032 3035 + 1 3077 3078 3035 3032 + 1 1100 48 1101 1103 + 1 3680 1101 426 3686 + 1 3681 1103 3686 428 + 1 1100 3680 3681 1103 + 1 1100 3680 1103 1101 + 1 3680 3681 1103 3686 + 1 3680 1101 3686 1103 + 1 3689 426 1606 3691 + 1 1610 1606 97 1615 + 1 4612 3691 1615 652 + 1 3689 1610 4612 3691 + 1 3689 1610 3691 1606 + 1 1610 4612 3691 1615 + 1 1610 1606 1615 3691 + 1 3701 428 3702 1830 + 1 4618 3702 652 1835 + 1 1833 1830 1835 115 + 1 3701 4618 1833 1830 + 1 3701 4618 1830 3702 + 1 4618 1833 1830 1835 + 1 4618 3702 1835 1830 + 1 3683 640 4609 3700 + 1 3684 4609 642 3701 + 1 3681 3700 3701 428 + 1 3683 3684 3681 3700 + 1 3683 3684 3700 4609 + 1 3684 3681 3700 3701 + 1 3684 4609 3701 3700 + 1 3683 640 3700 3689 + 1 3680 3689 3686 426 + 1 3681 3700 428 3686 + 1 3683 3680 3700 3681 + 1 3683 3680 3689 3700 + 1 3680 3681 3686 3700 + 1 3680 3689 3700 3686 + 1 4609 642 3701 4618 + 1 3700 3701 428 3702 + 1 4612 4618 3702 652 + 1 4609 3700 4612 4618 + 1 4609 3700 4618 3701 + 1 3700 4612 4618 3702 + 1 3700 3701 3702 4618 + 1 3689 426 3691 3686 + 1 3700 3686 3702 428 + 1 4612 3691 652 3702 + 1 3689 3700 3691 4612 + 1 3689 3700 3686 3691 + 1 3700 4612 3702 3691 + 1 3700 3686 3691 3702 + 1 1100 48 1103 1097 + 1 3662 1097 3663 422 + 1 3681 1103 428 3663 + 1 1100 3662 1103 3681 + 1 1100 3662 1097 1103 + 1 3662 3681 3663 1103 + 1 3662 1097 1103 3663 + 1 3665 422 3666 1106 + 1 1108 1106 1109 49 + 1 3705 3666 431 1109 + 1 3665 1108 3666 3705 + 1 3665 1108 1106 3666 + 1 1108 3705 1109 3666 + 1 1108 1106 3666 1109 + 1 3701 428 1830 3697 + 1 3708 3697 1831 431 + 1 1833 1830 115 1831 + 1 3701 3708 1830 1833 + 1 3701 3708 3697 1830 + 1 3708 1833 1831 1830 + 1 3708 3697 1830 1831 + 1 3682 430 3696 3706 + 1 3684 3706 3701 642 + 1 3681 3696 428 3701 + 1 3682 3684 3696 3681 + 1 3682 3684 3706 3696 + 1 3684 3681 3701 3696 + 1 3684 3706 3696 3701 + 1 3682 430 3665 3696 + 1 3662 3665 422 3663 + 1 3681 3696 3663 428 + 1 3682 3662 3681 3696 + 1 3682 3662 3696 3665 + 1 3662 3681 3696 3663 + 1 3662 3665 3663 3696 + 1 3706 642 3708 3701 + 1 3696 3701 3697 428 + 1 3705 3708 431 3697 + 1 3706 3696 3708 3705 + 1 3706 3696 3701 3708 + 1 3696 3705 3697 3708 + 1 3696 3701 3708 3697 + 1 3665 422 3663 3666 + 1 3696 3663 428 3697 + 1 3705 3666 3697 431 + 1 3665 3696 3705 3666 + 1 3665 3696 3666 3663 + 1 3696 3705 3666 3697 + 1 3696 3663 3697 3666 + 1 1606 97 1615 1607 + 1 3691 1615 652 3717 + 1 3687 1607 3717 433 + 1 1606 3691 3687 1607 + 1 1606 3691 1607 1615 + 1 3691 3687 1607 3717 + 1 3691 1615 3717 1607 + 1 3702 652 1835 3725 + 1 1830 1835 115 1832 + 1 3699 3725 1832 435 + 1 3702 1830 3699 3725 + 1 3702 1830 3725 1835 + 1 1830 3699 3725 1832 + 1 1830 1835 1832 3725 + 1 3673 433 3714 1115 + 1 3675 3714 435 1117 + 1 1112 1115 1117 50 + 1 3673 3675 1112 1115 + 1 3673 3675 1115 3714 + 1 3675 1112 1115 1117 + 1 3675 3714 1117 1115 + 1 3686 428 3670 3698 + 1 3668 3670 423 3673 + 1 3687 3698 3673 433 + 1 3686 3668 3687 3698 + 1 3686 3668 3698 3670 + 1 3668 3687 3698 3673 + 1 3668 3670 3673 3698 + 1 3686 428 3698 3702 + 1 3691 3702 3717 652 + 1 3687 3698 433 3717 + 1 3686 3691 3698 3687 + 1 3686 3691 3702 3698 + 1 3691 3687 3717 3698 + 1 3691 3702 3698 3717 + 1 3670 423 3673 3675 + 1 3698 3673 433 3714 + 1 3699 3675 3714 435 + 1 3670 3698 3699 3675 + 1 3670 3698 3675 3673 + 1 3698 3699 3675 3714 + 1 3698 3673 3714 3675 + 1 3702 652 3725 3717 + 1 3698 3717 3714 433 + 1 3699 3725 435 3714 + 1 3702 3698 3725 3699 + 1 3702 3698 3717 3725 + 1 3698 3699 3714 3725 + 1 3698 3717 3725 3714 + 1 1106 49 1107 1109 + 1 3666 1109 3703 431 + 1 3664 1107 429 3703 + 1 1106 3666 1107 3664 + 1 1106 3666 1109 1107 + 1 3666 3664 3703 1107 + 1 3666 1109 1107 3703 + 1 3697 431 3707 1831 + 1 1830 1831 1832 115 + 1 3699 3707 435 1832 + 1 3697 1830 3707 3699 + 1 3697 1830 1831 3707 + 1 1830 3699 1832 3707 + 1 1830 1831 3707 1832 + 1 3671 429 1113 3704 + 1 3675 3704 1117 435 + 1 1112 1113 50 1117 + 1 3671 3675 1113 1112 + 1 3671 3675 3704 1113 + 1 3675 1112 1117 1113 + 1 3675 3704 1113 1117 + 1 3663 428 3695 3670 + 1 3661 3670 3671 423 + 1 3664 3695 429 3671 + 1 3663 3661 3695 3664 + 1 3663 3661 3670 3695 + 1 3661 3664 3671 3695 + 1 3661 3670 3695 3671 + 1 3663 428 3697 3695 + 1 3666 3697 431 3703 + 1 3664 3695 3703 429 + 1 3663 3666 3664 3695 + 1 3663 3666 3695 3697 + 1 3666 3664 3695 3703 + 1 3666 3697 3703 3695 + 1 3670 423 3675 3671 + 1 3695 3671 3704 429 + 1 3699 3675 435 3704 + 1 3670 3695 3675 3699 + 1 3670 3695 3671 3675 + 1 3695 3699 3704 3675 + 1 3695 3671 3675 3704 + 1 3697 431 3703 3707 + 1 3695 3703 429 3704 + 1 3699 3707 3704 435 + 1 3697 3695 3699 3707 + 1 3697 3695 3707 3703 + 1 3695 3699 3707 3704 + 1 3695 3703 3704 3707 + 1 870 20 872 865 + 1 2855 872 268 2817 + 1 2816 865 2817 261 + 1 870 2855 2816 865 + 1 870 2855 865 872 + 1 2855 2816 865 2817 + 1 2855 872 2817 865 + 1 2870 268 1838 2868 + 1 1844 1838 116 1840 + 1 3902 2868 1840 471 + 1 2870 1844 3902 2868 + 1 2870 1844 2868 1838 + 1 1844 3902 2868 1840 + 1 1844 1838 1840 2868 + 1 2819 261 2820 1168 + 1 3891 2820 471 1175 + 1 1173 1168 1175 57 + 1 2819 3891 1173 1168 + 1 2819 3891 1168 2820 + 1 3891 1173 1168 1175 + 1 3891 2820 1175 1168 + 1 2862 675 3894 2821 + 1 2857 3894 469 2819 + 1 2816 2821 2819 261 + 1 2862 2857 2816 2821 + 1 2862 2857 2821 3894 + 1 2857 2816 2821 2819 + 1 2857 3894 2819 2821 + 1 2862 675 2821 2870 + 1 2855 2870 2817 268 + 1 2816 2821 261 2817 + 1 2862 2855 2821 2816 + 1 2862 2855 2870 2821 + 1 2855 2816 2817 2821 + 1 2855 2870 2821 2817 + 1 3894 469 2819 3891 + 1 2821 2819 261 2820 + 1 3902 3891 2820 471 + 1 3894 2821 3902 3891 + 1 3894 2821 3891 2819 + 1 2821 3902 3891 2820 + 1 2821 2819 2820 3891 + 1 2870 268 2868 2817 + 1 2821 2817 2820 261 + 1 3902 2868 471 2820 + 1 2870 2821 2868 3902 + 1 2870 2821 2817 2868 + 1 2821 3902 2820 2868 + 1 2821 2817 2868 2820 + 1 1845 116 1839 1841 + 1 3084 1839 299 3082 + 1 3929 1841 3082 479 + 1 1845 3084 3929 1841 + 1 1845 3084 1841 1839 + 1 3084 3929 1841 3082 + 1 3084 1839 3082 1841 + 1 3057 299 903 3039 + 1 900 903 24 898 + 1 3038 3039 898 294 + 1 3057 900 3038 3039 + 1 3057 900 3039 903 + 1 900 3038 3039 898 + 1 900 903 898 3039 + 1 3918 479 3042 1191 + 1 3041 3042 294 1185 + 1 1189 1191 1185 59 + 1 3918 3041 1189 1191 + 1 3918 3041 1191 3042 + 1 3041 1189 1191 1185 + 1 3041 3042 1185 1191 + 1 3064 296 3059 3060 + 1 3921 3059 477 3918 + 1 3929 3060 3918 479 + 1 3064 3921 3929 3060 + 1 3064 3921 3060 3059 + 1 3921 3929 3060 3918 + 1 3921 3059 3918 3060 + 1 3064 296 3060 3057 + 1 3084 3057 3082 299 + 1 3929 3060 479 3082 + 1 3064 3084 3060 3929 + 1 3064 3084 3057 3060 + 1 3084 3929 3082 3060 + 1 3084 3057 3060 3082 + 1 3059 477 3918 3041 + 1 3060 3918 479 3042 + 1 3038 3041 3042 294 + 1 3059 3060 3038 3041 + 1 3059 3060 3041 3918 + 1 3060 3038 3041 3042 + 1 3060 3918 3042 3041 + 1 3057 299 3039 3082 + 1 3060 3082 3042 479 + 1 3038 3039 294 3042 + 1 3057 3060 3039 3038 + 1 3057 3060 3082 3039 + 1 3060 3038 3042 3039 + 1 3060 3082 3039 3042 + 1 1170 57 1171 1167 + 1 3814 1171 467 2087 + 1 2085 1167 2087 155 + 1 1170 3814 2085 1167 + 1 1170 3814 1167 1171 + 1 3814 2085 1167 2087 + 1 3814 1171 2087 1167 + 1 3828 467 1187 2095 + 1 1186 1187 59 1184 + 1 2093 2095 1184 157 + 1 3828 1186 2093 2095 + 1 3828 1186 2095 1187 + 1 1186 2093 2095 1184 + 1 1186 1187 1184 2095 + 1 2072 155 2083 759 + 1 2074 2083 157 761 + 1 758 759 761 7 + 1 2072 2074 758 759 + 1 2072 2074 759 2083 + 1 2074 758 759 761 + 1 2074 2083 761 759 + 1 3811 458 2080 2086 + 1 2078 2080 154 2072 + 1 2085 2086 2072 155 + 1 3811 2078 2085 2086 + 1 3811 2078 2086 2080 + 1 2078 2085 2086 2072 + 1 2078 2080 2072 2086 + 1 3811 458 2086 3828 + 1 3814 3828 2087 467 + 1 2085 2086 155 2087 + 1 3811 3814 2086 2085 + 1 3811 3814 3828 2086 + 1 3814 2085 2087 2086 + 1 3814 3828 2086 2087 + 1 2080 154 2072 2074 + 1 2086 2072 155 2083 + 1 2093 2074 2083 157 + 1 2080 2086 2093 2074 + 1 2080 2086 2074 2072 + 1 2086 2093 2074 2083 + 1 2086 2072 2083 2074 + 1 3828 467 2095 2087 + 1 2086 2087 2083 155 + 1 2093 2095 157 2083 + 1 3828 2086 2095 2093 + 1 3828 2086 2087 2095 + 1 2086 2093 2083 2095 + 1 2086 2087 2095 2083 + 1 1723 106 1716 1717 + 1 3868 1716 464 3865 + 1 3898 1717 3865 470 + 1 1723 3868 3898 1717 + 1 1723 3868 1717 1716 + 1 3868 3898 1717 3865 + 1 3868 1716 3865 1717 + 1 3852 464 1164 3813 + 1 1162 1164 56 1156 + 1 3812 3813 1156 456 + 1 3852 1162 3812 3813 + 1 3852 1162 3813 1164 + 1 1162 3812 3813 1156 + 1 1162 1164 1156 3813 + 1 3890 470 3816 1174 + 1 3815 3816 456 1170 + 1 1173 1174 1170 57 + 1 3890 3815 1173 1174 + 1 3890 3815 1174 3816 + 1 3815 1173 1174 1170 + 1 3815 3816 1170 1174 + 1 3856 462 3853 3854 + 1 3893 3853 469 3890 + 1 3898 3854 3890 470 + 1 3856 3893 3898 3854 + 1 3856 3893 3854 3853 + 1 3893 3898 3854 3890 + 1 3893 3853 3890 3854 + 1 3856 462 3854 3852 + 1 3868 3852 3865 464 + 1 3898 3854 470 3865 + 1 3856 3868 3854 3898 + 1 3856 3868 3852 3854 + 1 3868 3898 3865 3854 + 1 3868 3852 3854 3865 + 1 3853 469 3890 3815 + 1 3854 3890 470 3816 + 1 3812 3815 3816 456 + 1 3853 3854 3812 3815 + 1 3853 3854 3815 3890 + 1 3854 3812 3815 3816 + 1 3854 3890 3816 3815 + 1 3852 464 3813 3865 + 1 3854 3865 3816 470 + 1 3812 3813 456 3816 + 1 3852 3854 3813 3812 + 1 3852 3854 3865 3813 + 1 3854 3812 3816 3813 + 1 3854 3865 3813 3816 + 1 1723 106 1717 1726 + 1 4749 1726 3900 688 + 1 3898 1717 470 3900 + 1 1723 4749 1717 3898 + 1 1723 4749 1726 1717 + 1 4749 3898 3900 1717 + 1 4749 1726 1717 3900 + 1 4750 688 3903 1845 + 1 1844 1845 1840 116 + 1 3902 3903 471 1840 + 1 4750 1844 3903 3902 + 1 4750 1844 1845 3903 + 1 1844 3902 1840 3903 + 1 1844 1845 3903 1840 + 1 3890 470 1174 3895 + 1 3891 3895 1175 471 + 1 1173 1174 57 1175 + 1 3890 3891 1174 1173 + 1 3890 3891 3895 1174 + 1 3891 1173 1175 1174 + 1 3891 3895 1174 1175 + 1 4748 675 3899 3894 + 1 3893 3894 3890 469 + 1 3898 3899 470 3890 + 1 4748 3893 3899 3898 + 1 4748 3893 3894 3899 + 1 3893 3898 3890 3899 + 1 3893 3894 3899 3890 + 1 4748 675 4750 3899 + 1 4749 4750 688 3900 + 1 3898 3899 3900 470 + 1 4748 4749 3898 3899 + 1 4748 4749 3899 4750 + 1 4749 3898 3899 3900 + 1 4749 4750 3900 3899 + 1 3894 469 3891 3890 + 1 3899 3890 3895 470 + 1 3902 3891 471 3895 + 1 3894 3899 3891 3902 + 1 3894 3899 3890 3891 + 1 3899 3902 3895 3891 + 1 3899 3890 3891 3895 + 1 4750 688 3900 3903 + 1 3899 3900 470 3895 + 1 3902 3903 3895 471 + 1 4750 3899 3902 3903 + 1 4750 3899 3903 3900 + 1 3899 3902 3903 3895 + 1 3899 3900 3895 3903 + 1 1164 56 1156 1158 + 1 3813 1156 456 3811 + 1 3826 1158 3811 458 + 1 1164 3813 3826 1158 + 1 1164 3813 1158 1156 + 1 3813 3826 1158 3811 + 1 3813 1156 3811 1158 + 1 3816 456 1170 3814 + 1 1174 1170 57 1171 + 1 3884 3814 1171 467 + 1 3816 1174 3884 3814 + 1 3816 1174 3814 1170 + 1 1174 3884 3814 1171 + 1 1174 1170 1171 3814 + 1 3831 458 3828 1186 + 1 3886 3828 467 1187 + 1 1189 1186 1187 59 + 1 3831 3886 1189 1186 + 1 3831 3886 1186 3828 + 1 3886 1189 1186 1187 + 1 3886 3828 1187 1186 + 1 3865 470 3896 3829 + 1 3866 3896 477 3831 + 1 3826 3829 3831 458 + 1 3865 3866 3826 3829 + 1 3865 3866 3829 3896 + 1 3866 3826 3829 3831 + 1 3866 3896 3831 3829 + 1 3865 470 3829 3816 + 1 3813 3816 3811 456 + 1 3826 3829 458 3811 + 1 3865 3813 3829 3826 + 1 3865 3813 3816 3829 + 1 3813 3826 3811 3829 + 1 3813 3816 3829 3811 + 1 3896 477 3831 3886 + 1 3829 3831 458 3828 + 1 3884 3886 3828 467 + 1 3896 3829 3884 3886 + 1 3896 3829 3886 3831 + 1 3829 3884 3886 3828 + 1 3829 3831 3828 3886 + 1 3816 456 3814 3811 + 1 3829 3811 3828 458 + 1 3884 3814 467 3828 + 1 3816 3829 3814 3884 + 1 3816 3829 3811 3814 + 1 3829 3884 3828 3814 + 1 3829 3811 3814 3828 + 1 1845 116 1841 1840 + 1 3903 1840 3901 471 + 1 3929 1841 479 3901 + 1 1845 3903 1841 3929 + 1 1845 3903 1840 1841 + 1 3903 3929 3901 1841 + 1 3903 1840 1841 3901 + 1 3895 471 3885 1175 + 1 1174 1175 1171 57 + 1 3884 3885 467 1171 + 1 3895 1174 3885 3884 + 1 3895 1174 1175 3885 + 1 1174 3884 1171 3885 + 1 1174 1175 3885 1171 + 1 3918 479 1191 3887 + 1 3886 3887 1187 467 + 1 1189 1191 59 1187 + 1 3918 3886 1191 1189 + 1 3918 3886 3887 1191 + 1 3886 1189 1187 1191 + 1 3886 3887 1191 1187 + 1 3900 470 3897 3896 + 1 3921 3896 3918 477 + 1 3929 3897 479 3918 + 1 3900 3921 3897 3929 + 1 3900 3921 3896 3897 + 1 3921 3929 3918 3897 + 1 3921 3896 3897 3918 + 1 3900 470 3895 3897 + 1 3903 3895 471 3901 + 1 3929 3897 3901 479 + 1 3900 3903 3929 3897 + 1 3900 3903 3897 3895 + 1 3903 3929 3897 3901 + 1 3903 3895 3901 3897 + 1 3896 477 3886 3918 + 1 3897 3918 3887 479 + 1 3884 3886 467 3887 + 1 3896 3897 3886 3884 + 1 3896 3897 3918 3886 + 1 3897 3884 3887 3886 + 1 3897 3918 3886 3887 + 1 3895 471 3901 3885 + 1 3897 3901 479 3887 + 1 3884 3885 3887 467 + 1 3895 3897 3884 3885 + 1 3895 3897 3885 3901 + 1 3897 3884 3885 3887 + 1 3897 3901 3887 3885 + 1 819 15 820 823 + 1 2467 820 216 2475 + 1 2469 823 2475 219 + 1 819 2467 2469 823 + 1 819 2467 823 820 + 1 2467 2469 823 2475 + 1 2467 820 2475 823 + 1 2479 216 1556 2481 + 1 1561 1556 93 1564 + 1 4352 2481 1564 628 + 1 2479 1561 4352 2481 + 1 2479 1561 2481 1556 + 1 1561 4352 2481 1564 + 1 1561 1556 1564 2481 + 1 2499 219 2500 1590 + 1 4360 2500 628 1596 + 1 1592 1590 1596 96 + 1 2499 4360 1592 1590 + 1 2499 4360 1590 2500 + 1 4360 1592 1590 1596 + 1 4360 2500 1596 1590 + 1 2471 582 4349 2497 + 1 2473 4349 584 2499 + 1 2469 2497 2499 219 + 1 2471 2473 2469 2497 + 1 2471 2473 2497 4349 + 1 2473 2469 2497 2499 + 1 2473 4349 2499 2497 + 1 2471 582 2497 2479 + 1 2467 2479 2475 216 + 1 2469 2497 219 2475 + 1 2471 2467 2497 2469 + 1 2471 2467 2479 2497 + 1 2467 2469 2475 2497 + 1 2467 2479 2497 2475 + 1 4349 584 2499 4360 + 1 2497 2499 219 2500 + 1 4352 4360 2500 628 + 1 4349 2497 4352 4360 + 1 4349 2497 4360 2499 + 1 2497 4352 4360 2500 + 1 2497 2499 2500 4360 + 1 2479 216 2481 2475 + 1 2497 2475 2500 219 + 1 4352 2481 628 2500 + 1 2479 2497 2481 4352 + 1 2479 2497 2475 2481 + 1 2497 4352 2500 2481 + 1 2497 2475 2481 2500 + 1 1562 93 1557 1567 + 1 2626 1557 235 2628 + 1 4369 1567 2628 631 + 1 1562 2626 4369 1567 + 1 1562 2626 1567 1557 + 1 2626 4369 1567 2628 + 1 2626 1557 2628 1567 + 1 2603 235 839 2622 + 1 837 839 17 841 + 1 2604 2622 841 237 + 1 2603 837 2604 2622 + 1 2603 837 2622 839 + 1 837 2604 2622 841 + 1 837 839 841 2622 + 1 4377 631 2646 1682 + 1 2645 2646 237 1672 + 1 1680 1682 1672 103 + 1 4377 2645 1680 1682 + 1 4377 2645 1682 2646 + 1 2645 1680 1682 1672 + 1 2645 2646 1672 1682 + 1 2609 233 2610 2611 + 1 4367 2610 588 4377 + 1 4369 2611 4377 631 + 1 2609 4367 4369 2611 + 1 2609 4367 2611 2610 + 1 4367 4369 2611 4377 + 1 4367 2610 4377 2611 + 1 2609 233 2611 2603 + 1 2626 2603 2628 235 + 1 4369 2611 631 2628 + 1 2609 2626 2611 4369 + 1 2609 2626 2603 2611 + 1 2626 4369 2628 2611 + 1 2626 2603 2611 2628 + 1 2610 588 4377 2645 + 1 2611 4377 631 2646 + 1 2604 2645 2646 237 + 1 2610 2611 2604 2645 + 1 2610 2611 2645 4377 + 1 2611 2604 2645 2646 + 1 2611 4377 2646 2645 + 1 2603 235 2622 2628 + 1 2611 2628 2646 631 + 1 2604 2622 237 2646 + 1 2603 2611 2622 2604 + 1 2603 2611 2628 2622 + 1 2611 2604 2646 2622 + 1 2611 2628 2622 2646 + 1 1595 96 1599 1591 + 1 4398 1599 644 2850 + 1 2847 1591 2850 265 + 1 1595 4398 2847 1591 + 1 1595 4398 1591 1599 + 1 4398 2847 1591 2850 + 1 4398 1599 2850 1591 + 1 4400 644 1683 2861 + 1 1681 1683 103 1673 + 1 2860 2861 1673 266 + 1 4400 1681 2860 2861 + 1 4400 1681 2861 1683 + 1 1681 2860 2861 1673 + 1 1681 1683 1673 2861 + 1 2835 265 2844 869 + 1 2836 2844 266 870 + 1 868 869 870 20 + 1 2835 2836 868 869 + 1 2835 2836 869 2844 + 1 2836 868 869 870 + 1 2836 2844 870 869 + 1 4396 594 2842 2848 + 1 2841 2842 264 2835 + 1 2847 2848 2835 265 + 1 4396 2841 2847 2848 + 1 4396 2841 2848 2842 + 1 2841 2847 2848 2835 + 1 2841 2842 2835 2848 + 1 4396 594 2848 4400 + 1 4398 4400 2850 644 + 1 2847 2848 265 2850 + 1 4396 4398 2848 2847 + 1 4396 4398 4400 2848 + 1 4398 2847 2850 2848 + 1 4398 4400 2848 2850 + 1 2842 264 2835 2836 + 1 2848 2835 265 2844 + 1 2860 2836 2844 266 + 1 2842 2848 2860 2836 + 1 2842 2848 2836 2835 + 1 2848 2860 2836 2844 + 1 2848 2835 2844 2836 + 1 4400 644 2861 2850 + 1 2848 2850 2844 265 + 1 2860 2861 266 2844 + 1 4400 2848 2861 2860 + 1 4400 2848 2850 2861 + 1 2848 2860 2844 2861 + 1 2848 2850 2861 2844 + 1 1451 84 1452 1454 + 1 4334 1452 585 4362 + 1 4336 1454 4362 587 + 1 1451 4334 4336 1454 + 1 1451 4334 1454 1452 + 1 4334 4336 1454 4362 + 1 4334 1452 4362 1454 + 1 4344 585 1475 4364 + 1 1474 1475 86 1477 + 1 4348 4364 1477 593 + 1 4344 1474 4348 4364 + 1 4344 1474 4364 1475 + 1 1474 4348 4364 1477 + 1 1474 1475 1477 4364 + 1 4357 587 4371 1593 + 1 4359 4371 593 1595 + 1 1592 1593 1595 96 + 1 4357 4359 1592 1593 + 1 4357 4359 1593 4371 + 1 4359 1592 1593 1595 + 1 4359 4371 1595 1593 + 1 4331 581 4343 4345 + 1 4333 4343 584 4357 + 1 4336 4345 4357 587 + 1 4331 4333 4336 4345 + 1 4331 4333 4345 4343 + 1 4333 4336 4345 4357 + 1 4333 4343 4357 4345 + 1 4331 581 4345 4344 + 1 4334 4344 4362 585 + 1 4336 4345 587 4362 + 1 4331 4334 4345 4336 + 1 4331 4334 4344 4345 + 1 4334 4336 4362 4345 + 1 4334 4344 4345 4362 + 1 4343 584 4357 4359 + 1 4345 4357 587 4371 + 1 4348 4359 4371 593 + 1 4343 4345 4348 4359 + 1 4343 4345 4359 4357 + 1 4345 4348 4359 4371 + 1 4345 4357 4371 4359 + 1 4344 585 4364 4362 + 1 4345 4362 4371 587 + 1 4348 4364 593 4371 + 1 4344 4345 4364 4348 + 1 4344 4345 4362 4364 + 1 4345 4348 4371 4364 + 1 4345 4362 4364 4371 + 1 1451 84 1454 1453 + 1 4335 1453 4366 586 + 1 4336 1454 587 4366 + 1 1451 4335 1454 4336 + 1 1451 4335 1453 1454 + 1 4335 4336 4366 1454 + 1 4335 1453 1454 4366 + 1 4350 586 4368 1562 + 1 1561 1562 1564 93 + 1 4352 4368 628 1564 + 1 4350 1561 4368 4352 + 1 4350 1561 1562 4368 + 1 1561 4352 1564 4368 + 1 1561 1562 4368 1564 + 1 4357 587 1593 4373 + 1 4360 4373 1596 628 + 1 1592 1593 96 1596 + 1 4357 4360 1593 1592 + 1 4357 4360 4373 1593 + 1 4360 1592 1596 1593 + 1 4360 4373 1593 1596 + 1 4332 582 4351 4349 + 1 4333 4349 4357 584 + 1 4336 4351 587 4357 + 1 4332 4333 4351 4336 + 1 4332 4333 4349 4351 + 1 4333 4336 4357 4351 + 1 4333 4349 4351 4357 + 1 4332 582 4350 4351 + 1 4335 4350 586 4366 + 1 4336 4351 4366 587 + 1 4332 4335 4336 4351 + 1 4332 4335 4351 4350 + 1 4335 4336 4351 4366 + 1 4335 4350 4366 4351 + 1 4349 584 4360 4357 + 1 4351 4357 4373 587 + 1 4352 4360 628 4373 + 1 4349 4351 4360 4352 + 1 4349 4351 4357 4360 + 1 4351 4352 4373 4360 + 1 4351 4357 4360 4373 + 1 4350 586 4366 4368 + 1 4351 4366 587 4373 + 1 4352 4368 4373 628 + 1 4350 4351 4352 4368 + 1 4350 4351 4368 4366 + 1 4351 4352 4368 4373 + 1 4351 4366 4373 4368 + 1 1475 86 1477 1478 + 1 4364 1477 593 4396 + 1 4365 1478 4396 594 + 1 1475 4364 4365 1478 + 1 1475 4364 1478 1477 + 1 4364 4365 1478 4396 + 1 4364 1477 4396 1478 + 1 4371 593 1595 4398 + 1 1593 1595 96 1599 + 1 4375 4398 1599 644 + 1 4371 1593 4375 4398 + 1 4371 1593 4398 1595 + 1 1593 4375 4398 1599 + 1 1593 1595 1599 4398 + 1 4376 594 4400 1681 + 1 4378 4400 644 1683 + 1 1680 1681 1683 103 + 1 4376 4378 1680 1681 + 1 4376 4378 1681 4400 + 1 4378 1680 1681 1683 + 1 4378 4400 1683 1681 + 1 4362 587 4370 4372 + 1 4363 4370 588 4376 + 1 4365 4372 4376 594 + 1 4362 4363 4365 4372 + 1 4362 4363 4372 4370 + 1 4363 4365 4372 4376 + 1 4363 4370 4376 4372 + 1 4362 587 4372 4371 + 1 4364 4371 4396 593 + 1 4365 4372 594 4396 + 1 4362 4364 4372 4365 + 1 4362 4364 4371 4372 + 1 4364 4365 4396 4372 + 1 4364 4371 4372 4396 + 1 4370 588 4376 4378 + 1 4372 4376 594 4400 + 1 4375 4378 4400 644 + 1 4370 4372 4375 4378 + 1 4370 4372 4378 4376 + 1 4372 4375 4378 4400 + 1 4372 4376 4400 4378 + 1 4371 593 4398 4396 + 1 4372 4396 4400 594 + 1 4375 4398 644 4400 + 1 4371 4372 4398 4375 + 1 4371 4372 4396 4398 + 1 4372 4375 4400 4398 + 1 4372 4396 4398 4400 + 1 1562 93 1567 1564 + 1 4368 1564 4548 628 + 1 4369 1567 631 4548 + 1 1562 4368 1567 4369 + 1 1562 4368 1564 1567 + 1 4368 4369 4548 1567 + 1 4368 1564 1567 4548 + 1 4373 628 4551 1596 + 1 1593 1596 1599 96 + 1 4375 4551 644 1599 + 1 4373 1593 4551 4375 + 1 4373 1593 1596 4551 + 1 1593 4375 1599 4551 + 1 1593 1596 4551 1599 + 1 4377 631 1682 4566 + 1 4378 4566 1683 644 + 1 1680 1682 103 1683 + 1 4377 4378 1682 1680 + 1 4377 4378 4566 1682 + 1 4378 1680 1683 1682 + 1 4378 4566 1682 1683 + 1 4366 587 4374 4370 + 1 4367 4370 4377 588 + 1 4369 4374 631 4377 + 1 4366 4367 4374 4369 + 1 4366 4367 4370 4374 + 1 4367 4369 4377 4374 + 1 4367 4370 4374 4377 + 1 4366 587 4373 4374 + 1 4368 4373 628 4548 + 1 4369 4374 4548 631 + 1 4366 4368 4369 4374 + 1 4366 4368 4374 4373 + 1 4368 4369 4374 4548 + 1 4368 4373 4548 4374 + 1 4370 588 4378 4377 + 1 4374 4377 4566 631 + 1 4375 4378 644 4566 + 1 4370 4374 4378 4375 + 1 4370 4374 4377 4378 + 1 4374 4375 4566 4378 + 1 4374 4377 4378 4566 + 1 4373 628 4548 4551 + 1 4374 4548 631 4566 + 1 4375 4551 4566 644 + 1 4373 4374 4375 4551 + 1 4373 4374 4551 4548 + 1 4374 4375 4551 4566 + 1 4374 4548 4566 4551 + 1 819 15 823 822 + 1 2468 822 2490 218 + 1 2469 823 219 2490 + 1 819 2468 823 2469 + 1 819 2468 822 823 + 1 2468 2469 2490 823 + 1 2468 822 823 2490 + 1 2493 218 2494 1580 + 1 1584 1580 1586 95 + 1 4356 2494 639 1586 + 1 2493 1584 2494 4356 + 1 2493 1584 1580 2494 + 1 1584 4356 1586 2494 + 1 1584 1580 2494 1586 + 1 2499 219 1590 2502 + 1 4361 2502 1597 639 + 1 1592 1590 96 1597 + 1 2499 4361 1590 1592 + 1 2499 4361 2502 1590 + 1 4361 1592 1597 1590 + 1 4361 2502 1590 1597 + 1 2472 583 2498 4353 + 1 2473 4353 2499 584 + 1 2469 2498 219 2499 + 1 2472 2473 2498 2469 + 1 2472 2473 4353 2498 + 1 2473 2469 2499 2498 + 1 2473 4353 2498 2499 + 1 2472 583 2493 2498 + 1 2468 2493 218 2490 + 1 2469 2498 2490 219 + 1 2472 2468 2469 2498 + 1 2472 2468 2498 2493 + 1 2468 2469 2498 2490 + 1 2468 2493 2490 2498 + 1 4353 584 4361 2499 + 1 2498 2499 2502 219 + 1 4356 4361 639 2502 + 1 4353 2498 4361 4356 + 1 4353 2498 2499 4361 + 1 2498 4356 2502 4361 + 1 2498 2499 4361 2502 + 1 2493 218 2490 2494 + 1 2498 2490 219 2502 + 1 4356 2494 2502 639 + 1 2493 2498 4356 2494 + 1 2493 2498 2494 2490 + 1 2498 4356 2494 2502 + 1 2498 2490 2502 2494 + 1 1585 95 1588 1581 + 1 2795 1581 2796 257 + 1 4386 1588 641 2796 + 1 1585 2795 1588 4386 + 1 1585 2795 1581 1588 + 1 2795 4386 2796 1588 + 1 2795 1581 1588 2796 + 1 2785 257 2792 861 + 1 860 861 862 19 + 1 2786 2792 258 862 + 1 2785 860 2792 2786 + 1 2785 860 861 2792 + 1 860 2786 862 2792 + 1 860 861 2792 862 + 1 4394 641 1824 2801 + 1 2800 2801 1818 258 + 1 1822 1824 114 1818 + 1 4394 2800 1824 1822 + 1 4394 2800 2801 1824 + 1 2800 1822 1818 1824 + 1 2800 2801 1824 1818 + 1 2789 256 2791 2790 + 1 4384 2790 4394 592 + 1 4386 2791 641 4394 + 1 2789 4384 2791 4386 + 1 2789 4384 2790 2791 + 1 4384 4386 4394 2791 + 1 4384 2790 2791 4394 + 1 2789 256 2785 2791 + 1 2795 2785 257 2796 + 1 4386 2791 2796 641 + 1 2789 2795 4386 2791 + 1 2789 2795 2791 2785 + 1 2795 4386 2791 2796 + 1 2795 2785 2796 2791 + 1 2790 592 2800 4394 + 1 2791 4394 2801 641 + 1 2786 2800 258 2801 + 1 2790 2791 2800 2786 + 1 2790 2791 4394 2800 + 1 2791 2786 2801 2800 + 1 2791 4394 2800 2801 + 1 2785 257 2796 2792 + 1 2791 2796 641 2801 + 1 2786 2792 2801 258 + 1 2785 2791 2786 2792 + 1 2785 2791 2792 2796 + 1 2791 2786 2792 2801 + 1 2791 2796 2801 2792 + 1 1595 96 1591 1601 + 1 4399 1601 2851 646 + 1 2847 1591 265 2851 + 1 1595 4399 1591 2847 + 1 1595 4399 1601 1591 + 1 4399 2847 2851 1591 + 1 4399 1601 1591 2851 + 1 4401 646 2866 1825 + 1 1823 1825 1819 114 + 1 2865 2866 267 1819 + 1 4401 1823 2866 2865 + 1 4401 1823 1825 2866 + 1 1823 2865 1819 2866 + 1 1823 1825 2866 1819 + 1 2835 265 869 2845 + 1 2837 2845 871 267 + 1 868 869 20 871 + 1 2835 2837 869 868 + 1 2835 2837 2845 869 + 1 2837 868 871 869 + 1 2837 2845 869 871 + 1 4397 595 2849 2843 + 1 2841 2843 2835 264 + 1 2847 2849 265 2835 + 1 4397 2841 2849 2847 + 1 4397 2841 2843 2849 + 1 2841 2847 2835 2849 + 1 2841 2843 2849 2835 + 1 4397 595 4401 2849 + 1 4399 4401 646 2851 + 1 2847 2849 2851 265 + 1 4397 4399 2847 2849 + 1 4397 4399 2849 4401 + 1 4399 2847 2849 2851 + 1 4399 4401 2851 2849 + 1 2843 264 2837 2835 + 1 2849 2835 2845 265 + 1 2865 2837 267 2845 + 1 2843 2849 2837 2865 + 1 2843 2849 2835 2837 + 1 2849 2865 2845 2837 + 1 2849 2835 2837 2845 + 1 4401 646 2851 2866 + 1 2849 2851 265 2845 + 1 2865 2866 2845 267 + 1 4401 2849 2865 2866 + 1 4401 2849 2866 2851 + 1 2849 2865 2866 2845 + 1 2849 2851 2845 2866 + 1 1461 85 1464 1462 + 1 4340 1462 4379 589 + 1 4342 1464 591 4379 + 1 1461 4340 1464 4342 + 1 1461 4340 1462 1464 + 1 4340 4342 4379 1464 + 1 4340 1462 1464 4379 + 1 4346 589 4381 1476 + 1 1474 1476 1477 86 + 1 4348 4381 593 1477 + 1 4346 1474 4381 4348 + 1 4346 1474 1476 4381 + 1 1474 4348 1477 4381 + 1 1474 1476 4381 1477 + 1 4358 591 1594 4388 + 1 4359 4388 1595 593 + 1 1592 1594 96 1595 + 1 4358 4359 1594 1592 + 1 4358 4359 4388 1594 + 1 4359 1592 1595 1594 + 1 4359 4388 1594 1595 + 1 4337 581 4347 4343 + 1 4339 4343 4358 584 + 1 4342 4347 591 4358 + 1 4337 4339 4347 4342 + 1 4337 4339 4343 4347 + 1 4339 4342 4358 4347 + 1 4339 4343 4347 4358 + 1 4337 581 4346 4347 + 1 4340 4346 589 4379 + 1 4342 4347 4379 591 + 1 4337 4340 4342 4347 + 1 4337 4340 4347 4346 + 1 4340 4342 4347 4379 + 1 4340 4346 4379 4347 + 1 4343 584 4359 4358 + 1 4347 4358 4388 591 + 1 4348 4359 593 4388 + 1 4343 4347 4359 4348 + 1 4343 4347 4358 4359 + 1 4347 4348 4388 4359 + 1 4347 4358 4359 4388 + 1 4346 589 4379 4381 + 1 4347 4379 591 4388 + 1 4348 4381 4388 593 + 1 4346 4347 4348 4381 + 1 4346 4347 4381 4379 + 1 4347 4348 4381 4388 + 1 4347 4379 4388 4381 + 1 1461 85 1463 1464 + 1 4341 1463 590 4383 + 1 4342 1464 4383 591 + 1 1461 4341 4342 1464 + 1 1461 4341 1464 1463 + 1 4341 4342 1464 4383 + 1 4341 1463 4383 1464 + 1 4354 590 1585 4385 + 1 1584 1585 95 1586 + 1 4356 4385 1586 639 + 1 4354 1584 4356 4385 + 1 4354 1584 4385 1585 + 1 1584 4356 4385 1586 + 1 1584 1585 1586 4385 + 1 4358 591 4390 1594 + 1 4361 4390 639 1597 + 1 1592 1594 1597 96 + 1 4358 4361 1592 1594 + 1 4358 4361 1594 4390 + 1 4361 1592 1594 1597 + 1 4361 4390 1597 1594 + 1 4338 583 4353 4355 + 1 4339 4353 584 4358 + 1 4342 4355 4358 591 + 1 4338 4339 4342 4355 + 1 4338 4339 4355 4353 + 1 4339 4342 4355 4358 + 1 4339 4353 4358 4355 + 1 4338 583 4355 4354 + 1 4341 4354 4383 590 + 1 4342 4355 591 4383 + 1 4338 4341 4355 4342 + 1 4338 4341 4354 4355 + 1 4341 4342 4383 4355 + 1 4341 4354 4355 4383 + 1 4353 584 4358 4361 + 1 4355 4358 591 4390 + 1 4356 4361 4390 639 + 1 4353 4355 4356 4361 + 1 4353 4355 4361 4358 + 1 4355 4356 4361 4390 + 1 4355 4358 4390 4361 + 1 4354 590 4385 4383 + 1 4355 4383 4390 591 + 1 4356 4385 639 4390 + 1 4354 4355 4385 4356 + 1 4354 4355 4383 4385 + 1 4355 4356 4390 4385 + 1 4355 4383 4385 4390 + 1 1476 86 1479 1477 + 1 4381 1477 4397 593 + 1 4382 1479 595 4397 + 1 1476 4381 1479 4382 + 1 1476 4381 1477 1479 + 1 4381 4382 4397 1479 + 1 4381 1477 1479 4397 + 1 4388 593 4399 1595 + 1 1594 1595 1601 96 + 1 4392 4399 646 1601 + 1 4388 1594 4399 4392 + 1 4388 1594 1595 4399 + 1 1594 4392 1601 4399 + 1 1594 1595 4399 1601 + 1 4393 595 1823 4401 + 1 4395 4401 1825 646 + 1 1822 1823 114 1825 + 1 4393 4395 1823 1822 + 1 4393 4395 4401 1823 + 1 4395 1822 1825 1823 + 1 4395 4401 1823 1825 + 1 4379 591 4389 4387 + 1 4380 4387 4393 592 + 1 4382 4389 595 4393 + 1 4379 4380 4389 4382 + 1 4379 4380 4387 4389 + 1 4380 4382 4393 4389 + 1 4380 4387 4389 4393 + 1 4379 591 4388 4389 + 1 4381 4388 593 4397 + 1 4382 4389 4397 595 + 1 4379 4381 4382 4389 + 1 4379 4381 4389 4388 + 1 4381 4382 4389 4397 + 1 4381 4388 4397 4389 + 1 4387 592 4395 4393 + 1 4389 4393 4401 595 + 1 4392 4395 646 4401 + 1 4387 4389 4395 4392 + 1 4387 4389 4393 4395 + 1 4389 4392 4401 4395 + 1 4389 4393 4395 4401 + 1 4388 593 4397 4399 + 1 4389 4397 595 4401 + 1 4392 4399 4401 646 + 1 4388 4389 4392 4399 + 1 4388 4389 4399 4397 + 1 4389 4392 4399 4401 + 1 4389 4397 4401 4399 + 1 1585 95 1586 1588 + 1 4385 1586 639 4604 + 1 4386 1588 4604 641 + 1 1585 4385 4386 1588 + 1 1585 4385 1588 1586 + 1 4385 4386 1588 4604 + 1 4385 1586 4604 1588 + 1 4390 639 1597 4607 + 1 1594 1597 96 1601 + 1 4392 4607 1601 646 + 1 4390 1594 4392 4607 + 1 4390 1594 4607 1597 + 1 1594 4392 4607 1601 + 1 1594 1597 1601 4607 + 1 4394 641 4614 1824 + 1 4395 4614 646 1825 + 1 1822 1824 1825 114 + 1 4394 4395 1822 1824 + 1 4394 4395 1824 4614 + 1 4395 1822 1824 1825 + 1 4395 4614 1825 1824 + 1 4383 591 4387 4391 + 1 4384 4387 592 4394 + 1 4386 4391 4394 641 + 1 4383 4384 4386 4391 + 1 4383 4384 4391 4387 + 1 4384 4386 4391 4394 + 1 4384 4387 4394 4391 + 1 4383 591 4391 4390 + 1 4385 4390 4604 639 + 1 4386 4391 641 4604 + 1 4383 4385 4391 4386 + 1 4383 4385 4390 4391 + 1 4385 4386 4604 4391 + 1 4385 4390 4391 4604 + 1 4387 592 4394 4395 + 1 4391 4394 641 4614 + 1 4392 4395 4614 646 + 1 4387 4391 4392 4395 + 1 4387 4391 4395 4394 + 1 4391 4392 4395 4614 + 1 4391 4394 4614 4395 + 1 4390 639 4607 4604 + 1 4391 4604 4614 641 + 1 4392 4607 646 4614 + 1 4390 4391 4607 4392 + 1 4390 4391 4604 4607 + 1 4391 4392 4614 4607 + 1 4391 4604 4607 4614 + 1 839 17 841 844 + 1 2622 841 237 2640 + 1 2623 844 2640 240 + 1 839 2622 2623 844 + 1 839 2622 844 841 + 1 2622 2623 844 2640 + 1 2622 841 2640 844 + 1 2646 237 1672 2647 + 1 1682 1672 103 1684 + 1 4568 2647 1684 674 + 1 2646 1682 4568 2647 + 1 2646 1682 2647 1672 + 1 1682 4568 2647 1684 + 1 1682 1672 1684 2647 + 1 2669 240 2671 1714 + 1 4573 2671 674 1723 + 1 1719 1714 1723 106 + 1 2669 4573 1719 1714 + 1 2669 4573 1714 2671 + 1 4573 1719 1714 1723 + 1 4573 2671 1723 1714 + 1 2628 631 4565 2668 + 1 2629 4565 632 2669 + 1 2623 2668 2669 240 + 1 2628 2629 2623 2668 + 1 2628 2629 2668 4565 + 1 2629 2623 2668 2669 + 1 2629 4565 2669 2668 + 1 2628 631 2668 2646 + 1 2622 2646 2640 237 + 1 2623 2668 240 2640 + 1 2628 2622 2668 2623 + 1 2628 2622 2646 2668 + 1 2622 2623 2640 2668 + 1 2622 2646 2668 2640 + 1 4565 632 2669 4573 + 1 2668 2669 240 2671 + 1 4568 4573 2671 674 + 1 4565 2668 4568 4573 + 1 4565 2668 4573 2669 + 1 2668 4568 4573 2671 + 1 2668 2669 2671 4573 + 1 2646 237 2647 2640 + 1 2668 2640 2671 240 + 1 4568 2647 674 2671 + 1 2646 2668 2647 4568 + 1 2646 2668 2640 2647 + 1 2668 4568 2671 2647 + 1 2668 2640 2647 2671 + 1 1683 103 1673 1685 + 1 2861 1673 266 2862 + 1 4629 1685 2862 675 + 1 1683 2861 4629 1685 + 1 1683 2861 1685 1673 + 1 2861 4629 1685 2862 + 1 2861 1673 2862 1685 + 1 2844 266 870 2855 + 1 869 870 20 872 + 1 2846 2855 872 268 + 1 2844 869 2846 2855 + 1 2844 869 2855 870 + 1 869 2846 2855 872 + 1 869 870 872 2855 + 1 4647 675 2870 1844 + 1 2869 2870 268 1838 + 1 1842 1844 1838 116 + 1 4647 2869 1842 1844 + 1 4647 2869 1844 2870 + 1 2869 1842 1844 1838 + 1 2869 2870 1838 1844 + 1 2850 265 2852 2853 + 1 4627 2852 648 4647 + 1 4629 2853 4647 675 + 1 2850 4627 4629 2853 + 1 2850 4627 2853 2852 + 1 4627 4629 2853 4647 + 1 4627 2852 4647 2853 + 1 2850 265 2853 2844 + 1 2861 2844 2862 266 + 1 4629 2853 675 2862 + 1 2850 2861 2853 4629 + 1 2850 2861 2844 2853 + 1 2861 4629 2862 2853 + 1 2861 2844 2853 2862 + 1 2852 648 4647 2869 + 1 2853 4647 675 2870 + 1 2846 2869 2870 268 + 1 2852 2853 2846 2869 + 1 2852 2853 2869 4647 + 1 2853 2846 2869 2870 + 1 2853 4647 2870 2869 + 1 2844 266 2855 2862 + 1 2853 2862 2870 675 + 1 2846 2855 268 2870 + 1 2844 2853 2855 2846 + 1 2844 2853 2862 2855 + 1 2853 2846 2870 2855 + 1 2853 2862 2855 2870 + 1 1721 106 1726 1715 + 1 4658 1726 688 3064 + 1 3061 1715 3064 296 + 1 1721 4658 3061 1715 + 1 1721 4658 1715 1726 + 1 4658 3061 1715 3064 + 1 4658 1726 3064 1715 + 1 4665 688 1845 3084 + 1 1843 1845 116 1839 + 1 3083 3084 1839 299 + 1 4665 1843 3083 3084 + 1 4665 1843 3084 1845 + 1 1843 3083 3084 1839 + 1 1843 1845 1839 3084 + 1 3045 296 3057 900 + 1 3048 3057 299 903 + 1 899 900 903 24 + 1 3045 3048 899 900 + 1 3045 3048 900 3057 + 1 3048 899 900 903 + 1 3048 3057 903 900 + 1 4656 653 3054 3062 + 1 3051 3054 295 3045 + 1 3061 3062 3045 296 + 1 4656 3051 3061 3062 + 1 4656 3051 3062 3054 + 1 3051 3061 3062 3045 + 1 3051 3054 3045 3062 + 1 4656 653 3062 4665 + 1 4658 4665 3064 688 + 1 3061 3062 296 3064 + 1 4656 4658 3062 3061 + 1 4656 4658 4665 3062 + 1 4658 3061 3064 3062 + 1 4658 4665 3062 3064 + 1 3054 295 3045 3048 + 1 3062 3045 296 3057 + 1 3083 3048 3057 299 + 1 3054 3062 3083 3048 + 1 3054 3062 3048 3045 + 1 3062 3083 3048 3057 + 1 3062 3045 3057 3048 + 1 4665 688 3084 3064 + 1 3062 3064 3057 296 + 1 3083 3084 299 3057 + 1 4665 3062 3084 3083 + 1 4665 3062 3064 3084 + 1 3062 3083 3057 3084 + 1 3062 3064 3084 3057 + 1 1596 96 1598 1600 + 1 4550 1598 643 4620 + 1 4552 1600 4620 645 + 1 1596 4550 4552 1600 + 1 1596 4550 1600 1598 + 1 4550 4552 1600 4620 + 1 4550 1598 4620 1600 + 1 4556 643 1611 4623 + 1 1608 1611 97 1613 + 1 4558 4623 1613 650 + 1 4556 1608 4558 4623 + 1 4556 1608 4623 1611 + 1 1608 4558 4623 1613 + 1 1608 1611 1613 4623 + 1 4570 645 4631 1720 + 1 4571 4631 650 1721 + 1 1719 1720 1721 106 + 1 4570 4571 1719 1720 + 1 4570 4571 1720 4631 + 1 4571 1719 1720 1721 + 1 4571 4631 1721 1720 + 1 4547 629 4553 4557 + 1 4549 4553 632 4570 + 1 4552 4557 4570 645 + 1 4547 4549 4552 4557 + 1 4547 4549 4557 4553 + 1 4549 4552 4557 4570 + 1 4549 4553 4570 4557 + 1 4547 629 4557 4556 + 1 4550 4556 4620 643 + 1 4552 4557 645 4620 + 1 4547 4550 4557 4552 + 1 4547 4550 4556 4557 + 1 4550 4552 4620 4557 + 1 4550 4556 4557 4620 + 1 4553 632 4570 4571 + 1 4557 4570 645 4631 + 1 4558 4571 4631 650 + 1 4553 4557 4558 4571 + 1 4553 4557 4571 4570 + 1 4557 4558 4571 4631 + 1 4557 4570 4631 4571 + 1 4556 643 4623 4620 + 1 4557 4620 4631 645 + 1 4558 4623 650 4631 + 1 4556 4557 4623 4558 + 1 4556 4557 4620 4623 + 1 4557 4558 4631 4623 + 1 4557 4620 4623 4631 + 1 1596 96 1600 1599 + 1 4551 1599 4626 644 + 1 4552 1600 645 4626 + 1 1596 4551 1600 4552 + 1 1596 4551 1599 1600 + 1 4551 4552 4626 1600 + 1 4551 1599 1600 4626 + 1 4566 644 4628 1683 + 1 1682 1683 1684 103 + 1 4568 4628 674 1684 + 1 4566 1682 4628 4568 + 1 4566 1682 1683 4628 + 1 1682 4568 1684 4628 + 1 1682 1683 4628 1684 + 1 4570 645 1720 4633 + 1 4573 4633 1723 674 + 1 1719 1720 106 1723 + 1 4570 4573 1720 1719 + 1 4570 4573 4633 1720 + 1 4573 1719 1723 1720 + 1 4573 4633 1720 1723 + 1 4548 631 4567 4565 + 1 4549 4565 4570 632 + 1 4552 4567 645 4570 + 1 4548 4549 4567 4552 + 1 4548 4549 4565 4567 + 1 4549 4552 4570 4567 + 1 4549 4565 4567 4570 + 1 4548 631 4566 4567 + 1 4551 4566 644 4626 + 1 4552 4567 4626 645 + 1 4548 4551 4552 4567 + 1 4548 4551 4567 4566 + 1 4551 4552 4567 4626 + 1 4551 4566 4626 4567 + 1 4565 632 4573 4570 + 1 4567 4570 4633 645 + 1 4568 4573 674 4633 + 1 4565 4567 4573 4568 + 1 4565 4567 4570 4573 + 1 4567 4568 4633 4573 + 1 4567 4570 4573 4633 + 1 4566 644 4626 4628 + 1 4567 4626 645 4633 + 1 4568 4628 4633 674 + 1 4566 4567 4568 4628 + 1 4566 4567 4628 4626 + 1 4567 4568 4628 4633 + 1 4567 4626 4633 4628 + 1 1611 97 1613 1616 + 1 4623 1613 650 4656 + 1 4625 1616 4656 653 + 1 1611 4623 4625 1616 + 1 1611 4623 1616 1613 + 1 4623 4625 1616 4656 + 1 4623 1613 4656 1616 + 1 4631 650 1721 4658 + 1 1720 1721 106 1726 + 1 4635 4658 1726 688 + 1 4631 1720 4635 4658 + 1 4631 1720 4658 1721 + 1 1720 4635 4658 1726 + 1 1720 1721 1726 4658 + 1 4646 653 4665 1843 + 1 4648 4665 688 1845 + 1 1842 1843 1845 116 + 1 4646 4648 1842 1843 + 1 4646 4648 1843 4665 + 1 4648 1842 1843 1845 + 1 4648 4665 1845 1843 + 1 4620 645 4630 4632 + 1 4622 4630 648 4646 + 1 4625 4632 4646 653 + 1 4620 4622 4625 4632 + 1 4620 4622 4632 4630 + 1 4622 4625 4632 4646 + 1 4622 4630 4646 4632 + 1 4620 645 4632 4631 + 1 4623 4631 4656 650 + 1 4625 4632 653 4656 + 1 4620 4623 4632 4625 + 1 4620 4623 4631 4632 + 1 4623 4625 4656 4632 + 1 4623 4631 4632 4656 + 1 4630 648 4646 4648 + 1 4632 4646 653 4665 + 1 4635 4648 4665 688 + 1 4630 4632 4635 4648 + 1 4630 4632 4648 4646 + 1 4632 4635 4648 4665 + 1 4632 4646 4665 4648 + 1 4631 650 4658 4656 + 1 4632 4656 4665 653 + 1 4635 4658 688 4665 + 1 4631 4632 4658 4635 + 1 4631 4632 4656 4658 + 1 4632 4635 4665 4658 + 1 4632 4656 4658 4665 + 1 1683 103 1685 1684 + 1 4628 1684 4748 674 + 1 4629 1685 675 4748 + 1 1683 4628 1685 4629 + 1 1683 4628 1684 1685 + 1 4628 4629 4748 1685 + 1 4628 1684 1685 4748 + 1 4633 674 4749 1723 + 1 1720 1723 1726 106 + 1 4635 4749 688 1726 + 1 4633 1720 4749 4635 + 1 4633 1720 1723 4749 + 1 1720 4635 1726 4749 + 1 1720 1723 4749 1726 + 1 4647 675 1844 4750 + 1 4648 4750 1845 688 + 1 1842 1844 116 1845 + 1 4647 4648 1844 1842 + 1 4647 4648 4750 1844 + 1 4648 1842 1845 1844 + 1 4648 4750 1844 1845 + 1 4626 645 4634 4630 + 1 4627 4630 4647 648 + 1 4629 4634 675 4647 + 1 4626 4627 4634 4629 + 1 4626 4627 4630 4634 + 1 4627 4629 4647 4634 + 1 4627 4630 4634 4647 + 1 4626 645 4633 4634 + 1 4628 4633 674 4748 + 1 4629 4634 4748 675 + 1 4626 4628 4629 4634 + 1 4626 4628 4634 4633 + 1 4628 4629 4634 4748 + 1 4628 4633 4748 4634 + 1 4630 648 4648 4647 + 1 4634 4647 4750 675 + 1 4635 4648 688 4750 + 1 4630 4634 4648 4635 + 1 4630 4634 4647 4648 + 1 4634 4635 4750 4648 + 1 4634 4647 4648 4750 + 1 4633 674 4748 4749 + 1 4634 4748 675 4750 + 1 4635 4749 4750 688 + 1 4633 4634 4635 4749 + 1 4633 4634 4749 4748 + 1 4634 4635 4749 4750 + 1 4634 4748 4750 4749 + 1 861 19 863 862 + 1 2792 862 2798 258 + 1 2793 863 259 2798 + 1 861 2792 863 2793 + 1 861 2792 862 863 + 1 2792 2793 2798 863 + 1 2792 862 863 2798 + 1 2801 258 2802 1818 + 1 1824 1818 1826 114 + 1 4616 2802 718 1826 + 1 2801 1824 2802 4616 + 1 2801 1824 1818 2802 + 1 1824 4616 1826 2802 + 1 1824 1818 2802 1826 + 1 2806 259 1828 2807 + 1 4619 2807 1836 718 + 1 1833 1828 115 1836 + 1 2806 4619 1828 1833 + 1 2806 4619 2807 1828 + 1 4619 1833 1836 1828 + 1 4619 2807 1828 1836 + 1 2796 641 2805 4613 + 1 2797 4613 2806 642 + 1 2793 2805 259 2806 + 1 2796 2797 2805 2793 + 1 2796 2797 4613 2805 + 1 2797 2793 2806 2805 + 1 2797 4613 2805 2806 + 1 2796 641 2801 2805 + 1 2792 2801 258 2798 + 1 2793 2805 2798 259 + 1 2796 2792 2793 2805 + 1 2796 2792 2805 2801 + 1 2792 2793 2805 2798 + 1 2792 2801 2798 2805 + 1 4613 642 4619 2806 + 1 2805 2806 2807 259 + 1 4616 4619 718 2807 + 1 4613 2805 4619 4616 + 1 4613 2805 2806 4619 + 1 2805 4616 2807 4619 + 1 2805 2806 4619 2807 + 1 2801 258 2798 2802 + 1 2805 2798 259 2807 + 1 4616 2802 2807 718 + 1 2801 2805 4616 2802 + 1 2801 2805 2802 2798 + 1 2805 4616 2802 2807 + 1 2805 2798 2807 2802 + 1 1825 114 1827 1819 + 1 2866 1819 2867 267 + 1 4639 1827 719 2867 + 1 1825 2866 1827 4639 + 1 1825 2866 1819 1827 + 1 2866 4639 2867 1827 + 1 2866 1819 1827 2867 + 1 2845 267 2863 871 + 1 869 871 872 20 + 1 2846 2863 268 872 + 1 2845 869 2863 2846 + 1 2845 869 871 2863 + 1 869 2846 872 2863 + 1 869 871 2863 872 + 1 4649 719 1846 2871 + 1 2869 2871 1838 268 + 1 1842 1846 116 1838 + 1 4649 2869 1846 1842 + 1 4649 2869 2871 1846 + 1 2869 1842 1838 1846 + 1 2869 2871 1846 1838 + 1 2851 265 2854 2852 + 1 4637 2852 4649 648 + 1 4639 2854 719 4649 + 1 2851 4637 2854 4639 + 1 2851 4637 2852 2854 + 1 4637 4639 4649 2854 + 1 4637 2852 2854 4649 + 1 2851 265 2845 2854 + 1 2866 2845 267 2867 + 1 4639 2854 2867 719 + 1 2851 2866 4639 2854 + 1 2851 2866 2854 2845 + 1 2866 4639 2854 2867 + 1 2866 2845 2867 2854 + 1 2852 648 2869 4649 + 1 2854 4649 2871 719 + 1 2846 2869 268 2871 + 1 2852 2854 2869 2846 + 1 2852 2854 4649 2869 + 1 2854 2846 2871 2869 + 1 2854 4649 2869 2871 + 1 2845 267 2867 2863 + 1 2854 2867 719 2871 + 1 2846 2863 2871 268 + 1 2845 2854 2846 2863 + 1 2845 2854 2863 2867 + 1 2854 2846 2863 2871 + 1 2854 2867 2871 2863 + 1 1835 115 1829 1837 + 1 4664 1837 3081 720 + 1 3079 1829 298 3081 + 1 1835 4664 1829 3079 + 1 1835 4664 1837 1829 + 1 4664 3079 3081 1829 + 1 4664 1837 1829 3081 + 1 4666 720 3085 1847 + 1 1843 1847 1839 116 + 1 3083 3085 299 1839 + 1 4666 1843 3085 3083 + 1 4666 1843 1847 3085 + 1 1843 3083 1839 3085 + 1 1843 1847 3085 1839 + 1 3047 298 902 3076 + 1 3048 3076 903 299 + 1 899 902 24 903 + 1 3047 3048 902 899 + 1 3047 3048 3076 902 + 1 3048 899 903 902 + 1 3048 3076 902 903 + 1 4663 653 3080 3054 + 1 3053 3054 3047 295 + 1 3079 3080 298 3047 + 1 4663 3053 3080 3079 + 1 4663 3053 3054 3080 + 1 3053 3079 3047 3080 + 1 3053 3054 3080 3047 + 1 4663 653 4666 3080 + 1 4664 4666 720 3081 + 1 3079 3080 3081 298 + 1 4663 4664 3079 3080 + 1 4663 4664 3080 4666 + 1 4664 3079 3080 3081 + 1 4664 4666 3081 3080 + 1 3054 295 3048 3047 + 1 3080 3047 3076 298 + 1 3083 3048 299 3076 + 1 3054 3080 3048 3083 + 1 3054 3080 3047 3048 + 1 3080 3083 3076 3048 + 1 3080 3047 3048 3076 + 1 4666 720 3081 3085 + 1 3080 3081 298 3076 + 1 3083 3085 3076 299 + 1 4666 3080 3083 3085 + 1 4666 3080 3085 3081 + 1 3080 3083 3085 3076 + 1 3080 3081 3076 3085 + 1 1597 96 1602 1598 + 1 4606 1598 4621 643 + 1 4608 1602 647 4621 + 1 1597 4606 1602 4608 + 1 1597 4606 1598 1602 + 1 4606 4608 4621 1602 + 1 4606 1598 1602 4621 + 1 4610 643 4624 1611 + 1 1610 1611 1615 97 + 1 4612 4624 652 1615 + 1 4610 1610 4624 4612 + 1 4610 1610 1611 4624 + 1 1610 4612 1615 4624 + 1 1610 1611 4624 1615 + 1 4617 647 1834 4641 + 1 4618 4641 1835 652 + 1 1833 1834 115 1835 + 1 4617 4618 1834 1833 + 1 4617 4618 4641 1834 + 1 4618 1833 1835 1834 + 1 4618 4641 1834 1835 + 1 4603 640 4611 4609 + 1 4605 4609 4617 642 + 1 4608 4611 647 4617 + 1 4603 4605 4611 4608 + 1 4603 4605 4609 4611 + 1 4605 4608 4617 4611 + 1 4605 4609 4611 4617 + 1 4603 640 4610 4611 + 1 4606 4610 643 4621 + 1 4608 4611 4621 647 + 1 4603 4606 4608 4611 + 1 4603 4606 4611 4610 + 1 4606 4608 4611 4621 + 1 4606 4610 4621 4611 + 1 4609 642 4618 4617 + 1 4611 4617 4641 647 + 1 4612 4618 652 4641 + 1 4609 4611 4618 4612 + 1 4609 4611 4617 4618 + 1 4611 4612 4641 4618 + 1 4611 4617 4618 4641 + 1 4610 643 4621 4624 + 1 4611 4621 647 4641 + 1 4612 4624 4641 652 + 1 4610 4611 4612 4624 + 1 4610 4611 4624 4621 + 1 4611 4612 4624 4641 + 1 4611 4621 4641 4624 + 1 1597 96 1601 1602 + 1 4607 1601 646 4636 + 1 4608 1602 4636 647 + 1 1597 4607 4608 1602 + 1 1597 4607 1602 1601 + 1 4607 4608 1602 4636 + 1 4607 1601 4636 1602 + 1 4614 646 1825 4638 + 1 1824 1825 114 1826 + 1 4616 4638 1826 718 + 1 4614 1824 4616 4638 + 1 4614 1824 4638 1825 + 1 1824 4616 4638 1826 + 1 1824 1825 1826 4638 + 1 4617 647 4643 1834 + 1 4619 4643 718 1836 + 1 1833 1834 1836 115 + 1 4617 4619 1833 1834 + 1 4617 4619 1834 4643 + 1 4619 1833 1834 1836 + 1 4619 4643 1836 1834 + 1 4604 641 4613 4615 + 1 4605 4613 642 4617 + 1 4608 4615 4617 647 + 1 4604 4605 4608 4615 + 1 4604 4605 4615 4613 + 1 4605 4608 4615 4617 + 1 4605 4613 4617 4615 + 1 4604 641 4615 4614 + 1 4607 4614 4636 646 + 1 4608 4615 647 4636 + 1 4604 4607 4615 4608 + 1 4604 4607 4614 4615 + 1 4607 4608 4636 4615 + 1 4607 4614 4615 4636 + 1 4613 642 4617 4619 + 1 4615 4617 647 4643 + 1 4616 4619 4643 718 + 1 4613 4615 4616 4619 + 1 4613 4615 4619 4617 + 1 4615 4616 4619 4643 + 1 4615 4617 4643 4619 + 1 4614 646 4638 4636 + 1 4615 4636 4643 647 + 1 4616 4638 718 4643 + 1 4614 4615 4638 4616 + 1 4614 4615 4636 4638 + 1 4615 4616 4643 4638 + 1 4615 4636 4638 4643 + 1 1611 97 1616 1615 + 1 4624 1615 4663 652 + 1 4625 1616 653 4663 + 1 1611 4624 1616 4625 + 1 1611 4624 1615 1616 + 1 4624 4625 4663 1616 + 1 4624 1615 1616 4663 + 1 4641 652 4664 1835 + 1 1834 1835 1837 115 + 1 4645 4664 720 1837 + 1 4641 1834 4664 4645 + 1 4641 1834 1835 4664 + 1 1834 4645 1837 4664 + 1 1834 1835 4664 1837 + 1 4646 653 1843 4666 + 1 4650 4666 1847 720 + 1 1842 1843 116 1847 + 1 4646 4650 1843 1842 + 1 4646 4650 4666 1843 + 1 4650 1842 1847 1843 + 1 4650 4666 1843 1847 + 1 4621 647 4642 4640 + 1 4622 4640 4646 648 + 1 4625 4642 653 4646 + 1 4621 4622 4642 4625 + 1 4621 4622 4640 4642 + 1 4622 4625 4646 4642 + 1 4622 4640 4642 4646 + 1 4621 647 4641 4642 + 1 4624 4641 652 4663 + 1 4625 4642 4663 653 + 1 4621 4624 4625 4642 + 1 4621 4624 4642 4641 + 1 4624 4625 4642 4663 + 1 4624 4641 4663 4642 + 1 4640 648 4650 4646 + 1 4642 4646 4666 653 + 1 4645 4650 720 4666 + 1 4640 4642 4650 4645 + 1 4640 4642 4646 4650 + 1 4642 4645 4666 4650 + 1 4642 4646 4650 4666 + 1 4641 652 4663 4664 + 1 4642 4663 653 4666 + 1 4645 4664 4666 720 + 1 4641 4642 4645 4664 + 1 4641 4642 4664 4663 + 1 4642 4645 4664 4666 + 1 4642 4663 4666 4664 + 1 1825 114 1826 1827 + 1 4638 1826 718 4902 + 1 4639 1827 4902 719 + 1 1825 4638 4639 1827 + 1 1825 4638 1827 1826 + 1 4638 4639 1827 4902 + 1 4638 1826 4902 1827 + 1 4643 718 1836 4903 + 1 1834 1836 115 1837 + 1 4645 4903 1837 720 + 1 4643 1834 4645 4903 + 1 4643 1834 4903 1836 + 1 1834 4645 4903 1837 + 1 1834 1836 1837 4903 + 1 4649 719 4904 1846 + 1 4650 4904 720 1847 + 1 1842 1846 1847 116 + 1 4649 4650 1842 1846 + 1 4649 4650 1846 4904 + 1 4650 1842 1846 1847 + 1 4650 4904 1847 1846 + 1 4636 647 4640 4644 + 1 4637 4640 648 4649 + 1 4639 4644 4649 719 + 1 4636 4637 4639 4644 + 1 4636 4637 4644 4640 + 1 4637 4639 4644 4649 + 1 4637 4640 4649 4644 + 1 4636 647 4644 4643 + 1 4638 4643 4902 718 + 1 4639 4644 719 4902 + 1 4636 4638 4644 4639 + 1 4636 4638 4643 4644 + 1 4638 4639 4902 4644 + 1 4638 4643 4644 4902 + 1 4640 648 4649 4650 + 1 4644 4649 719 4904 + 1 4645 4650 4904 720 + 1 4640 4644 4645 4650 + 1 4640 4644 4650 4649 + 1 4644 4645 4650 4904 + 1 4644 4649 4904 4650 + 1 4643 718 4903 4902 + 1 4644 4902 4904 719 + 1 4645 4903 720 4904 + 1 4643 4644 4903 4645 + 1 4643 4644 4902 4903 + 1 4644 4645 4904 4903 + 1 4644 4902 4903 4904 + 1 746 4 749 747 + 1 2021 749 145 2026 + 1 2019 747 2026 143 + 1 746 2021 2019 747 + 1 746 2021 747 749 + 1 2021 2019 747 2026 + 1 2021 749 2026 747 + 1 2035 145 1086 2036 + 1 1088 1086 47 1089 + 1 3597 2036 1089 410 + 1 2035 1088 3597 2036 + 1 2035 1088 2036 1086 + 1 1088 3597 2036 1089 + 1 1088 1086 1089 2036 + 1 2027 143 2029 1071 + 1 3587 2029 410 1074 + 1 1073 1071 1074 45 + 1 2027 3587 1073 1071 + 1 2027 3587 1071 2029 + 1 3587 1073 1071 1074 + 1 3587 2029 1074 1071 + 1 2025 405 3584 2028 + 1 2023 3584 403 2027 + 1 2019 2028 2027 143 + 1 2025 2023 2019 2028 + 1 2025 2023 2028 3584 + 1 2023 2019 2028 2027 + 1 2023 3584 2027 2028 + 1 2025 405 2028 2035 + 1 2021 2035 2026 145 + 1 2019 2028 143 2026 + 1 2025 2021 2028 2019 + 1 2025 2021 2035 2028 + 1 2021 2019 2026 2028 + 1 2021 2035 2028 2026 + 1 3584 403 2027 3587 + 1 2028 2027 143 2029 + 1 3597 3587 2029 410 + 1 3584 2028 3597 3587 + 1 3584 2028 3587 2027 + 1 2028 3597 3587 2029 + 1 2028 2027 2029 3587 + 1 2035 145 2036 2026 + 1 2028 2026 2029 143 + 1 3597 2036 410 2029 + 1 2035 2028 2036 3597 + 1 2035 2028 2026 2036 + 1 2028 3597 2029 2036 + 1 2028 2026 2036 2029 + 1 1092 47 1087 1093 + 1 2970 1087 284 2971 + 1 3653 1093 2971 420 + 1 1092 2970 3653 1093 + 1 1092 2970 1093 1087 + 1 2970 3653 1093 2971 + 1 2970 1087 2971 1093 + 1 2967 284 888 2968 + 1 890 888 23 893 + 1 2983 2968 893 289 + 1 2967 890 2983 2968 + 1 2967 890 2968 888 + 1 890 2983 2968 893 + 1 890 888 893 2968 + 1 3658 420 3013 1851 + 1 3014 3013 289 1849 + 1 1853 1851 1849 117 + 1 3658 3014 1853 1851 + 1 3658 3014 1851 3013 + 1 3014 1853 1851 1849 + 1 3014 3013 1849 1851 + 1 2985 286 2989 2986 + 1 3656 2989 625 3658 + 1 3653 2986 3658 420 + 1 2985 3656 3653 2986 + 1 2985 3656 2986 2989 + 1 3656 3653 2986 3658 + 1 3656 2989 3658 2986 + 1 2985 286 2986 2967 + 1 2970 2967 2971 284 + 1 3653 2986 420 2971 + 1 2985 2970 2986 3653 + 1 2985 2970 2967 2986 + 1 2970 3653 2971 2986 + 1 2970 2967 2986 2971 + 1 2989 625 3658 3014 + 1 2986 3658 420 3013 + 1 2983 3014 3013 289 + 1 2989 2986 2983 3014 + 1 2989 2986 3014 3658 + 1 2986 2983 3014 3013 + 1 2986 3658 3013 3014 + 1 2967 284 2968 2971 + 1 2986 2971 3013 420 + 1 2983 2968 289 3013 + 1 2967 2986 2968 2983 + 1 2967 2986 2971 2968 + 1 2986 2983 3013 2968 + 1 2986 2971 2968 3013 + 1 1075 45 1077 1072 + 1 3623 1077 413 2875 + 1 2874 1072 2875 269 + 1 1075 3623 2874 1072 + 1 1075 3623 1072 1077 + 1 3623 2874 1072 2875 + 1 3623 1077 2875 1072 + 1 3633 413 1850 2906 + 1 1852 1850 117 1848 + 1 2907 2906 1848 274 + 1 3633 1852 2907 2906 + 1 3633 1852 2906 1850 + 1 1852 2907 2906 1848 + 1 1852 1850 1848 2906 + 1 2872 269 2873 873 + 1 2884 2873 274 878 + 1 875 873 878 21 + 1 2872 2884 875 873 + 1 2872 2884 873 2873 + 1 2884 875 873 878 + 1 2884 2873 878 873 + 1 3625 617 2888 2876 + 1 2885 2888 271 2872 + 1 2874 2876 2872 269 + 1 3625 2885 2874 2876 + 1 3625 2885 2876 2888 + 1 2885 2874 2876 2872 + 1 2885 2888 2872 2876 + 1 3625 617 2876 3633 + 1 3623 3633 2875 413 + 1 2874 2876 269 2875 + 1 3625 3623 2876 2874 + 1 3625 3623 3633 2876 + 1 3623 2874 2875 2876 + 1 3623 3633 2876 2875 + 1 2888 271 2872 2884 + 1 2876 2872 269 2873 + 1 2907 2884 2873 274 + 1 2888 2876 2907 2884 + 1 2888 2876 2884 2872 + 1 2876 2907 2884 2873 + 1 2876 2872 2873 2884 + 1 3633 413 2906 2875 + 1 2876 2875 2873 269 + 1 2907 2906 274 2873 + 1 3633 2876 2906 2907 + 1 3633 2876 2875 2906 + 1 2876 2907 2873 2906 + 1 2876 2875 2906 2873 + 1 1544 92 1549 1545 + 1 3616 1549 614 3629 + 1 3613 1545 3629 412 + 1 1544 3616 3613 1545 + 1 1544 3616 1545 1549 + 1 3616 3613 1545 3629 + 1 3616 1549 3629 1545 + 1 3607 614 1524 3624 + 1 1520 1524 90 1521 + 1 3605 3624 1521 411 + 1 3607 1520 3605 3624 + 1 3607 1520 3624 1524 + 1 1520 3605 3624 1521 + 1 1520 1524 1521 3624 + 1 3589 412 3622 1076 + 1 3588 3622 411 1075 + 1 1073 1076 1075 45 + 1 3589 3588 1073 1076 + 1 3589 3588 1076 3622 + 1 3588 1073 1076 1075 + 1 3588 3622 1075 1076 + 1 3604 407 3585 3606 + 1 3586 3585 403 3589 + 1 3613 3606 3589 412 + 1 3604 3586 3613 3606 + 1 3604 3586 3606 3585 + 1 3586 3613 3606 3589 + 1 3586 3585 3589 3606 + 1 3604 407 3606 3607 + 1 3616 3607 3629 614 + 1 3613 3606 412 3629 + 1 3604 3616 3606 3613 + 1 3604 3616 3607 3606 + 1 3616 3613 3629 3606 + 1 3616 3607 3606 3629 + 1 3585 403 3589 3588 + 1 3606 3589 412 3622 + 1 3605 3588 3622 411 + 1 3585 3606 3605 3588 + 1 3585 3606 3588 3589 + 1 3606 3605 3588 3622 + 1 3606 3589 3622 3588 + 1 3607 614 3624 3629 + 1 3606 3629 3622 412 + 1 3605 3624 411 3622 + 1 3607 3606 3624 3605 + 1 3607 3606 3629 3624 + 1 3606 3605 3622 3624 + 1 3606 3629 3624 3622 + 1 1544 92 1545 1546 + 1 3615 1546 3627 419 + 1 3613 1545 412 3627 + 1 1544 3615 1545 3613 + 1 1544 3615 1546 1545 + 1 3615 3613 3627 1545 + 1 3615 1546 1545 3627 + 1 3601 419 3620 1092 + 1 1088 1092 1089 47 + 1 3597 3620 410 1089 + 1 3601 1088 3620 3597 + 1 3601 1088 1092 3620 + 1 1088 3597 1089 3620 + 1 1088 1092 3620 1089 + 1 3589 412 1076 3618 + 1 3587 3618 1074 410 + 1 1073 1076 45 1074 + 1 3589 3587 1076 1073 + 1 3589 3587 3618 1076 + 1 3587 1073 1074 1076 + 1 3587 3618 1076 1074 + 1 3596 405 3598 3584 + 1 3586 3584 3589 403 + 1 3613 3598 412 3589 + 1 3596 3586 3598 3613 + 1 3596 3586 3584 3598 + 1 3586 3613 3589 3598 + 1 3586 3584 3598 3589 + 1 3596 405 3601 3598 + 1 3615 3601 419 3627 + 1 3613 3598 3627 412 + 1 3596 3615 3613 3598 + 1 3596 3615 3598 3601 + 1 3615 3613 3598 3627 + 1 3615 3601 3627 3598 + 1 3584 403 3587 3589 + 1 3598 3589 3618 412 + 1 3597 3587 410 3618 + 1 3584 3598 3587 3597 + 1 3584 3598 3589 3587 + 1 3598 3597 3618 3587 + 1 3598 3589 3587 3618 + 1 3601 419 3627 3620 + 1 3598 3627 412 3618 + 1 3597 3620 3618 410 + 1 3601 3598 3597 3620 + 1 3601 3598 3620 3627 + 1 3598 3597 3620 3618 + 1 3598 3627 3618 3620 + 1 1524 90 1521 1527 + 1 3624 1521 411 3625 + 1 4496 1527 3625 617 + 1 1524 3624 4496 1527 + 1 1524 3624 1527 1521 + 1 3624 4496 1527 3625 + 1 3624 1521 3625 1527 + 1 3622 411 1075 3623 + 1 1076 1075 45 1077 + 1 3626 3623 1077 413 + 1 3622 1076 3626 3623 + 1 3622 1076 3623 1075 + 1 1076 3626 3623 1077 + 1 1076 1075 1077 3623 + 1 4506 617 3633 1852 + 1 3634 3633 413 1850 + 1 1853 1852 1850 117 + 1 4506 3634 1853 1852 + 1 4506 3634 1852 3633 + 1 3634 1853 1852 1850 + 1 3634 3633 1850 1852 + 1 3629 412 3631 3630 + 1 4498 3631 625 4506 + 1 4496 3630 4506 617 + 1 3629 4498 4496 3630 + 1 3629 4498 3630 3631 + 1 4498 4496 3630 4506 + 1 4498 3631 4506 3630 + 1 3629 412 3630 3622 + 1 3624 3622 3625 411 + 1 4496 3630 617 3625 + 1 3629 3624 3630 4496 + 1 3629 3624 3622 3630 + 1 3624 4496 3625 3630 + 1 3624 3622 3630 3625 + 1 3631 625 4506 3634 + 1 3630 4506 617 3633 + 1 3626 3634 3633 413 + 1 3631 3630 3626 3634 + 1 3631 3630 3634 4506 + 1 3630 3626 3634 3633 + 1 3630 4506 3633 3634 + 1 3622 411 3623 3625 + 1 3630 3625 3633 617 + 1 3626 3623 413 3633 + 1 3622 3630 3623 3626 + 1 3622 3630 3625 3623 + 1 3630 3626 3633 3623 + 1 3630 3625 3623 3633 + 1 1092 47 1093 1089 + 1 3620 1089 3621 410 + 1 3653 1093 420 3621 + 1 1092 3620 1093 3653 + 1 1092 3620 1089 1093 + 1 3620 3653 3621 1093 + 1 3620 1089 1093 3621 + 1 3618 410 3619 1074 + 1 1076 1074 1077 45 + 1 3626 3619 413 1077 + 1 3618 1076 3619 3626 + 1 3618 1076 1074 3619 + 1 1076 3626 1077 3619 + 1 1076 1074 3619 1077 + 1 3658 420 1851 3632 + 1 3634 3632 1850 413 + 1 1853 1851 117 1850 + 1 3658 3634 1851 1853 + 1 3658 3634 3632 1851 + 1 3634 1853 1850 1851 + 1 3634 3632 1851 1850 + 1 3627 412 3628 3631 + 1 3656 3631 3658 625 + 1 3653 3628 420 3658 + 1 3627 3656 3628 3653 + 1 3627 3656 3631 3628 + 1 3656 3653 3658 3628 + 1 3656 3631 3628 3658 + 1 3627 412 3618 3628 + 1 3620 3618 410 3621 + 1 3653 3628 3621 420 + 1 3627 3620 3653 3628 + 1 3627 3620 3628 3618 + 1 3620 3653 3628 3621 + 1 3620 3618 3621 3628 + 1 3631 625 3634 3658 + 1 3628 3658 3632 420 + 1 3626 3634 413 3632 + 1 3631 3628 3634 3626 + 1 3631 3628 3658 3634 + 1 3628 3626 3632 3634 + 1 3628 3658 3634 3632 + 1 3618 410 3621 3619 + 1 3628 3621 420 3632 + 1 3626 3619 3632 413 + 1 3618 3628 3626 3619 + 1 3618 3628 3619 3621 + 1 3628 3626 3619 3632 + 1 3628 3621 3632 3619 + 1 892 23 889 895 + 1 2974 889 285 2975 + 1 3004 895 2975 291 + 1 892 2974 3004 895 + 1 892 2974 895 889 + 1 2974 3004 895 2975 + 1 2974 889 2975 895 + 1 2977 285 1214 2978 + 1 1218 1214 62 1220 + 1 4013 2978 1220 498 + 1 2977 1218 4013 2978 + 1 2977 1218 2978 1214 + 1 1218 4013 2978 1220 + 1 1218 1214 1220 2978 + 1 3025 291 3023 1888 + 1 4025 3023 498 1891 + 1 1894 1888 1891 121 + 1 3025 4025 1894 1888 + 1 3025 4025 1888 3023 + 1 4025 1894 1888 1891 + 1 4025 3023 1891 1888 + 1 3006 496 4016 3022 + 1 3010 4016 703 3025 + 1 3004 3022 3025 291 + 1 3006 3010 3004 3022 + 1 3006 3010 3022 4016 + 1 3010 3004 3022 3025 + 1 3010 4016 3025 3022 + 1 3006 496 3022 2977 + 1 2974 2977 2975 285 + 1 3004 3022 291 2975 + 1 3006 2974 3022 3004 + 1 3006 2974 2977 3022 + 1 2974 3004 2975 3022 + 1 2974 2977 3022 2975 + 1 4016 703 3025 4025 + 1 3022 3025 291 3023 + 1 4013 4025 3023 498 + 1 4016 3022 4013 4025 + 1 4016 3022 4025 3025 + 1 3022 4013 4025 3023 + 1 3022 3025 3023 4025 + 1 2977 285 2978 2975 + 1 3022 2975 3023 291 + 1 4013 2978 498 3023 + 1 2977 3022 2978 4013 + 1 2977 3022 2975 2978 + 1 3022 4013 3023 2978 + 1 3022 2975 2978 3023 + 1 1215 62 1213 1216 + 1 2112 1213 160 2114 + 1 3944 1216 2114 494 + 1 1215 2112 3944 1216 + 1 1215 2112 1216 1213 + 1 2112 3944 1216 2114 + 1 2112 1213 2114 1216 + 1 2100 160 764 2110 + 1 763 764 8 766 + 1 2102 2110 766 162 + 1 2100 763 2102 2110 + 1 2100 763 2110 764 + 1 763 2102 2110 766 + 1 763 764 766 2110 + 1 3957 494 2120 1231 + 1 2119 2120 162 1228 + 1 1230 1231 1228 64 + 1 3957 2119 1230 1231 + 1 3957 2119 1231 2120 + 1 2119 1230 1231 1228 + 1 2119 2120 1228 1231 + 1 2104 159 2106 2108 + 1 3939 2106 486 3957 + 1 3944 2108 3957 494 + 1 2104 3939 3944 2108 + 1 2104 3939 2108 2106 + 1 3939 3944 2108 3957 + 1 3939 2106 3957 2108 + 1 2104 159 2108 2100 + 1 2112 2100 2114 160 + 1 3944 2108 494 2114 + 1 2104 2112 2108 3944 + 1 2104 2112 2100 2108 + 1 2112 3944 2114 2108 + 1 2112 2100 2108 2114 + 1 2106 486 3957 2119 + 1 2108 3957 494 2120 + 1 2102 2119 2120 162 + 1 2106 2108 2102 2119 + 1 2106 2108 2119 3957 + 1 2108 2102 2119 2120 + 1 2108 3957 2120 2119 + 1 2100 160 2110 2114 + 1 2108 2114 2120 494 + 1 2102 2110 162 2120 + 1 2100 2108 2110 2102 + 1 2100 2108 2114 2110 + 1 2108 2102 2120 2110 + 1 2108 2114 2110 2120 + 1 1895 121 1892 1889 + 1 4037 1892 504 3153 + 1 3155 1889 3153 313 + 1 1895 4037 3155 1889 + 1 1895 4037 1889 1892 + 1 4037 3155 1889 3153 + 1 4037 1892 3153 1889 + 1 4035 504 1233 3133 + 1 1232 1233 64 1229 + 1 3132 3133 1229 309 + 1 4035 1232 3132 3133 + 1 4035 1232 3133 1233 + 1 1232 3132 3133 1229 + 1 1232 1233 1229 3133 + 1 3142 313 3131 917 + 1 3130 3131 309 913 + 1 915 917 913 26 + 1 3142 3130 915 917 + 1 3142 3130 917 3131 + 1 3130 915 917 913 + 1 3130 3131 913 917 + 1 4036 503 3143 3152 + 1 3146 3143 311 3142 + 1 3155 3152 3142 313 + 1 4036 3146 3155 3152 + 1 4036 3146 3152 3143 + 1 3146 3155 3152 3142 + 1 3146 3143 3142 3152 + 1 4036 503 3152 4035 + 1 4037 4035 3153 504 + 1 3155 3152 313 3153 + 1 4036 4037 3152 3155 + 1 4036 4037 4035 3152 + 1 4037 3155 3153 3152 + 1 4037 4035 3152 3153 + 1 3143 311 3142 3130 + 1 3152 3142 313 3131 + 1 3132 3130 3131 309 + 1 3143 3152 3132 3130 + 1 3143 3152 3130 3142 + 1 3152 3132 3130 3131 + 1 3152 3142 3131 3130 + 1 4035 504 3133 3153 + 1 3152 3153 3131 313 + 1 3132 3133 309 3131 + 1 4035 3152 3133 3132 + 1 4035 3152 3153 3133 + 1 3152 3132 3131 3133 + 1 3152 3153 3133 3131 + 1 1207 61 1209 1211 + 1 3967 1209 490 3980 + 1 3969 1211 3980 492 + 1 1207 3967 3969 1211 + 1 1207 3967 1211 1209 + 1 3967 3969 1211 3980 + 1 3967 1209 3980 1211 + 1 3982 490 1796 3983 + 1 1801 1796 112 1803 + 1 4854 3983 1803 714 + 1 3982 1801 4854 3983 + 1 3982 1801 3983 1796 + 1 1801 4854 3983 1803 + 1 1801 1796 1803 3983 + 1 3996 492 3997 1890 + 1 4859 3997 714 1895 + 1 1894 1890 1895 121 + 1 3996 4859 1894 1890 + 1 3996 4859 1890 3997 + 1 4859 1894 1890 1895 + 1 4859 3997 1895 1890 + 1 3972 700 4853 3995 + 1 3974 4853 703 3996 + 1 3969 3995 3996 492 + 1 3972 3974 3969 3995 + 1 3972 3974 3995 4853 + 1 3974 3969 3995 3996 + 1 3974 4853 3996 3995 + 1 3972 700 3995 3982 + 1 3967 3982 3980 490 + 1 3969 3995 492 3980 + 1 3972 3967 3995 3969 + 1 3972 3967 3982 3995 + 1 3967 3969 3980 3995 + 1 3967 3982 3995 3980 + 1 4853 703 3996 4859 + 1 3995 3996 492 3997 + 1 4854 4859 3997 714 + 1 4853 3995 4854 4859 + 1 4853 3995 4859 3996 + 1 3995 4854 4859 3997 + 1 3995 3996 3997 4859 + 1 3982 490 3983 3980 + 1 3995 3980 3997 492 + 1 4854 3983 714 3997 + 1 3982 3995 3983 4854 + 1 3982 3995 3980 3983 + 1 3995 4854 3997 3983 + 1 3995 3980 3983 3997 + 1 1207 61 1211 1203 + 1 3941 1203 3943 484 + 1 3969 1211 492 3943 + 1 1207 3941 1211 3969 + 1 1207 3941 1203 1211 + 1 3941 3969 3943 1211 + 1 3941 1203 1211 3943 + 1 3946 484 3948 1215 + 1 1218 1215 1220 62 + 1 4013 3948 498 1220 + 1 3946 1218 3948 4013 + 1 3946 1218 1215 3948 + 1 1218 4013 1220 3948 + 1 1218 1215 3948 1220 + 1 3996 492 1890 3992 + 1 4025 3992 1891 498 + 1 1894 1890 121 1891 + 1 3996 4025 1890 1894 + 1 3996 4025 3992 1890 + 1 4025 1894 1891 1890 + 1 4025 3992 1890 1891 + 1 3970 496 3991 4016 + 1 3974 4016 3996 703 + 1 3969 3991 492 3996 + 1 3970 3974 3991 3969 + 1 3970 3974 4016 3991 + 1 3974 3969 3996 3991 + 1 3974 4016 3991 3996 + 1 3970 496 3946 3991 + 1 3941 3946 484 3943 + 1 3969 3991 3943 492 + 1 3970 3941 3969 3991 + 1 3970 3941 3991 3946 + 1 3941 3969 3991 3943 + 1 3941 3946 3943 3991 + 1 4016 703 4025 3996 + 1 3991 3996 3992 492 + 1 4013 4025 498 3992 + 1 4016 3991 4025 4013 + 1 4016 3991 3996 4025 + 1 3991 4013 3992 4025 + 1 3991 3996 4025 3992 + 1 3946 484 3943 3948 + 1 3991 3943 492 3992 + 1 4013 3948 3992 498 + 1 3946 3991 4013 3948 + 1 3946 3991 3948 3943 + 1 3991 4013 3948 3992 + 1 3991 3943 3992 3948 + 1 1796 112 1803 1797 + 1 3983 1803 714 4036 + 1 3981 1797 4036 503 + 1 1796 3983 3981 1797 + 1 1796 3983 1797 1803 + 1 3983 3981 1797 4036 + 1 3983 1803 4036 1797 + 1 3997 714 1895 4037 + 1 1890 1895 121 1892 + 1 3994 4037 1892 504 + 1 3997 1890 3994 4037 + 1 3997 1890 4037 1895 + 1 1890 3994 4037 1892 + 1 1890 1895 1892 4037 + 1 3958 503 4035 1232 + 1 3959 4035 504 1233 + 1 1230 1232 1233 64 + 1 3958 3959 1230 1232 + 1 3958 3959 1232 4035 + 1 3959 1230 1232 1233 + 1 3959 4035 1233 1232 + 1 3980 492 3956 3993 + 1 3955 3956 486 3958 + 1 3981 3993 3958 503 + 1 3980 3955 3981 3993 + 1 3980 3955 3993 3956 + 1 3955 3981 3993 3958 + 1 3955 3956 3958 3993 + 1 3980 492 3993 3997 + 1 3983 3997 4036 714 + 1 3981 3993 503 4036 + 1 3980 3983 3993 3981 + 1 3980 3983 3997 3993 + 1 3983 3981 4036 3993 + 1 3983 3997 3993 4036 + 1 3956 486 3958 3959 + 1 3993 3958 503 4035 + 1 3994 3959 4035 504 + 1 3956 3993 3994 3959 + 1 3956 3993 3959 3958 + 1 3993 3994 3959 4035 + 1 3993 3958 4035 3959 + 1 3997 714 4037 4036 + 1 3993 4036 4035 503 + 1 3994 4037 504 4035 + 1 3997 3993 4037 3994 + 1 3997 3993 4036 4037 + 1 3993 3994 4035 4037 + 1 3993 4036 4037 4035 + 1 1215 62 1216 1220 + 1 3948 1220 4006 498 + 1 3944 1216 494 4006 + 1 1215 3948 1216 3944 + 1 1215 3948 1220 1216 + 1 3948 3944 4006 1216 + 1 3948 1220 1216 4006 + 1 3992 498 4024 1891 + 1 1890 1891 1892 121 + 1 3994 4024 504 1892 + 1 3992 1890 4024 3994 + 1 3992 1890 1891 4024 + 1 1890 3994 1892 4024 + 1 1890 1891 4024 1892 + 1 3957 494 1231 4007 + 1 3959 4007 1233 504 + 1 1230 1231 64 1233 + 1 3957 3959 1231 1230 + 1 3957 3959 4007 1231 + 1 3959 1230 1233 1231 + 1 3959 4007 1231 1233 + 1 3943 492 3990 3956 + 1 3939 3956 3957 486 + 1 3944 3990 494 3957 + 1 3943 3939 3990 3944 + 1 3943 3939 3956 3990 + 1 3939 3944 3957 3990 + 1 3939 3956 3990 3957 + 1 3943 492 3992 3990 + 1 3948 3992 498 4006 + 1 3944 3990 4006 494 + 1 3943 3948 3944 3990 + 1 3943 3948 3990 3992 + 1 3948 3944 3990 4006 + 1 3948 3992 4006 3990 + 1 3956 486 3959 3957 + 1 3990 3957 4007 494 + 1 3994 3959 504 4007 + 1 3956 3990 3959 3994 + 1 3956 3990 3957 3959 + 1 3990 3994 4007 3959 + 1 3990 3957 3959 4007 + 1 3992 498 4006 4024 + 1 3990 4006 494 4007 + 1 3994 4024 4007 504 + 1 3992 3990 3994 4024 + 1 3992 3990 4024 4006 + 1 3990 3994 4024 4007 + 1 3990 4006 4007 4024 + 1 876 21 879 874 + 1 2890 879 275 2878 + 1 2877 874 2878 270 + 1 876 2890 2877 874 + 1 876 2890 874 879 + 1 2890 2877 874 2878 + 1 2890 879 2878 874 + 1 2911 275 1858 2910 + 1 1862 1858 118 1860 + 1 3764 2910 1860 446 + 1 2911 1862 3764 2910 + 1 2911 1862 2910 1858 + 1 1862 3764 2910 1860 + 1 1862 1858 1860 2910 + 1 2879 270 2880 1132 + 1 3754 2880 446 1137 + 1 1135 1132 1137 53 + 1 2879 3754 1135 1132 + 1 2879 3754 1132 2880 + 1 3754 1135 1132 1137 + 1 3754 2880 1137 1132 + 1 2894 664 3756 2881 + 1 2891 3756 444 2879 + 1 2877 2881 2879 270 + 1 2894 2891 2877 2881 + 1 2894 2891 2881 3756 + 1 2891 2877 2881 2879 + 1 2891 3756 2879 2881 + 1 2894 664 2881 2911 + 1 2890 2911 2878 275 + 1 2877 2881 270 2878 + 1 2894 2890 2881 2877 + 1 2894 2890 2911 2881 + 1 2890 2877 2878 2881 + 1 2890 2911 2881 2878 + 1 3756 444 2879 3754 + 1 2881 2879 270 2880 + 1 3764 3754 2880 446 + 1 3756 2881 3764 3754 + 1 3756 2881 3754 2879 + 1 2881 3764 3754 2880 + 1 2881 2879 2880 3754 + 1 2911 275 2910 2878 + 1 2881 2878 2880 270 + 1 3764 2910 446 2880 + 1 2911 2881 2910 3764 + 1 2911 2881 2878 2910 + 1 2881 3764 2880 2910 + 1 2881 2878 2910 2880 + 1 1863 118 1859 1861 + 1 3149 1859 312 3148 + 1 3768 1861 3148 448 + 1 1863 3149 3768 1861 + 1 1863 3149 1861 1859 + 1 3149 3768 1861 3148 + 1 3149 1859 3148 1861 + 1 3135 312 916 3127 + 1 914 916 26 912 + 1 3126 3127 912 308 + 1 3135 914 3126 3127 + 1 3135 914 3127 916 + 1 914 3126 3127 912 + 1 914 916 912 3127 + 1 3766 448 3129 1143 + 1 3128 3129 308 1139 + 1 1142 1143 1139 54 + 1 3766 3128 1142 1143 + 1 3766 3128 1143 3129 + 1 3128 1142 1143 1139 + 1 3128 3129 1139 1143 + 1 3139 310 3136 3137 + 1 3767 3136 447 3766 + 1 3768 3137 3766 448 + 1 3139 3767 3768 3137 + 1 3139 3767 3137 3136 + 1 3767 3768 3137 3766 + 1 3767 3136 3766 3137 + 1 3139 310 3137 3135 + 1 3149 3135 3148 312 + 1 3768 3137 448 3148 + 1 3139 3149 3137 3768 + 1 3139 3149 3135 3137 + 1 3149 3768 3148 3137 + 1 3149 3135 3137 3148 + 1 3136 447 3766 3128 + 1 3137 3766 448 3129 + 1 3126 3128 3129 308 + 1 3136 3137 3126 3128 + 1 3136 3137 3128 3766 + 1 3137 3126 3128 3129 + 1 3137 3766 3129 3128 + 1 3135 312 3127 3148 + 1 3137 3148 3129 448 + 1 3126 3127 308 3129 + 1 3135 3137 3127 3126 + 1 3135 3137 3148 3127 + 1 3137 3126 3129 3127 + 1 3137 3148 3127 3129 + 1 1133 53 1134 1131 + 1 3735 1134 443 2062 + 1 2060 1131 2062 151 + 1 1133 3735 2060 1131 + 1 1133 3735 1131 1134 + 1 3735 2060 1131 2062 + 1 3735 1134 2062 1131 + 1 3739 443 1141 2064 + 1 1140 1141 54 1138 + 1 2063 2064 1138 152 + 1 3739 1140 2063 2064 + 1 3739 1140 2064 1141 + 1 1140 2063 2064 1138 + 1 1140 1141 1138 2064 + 1 2055 151 2059 755 + 1 2056 2059 152 756 + 1 754 755 756 6 + 1 2055 2056 754 755 + 1 2055 2056 755 2059 + 1 2056 754 755 756 + 1 2056 2059 756 755 + 1 3732 440 2058 2061 + 1 2057 2058 150 2055 + 1 2060 2061 2055 151 + 1 3732 2057 2060 2061 + 1 3732 2057 2061 2058 + 1 2057 2060 2061 2055 + 1 2057 2058 2055 2061 + 1 3732 440 2061 3739 + 1 3735 3739 2062 443 + 1 2060 2061 151 2062 + 1 3732 3735 2061 2060 + 1 3732 3735 3739 2061 + 1 3735 2060 2062 2061 + 1 3735 3739 2061 2062 + 1 2058 150 2055 2056 + 1 2061 2055 151 2059 + 1 2063 2056 2059 152 + 1 2058 2061 2063 2056 + 1 2058 2061 2056 2055 + 1 2061 2063 2056 2059 + 1 2061 2055 2059 2056 + 1 3739 443 2064 2062 + 1 2061 2062 2059 151 + 1 2063 2064 152 2059 + 1 3739 2061 2064 2063 + 1 3739 2061 2062 2064 + 1 2061 2063 2059 2064 + 1 2061 2062 2064 2059 + 1 1654 101 1650 1651 + 1 3748 1650 442 3746 + 1 3760 1651 3746 445 + 1 1654 3748 3760 1651 + 1 1654 3748 1651 1650 + 1 3748 3760 1651 3746 + 1 3748 1650 3746 1651 + 1 3742 442 1130 3734 + 1 1129 1130 52 1127 + 1 3733 3734 1127 439 + 1 3742 1129 3733 3734 + 1 3742 1129 3734 1130 + 1 1129 3733 3734 1127 + 1 1129 1130 1127 3734 + 1 3753 445 3737 1136 + 1 3736 3737 439 1133 + 1 1135 1136 1133 53 + 1 3753 3736 1135 1136 + 1 3753 3736 1136 3737 + 1 3736 1135 1136 1133 + 1 3736 3737 1133 1136 + 1 3745 441 3743 3744 + 1 3755 3743 444 3753 + 1 3760 3744 3753 445 + 1 3745 3755 3760 3744 + 1 3745 3755 3744 3743 + 1 3755 3760 3744 3753 + 1 3755 3743 3753 3744 + 1 3745 441 3744 3742 + 1 3748 3742 3746 442 + 1 3760 3744 445 3746 + 1 3745 3748 3744 3760 + 1 3745 3748 3742 3744 + 1 3748 3760 3746 3744 + 1 3748 3742 3744 3746 + 1 3743 444 3753 3736 + 1 3744 3753 445 3737 + 1 3733 3736 3737 439 + 1 3743 3744 3733 3736 + 1 3743 3744 3736 3753 + 1 3744 3733 3736 3737 + 1 3744 3753 3737 3736 + 1 3742 442 3734 3746 + 1 3744 3746 3737 445 + 1 3733 3734 439 3737 + 1 3742 3744 3734 3733 + 1 3742 3744 3746 3734 + 1 3744 3733 3737 3734 + 1 3744 3746 3734 3737 + 1 1654 101 1651 1657 + 1 4700 1657 3762 667 + 1 3760 1651 445 3762 + 1 1654 4700 1651 3760 + 1 1654 4700 1657 1651 + 1 4700 3760 3762 1651 + 1 4700 1657 1651 3762 + 1 4705 667 3765 1863 + 1 1862 1863 1860 118 + 1 3764 3765 446 1860 + 1 4705 1862 3765 3764 + 1 4705 1862 1863 3765 + 1 1862 3764 1860 3765 + 1 1862 1863 3765 1860 + 1 3753 445 1136 3757 + 1 3754 3757 1137 446 + 1 1135 1136 53 1137 + 1 3753 3754 1136 1135 + 1 3753 3754 3757 1136 + 1 3754 1135 1137 1136 + 1 3754 3757 1136 1137 + 1 4698 664 3761 3756 + 1 3755 3756 3753 444 + 1 3760 3761 445 3753 + 1 4698 3755 3761 3760 + 1 4698 3755 3756 3761 + 1 3755 3760 3753 3761 + 1 3755 3756 3761 3753 + 1 4698 664 4705 3761 + 1 4700 4705 667 3762 + 1 3760 3761 3762 445 + 1 4698 4700 3760 3761 + 1 4698 4700 3761 4705 + 1 4700 3760 3761 3762 + 1 4700 4705 3762 3761 + 1 3756 444 3754 3753 + 1 3761 3753 3757 445 + 1 3764 3754 446 3757 + 1 3756 3761 3754 3764 + 1 3756 3761 3753 3754 + 1 3761 3764 3757 3754 + 1 3761 3753 3754 3757 + 1 4705 667 3762 3765 + 1 3761 3762 445 3757 + 1 3764 3765 3757 446 + 1 4705 3761 3764 3765 + 1 4705 3761 3765 3762 + 1 3761 3764 3765 3757 + 1 3761 3762 3757 3765 + 1 1130 52 1127 1128 + 1 3734 1127 439 3732 + 1 3738 1128 3732 440 + 1 1130 3734 3738 1128 + 1 1130 3734 1128 1127 + 1 3734 3738 1128 3732 + 1 3734 1127 3732 1128 + 1 3737 439 1133 3735 + 1 1136 1133 53 1134 + 1 3749 3735 1134 443 + 1 3737 1136 3749 3735 + 1 3737 1136 3735 1133 + 1 1136 3749 3735 1134 + 1 1136 1133 1134 3735 + 1 3741 440 3739 1140 + 1 3751 3739 443 1141 + 1 1142 1140 1141 54 + 1 3741 3751 1142 1140 + 1 3741 3751 1140 3739 + 1 3751 1142 1140 1141 + 1 3751 3739 1141 1140 + 1 3746 445 3758 3740 + 1 3747 3758 447 3741 + 1 3738 3740 3741 440 + 1 3746 3747 3738 3740 + 1 3746 3747 3740 3758 + 1 3747 3738 3740 3741 + 1 3747 3758 3741 3740 + 1 3746 445 3740 3737 + 1 3734 3737 3732 439 + 1 3738 3740 440 3732 + 1 3746 3734 3740 3738 + 1 3746 3734 3737 3740 + 1 3734 3738 3732 3740 + 1 3734 3737 3740 3732 + 1 3758 447 3741 3751 + 1 3740 3741 440 3739 + 1 3749 3751 3739 443 + 1 3758 3740 3749 3751 + 1 3758 3740 3751 3741 + 1 3740 3749 3751 3739 + 1 3740 3741 3739 3751 + 1 3737 439 3735 3732 + 1 3740 3732 3739 440 + 1 3749 3735 443 3739 + 1 3737 3740 3735 3749 + 1 3737 3740 3732 3735 + 1 3740 3749 3739 3735 + 1 3740 3732 3735 3739 + 1 1863 118 1861 1860 + 1 3765 1860 3763 446 + 1 3768 1861 448 3763 + 1 1863 3765 1861 3768 + 1 1863 3765 1860 1861 + 1 3765 3768 3763 1861 + 1 3765 1860 1861 3763 + 1 3757 446 3750 1137 + 1 1136 1137 1134 53 + 1 3749 3750 443 1134 + 1 3757 1136 3750 3749 + 1 3757 1136 1137 3750 + 1 1136 3749 1134 3750 + 1 1136 1137 3750 1134 + 1 3766 448 1143 3752 + 1 3751 3752 1141 443 + 1 1142 1143 54 1141 + 1 3766 3751 1143 1142 + 1 3766 3751 3752 1143 + 1 3751 1142 1141 1143 + 1 3751 3752 1143 1141 + 1 3762 445 3759 3758 + 1 3767 3758 3766 447 + 1 3768 3759 448 3766 + 1 3762 3767 3759 3768 + 1 3762 3767 3758 3759 + 1 3767 3768 3766 3759 + 1 3767 3758 3759 3766 + 1 3762 445 3757 3759 + 1 3765 3757 446 3763 + 1 3768 3759 3763 448 + 1 3762 3765 3768 3759 + 1 3762 3765 3759 3757 + 1 3765 3768 3759 3763 + 1 3765 3757 3763 3759 + 1 3758 447 3751 3766 + 1 3759 3766 3752 448 + 1 3749 3751 443 3752 + 1 3758 3759 3751 3749 + 1 3758 3759 3766 3751 + 1 3759 3749 3752 3751 + 1 3759 3766 3751 3752 + 1 3757 446 3763 3750 + 1 3759 3763 448 3752 + 1 3749 3750 3752 443 + 1 3757 3759 3749 3750 + 1 3757 3759 3750 3763 + 1 3759 3749 3750 3752 + 1 3759 3763 3752 3750 + 1 848 18 850 852 + 1 2700 850 246 2718 + 1 2702 852 2718 248 + 1 848 2700 2702 852 + 1 848 2700 852 850 + 1 2700 2702 852 2718 + 1 2700 850 2718 852 + 1 2721 246 1629 2722 + 1 1633 1629 99 1636 + 1 4474 2722 1636 660 + 1 2721 1633 4474 2722 + 1 2721 1633 2722 1629 + 1 1633 4474 2722 1636 + 1 1633 1629 1636 2722 + 1 2736 248 2738 1742 + 1 4488 2738 660 1748 + 1 1745 1742 1748 108 + 1 2736 4488 1745 1742 + 1 2736 4488 1742 2738 + 1 4488 1745 1742 1748 + 1 4488 2738 1748 1742 + 1 2706 609 4473 2735 + 1 2708 4473 612 2736 + 1 2702 2735 2736 248 + 1 2706 2708 2702 2735 + 1 2706 2708 2735 4473 + 1 2708 2702 2735 2736 + 1 2708 4473 2736 2735 + 1 2706 609 2735 2721 + 1 2700 2721 2718 246 + 1 2702 2735 248 2718 + 1 2706 2700 2735 2702 + 1 2706 2700 2721 2735 + 1 2700 2702 2718 2735 + 1 2700 2721 2735 2718 + 1 4473 612 2736 4488 + 1 2735 2736 248 2738 + 1 4474 4488 2738 660 + 1 4473 2735 4474 4488 + 1 4473 2735 4488 2736 + 1 2735 4474 4488 2738 + 1 2735 2736 2738 4488 + 1 2721 246 2722 2718 + 1 2735 2718 2738 248 + 1 4474 2722 660 2738 + 1 2721 2735 2722 4474 + 1 2721 2735 2718 2722 + 1 2735 4474 2738 2722 + 1 2735 2718 2722 2738 + 1 1632 99 1628 1634 + 1 2535 1628 225 2536 + 1 4416 1634 2536 658 + 1 1632 2535 4416 1634 + 1 1632 2535 1634 1628 + 1 2535 4416 1634 2536 + 1 2535 1628 2536 1634 + 1 2525 225 829 2532 + 1 828 829 16 830 + 1 2526 2532 830 226 + 1 2525 828 2526 2532 + 1 2525 828 2532 829 + 1 828 2526 2532 830 + 1 828 829 830 2532 + 1 4420 658 2541 1644 + 1 2540 2541 226 1638 + 1 1642 1644 1638 100 + 1 4420 2540 1642 1644 + 1 4420 2540 1644 2541 + 1 2540 1642 1644 1638 + 1 2540 2541 1638 1644 + 1 2529 224 2530 2531 + 1 4413 2530 599 4420 + 1 4416 2531 4420 658 + 1 2529 4413 4416 2531 + 1 2529 4413 2531 2530 + 1 4413 4416 2531 4420 + 1 4413 2530 4420 2531 + 1 2529 224 2531 2525 + 1 2535 2525 2536 225 + 1 4416 2531 658 2536 + 1 2529 2535 2531 4416 + 1 2529 2535 2525 2531 + 1 2535 4416 2536 2531 + 1 2535 2525 2531 2536 + 1 2530 599 4420 2540 + 1 2531 4420 658 2541 + 1 2526 2540 2541 226 + 1 2530 2531 2526 2540 + 1 2530 2531 2540 4420 + 1 2531 2526 2540 2541 + 1 2531 4420 2541 2540 + 1 2525 225 2532 2536 + 1 2531 2536 2541 658 + 1 2526 2532 226 2541 + 1 2525 2531 2532 2526 + 1 2525 2531 2536 2532 + 1 2531 2526 2541 2532 + 1 2531 2536 2532 2541 + 1 1746 108 1749 1743 + 1 4503 1749 663 2900 + 1 2898 1743 2900 273 + 1 1746 4503 2898 1743 + 1 1746 4503 1743 1749 + 1 4503 2898 1743 2900 + 1 4503 1749 2900 1743 + 1 4500 663 1646 2893 + 1 1643 1646 100 1639 + 1 2892 2893 1639 272 + 1 4500 1643 2892 2893 + 1 4500 1643 2893 1646 + 1 1643 2892 2893 1639 + 1 1643 1646 1639 2893 + 1 2883 273 2889 877 + 1 2882 2889 272 876 + 1 875 877 876 21 + 1 2883 2882 875 877 + 1 2883 2882 877 2889 + 1 2882 875 877 876 + 1 2882 2889 876 877 + 1 4499 615 2886 2897 + 1 2887 2886 271 2883 + 1 2898 2897 2883 273 + 1 4499 2887 2898 2897 + 1 4499 2887 2897 2886 + 1 2887 2898 2897 2883 + 1 2887 2886 2883 2897 + 1 4499 615 2897 4500 + 1 4503 4500 2900 663 + 1 2898 2897 273 2900 + 1 4499 4503 2897 2898 + 1 4499 4503 4500 2897 + 1 4503 2898 2900 2897 + 1 4503 4500 2897 2900 + 1 2886 271 2883 2882 + 1 2897 2883 273 2889 + 1 2892 2882 2889 272 + 1 2886 2897 2892 2882 + 1 2886 2897 2882 2883 + 1 2897 2892 2882 2889 + 1 2897 2883 2889 2882 + 1 4500 663 2893 2900 + 1 2897 2900 2889 273 + 1 2892 2893 272 2889 + 1 4500 2897 2893 2892 + 1 4500 2897 2900 2893 + 1 2897 2892 2889 2893 + 1 2897 2900 2893 2889 + 1 1485 87 1486 1489 + 1 4402 1486 597 4409 + 1 4404 1489 4409 600 + 1 1485 4402 4404 1489 + 1 1485 4402 1489 1486 + 1 4402 4404 1489 4409 + 1 4402 1486 4409 1489 + 1 4410 597 1522 4412 + 1 1523 1522 90 1526 + 1 4464 4412 1526 616 + 1 4410 1523 4464 4412 + 1 4410 1523 4412 1522 + 1 1523 4464 4412 1526 + 1 1523 1522 1526 4412 + 1 4424 600 4426 1744 + 1 4486 4426 616 1746 + 1 1745 1744 1746 108 + 1 4424 4486 1745 1744 + 1 4424 4486 1744 4426 + 1 4486 1745 1744 1746 + 1 4486 4426 1746 1744 + 1 4405 607 4462 4422 + 1 4407 4462 612 4424 + 1 4404 4422 4424 600 + 1 4405 4407 4404 4422 + 1 4405 4407 4422 4462 + 1 4407 4404 4422 4424 + 1 4407 4462 4424 4422 + 1 4405 607 4422 4410 + 1 4402 4410 4409 597 + 1 4404 4422 600 4409 + 1 4405 4402 4422 4404 + 1 4405 4402 4410 4422 + 1 4402 4404 4409 4422 + 1 4402 4410 4422 4409 + 1 4462 612 4424 4486 + 1 4422 4424 600 4426 + 1 4464 4486 4426 616 + 1 4462 4422 4464 4486 + 1 4462 4422 4486 4424 + 1 4422 4464 4486 4426 + 1 4422 4424 4426 4486 + 1 4410 597 4412 4409 + 1 4422 4409 4426 600 + 1 4464 4412 616 4426 + 1 4410 4422 4412 4464 + 1 4410 4422 4409 4412 + 1 4422 4464 4426 4412 + 1 4422 4409 4412 4426 + 1 1485 87 1489 1487 + 1 4403 1487 4414 598 + 1 4404 1489 600 4414 + 1 1485 4403 1489 4404 + 1 1485 4403 1487 1489 + 1 4403 4404 4414 1489 + 1 4403 1487 1489 4414 + 1 4415 598 4417 1632 + 1 1633 1632 1636 99 + 1 4474 4417 660 1636 + 1 4415 1633 4417 4474 + 1 4415 1633 1632 4417 + 1 1633 4474 1636 4417 + 1 1633 1632 4417 1636 + 1 4424 600 1744 4428 + 1 4488 4428 1748 660 + 1 1745 1744 108 1748 + 1 4424 4488 1744 1745 + 1 4424 4488 4428 1744 + 1 4488 1745 1748 1744 + 1 4488 4428 1744 1748 + 1 4406 609 4423 4473 + 1 4407 4473 4424 612 + 1 4404 4423 600 4424 + 1 4406 4407 4423 4404 + 1 4406 4407 4473 4423 + 1 4407 4404 4424 4423 + 1 4407 4473 4423 4424 + 1 4406 609 4415 4423 + 1 4403 4415 598 4414 + 1 4404 4423 4414 600 + 1 4406 4403 4404 4423 + 1 4406 4403 4423 4415 + 1 4403 4404 4423 4414 + 1 4403 4415 4414 4423 + 1 4473 612 4488 4424 + 1 4423 4424 4428 600 + 1 4474 4488 660 4428 + 1 4473 4423 4488 4474 + 1 4473 4423 4424 4488 + 1 4423 4474 4428 4488 + 1 4423 4424 4488 4428 + 1 4415 598 4414 4417 + 1 4423 4414 600 4428 + 1 4474 4417 4428 660 + 1 4415 4423 4474 4417 + 1 4415 4423 4417 4414 + 1 4423 4474 4417 4428 + 1 4423 4414 4428 4417 + 1 1522 90 1526 1525 + 1 4412 1526 616 4499 + 1 4411 1525 4499 615 + 1 1522 4412 4411 1525 + 1 1522 4412 1525 1526 + 1 4412 4411 1525 4499 + 1 4412 1526 4499 1525 + 1 4426 616 1746 4503 + 1 1744 1746 108 1749 + 1 4429 4503 1749 663 + 1 4426 1744 4429 4503 + 1 4426 1744 4503 1746 + 1 1744 4429 4503 1749 + 1 1744 1746 1749 4503 + 1 4419 615 4500 1643 + 1 4421 4500 663 1646 + 1 1642 1643 1646 100 + 1 4419 4421 1642 1643 + 1 4419 4421 1643 4500 + 1 4421 1642 1643 1646 + 1 4421 4500 1646 1643 + 1 4409 600 4418 4425 + 1 4408 4418 599 4419 + 1 4411 4425 4419 615 + 1 4409 4408 4411 4425 + 1 4409 4408 4425 4418 + 1 4408 4411 4425 4419 + 1 4408 4418 4419 4425 + 1 4409 600 4425 4426 + 1 4412 4426 4499 616 + 1 4411 4425 615 4499 + 1 4409 4412 4425 4411 + 1 4409 4412 4426 4425 + 1 4412 4411 4499 4425 + 1 4412 4426 4425 4499 + 1 4418 599 4419 4421 + 1 4425 4419 615 4500 + 1 4429 4421 4500 663 + 1 4418 4425 4429 4421 + 1 4418 4425 4421 4419 + 1 4425 4429 4421 4500 + 1 4425 4419 4500 4421 + 1 4426 616 4503 4499 + 1 4425 4499 4500 615 + 1 4429 4503 663 4500 + 1 4426 4425 4503 4429 + 1 4426 4425 4499 4503 + 1 4425 4429 4500 4503 + 1 4425 4499 4503 4500 + 1 1632 99 1634 1636 + 1 4417 1636 4681 660 + 1 4416 1634 658 4681 + 1 1632 4417 1634 4416 + 1 1632 4417 1636 1634 + 1 4417 4416 4681 1634 + 1 4417 1636 1634 4681 + 1 4428 660 4691 1748 + 1 1744 1748 1749 108 + 1 4429 4691 663 1749 + 1 4428 1744 4691 4429 + 1 4428 1744 1748 4691 + 1 1744 4429 1749 4691 + 1 1744 1748 4691 1749 + 1 4420 658 1644 4683 + 1 4421 4683 1646 663 + 1 1642 1644 100 1646 + 1 4420 4421 1644 1642 + 1 4420 4421 4683 1644 + 1 4421 1642 1646 1644 + 1 4421 4683 1644 1646 + 1 4414 600 4427 4418 + 1 4413 4418 4420 599 + 1 4416 4427 658 4420 + 1 4414 4413 4427 4416 + 1 4414 4413 4418 4427 + 1 4413 4416 4420 4427 + 1 4413 4418 4427 4420 + 1 4414 600 4428 4427 + 1 4417 4428 660 4681 + 1 4416 4427 4681 658 + 1 4414 4417 4416 4427 + 1 4414 4417 4427 4428 + 1 4417 4416 4427 4681 + 1 4417 4428 4681 4427 + 1 4418 599 4421 4420 + 1 4427 4420 4683 658 + 1 4429 4421 663 4683 + 1 4418 4427 4421 4429 + 1 4418 4427 4420 4421 + 1 4427 4429 4683 4421 + 1 4427 4420 4421 4683 + 1 4428 660 4681 4691 + 1 4427 4681 658 4683 + 1 4429 4691 4683 663 + 1 4428 4427 4429 4691 + 1 4428 4427 4691 4681 + 1 4427 4429 4691 4683 + 1 4427 4681 4683 4691 + 1 848 18 852 853 + 1 2703 853 2733 249 + 1 2702 852 248 2733 + 1 848 2703 852 2702 + 1 848 2703 853 852 + 1 2703 2702 2733 852 + 1 2703 853 852 2733 + 1 2746 249 2748 1756 + 1 1760 1756 1764 109 + 1 4494 2748 695 1764 + 1 2746 1760 2748 4494 + 1 2746 1760 1756 2748 + 1 1760 4494 1764 2748 + 1 1760 1756 2748 1764 + 1 2736 248 1742 2740 + 1 4489 2740 1751 695 + 1 1745 1742 108 1751 + 1 2736 4489 1742 1745 + 1 2736 4489 2740 1742 + 1 4489 1745 1751 1742 + 1 4489 2740 1742 1751 + 1 2709 613 2737 4485 + 1 2708 4485 2736 612 + 1 2702 2737 248 2736 + 1 2709 2708 2737 2702 + 1 2709 2708 4485 2737 + 1 2708 2702 2736 2737 + 1 2708 4485 2737 2736 + 1 2709 613 2746 2737 + 1 2703 2746 249 2733 + 1 2702 2737 2733 248 + 1 2709 2703 2702 2737 + 1 2709 2703 2737 2746 + 1 2703 2702 2737 2733 + 1 2703 2746 2733 2737 + 1 4485 612 4489 2736 + 1 2737 2736 2740 248 + 1 4494 4489 695 2740 + 1 4485 2737 4489 4494 + 1 4485 2737 2736 4489 + 1 2737 4494 2740 4489 + 1 2737 2736 4489 2740 + 1 2746 249 2733 2748 + 1 2737 2733 248 2740 + 1 4494 2748 2740 695 + 1 2746 2737 4494 2748 + 1 2746 2737 2748 2733 + 1 2737 4494 2748 2740 + 1 2737 2733 2740 2748 + 1 1761 109 1767 1757 + 1 3007 1757 3009 288 + 1 4537 1767 702 3009 + 1 1761 3007 1767 4537 + 1 1761 3007 1757 1767 + 1 3007 4537 3009 1767 + 1 3007 1757 1767 3009 + 1 2982 288 3003 892 + 1 890 892 893 23 + 1 2983 3003 289 893 + 1 2982 890 3003 2983 + 1 2982 890 892 3003 + 1 890 2983 893 3003 + 1 890 892 3003 893 + 1 4539 702 1855 3015 + 1 3014 3015 1849 289 + 1 1853 1855 117 1849 + 1 4539 3014 1855 1853 + 1 4539 3014 3015 1855 + 1 3014 1853 1849 1855 + 1 3014 3015 1855 1849 + 1 2988 286 2991 2989 + 1 4534 2989 4539 625 + 1 4537 2991 702 4539 + 1 2988 4534 2991 4537 + 1 2988 4534 2989 2991 + 1 4534 4537 4539 2991 + 1 4534 2989 2991 4539 + 1 2988 286 2982 2991 + 1 3007 2982 288 3009 + 1 4537 2991 3009 702 + 1 2988 3007 4537 2991 + 1 2988 3007 2991 2982 + 1 3007 4537 2991 3009 + 1 3007 2982 3009 2991 + 1 2989 625 3014 4539 + 1 2991 4539 3015 702 + 1 2983 3014 289 3015 + 1 2989 2991 3014 2983 + 1 2989 2991 4539 3014 + 1 2991 2983 3015 3014 + 1 2991 4539 3014 3015 + 1 2982 288 3009 3003 + 1 2991 3009 702 3015 + 1 2983 3003 3015 289 + 1 2982 2991 2983 3003 + 1 2982 2991 3003 3009 + 1 2991 2983 3003 3015 + 1 2991 3009 3015 3003 + 1 1746 108 1743 1753 + 1 4504 1753 2902 697 + 1 2898 1743 273 2902 + 1 1746 4504 1743 2898 + 1 1746 4504 1753 1743 + 1 4504 2898 2902 1743 + 1 4504 1753 1743 2902 + 1 4507 697 2908 1854 + 1 1852 1854 1848 117 + 1 2907 2908 274 1848 + 1 4507 1852 2908 2907 + 1 4507 1852 1854 2908 + 1 1852 2907 1848 2908 + 1 1852 1854 2908 1848 + 1 2883 273 877 2895 + 1 2884 2895 878 274 + 1 875 877 21 878 + 1 2883 2884 877 875 + 1 2883 2884 2895 877 + 1 2884 875 878 877 + 1 2884 2895 877 878 + 1 4501 617 2899 2888 + 1 2887 2888 2883 271 + 1 2898 2899 273 2883 + 1 4501 2887 2899 2898 + 1 4501 2887 2888 2899 + 1 2887 2898 2883 2899 + 1 2887 2888 2899 2883 + 1 4501 617 4507 2899 + 1 4504 4507 697 2902 + 1 2898 2899 2902 273 + 1 4501 4504 2898 2899 + 1 4501 4504 2899 4507 + 1 4504 2898 2899 2902 + 1 4504 4507 2902 2899 + 1 2888 271 2884 2883 + 1 2899 2883 2895 273 + 1 2907 2884 274 2895 + 1 2888 2899 2884 2907 + 1 2888 2899 2883 2884 + 1 2899 2907 2895 2884 + 1 2899 2883 2884 2895 + 1 4507 697 2902 2908 + 1 2899 2902 273 2895 + 1 2907 2908 2895 274 + 1 4507 2899 2907 2908 + 1 4507 2899 2908 2902 + 1 2899 2907 2908 2895 + 1 2899 2902 2895 2908 + 1 1548 92 1552 1549 + 1 4469 1549 4497 614 + 1 4471 1552 623 4497 + 1 1548 4469 1552 4471 + 1 1548 4469 1549 1552 + 1 4469 4471 4497 1552 + 1 4469 1549 1552 4497 + 1 4463 614 4495 1524 + 1 1523 1524 1526 90 + 1 4464 4495 616 1526 + 1 4463 1523 4495 4464 + 1 4463 1523 1524 4495 + 1 1523 4464 1526 4495 + 1 1523 1524 4495 1526 + 1 4487 623 1747 4502 + 1 4486 4502 1746 616 + 1 1745 1747 108 1746 + 1 4487 4486 1747 1745 + 1 4487 4486 4502 1747 + 1 4486 1745 1746 1747 + 1 4486 4502 1747 1746 + 1 4461 607 4465 4462 + 1 4467 4462 4487 612 + 1 4471 4465 623 4487 + 1 4461 4467 4465 4471 + 1 4461 4467 4462 4465 + 1 4467 4471 4487 4465 + 1 4467 4462 4465 4487 + 1 4461 607 4463 4465 + 1 4469 4463 614 4497 + 1 4471 4465 4497 623 + 1 4461 4469 4471 4465 + 1 4461 4469 4465 4463 + 1 4469 4471 4465 4497 + 1 4469 4463 4497 4465 + 1 4462 612 4486 4487 + 1 4465 4487 4502 623 + 1 4464 4486 616 4502 + 1 4462 4465 4486 4464 + 1 4462 4465 4487 4486 + 1 4465 4464 4502 4486 + 1 4465 4487 4486 4502 + 1 4463 614 4497 4495 + 1 4465 4497 623 4502 + 1 4464 4495 4502 616 + 1 4463 4465 4464 4495 + 1 4463 4465 4495 4497 + 1 4465 4464 4495 4502 + 1 4465 4497 4502 4495 + 1 1548 92 1553 1552 + 1 4472 1553 624 4529 + 1 4471 1552 4529 623 + 1 1548 4472 4471 1552 + 1 1548 4472 1552 1553 + 1 4472 4471 1552 4529 + 1 4472 1553 4529 1552 + 1 4491 624 1761 4536 + 1 1760 1761 109 1764 + 1 4494 4536 1764 695 + 1 4491 1760 4494 4536 + 1 4491 1760 4536 1761 + 1 1760 4494 4536 1764 + 1 1760 1761 1764 4536 + 1 4487 623 4531 1747 + 1 4489 4531 695 1751 + 1 1745 1747 1751 108 + 1 4487 4489 1745 1747 + 1 4487 4489 1747 4531 + 1 4489 1745 1747 1751 + 1 4489 4531 1751 1747 + 1 4468 613 4485 4490 + 1 4467 4485 612 4487 + 1 4471 4490 4487 623 + 1 4468 4467 4471 4490 + 1 4468 4467 4490 4485 + 1 4467 4471 4490 4487 + 1 4467 4485 4487 4490 + 1 4468 613 4490 4491 + 1 4472 4491 4529 624 + 1 4471 4490 623 4529 + 1 4468 4472 4490 4471 + 1 4468 4472 4491 4490 + 1 4472 4471 4529 4490 + 1 4472 4491 4490 4529 + 1 4485 612 4487 4489 + 1 4490 4487 623 4531 + 1 4494 4489 4531 695 + 1 4485 4490 4494 4489 + 1 4485 4490 4489 4487 + 1 4490 4494 4489 4531 + 1 4490 4487 4531 4489 + 1 4491 624 4536 4529 + 1 4490 4529 4531 623 + 1 4494 4536 695 4531 + 1 4491 4490 4536 4494 + 1 4491 4490 4529 4536 + 1 4490 4494 4531 4536 + 1 4490 4529 4536 4531 + 1 1524 90 1527 1526 + 1 4495 1526 4501 616 + 1 4496 1527 617 4501 + 1 1524 4495 1527 4496 + 1 1524 4495 1526 1527 + 1 4495 4496 4501 1527 + 1 4495 1526 1527 4501 + 1 4502 616 4504 1746 + 1 1747 1746 1753 108 + 1 4532 4504 697 1753 + 1 4502 1747 4504 4532 + 1 4502 1747 1746 4504 + 1 1747 4532 1753 4504 + 1 1747 1746 4504 1753 + 1 4506 617 1852 4507 + 1 4538 4507 1854 697 + 1 1853 1852 117 1854 + 1 4506 4538 1852 1853 + 1 4506 4538 4507 1852 + 1 4538 1853 1854 1852 + 1 4538 4507 1852 1854 + 1 4497 623 4505 4530 + 1 4498 4530 4506 625 + 1 4496 4505 617 4506 + 1 4497 4498 4505 4496 + 1 4497 4498 4530 4505 + 1 4498 4496 4506 4505 + 1 4498 4530 4505 4506 + 1 4497 623 4502 4505 + 1 4495 4502 616 4501 + 1 4496 4505 4501 617 + 1 4497 4495 4496 4505 + 1 4497 4495 4505 4502 + 1 4495 4496 4505 4501 + 1 4495 4502 4501 4505 + 1 4530 625 4538 4506 + 1 4505 4506 4507 617 + 1 4532 4538 697 4507 + 1 4530 4505 4538 4532 + 1 4530 4505 4506 4538 + 1 4505 4532 4507 4538 + 1 4505 4506 4538 4507 + 1 4502 616 4501 4504 + 1 4505 4501 617 4507 + 1 4532 4504 4507 697 + 1 4502 4505 4532 4504 + 1 4502 4505 4504 4501 + 1 4505 4532 4504 4507 + 1 4505 4501 4507 4504 + 1 1761 109 1764 1767 + 1 4536 1764 695 4829 + 1 4537 1767 4829 702 + 1 1761 4536 4537 1767 + 1 1761 4536 1767 1764 + 1 4536 4537 1767 4829 + 1 4536 1764 4829 1767 + 1 4531 695 1751 4826 + 1 1747 1751 108 1753 + 1 4532 4826 1753 697 + 1 4531 1747 4532 4826 + 1 4531 1747 4826 1751 + 1 1747 4532 4826 1753 + 1 1747 1751 1753 4826 + 1 4539 702 4838 1855 + 1 4538 4838 697 1854 + 1 1853 1855 1854 117 + 1 4539 4538 1853 1855 + 1 4539 4538 1855 4838 + 1 4538 1853 1855 1854 + 1 4538 4838 1854 1855 + 1 4529 623 4530 4533 + 1 4534 4530 625 4539 + 1 4537 4533 4539 702 + 1 4529 4534 4537 4533 + 1 4529 4534 4533 4530 + 1 4534 4537 4533 4539 + 1 4534 4530 4539 4533 + 1 4529 623 4533 4531 + 1 4536 4531 4829 695 + 1 4537 4533 702 4829 + 1 4529 4536 4533 4537 + 1 4529 4536 4531 4533 + 1 4536 4537 4829 4533 + 1 4536 4531 4533 4829 + 1 4530 625 4539 4538 + 1 4533 4539 702 4838 + 1 4532 4538 4838 697 + 1 4530 4533 4532 4538 + 1 4530 4533 4538 4539 + 1 4533 4532 4538 4838 + 1 4533 4539 4838 4538 + 1 4531 695 4826 4829 + 1 4533 4829 4838 702 + 1 4532 4826 697 4838 + 1 4531 4533 4826 4532 + 1 4531 4533 4829 4826 + 1 4533 4532 4838 4826 + 1 4533 4829 4826 4838 + 1 829 16 830 831 + 1 2532 830 226 2538 + 1 2533 831 2538 227 + 1 829 2532 2533 831 + 1 829 2532 831 830 + 1 2532 2533 831 2538 + 1 2532 830 2538 831 + 1 2541 226 1638 2542 + 1 1644 1638 100 1645 + 1 4682 2542 1645 662 + 1 2541 1644 4682 2542 + 1 2541 1644 2542 1638 + 1 1644 4682 2542 1645 + 1 1644 1638 1645 2542 + 1 2546 227 2547 1648 + 1 4687 2547 662 1654 + 1 1653 1648 1654 101 + 1 2546 4687 1653 1648 + 1 2546 4687 1648 2547 + 1 4687 1653 1648 1654 + 1 4687 2547 1654 1648 + 1 2536 658 4680 2545 + 1 2537 4680 659 2546 + 1 2533 2545 2546 227 + 1 2536 2537 2533 2545 + 1 2536 2537 2545 4680 + 1 2537 2533 2545 2546 + 1 2537 4680 2546 2545 + 1 2536 658 2545 2541 + 1 2532 2541 2538 226 + 1 2533 2545 227 2538 + 1 2536 2532 2545 2533 + 1 2536 2532 2541 2545 + 1 2532 2533 2538 2545 + 1 2532 2541 2545 2538 + 1 4680 659 2546 4687 + 1 2545 2546 227 2547 + 1 4682 4687 2547 662 + 1 4680 2545 4682 4687 + 1 4680 2545 4687 2546 + 1 2545 4682 4687 2547 + 1 2545 2546 2547 4687 + 1 2541 226 2542 2538 + 1 2545 2538 2547 227 + 1 4682 2542 662 2547 + 1 2541 2545 2542 4682 + 1 2541 2545 2538 2542 + 1 2545 4682 2547 2542 + 1 2545 2538 2542 2547 + 1 1646 100 1639 1647 + 1 2893 1639 272 2894 + 1 4701 1647 2894 664 + 1 1646 2893 4701 1647 + 1 1646 2893 1647 1639 + 1 2893 4701 1647 2894 + 1 2893 1639 2894 1647 + 1 2889 272 876 2890 + 1 877 876 21 879 + 1 2896 2890 879 275 + 1 2889 877 2896 2890 + 1 2889 877 2890 876 + 1 877 2896 2890 879 + 1 877 876 879 2890 + 1 4706 664 2911 1862 + 1 2912 2911 275 1858 + 1 1864 1862 1858 118 + 1 4706 2912 1864 1862 + 1 4706 2912 1862 2911 + 1 2912 1864 1862 1858 + 1 2912 2911 1858 1862 + 1 2900 273 2903 2901 + 1 4703 2903 698 4706 + 1 4701 2901 4706 664 + 1 2900 4703 4701 2901 + 1 2900 4703 2901 2903 + 1 4703 4701 2901 4706 + 1 4703 2903 4706 2901 + 1 2900 273 2901 2889 + 1 2893 2889 2894 272 + 1 4701 2901 664 2894 + 1 2900 2893 2901 4701 + 1 2900 2893 2889 2901 + 1 2893 4701 2894 2901 + 1 2893 2889 2901 2894 + 1 2903 698 4706 2912 + 1 2901 4706 664 2911 + 1 2896 2912 2911 275 + 1 2903 2901 2896 2912 + 1 2903 2901 2912 4706 + 1 2901 2896 2912 2911 + 1 2901 4706 2911 2912 + 1 2889 272 2890 2894 + 1 2901 2894 2911 664 + 1 2896 2890 275 2911 + 1 2889 2901 2890 2896 + 1 2889 2901 2894 2890 + 1 2901 2896 2911 2890 + 1 2901 2894 2890 2911 + 1 1656 101 1657 1649 + 1 4712 1657 667 3139 + 1 3138 1649 3139 310 + 1 1656 4712 3138 1649 + 1 1656 4712 1649 1657 + 1 4712 3138 1649 3139 + 1 4712 1657 3139 1649 + 1 4716 667 1863 3149 + 1 1865 1863 118 1859 + 1 3150 3149 1859 312 + 1 4716 1865 3150 3149 + 1 4716 1865 3149 1863 + 1 1865 3150 3149 1859 + 1 1865 1863 1859 3149 + 1 3134 310 3135 914 + 1 3141 3135 312 916 + 1 915 914 916 26 + 1 3134 3141 915 914 + 1 3134 3141 914 3135 + 1 3141 915 914 916 + 1 3141 3135 916 914 + 1 4714 713 3145 3140 + 1 3144 3145 311 3134 + 1 3138 3140 3134 310 + 1 4714 3144 3138 3140 + 1 4714 3144 3140 3145 + 1 3144 3138 3140 3134 + 1 3144 3145 3134 3140 + 1 4714 713 3140 4716 + 1 4712 4716 3139 667 + 1 3138 3140 310 3139 + 1 4714 4712 3140 3138 + 1 4714 4712 4716 3140 + 1 4712 3138 3139 3140 + 1 4712 4716 3140 3139 + 1 3145 311 3134 3141 + 1 3140 3134 310 3135 + 1 3150 3141 3135 312 + 1 3145 3140 3150 3141 + 1 3145 3140 3141 3134 + 1 3140 3150 3141 3135 + 1 3140 3134 3135 3141 + 1 4716 667 3149 3139 + 1 3140 3139 3135 310 + 1 3150 3149 312 3135 + 1 4716 3140 3149 3150 + 1 4716 3140 3139 3149 + 1 3140 3150 3135 3149 + 1 3140 3139 3149 3135 + 1 1748 108 1752 1750 + 1 4693 1752 696 4709 + 1 4692 1750 4709 665 + 1 1748 4693 4692 1750 + 1 1748 4693 1750 1752 + 1 4693 4692 1750 4709 + 1 4693 1752 4709 1750 + 1 4696 696 1800 4713 + 1 1798 1800 112 1799 + 1 4695 4713 1799 666 + 1 4696 1798 4695 4713 + 1 4696 1798 4713 1800 + 1 1798 4695 4713 1799 + 1 1798 1800 1799 4713 + 1 4688 665 4707 1655 + 1 4689 4707 666 1656 + 1 1653 1655 1656 101 + 1 4688 4689 1653 1655 + 1 4688 4689 1655 4707 + 1 4689 1653 1655 1656 + 1 4689 4707 1656 1655 + 1 4690 661 4686 4694 + 1 4685 4686 659 4688 + 1 4692 4694 4688 665 + 1 4690 4685 4692 4694 + 1 4690 4685 4694 4686 + 1 4685 4692 4694 4688 + 1 4685 4686 4688 4694 + 1 4690 661 4694 4696 + 1 4693 4696 4709 696 + 1 4692 4694 665 4709 + 1 4690 4693 4694 4692 + 1 4690 4693 4696 4694 + 1 4693 4692 4709 4694 + 1 4693 4696 4694 4709 + 1 4686 659 4688 4689 + 1 4694 4688 665 4707 + 1 4695 4689 4707 666 + 1 4686 4694 4695 4689 + 1 4686 4694 4689 4688 + 1 4694 4695 4689 4707 + 1 4694 4688 4707 4689 + 1 4696 696 4713 4709 + 1 4694 4709 4707 665 + 1 4695 4713 666 4707 + 1 4696 4694 4713 4695 + 1 4696 4694 4709 4713 + 1 4694 4695 4707 4713 + 1 4694 4709 4713 4707 + 1 1748 108 1750 1749 + 1 4691 1749 4702 663 + 1 4692 1750 665 4702 + 1 1748 4691 1750 4692 + 1 1748 4691 1749 1750 + 1 4691 4692 4702 1750 + 1 4691 1749 1750 4702 + 1 4683 663 4697 1646 + 1 1644 1646 1645 100 + 1 4682 4697 662 1645 + 1 4683 1644 4697 4682 + 1 4683 1644 1646 4697 + 1 1644 4682 1645 4697 + 1 1644 1646 4697 1645 + 1 4688 665 1655 4699 + 1 4687 4699 1654 662 + 1 1653 1655 101 1654 + 1 4688 4687 1655 1653 + 1 4688 4687 4699 1655 + 1 4687 1653 1654 1655 + 1 4687 4699 1655 1654 + 1 4681 658 4684 4680 + 1 4685 4680 4688 659 + 1 4692 4684 665 4688 + 1 4681 4685 4684 4692 + 1 4681 4685 4680 4684 + 1 4685 4692 4688 4684 + 1 4685 4680 4684 4688 + 1 4681 658 4683 4684 + 1 4691 4683 663 4702 + 1 4692 4684 4702 665 + 1 4681 4691 4692 4684 + 1 4681 4691 4684 4683 + 1 4691 4692 4684 4702 + 1 4691 4683 4702 4684 + 1 4680 659 4687 4688 + 1 4684 4688 4699 665 + 1 4682 4687 662 4699 + 1 4680 4684 4687 4682 + 1 4680 4684 4688 4687 + 1 4684 4682 4699 4687 + 1 4684 4688 4687 4699 + 1 4683 663 4702 4697 + 1 4684 4702 665 4699 + 1 4682 4697 4699 662 + 1 4683 4684 4682 4697 + 1 4683 4684 4697 4702 + 1 4684 4682 4697 4699 + 1 4684 4702 4699 4697 + 1 1800 112 1799 1802 + 1 4713 1799 666 4714 + 1 4834 1802 4714 713 + 1 1800 4713 4834 1802 + 1 1800 4713 1802 1799 + 1 4713 4834 1802 4714 + 1 4713 1799 4714 1802 + 1 4707 666 1656 4712 + 1 1655 1656 101 1657 + 1 4708 4712 1657 667 + 1 4707 1655 4708 4712 + 1 4707 1655 4712 1656 + 1 1655 4708 4712 1657 + 1 1655 1656 1657 4712 + 1 4842 713 4716 1865 + 1 4715 4716 667 1863 + 1 1864 1865 1863 118 + 1 4842 4715 1864 1865 + 1 4842 4715 1865 4716 + 1 4715 1864 1865 1863 + 1 4715 4716 1863 1865 + 1 4709 665 4710 4711 + 1 4831 4710 698 4842 + 1 4834 4711 4842 713 + 1 4709 4831 4834 4711 + 1 4709 4831 4711 4710 + 1 4831 4834 4711 4842 + 1 4831 4710 4842 4711 + 1 4709 665 4711 4707 + 1 4713 4707 4714 666 + 1 4834 4711 713 4714 + 1 4709 4713 4711 4834 + 1 4709 4713 4707 4711 + 1 4713 4834 4714 4711 + 1 4713 4707 4711 4714 + 1 4710 698 4842 4715 + 1 4711 4842 713 4716 + 1 4708 4715 4716 667 + 1 4710 4711 4708 4715 + 1 4710 4711 4715 4842 + 1 4711 4708 4715 4716 + 1 4711 4842 4716 4715 + 1 4707 666 4712 4714 + 1 4711 4714 4716 713 + 1 4708 4712 667 4716 + 1 4707 4711 4712 4708 + 1 4707 4711 4714 4712 + 1 4711 4708 4716 4712 + 1 4711 4714 4712 4716 + 1 1646 100 1647 1645 + 1 4697 1645 4698 662 + 1 4701 1647 664 4698 + 1 1646 4697 1647 4701 + 1 1646 4697 1645 1647 + 1 4697 4701 4698 1647 + 1 4697 1645 1647 4698 + 1 4699 662 4700 1654 + 1 1655 1654 1657 101 + 1 4708 4700 667 1657 + 1 4699 1655 4700 4708 + 1 4699 1655 1654 4700 + 1 1655 4708 1657 4700 + 1 1655 1654 4700 1657 + 1 4706 664 1862 4705 + 1 4715 4705 1863 667 + 1 1864 1862 118 1863 + 1 4706 4715 1862 1864 + 1 4706 4715 4705 1862 + 1 4715 1864 1863 1862 + 1 4715 4705 1862 1863 + 1 4702 665 4704 4710 + 1 4703 4710 4706 698 + 1 4701 4704 664 4706 + 1 4702 4703 4704 4701 + 1 4702 4703 4710 4704 + 1 4703 4701 4706 4704 + 1 4703 4710 4704 4706 + 1 4702 665 4699 4704 + 1 4697 4699 662 4698 + 1 4701 4704 4698 664 + 1 4702 4697 4701 4704 + 1 4702 4697 4704 4699 + 1 4697 4701 4704 4698 + 1 4697 4699 4698 4704 + 1 4710 698 4715 4706 + 1 4704 4706 4705 664 + 1 4708 4715 667 4705 + 1 4710 4704 4715 4708 + 1 4710 4704 4706 4715 + 1 4704 4708 4705 4715 + 1 4704 4706 4715 4705 + 1 4699 662 4698 4700 + 1 4704 4698 664 4705 + 1 4708 4700 4705 667 + 1 4699 4704 4708 4700 + 1 4699 4704 4700 4698 + 1 4704 4708 4700 4705 + 1 4704 4698 4705 4700 + 1 892 23 895 893 + 1 3003 893 3012 289 + 1 3004 895 291 3012 + 1 892 3003 895 3004 + 1 892 3003 893 895 + 1 3003 3004 3012 895 + 1 3003 893 895 3012 + 1 3015 289 3016 1849 + 1 1855 1849 1857 117 + 1 4858 3016 722 1857 + 1 3015 1855 3016 4858 + 1 3015 1855 1849 3016 + 1 1855 4858 1857 3016 + 1 1855 1849 3016 1857 + 1 3025 291 1888 3026 + 1 4860 3026 1896 722 + 1 1894 1888 121 1896 + 1 3025 4860 1888 1894 + 1 3025 4860 3026 1888 + 1 4860 1894 1896 1888 + 1 4860 3026 1888 1896 + 1 3009 702 3024 4857 + 1 3010 4857 3025 703 + 1 3004 3024 291 3025 + 1 3009 3010 3024 3004 + 1 3009 3010 4857 3024 + 1 3010 3004 3025 3024 + 1 3010 4857 3024 3025 + 1 3009 702 3015 3024 + 1 3003 3015 289 3012 + 1 3004 3024 3012 291 + 1 3009 3003 3004 3024 + 1 3009 3003 3024 3015 + 1 3003 3004 3024 3012 + 1 3003 3015 3012 3024 + 1 4857 703 4860 3025 + 1 3024 3025 3026 291 + 1 4858 4860 722 3026 + 1 4857 3024 4860 4858 + 1 4857 3024 3025 4860 + 1 3024 4858 3026 4860 + 1 3024 3025 4860 3026 + 1 3015 289 3012 3016 + 1 3024 3012 291 3026 + 1 4858 3016 3026 722 + 1 3015 3024 4858 3016 + 1 3015 3024 3016 3012 + 1 3024 4858 3016 3026 + 1 3024 3012 3026 3016 + 1 1854 117 1856 1848 + 1 2908 1848 2909 274 + 1 4839 1856 721 2909 + 1 1854 2908 1856 4839 + 1 1854 2908 1848 1856 + 1 2908 4839 2909 1856 + 1 2908 1848 1856 2909 + 1 2895 274 2905 878 + 1 877 878 879 21 + 1 2896 2905 275 879 + 1 2895 877 2905 2896 + 1 2895 877 878 2905 + 1 877 2896 879 2905 + 1 877 878 2905 879 + 1 4843 721 1866 2913 + 1 2912 2913 1858 275 + 1 1864 1866 118 1858 + 1 4843 2912 1866 1864 + 1 4843 2912 2913 1866 + 1 2912 1864 1858 1866 + 1 2912 2913 1866 1858 + 1 2902 273 2904 2903 + 1 4836 2903 4843 698 + 1 4839 2904 721 4843 + 1 2902 4836 2904 4839 + 1 2902 4836 2903 2904 + 1 4836 4839 4843 2904 + 1 4836 2903 2904 4843 + 1 2902 273 2895 2904 + 1 2908 2895 274 2909 + 1 4839 2904 2909 721 + 1 2902 2908 4839 2904 + 1 2902 2908 2904 2895 + 1 2908 4839 2904 2909 + 1 2908 2895 2909 2904 + 1 2903 698 2912 4843 + 1 2904 4843 2913 721 + 1 2896 2912 275 2913 + 1 2903 2904 2912 2896 + 1 2903 2904 4843 2912 + 1 2904 2896 2913 2912 + 1 2904 4843 2912 2913 + 1 2895 274 2909 2905 + 1 2904 2909 721 2913 + 1 2896 2905 2913 275 + 1 2895 2904 2896 2905 + 1 2895 2904 2905 2909 + 1 2904 2896 2905 2913 + 1 2904 2909 2913 2905 + 1 1895 121 1889 1897 + 1 4898 1897 3156 723 + 1 3155 1889 313 3156 + 1 1895 4898 1889 3155 + 1 1895 4898 1897 1889 + 1 4898 3155 3156 1889 + 1 4898 1897 1889 3156 + 1 4897 723 3151 1867 + 1 1865 1867 1859 118 + 1 3150 3151 312 1859 + 1 4897 1865 3151 3150 + 1 4897 1865 1867 3151 + 1 1865 3150 1859 3151 + 1 1865 1867 3151 1859 + 1 3142 313 917 3147 + 1 3141 3147 916 312 + 1 915 917 26 916 + 1 3142 3141 917 915 + 1 3142 3141 3147 917 + 1 3141 915 916 917 + 1 3141 3147 917 916 + 1 4896 713 3154 3145 + 1 3146 3145 3142 311 + 1 3155 3154 313 3142 + 1 4896 3146 3154 3155 + 1 4896 3146 3145 3154 + 1 3146 3155 3142 3154 + 1 3146 3145 3154 3142 + 1 4896 713 4897 3154 + 1 4898 4897 723 3156 + 1 3155 3154 3156 313 + 1 4896 4898 3155 3154 + 1 4896 4898 3154 4897 + 1 4898 3155 3154 3156 + 1 4898 4897 3156 3154 + 1 3145 311 3141 3142 + 1 3154 3142 3147 313 + 1 3150 3141 312 3147 + 1 3145 3154 3141 3150 + 1 3145 3154 3142 3141 + 1 3154 3150 3147 3141 + 1 3154 3142 3141 3147 + 1 4897 723 3156 3151 + 1 3154 3156 313 3147 + 1 3150 3151 3147 312 + 1 4897 3154 3150 3151 + 1 4897 3154 3151 3156 + 1 3154 3150 3151 3147 + 1 3154 3156 3147 3151 + 1 1751 108 1755 1752 + 1 4825 1752 4832 696 + 1 4827 1755 699 4832 + 1 1751 4825 1755 4827 + 1 1751 4825 1752 1755 + 1 4825 4827 4832 1755 + 1 4825 1752 1755 4832 + 1 4833 696 4835 1800 + 1 1801 1800 1803 112 + 1 4854 4835 714 1803 + 1 4833 1801 4835 4854 + 1 4833 1801 1800 4835 + 1 1801 4854 1803 4835 + 1 1801 1800 4835 1803 + 1 4847 699 1893 4849 + 1 4859 4849 1895 714 + 1 1894 1893 121 1895 + 1 4847 4859 1893 1894 + 1 4847 4859 4849 1893 + 1 4859 1894 1895 1893 + 1 4859 4849 1893 1895 + 1 4828 700 4845 4853 + 1 4830 4853 4847 703 + 1 4827 4845 699 4847 + 1 4828 4830 4845 4827 + 1 4828 4830 4853 4845 + 1 4830 4827 4847 4845 + 1 4830 4853 4845 4847 + 1 4828 700 4833 4845 + 1 4825 4833 696 4832 + 1 4827 4845 4832 699 + 1 4828 4825 4827 4845 + 1 4828 4825 4845 4833 + 1 4825 4827 4845 4832 + 1 4825 4833 4832 4845 + 1 4853 703 4859 4847 + 1 4845 4847 4849 699 + 1 4854 4859 714 4849 + 1 4853 4845 4859 4854 + 1 4853 4845 4847 4859 + 1 4845 4854 4849 4859 + 1 4845 4847 4859 4849 + 1 4833 696 4832 4835 + 1 4845 4832 699 4849 + 1 4854 4835 4849 714 + 1 4833 4845 4854 4835 + 1 4833 4845 4835 4832 + 1 4845 4854 4835 4849 + 1 4845 4832 4849 4835 + 1 1751 108 1753 1755 + 1 4826 1753 697 4837 + 1 4827 1755 4837 699 + 1 1751 4826 4827 1755 + 1 1751 4826 1755 1753 + 1 4826 4827 1755 4837 + 1 4826 1753 4837 1755 + 1 4838 697 1854 4840 + 1 1855 1854 117 1857 + 1 4858 4840 1857 722 + 1 4838 1855 4858 4840 + 1 4838 1855 4840 1854 + 1 1855 4858 4840 1857 + 1 1855 1854 1857 4840 + 1 4847 699 4851 1893 + 1 4860 4851 722 1896 + 1 1894 1893 1896 121 + 1 4847 4860 1894 1893 + 1 4847 4860 1893 4851 + 1 4860 1894 1893 1896 + 1 4860 4851 1896 1893 + 1 4829 702 4857 4846 + 1 4830 4857 703 4847 + 1 4827 4846 4847 699 + 1 4829 4830 4827 4846 + 1 4829 4830 4846 4857 + 1 4830 4827 4846 4847 + 1 4830 4857 4847 4846 + 1 4829 702 4846 4838 + 1 4826 4838 4837 697 + 1 4827 4846 699 4837 + 1 4829 4826 4846 4827 + 1 4829 4826 4838 4846 + 1 4826 4827 4837 4846 + 1 4826 4838 4846 4837 + 1 4857 703 4847 4860 + 1 4846 4847 699 4851 + 1 4858 4860 4851 722 + 1 4857 4846 4858 4860 + 1 4857 4846 4860 4847 + 1 4846 4858 4860 4851 + 1 4846 4847 4851 4860 + 1 4838 697 4840 4837 + 1 4846 4837 4851 699 + 1 4858 4840 722 4851 + 1 4838 4846 4840 4858 + 1 4838 4846 4837 4840 + 1 4846 4858 4851 4840 + 1 4846 4837 4840 4851 + 1 1800 112 1802 1803 + 1 4835 1803 4896 714 + 1 4834 1802 713 4896 + 1 1800 4835 1802 4834 + 1 1800 4835 1803 1802 + 1 4835 4834 4896 1802 + 1 4835 1803 1802 4896 + 1 4849 714 4898 1895 + 1 1893 1895 1897 121 + 1 4852 4898 723 1897 + 1 4849 1893 4898 4852 + 1 4849 1893 1895 4898 + 1 1893 4852 1897 4898 + 1 1893 1895 4898 1897 + 1 4842 713 1865 4897 + 1 4844 4897 1867 723 + 1 1864 1865 118 1867 + 1 4842 4844 1865 1864 + 1 4842 4844 4897 1865 + 1 4844 1864 1867 1865 + 1 4844 4897 1865 1867 + 1 4832 699 4848 4841 + 1 4831 4841 4842 698 + 1 4834 4848 713 4842 + 1 4832 4831 4848 4834 + 1 4832 4831 4841 4848 + 1 4831 4834 4842 4848 + 1 4831 4841 4848 4842 + 1 4832 699 4849 4848 + 1 4835 4849 714 4896 + 1 4834 4848 4896 713 + 1 4832 4835 4834 4848 + 1 4832 4835 4848 4849 + 1 4835 4834 4848 4896 + 1 4835 4849 4896 4848 + 1 4841 698 4844 4842 + 1 4848 4842 4897 713 + 1 4852 4844 723 4897 + 1 4841 4848 4844 4852 + 1 4841 4848 4842 4844 + 1 4848 4852 4897 4844 + 1 4848 4842 4844 4897 + 1 4849 714 4896 4898 + 1 4848 4896 713 4897 + 1 4852 4898 4897 723 + 1 4849 4848 4852 4898 + 1 4849 4848 4898 4896 + 1 4848 4852 4898 4897 + 1 4848 4896 4897 4898 + 1 1854 117 1857 1856 + 1 4840 1857 722 4905 + 1 4839 1856 4905 721 + 1 1854 4840 4839 1856 + 1 1854 4840 1856 1857 + 1 4840 4839 1856 4905 + 1 4840 1857 4905 1856 + 1 4851 722 1896 4907 + 1 1893 1896 121 1897 + 1 4852 4907 1897 723 + 1 4851 1893 4852 4907 + 1 4851 1893 4907 1896 + 1 1893 4852 4907 1897 + 1 1893 1896 1897 4907 + 1 4843 721 4906 1866 + 1 4844 4906 723 1867 + 1 1864 1866 1867 118 + 1 4843 4844 1864 1866 + 1 4843 4844 1866 4906 + 1 4844 1864 1866 1867 + 1 4844 4906 1867 1866 + 1 4837 699 4841 4850 + 1 4836 4841 698 4843 + 1 4839 4850 4843 721 + 1 4837 4836 4839 4850 + 1 4837 4836 4850 4841 + 1 4836 4839 4850 4843 + 1 4836 4841 4843 4850 + 1 4837 699 4850 4851 + 1 4840 4851 4905 722 + 1 4839 4850 721 4905 + 1 4837 4840 4850 4839 + 1 4837 4840 4851 4850 + 1 4840 4839 4905 4850 + 1 4840 4851 4850 4905 + 1 4841 698 4843 4844 + 1 4850 4843 721 4906 + 1 4852 4844 4906 723 + 1 4841 4850 4852 4844 + 1 4841 4850 4844 4843 + 1 4850 4852 4844 4906 + 1 4850 4843 4906 4844 + 1 4851 722 4907 4905 + 1 4850 4905 4906 721 + 1 4852 4907 723 4906 + 1 4851 4850 4907 4852 + 1 4851 4850 4905 4907 + 1 4850 4852 4906 4907 + 1 4850 4905 4907 4906 + 1 734 2 736 739 + 1 1956 736 132 1968 + 1 1957 739 1968 135 + 1 734 1956 1957 739 + 1 734 1956 739 736 + 1 1956 1957 739 1968 + 1 1956 736 1968 739 + 1 1970 132 973 1972 + 1 975 973 34 977 + 1 3289 1972 977 352 + 1 1970 975 3289 1972 + 1 1970 975 1972 973 + 1 975 3289 1972 977 + 1 975 973 977 1972 + 1 1985 135 1987 998 + 1 3296 1987 352 1002 + 1 1000 998 1002 37 + 1 1985 3296 1000 998 + 1 1985 3296 998 1987 + 1 3296 1000 998 1002 + 1 3296 1987 1002 998 + 1 1959 340 3287 1984 + 1 1960 3287 341 1985 + 1 1957 1984 1985 135 + 1 1959 1960 1957 1984 + 1 1959 1960 1984 3287 + 1 1960 1957 1984 1985 + 1 1960 3287 1985 1984 + 1 1959 340 1984 1970 + 1 1956 1970 1968 132 + 1 1957 1984 135 1968 + 1 1959 1956 1984 1957 + 1 1959 1956 1970 1984 + 1 1956 1957 1968 1984 + 1 1956 1970 1984 1968 + 1 3287 341 1985 3296 + 1 1984 1985 135 1987 + 1 3289 3296 1987 352 + 1 3287 1984 3289 3296 + 1 3287 1984 3296 1985 + 1 1984 3289 3296 1987 + 1 1984 1985 1987 3296 + 1 1970 132 1972 1968 + 1 1984 1968 1987 135 + 1 3289 1972 352 1987 + 1 1970 1984 1972 3289 + 1 1970 1984 1968 1972 + 1 1984 3289 1987 1972 + 1 1984 1968 1972 1987 + 1 979 34 974 981 + 1 2382 974 203 2384 + 1 3363 981 2384 356 + 1 979 2382 3363 981 + 1 979 2382 981 974 + 1 2382 3363 981 2384 + 1 2382 974 2384 981 + 1 2378 203 807 2380 + 1 809 807 14 812 + 1 2395 2380 812 208 + 1 2378 809 2395 2380 + 1 2378 809 2380 807 + 1 809 2395 2380 812 + 1 809 807 812 2380 + 1 3374 356 2417 1492 + 1 2418 2417 208 1490 + 1 1494 1492 1490 88 + 1 3374 2418 1494 1492 + 1 3374 2418 1492 2417 + 1 2418 1494 1492 1490 + 1 2418 2417 1490 1492 + 1 2396 205 2399 2397 + 1 3365 2399 533 3374 + 1 3363 2397 3374 356 + 1 2396 3365 3363 2397 + 1 2396 3365 2397 2399 + 1 3365 3363 2397 3374 + 1 3365 2399 3374 2397 + 1 2396 205 2397 2378 + 1 2382 2378 2384 203 + 1 3363 2397 356 2384 + 1 2396 2382 2397 3363 + 1 2396 2382 2378 2397 + 1 2382 3363 2384 2397 + 1 2382 2378 2397 2384 + 1 2399 533 3374 2418 + 1 2397 3374 356 2417 + 1 2395 2418 2417 208 + 1 2399 2397 2395 2418 + 1 2399 2397 2418 3374 + 1 2397 2395 2418 2417 + 1 2397 3374 2417 2418 + 1 2378 203 2380 2384 + 1 2397 2384 2417 356 + 1 2395 2380 208 2417 + 1 2378 2397 2380 2395 + 1 2378 2397 2384 2380 + 1 2397 2395 2417 2380 + 1 2397 2384 2380 2417 + 1 1006 37 1008 999 + 1 3434 1008 371 2555 + 1 2553 999 2555 228 + 1 1006 3434 2553 999 + 1 1006 3434 999 1008 + 1 3434 2553 999 2555 + 1 3434 1008 2555 999 + 1 3444 371 1493 2615 + 1 1495 1493 88 1491 + 1 2616 2615 1491 234 + 1 3444 1495 2616 2615 + 1 3444 1495 2615 1493 + 1 1495 2616 2615 1491 + 1 1495 1493 1491 2615 + 1 2548 228 2550 832 + 1 2575 2550 234 838 + 1 834 832 838 17 + 1 2548 2575 834 832 + 1 2548 2575 832 2550 + 1 2575 834 832 838 + 1 2575 2550 838 832 + 1 3437 538 2581 2558 + 1 2576 2581 230 2548 + 1 2553 2558 2548 228 + 1 3437 2576 2553 2558 + 1 3437 2576 2558 2581 + 1 2576 2553 2558 2548 + 1 2576 2581 2548 2558 + 1 3437 538 2558 3444 + 1 3434 3444 2555 371 + 1 2553 2558 228 2555 + 1 3437 3434 2558 2553 + 1 3437 3434 3444 2558 + 1 3434 2553 2555 2558 + 1 3434 3444 2558 2555 + 1 2581 230 2548 2575 + 1 2558 2548 228 2550 + 1 2616 2575 2550 234 + 1 2581 2558 2616 2575 + 1 2581 2558 2575 2548 + 1 2558 2616 2575 2550 + 1 2558 2548 2550 2575 + 1 3444 371 2615 2555 + 1 2558 2555 2550 228 + 1 2616 2615 234 2550 + 1 3444 2558 2615 2616 + 1 3444 2558 2555 2615 + 1 2558 2616 2550 2615 + 1 2558 2555 2615 2550 + 1 1288 70 1292 1290 + 1 3306 1292 530 3430 + 1 3305 1290 3430 368 + 1 1288 3306 3305 1290 + 1 1288 3306 1290 1292 + 1 3306 3305 1290 3430 + 1 3306 1292 3430 1290 + 1 3311 530 1304 3435 + 1 1298 1304 71 1300 + 1 3309 3435 1300 369 + 1 3311 1298 3309 3435 + 1 3311 1298 3435 1304 + 1 1298 3309 3435 1300 + 1 1298 1304 1300 3435 + 1 3297 368 3428 1005 + 1 3298 3428 369 1006 + 1 1000 1005 1006 37 + 1 3297 3298 1000 1005 + 1 3297 3298 1005 3428 + 1 3298 1000 1005 1006 + 1 3298 3428 1006 1005 + 1 3303 344 3293 3308 + 1 3292 3293 341 3297 + 1 3305 3308 3297 368 + 1 3303 3292 3305 3308 + 1 3303 3292 3308 3293 + 1 3292 3305 3308 3297 + 1 3292 3293 3297 3308 + 1 3303 344 3308 3311 + 1 3306 3311 3430 530 + 1 3305 3308 368 3430 + 1 3303 3306 3308 3305 + 1 3303 3306 3311 3308 + 1 3306 3305 3430 3308 + 1 3306 3311 3308 3430 + 1 3293 341 3297 3298 + 1 3308 3297 368 3428 + 1 3309 3298 3428 369 + 1 3293 3308 3309 3298 + 1 3293 3308 3298 3297 + 1 3308 3309 3298 3428 + 1 3308 3297 3428 3298 + 1 3311 530 3435 3430 + 1 3308 3430 3428 368 + 1 3309 3435 369 3428 + 1 3311 3308 3435 3309 + 1 3311 3308 3430 3435 + 1 3308 3309 3428 3435 + 1 3308 3430 3435 3428 + 1 1288 70 1290 1289 + 1 3304 1289 3364 354 + 1 3305 1290 368 3364 + 1 1288 3304 1290 3305 + 1 1288 3304 1289 1290 + 1 3304 3305 3364 1290 + 1 3304 1289 1290 3364 + 1 3290 354 3349 979 + 1 975 979 977 34 + 1 3289 3349 352 977 + 1 3290 975 3349 3289 + 1 3290 975 979 3349 + 1 975 3289 977 3349 + 1 975 979 3349 977 + 1 3297 368 1005 3353 + 1 3296 3353 1002 352 + 1 1000 1005 37 1002 + 1 3297 3296 1005 1000 + 1 3297 3296 3353 1005 + 1 3296 1000 1002 1005 + 1 3296 3353 1005 1002 + 1 3288 340 3291 3287 + 1 3292 3287 3297 341 + 1 3305 3291 368 3297 + 1 3288 3292 3291 3305 + 1 3288 3292 3287 3291 + 1 3292 3305 3297 3291 + 1 3292 3287 3291 3297 + 1 3288 340 3290 3291 + 1 3304 3290 354 3364 + 1 3305 3291 3364 368 + 1 3288 3304 3305 3291 + 1 3288 3304 3291 3290 + 1 3304 3305 3291 3364 + 1 3304 3290 3364 3291 + 1 3287 341 3296 3297 + 1 3291 3297 3353 368 + 1 3289 3296 352 3353 + 1 3287 3291 3296 3289 + 1 3287 3291 3297 3296 + 1 3291 3289 3353 3296 + 1 3291 3297 3296 3353 + 1 3290 354 3364 3349 + 1 3291 3364 368 3353 + 1 3289 3349 3353 352 + 1 3290 3291 3289 3349 + 1 3290 3291 3349 3364 + 1 3291 3289 3349 3353 + 1 3291 3364 3353 3349 + 1 1304 71 1300 1309 + 1 3435 1300 369 3437 + 1 4153 1309 3437 538 + 1 1304 3435 4153 1309 + 1 1304 3435 1309 1300 + 1 3435 4153 1309 3437 + 1 3435 1300 3437 1309 + 1 3428 369 1006 3434 + 1 1005 1006 37 1008 + 1 3429 3434 1008 371 + 1 3428 1005 3429 3434 + 1 3428 1005 3434 1006 + 1 1005 3429 3434 1008 + 1 1005 1006 1008 3434 + 1 4164 538 3444 1495 + 1 3443 3444 371 1493 + 1 1494 1495 1493 88 + 1 4164 3443 1494 1495 + 1 4164 3443 1495 3444 + 1 3443 1494 1495 1493 + 1 3443 3444 1493 1495 + 1 3430 368 3431 3432 + 1 4151 3431 533 4164 + 1 4153 3432 4164 538 + 1 3430 4151 4153 3432 + 1 3430 4151 3432 3431 + 1 4151 4153 3432 4164 + 1 4151 3431 4164 3432 + 1 3430 368 3432 3428 + 1 3435 3428 3437 369 + 1 4153 3432 538 3437 + 1 3430 3435 3432 4153 + 1 3430 3435 3428 3432 + 1 3435 4153 3437 3432 + 1 3435 3428 3432 3437 + 1 3431 533 4164 3443 + 1 3432 4164 538 3444 + 1 3429 3443 3444 371 + 1 3431 3432 3429 3443 + 1 3431 3432 3443 4164 + 1 3432 3429 3443 3444 + 1 3432 4164 3444 3443 + 1 3428 369 3434 3437 + 1 3432 3437 3444 538 + 1 3429 3434 371 3444 + 1 3428 3432 3434 3429 + 1 3428 3432 3437 3434 + 1 3432 3429 3444 3434 + 1 3432 3437 3434 3444 + 1 979 34 981 977 + 1 3349 977 3350 352 + 1 3363 981 356 3350 + 1 979 3349 981 3363 + 1 979 3349 977 981 + 1 3349 3363 3350 981 + 1 3349 977 981 3350 + 1 3353 352 3354 1002 + 1 1005 1002 1008 37 + 1 3429 3354 371 1008 + 1 3353 1005 3354 3429 + 1 3353 1005 1002 3354 + 1 1005 3429 1008 3354 + 1 1005 1002 3354 1008 + 1 3374 356 1492 3372 + 1 3443 3372 1493 371 + 1 1494 1492 88 1493 + 1 3374 3443 1492 1494 + 1 3374 3443 3372 1492 + 1 3443 1494 1493 1492 + 1 3443 3372 1492 1493 + 1 3364 368 3371 3431 + 1 3365 3431 3374 533 + 1 3363 3371 356 3374 + 1 3364 3365 3371 3363 + 1 3364 3365 3431 3371 + 1 3365 3363 3374 3371 + 1 3365 3431 3371 3374 + 1 3364 368 3353 3371 + 1 3349 3353 352 3350 + 1 3363 3371 3350 356 + 1 3364 3349 3363 3371 + 1 3364 3349 3371 3353 + 1 3349 3363 3371 3350 + 1 3349 3353 3350 3371 + 1 3431 533 3443 3374 + 1 3371 3374 3372 356 + 1 3429 3443 371 3372 + 1 3431 3371 3443 3429 + 1 3431 3371 3374 3443 + 1 3371 3429 3372 3443 + 1 3371 3374 3443 3372 + 1 3353 352 3350 3354 + 1 3371 3350 356 3372 + 1 3429 3354 3372 371 + 1 3353 3371 3429 3354 + 1 3353 3371 3354 3350 + 1 3371 3429 3354 3372 + 1 3371 3350 3372 3354 + 1 810 14 808 815 + 1 2386 808 204 2388 + 1 2402 815 2388 211 + 1 810 2386 2402 815 + 1 810 2386 815 808 + 1 2386 2402 815 2388 + 1 2386 808 2388 815 + 1 2390 204 1062 2392 + 1 1067 1062 44 1069 + 1 3602 2392 1069 408 + 1 2390 1067 3602 2392 + 1 2390 1067 2392 1062 + 1 1067 3602 2392 1069 + 1 1067 1062 1069 2392 + 1 2442 211 2439 1528 + 1 3611 2439 408 1531 + 1 1534 1528 1531 91 + 1 2442 3611 1534 1528 + 1 2442 3611 1528 2439 + 1 3611 1534 1528 1531 + 1 3611 2439 1531 1528 + 1 2403 406 3603 2438 + 1 2406 3603 556 2442 + 1 2402 2438 2442 211 + 1 2403 2406 2402 2438 + 1 2403 2406 2438 3603 + 1 2406 2402 2438 2442 + 1 2406 3603 2442 2438 + 1 2403 406 2438 2390 + 1 2386 2390 2388 204 + 1 2402 2438 211 2388 + 1 2403 2386 2438 2402 + 1 2403 2386 2390 2438 + 1 2386 2402 2388 2438 + 1 2386 2390 2438 2388 + 1 3603 556 2442 3611 + 1 2438 2442 211 2439 + 1 3602 3611 2439 408 + 1 3603 2438 3602 3611 + 1 3603 2438 3611 2442 + 1 2438 3602 3611 2439 + 1 2438 2442 2439 3611 + 1 2390 204 2392 2388 + 1 2438 2388 2439 211 + 1 3602 2392 408 2439 + 1 2390 2438 2392 3602 + 1 2390 2438 2388 2392 + 1 2438 3602 2439 2392 + 1 2438 2388 2392 2439 + 1 1063 44 1061 1065 + 1 2022 1061 142 2024 + 1 3559 1065 2024 404 + 1 1063 2022 3559 1065 + 1 1063 2022 1065 1061 + 1 2022 3559 1065 2024 + 1 2022 1061 2024 1065 + 1 2014 142 746 2020 + 1 745 746 4 748 + 1 2015 2020 748 144 + 1 2014 745 2015 2020 + 1 2014 745 2020 746 + 1 745 2015 2020 748 + 1 745 746 748 2020 + 1 3564 404 2032 1081 + 1 2031 2032 144 1078 + 1 1080 1081 1078 46 + 1 3564 2031 1080 1081 + 1 3564 2031 1081 2032 + 1 2031 1080 1081 1078 + 1 2031 2032 1078 1081 + 1 2016 141 2017 2018 + 1 3556 2017 399 3564 + 1 3559 2018 3564 404 + 1 2016 3556 3559 2018 + 1 2016 3556 2018 2017 + 1 3556 3559 2018 3564 + 1 3556 2017 3564 2018 + 1 2016 141 2018 2014 + 1 2022 2014 2024 142 + 1 3559 2018 404 2024 + 1 2016 2022 2018 3559 + 1 2016 2022 2014 2018 + 1 2022 3559 2024 2018 + 1 2022 2014 2018 2024 + 1 2017 399 3564 2031 + 1 2018 3564 404 2032 + 1 2015 2031 2032 144 + 1 2017 2018 2015 2031 + 1 2017 2018 2031 3564 + 1 2018 2015 2031 2032 + 1 2018 3564 2032 2031 + 1 2014 142 2020 2024 + 1 2018 2024 2032 404 + 1 2015 2020 144 2032 + 1 2014 2018 2020 2015 + 1 2014 2018 2024 2020 + 1 2018 2015 2032 2020 + 1 2018 2024 2020 2032 + 1 1536 91 1532 1529 + 1 3643 1532 416 2942 + 1 2944 1529 2942 280 + 1 1536 3643 2944 1529 + 1 1536 3643 1529 1532 + 1 3643 2944 1529 2942 + 1 3643 1532 2942 1529 + 1 3639 416 1084 2918 + 1 1083 1084 46 1079 + 1 2917 2918 1079 276 + 1 3639 1083 2917 2918 + 1 3639 1083 2918 1084 + 1 1083 2917 2918 1079 + 1 1083 1084 1079 2918 + 1 2927 280 2915 884 + 1 2914 2915 276 880 + 1 882 884 880 22 + 1 2927 2914 882 884 + 1 2927 2914 884 2915 + 1 2914 882 884 880 + 1 2914 2915 880 884 + 1 3640 415 2929 2941 + 1 2931 2929 278 2927 + 1 2944 2941 2927 280 + 1 3640 2931 2944 2941 + 1 3640 2931 2941 2929 + 1 2931 2944 2941 2927 + 1 2931 2929 2927 2941 + 1 3640 415 2941 3639 + 1 3643 3639 2942 416 + 1 2944 2941 280 2942 + 1 3640 3643 2941 2944 + 1 3640 3643 3639 2941 + 1 3643 2944 2942 2941 + 1 3643 3639 2941 2942 + 1 2929 278 2927 2914 + 1 2941 2927 280 2915 + 1 2917 2914 2915 276 + 1 2929 2941 2917 2914 + 1 2929 2941 2914 2927 + 1 2941 2917 2914 2915 + 1 2941 2927 2915 2914 + 1 3639 416 2918 2942 + 1 2941 2942 2915 280 + 1 2917 2918 276 2915 + 1 3639 2941 2918 2917 + 1 3639 2941 2942 2918 + 1 2941 2917 2915 2918 + 1 2941 2942 2918 2915 + 1 1058 43 1059 1060 + 1 3567 1059 401 3572 + 1 3568 1060 3572 402 + 1 1058 3567 3568 1060 + 1 1058 3567 1060 1059 + 1 3567 3568 1060 3572 + 1 3567 1059 3572 1060 + 1 3574 401 1376 3575 + 1 1379 1376 78 1382 + 1 4246 3575 1382 564 + 1 3574 1379 4246 3575 + 1 3574 1379 3575 1376 + 1 1379 4246 3575 1382 + 1 1379 1376 1382 3575 + 1 3582 402 3583 1530 + 1 4252 3583 564 1536 + 1 1534 1530 1536 91 + 1 3582 4252 1534 1530 + 1 3582 4252 1530 3583 + 1 4252 1534 1530 1536 + 1 4252 3583 1536 1530 + 1 3570 554 4243 3581 + 1 3571 4243 556 3582 + 1 3568 3581 3582 402 + 1 3570 3571 3568 3581 + 1 3570 3571 3581 4243 + 1 3571 3568 3581 3582 + 1 3571 4243 3582 3581 + 1 3570 554 3581 3574 + 1 3567 3574 3572 401 + 1 3568 3581 402 3572 + 1 3570 3567 3581 3568 + 1 3570 3567 3574 3581 + 1 3567 3568 3572 3581 + 1 3567 3574 3581 3572 + 1 4243 556 3582 4252 + 1 3581 3582 402 3583 + 1 4246 4252 3583 564 + 1 4243 3581 4246 4252 + 1 4243 3581 4252 3582 + 1 3581 4246 4252 3583 + 1 3581 3582 3583 4252 + 1 3574 401 3575 3572 + 1 3581 3572 3583 402 + 1 4246 3575 564 3583 + 1 3574 3581 3575 4246 + 1 3574 3581 3572 3575 + 1 3581 4246 3583 3575 + 1 3581 3572 3575 3583 + 1 1058 43 1060 1056 + 1 3557 1056 3558 398 + 1 3568 1060 402 3558 + 1 1058 3557 1060 3568 + 1 1058 3557 1056 1060 + 1 3557 3568 3558 1060 + 1 3557 1056 1060 3558 + 1 3560 398 3561 1063 + 1 1067 1063 1069 44 + 1 3602 3561 408 1069 + 1 3560 1067 3561 3602 + 1 3560 1067 1063 3561 + 1 1067 3602 1069 3561 + 1 1067 1063 3561 1069 + 1 3582 402 1530 3578 + 1 3611 3578 1531 408 + 1 1534 1530 91 1531 + 1 3582 3611 1530 1534 + 1 3582 3611 3578 1530 + 1 3611 1534 1531 1530 + 1 3611 3578 1530 1531 + 1 3569 406 3577 3603 + 1 3571 3603 3582 556 + 1 3568 3577 402 3582 + 1 3569 3571 3577 3568 + 1 3569 3571 3603 3577 + 1 3571 3568 3582 3577 + 1 3571 3603 3577 3582 + 1 3569 406 3560 3577 + 1 3557 3560 398 3558 + 1 3568 3577 3558 402 + 1 3569 3557 3568 3577 + 1 3569 3557 3577 3560 + 1 3557 3568 3577 3558 + 1 3557 3560 3558 3577 + 1 3603 556 3611 3582 + 1 3577 3582 3578 402 + 1 3602 3611 408 3578 + 1 3603 3577 3611 3602 + 1 3603 3577 3582 3611 + 1 3577 3602 3578 3611 + 1 3577 3582 3611 3578 + 1 3560 398 3558 3561 + 1 3577 3558 402 3578 + 1 3602 3561 3578 408 + 1 3560 3577 3602 3561 + 1 3560 3577 3561 3558 + 1 3577 3602 3561 3578 + 1 3577 3558 3578 3561 + 1 1376 78 1382 1377 + 1 3575 1382 564 3640 + 1 3573 1377 3640 415 + 1 1376 3575 3573 1377 + 1 1376 3575 1377 1382 + 1 3575 3573 1377 3640 + 1 3575 1382 3640 1377 + 1 3583 564 1536 3643 + 1 1530 1536 91 1532 + 1 3580 3643 1532 416 + 1 3583 1530 3580 3643 + 1 3583 1530 3643 1536 + 1 1530 3580 3643 1532 + 1 1530 1536 1532 3643 + 1 3565 415 3639 1083 + 1 3566 3639 416 1084 + 1 1080 1083 1084 46 + 1 3565 3566 1080 1083 + 1 3565 3566 1083 3639 + 1 3566 1080 1083 1084 + 1 3566 3639 1084 1083 + 1 3572 402 3563 3579 + 1 3562 3563 399 3565 + 1 3573 3579 3565 415 + 1 3572 3562 3573 3579 + 1 3572 3562 3579 3563 + 1 3562 3573 3579 3565 + 1 3562 3563 3565 3579 + 1 3572 402 3579 3583 + 1 3575 3583 3640 564 + 1 3573 3579 415 3640 + 1 3572 3575 3579 3573 + 1 3572 3575 3583 3579 + 1 3575 3573 3640 3579 + 1 3575 3583 3579 3640 + 1 3563 399 3565 3566 + 1 3579 3565 415 3639 + 1 3580 3566 3639 416 + 1 3563 3579 3580 3566 + 1 3563 3579 3566 3565 + 1 3579 3580 3566 3639 + 1 3579 3565 3639 3566 + 1 3583 564 3643 3640 + 1 3579 3640 3639 415 + 1 3580 3643 416 3639 + 1 3583 3579 3643 3580 + 1 3583 3579 3640 3643 + 1 3579 3580 3639 3643 + 1 3579 3640 3643 3639 + 1 1063 44 1065 1069 + 1 3561 1069 3591 408 + 1 3559 1065 404 3591 + 1 1063 3561 1065 3559 + 1 1063 3561 1069 1065 + 1 3561 3559 3591 1065 + 1 3561 1069 1065 3591 + 1 3578 408 3609 1531 + 1 1530 1531 1532 91 + 1 3580 3609 416 1532 + 1 3578 1530 3609 3580 + 1 3578 1530 1531 3609 + 1 1530 3580 1532 3609 + 1 1530 1531 3609 1532 + 1 3564 404 1081 3593 + 1 3566 3593 1084 416 + 1 1080 1081 46 1084 + 1 3564 3566 1081 1080 + 1 3564 3566 3593 1081 + 1 3566 1080 1084 1081 + 1 3566 3593 1081 1084 + 1 3558 402 3576 3563 + 1 3556 3563 3564 399 + 1 3559 3576 404 3564 + 1 3558 3556 3576 3559 + 1 3558 3556 3563 3576 + 1 3556 3559 3564 3576 + 1 3556 3563 3576 3564 + 1 3558 402 3578 3576 + 1 3561 3578 408 3591 + 1 3559 3576 3591 404 + 1 3558 3561 3559 3576 + 1 3558 3561 3576 3578 + 1 3561 3559 3576 3591 + 1 3561 3578 3591 3576 + 1 3563 399 3566 3564 + 1 3576 3564 3593 404 + 1 3580 3566 416 3593 + 1 3563 3576 3566 3580 + 1 3563 3576 3564 3566 + 1 3576 3580 3593 3566 + 1 3576 3564 3566 3593 + 1 3578 408 3591 3609 + 1 3576 3591 404 3593 + 1 3580 3609 3593 416 + 1 3578 3576 3580 3609 + 1 3578 3576 3609 3591 + 1 3576 3580 3609 3593 + 1 3576 3591 3593 3609 + 1 836 17 842 833 + 1 2596 842 238 2562 + 1 2560 833 2562 229 + 1 836 2596 2560 833 + 1 836 2596 833 842 + 1 2596 2560 833 2562 + 1 2596 842 2562 833 + 1 2652 238 1686 2650 + 1 1692 1686 104 1688 + 1 3860 2650 1688 463 + 1 2652 1692 3860 2650 + 1 2652 1692 2650 1686 + 1 1692 3860 2650 1688 + 1 1692 1686 1688 2650 + 1 2565 229 2567 1154 + 1 3842 2567 463 1163 + 1 1160 1154 1163 56 + 1 2565 3842 1160 1154 + 1 2565 3842 1154 2567 + 1 3842 1160 1154 1163 + 1 3842 2567 1163 1154 + 1 2602 575 3845 2570 + 1 2597 3845 460 2565 + 1 2560 2570 2565 229 + 1 2602 2597 2560 2570 + 1 2602 2597 2570 3845 + 1 2597 2560 2570 2565 + 1 2597 3845 2565 2570 + 1 2602 575 2570 2652 + 1 2596 2652 2562 238 + 1 2560 2570 229 2562 + 1 2602 2596 2570 2560 + 1 2602 2596 2652 2570 + 1 2596 2560 2562 2570 + 1 2596 2652 2570 2562 + 1 3845 460 2565 3842 + 1 2570 2565 229 2567 + 1 3860 3842 2567 463 + 1 3845 2570 3860 3842 + 1 3845 2570 3842 2565 + 1 2570 3860 3842 2567 + 1 2570 2565 2567 3842 + 1 2652 238 2650 2562 + 1 2570 2562 2567 229 + 1 3860 2650 463 2567 + 1 2652 2570 2650 3860 + 1 2652 2570 2562 2650 + 1 2570 3860 2567 2650 + 1 2570 2562 2650 2567 + 1 1693 104 1687 1689 + 1 2953 1687 281 2951 + 1 3909 1689 2951 474 + 1 1693 2953 3909 1689 + 1 1693 2953 1689 1687 + 1 2953 3909 1689 2951 + 1 2953 1687 2951 1689 + 1 2933 281 885 2921 + 1 883 885 22 881 + 1 2920 2921 881 277 + 1 2933 883 2920 2921 + 1 2933 883 2921 885 + 1 883 2920 2921 881 + 1 883 885 881 2921 + 1 3906 474 2924 1182 + 1 2923 2924 277 1177 + 1 1181 1182 1177 58 + 1 3906 2923 1181 1182 + 1 3906 2923 1182 2924 + 1 2923 1181 1182 1177 + 1 2923 2924 1177 1182 + 1 2938 279 2934 2935 + 1 3907 2934 473 3906 + 1 3909 2935 3906 474 + 1 2938 3907 3909 2935 + 1 2938 3907 2935 2934 + 1 3907 3909 2935 3906 + 1 3907 2934 3906 2935 + 1 2938 279 2935 2933 + 1 2953 2933 2951 281 + 1 3909 2935 474 2951 + 1 2938 2953 2935 3909 + 1 2938 2953 2933 2935 + 1 2953 3909 2951 2935 + 1 2953 2933 2935 2951 + 1 2934 473 3906 2923 + 1 2935 3906 474 2924 + 1 2920 2923 2924 277 + 1 2934 2935 2920 2923 + 1 2934 2935 2923 3906 + 1 2935 2920 2923 2924 + 1 2935 3906 2924 2923 + 1 2933 281 2921 2951 + 1 2935 2951 2924 474 + 1 2920 2921 277 2924 + 1 2933 2935 2921 2920 + 1 2933 2935 2951 2921 + 1 2935 2920 2924 2921 + 1 2935 2951 2921 2924 + 1 1155 56 1157 1153 + 1 3775 1157 457 2079 + 1 2076 1153 2079 154 + 1 1155 3775 2076 1153 + 1 1155 3775 1153 1157 + 1 3775 2076 1153 2079 + 1 3775 1157 2079 1153 + 1 3785 457 1179 2090 + 1 1178 1179 58 1176 + 1 2089 2090 1176 156 + 1 3785 1178 2089 2090 + 1 3785 1178 2090 1179 + 1 1178 2089 2090 1176 + 1 1178 1179 1176 2090 + 1 2065 154 2073 758 + 1 2067 2073 156 760 + 1 757 758 760 7 + 1 2065 2067 757 758 + 1 2065 2067 758 2073 + 1 2067 757 758 760 + 1 2067 2073 760 758 + 1 3770 451 2070 2077 + 1 2068 2070 153 2065 + 1 2076 2077 2065 154 + 1 3770 2068 2076 2077 + 1 3770 2068 2077 2070 + 1 2068 2076 2077 2065 + 1 2068 2070 2065 2077 + 1 3770 451 2077 3785 + 1 3775 3785 2079 457 + 1 2076 2077 154 2079 + 1 3770 3775 2077 2076 + 1 3770 3775 3785 2077 + 1 3775 2076 2079 2077 + 1 3775 3785 2077 2079 + 1 2070 153 2065 2067 + 1 2077 2065 154 2073 + 1 2089 2067 2073 156 + 1 2070 2077 2089 2067 + 1 2070 2077 2067 2065 + 1 2077 2089 2067 2073 + 1 2077 2065 2073 2067 + 1 3785 457 2090 2079 + 1 2077 2079 2073 154 + 1 2089 2090 156 2073 + 1 3785 2077 2090 2089 + 1 3785 2077 2079 2090 + 1 2077 2089 2073 2090 + 1 2077 2079 2090 2073 + 1 1430 82 1424 1425 + 1 3802 1424 454 3800 + 1 3849 1425 3800 461 + 1 1430 3802 3849 1425 + 1 1430 3802 1425 1424 + 1 3802 3849 1425 3800 + 1 3802 1424 3800 1425 + 1 3789 454 1151 3772 + 1 1149 1151 55 1146 + 1 3771 3772 1146 449 + 1 3789 1149 3771 3772 + 1 3789 1149 3772 1151 + 1 1149 3771 3772 1146 + 1 1149 1151 1146 3772 + 1 3840 461 3777 1161 + 1 3776 3777 449 1155 + 1 1160 1161 1155 56 + 1 3840 3776 1160 1161 + 1 3840 3776 1161 3777 + 1 3776 1160 1161 1155 + 1 3776 3777 1155 1161 + 1 3794 452 3791 3792 + 1 3843 3791 460 3840 + 1 3849 3792 3840 461 + 1 3794 3843 3849 3792 + 1 3794 3843 3792 3791 + 1 3843 3849 3792 3840 + 1 3843 3791 3840 3792 + 1 3794 452 3792 3789 + 1 3802 3789 3800 454 + 1 3849 3792 461 3800 + 1 3794 3802 3792 3849 + 1 3794 3802 3789 3792 + 1 3802 3849 3800 3792 + 1 3802 3789 3792 3800 + 1 3791 460 3840 3776 + 1 3792 3840 461 3777 + 1 3771 3776 3777 449 + 1 3791 3792 3771 3776 + 1 3791 3792 3776 3840 + 1 3792 3771 3776 3777 + 1 3792 3840 3777 3776 + 1 3789 454 3772 3800 + 1 3792 3800 3777 461 + 1 3771 3772 449 3777 + 1 3789 3792 3772 3771 + 1 3789 3792 3800 3772 + 1 3792 3771 3777 3772 + 1 3792 3800 3772 3777 + 1 1430 82 1425 1431 + 1 4322 1431 3851 578 + 1 3849 1425 461 3851 + 1 1430 4322 1425 3849 + 1 1430 4322 1431 1425 + 1 4322 3849 3851 1425 + 1 4322 1431 1425 3851 + 1 4327 578 3861 1693 + 1 1692 1693 1688 104 + 1 3860 3861 463 1688 + 1 4327 1692 3861 3860 + 1 4327 1692 1693 3861 + 1 1692 3860 1688 3861 + 1 1692 1693 3861 1688 + 1 3840 461 1161 3846 + 1 3842 3846 1163 463 + 1 1160 1161 56 1163 + 1 3840 3842 1161 1160 + 1 3840 3842 3846 1161 + 1 3842 1160 1163 1161 + 1 3842 3846 1161 1163 + 1 4321 575 3850 3845 + 1 3843 3845 3840 460 + 1 3849 3850 461 3840 + 1 4321 3843 3850 3849 + 1 4321 3843 3845 3850 + 1 3843 3849 3840 3850 + 1 3843 3845 3850 3840 + 1 4321 575 4327 3850 + 1 4322 4327 578 3851 + 1 3849 3850 3851 461 + 1 4321 4322 3849 3850 + 1 4321 4322 3850 4327 + 1 4322 3849 3850 3851 + 1 4322 4327 3851 3850 + 1 3845 460 3842 3840 + 1 3850 3840 3846 461 + 1 3860 3842 463 3846 + 1 3845 3850 3842 3860 + 1 3845 3850 3840 3842 + 1 3850 3860 3846 3842 + 1 3850 3840 3842 3846 + 1 4327 578 3851 3861 + 1 3850 3851 461 3846 + 1 3860 3861 3846 463 + 1 4327 3850 3860 3861 + 1 4327 3850 3861 3851 + 1 3850 3860 3861 3846 + 1 3850 3851 3846 3861 + 1 1151 55 1146 1148 + 1 3772 1146 449 3770 + 1 3784 1148 3770 451 + 1 1151 3772 3784 1148 + 1 1151 3772 1148 1146 + 1 3772 3784 1148 3770 + 1 3772 1146 3770 1148 + 1 3777 449 1155 3775 + 1 1161 1155 56 1157 + 1 3818 3775 1157 457 + 1 3777 1161 3818 3775 + 1 3777 1161 3775 1155 + 1 1161 3818 3775 1157 + 1 1161 1155 1157 3775 + 1 3787 451 3785 1178 + 1 3822 3785 457 1179 + 1 1181 1178 1179 58 + 1 3787 3822 1181 1178 + 1 3787 3822 1178 3785 + 1 3822 1181 1178 1179 + 1 3822 3785 1179 1178 + 1 3800 461 3847 3786 + 1 3801 3847 473 3787 + 1 3784 3786 3787 451 + 1 3800 3801 3784 3786 + 1 3800 3801 3786 3847 + 1 3801 3784 3786 3787 + 1 3801 3847 3787 3786 + 1 3800 461 3786 3777 + 1 3772 3777 3770 449 + 1 3784 3786 451 3770 + 1 3800 3772 3786 3784 + 1 3800 3772 3777 3786 + 1 3772 3784 3770 3786 + 1 3772 3777 3786 3770 + 1 3847 473 3787 3822 + 1 3786 3787 451 3785 + 1 3818 3822 3785 457 + 1 3847 3786 3818 3822 + 1 3847 3786 3822 3787 + 1 3786 3818 3822 3785 + 1 3786 3787 3785 3822 + 1 3777 449 3775 3770 + 1 3786 3770 3785 451 + 1 3818 3775 457 3785 + 1 3777 3786 3775 3818 + 1 3777 3786 3770 3775 + 1 3786 3818 3785 3775 + 1 3786 3770 3775 3785 + 1 1693 104 1689 1688 + 1 3861 1688 3859 463 + 1 3909 1689 474 3859 + 1 1693 3861 1689 3909 + 1 1693 3861 1688 1689 + 1 3861 3909 3859 1689 + 1 3861 1688 1689 3859 + 1 3846 463 3819 1163 + 1 1161 1163 1157 56 + 1 3818 3819 457 1157 + 1 3846 1161 3819 3818 + 1 3846 1161 1163 3819 + 1 1161 3818 1157 3819 + 1 1161 1163 3819 1157 + 1 3906 474 1182 3823 + 1 3822 3823 1179 457 + 1 1181 1182 58 1179 + 1 3906 3822 1182 1181 + 1 3906 3822 3823 1182 + 1 3822 1181 1179 1182 + 1 3822 3823 1182 1179 + 1 3851 461 3848 3847 + 1 3907 3847 3906 473 + 1 3909 3848 474 3906 + 1 3851 3907 3848 3909 + 1 3851 3907 3847 3848 + 1 3907 3909 3906 3848 + 1 3907 3847 3848 3906 + 1 3851 461 3846 3848 + 1 3861 3846 463 3859 + 1 3909 3848 3859 474 + 1 3851 3861 3909 3848 + 1 3851 3861 3848 3846 + 1 3861 3909 3848 3859 + 1 3861 3846 3859 3848 + 1 3847 473 3822 3906 + 1 3848 3906 3823 474 + 1 3818 3822 457 3823 + 1 3847 3848 3822 3818 + 1 3847 3848 3906 3822 + 1 3848 3818 3823 3822 + 1 3848 3906 3822 3823 + 1 3846 463 3859 3819 + 1 3848 3859 474 3823 + 1 3818 3819 3823 457 + 1 3846 3848 3818 3819 + 1 3846 3848 3819 3859 + 1 3848 3818 3819 3823 + 1 3848 3859 3823 3819 + 1 784 11 785 787 + 1 2218 785 181 2225 + 1 2220 787 2225 183 + 1 784 2218 2220 787 + 1 784 2218 787 785 + 1 2218 2220 787 2225 + 1 2218 785 2225 787 + 1 2228 181 1340 2229 + 1 1344 1340 75 1346 + 1 4093 2229 1346 549 + 1 2228 1344 4093 2229 + 1 2228 1344 2229 1340 + 1 1344 4093 2229 1346 + 1 1344 1340 1346 2229 + 1 2240 183 2241 1360 + 1 4101 2241 549 1366 + 1 1362 1360 1366 77 + 1 2240 4101 1362 1360 + 1 2240 4101 1360 2241 + 1 4101 1362 1360 1366 + 1 4101 2241 1366 1360 + 1 2222 516 4090 2238 + 1 2224 4090 518 2240 + 1 2220 2238 2240 183 + 1 2222 2224 2220 2238 + 1 2222 2224 2238 4090 + 1 2224 2220 2238 2240 + 1 2224 4090 2240 2238 + 1 2222 516 2238 2228 + 1 2218 2228 2225 181 + 1 2220 2238 183 2225 + 1 2222 2218 2238 2220 + 1 2222 2218 2228 2238 + 1 2218 2220 2225 2238 + 1 2218 2228 2238 2225 + 1 4090 518 2240 4101 + 1 2238 2240 183 2241 + 1 4093 4101 2241 549 + 1 4090 2238 4093 4101 + 1 4090 2238 4101 2240 + 1 2238 4093 4101 2241 + 1 2238 2240 2241 4101 + 1 2228 181 2229 2225 + 1 2238 2225 2241 183 + 1 4093 2229 549 2241 + 1 2228 2238 2229 4093 + 1 2228 2238 2225 2229 + 1 2238 4093 2241 2229 + 1 2238 2225 2229 2241 + 1 1345 75 1341 1348 + 1 2284 1341 189 2285 + 1 4120 1348 2285 551 + 1 1345 2284 4120 1348 + 1 1345 2284 1348 1341 + 1 2284 4120 1348 2285 + 1 2284 1341 2285 1348 + 1 2265 189 793 2281 + 1 791 793 12 795 + 1 2267 2281 795 191 + 1 2265 791 2267 2281 + 1 2265 791 2281 793 + 1 791 2267 2281 795 + 1 791 793 795 2281 + 1 4134 551 2301 1404 + 1 2300 2301 191 1398 + 1 1402 1404 1398 80 + 1 4134 2300 1402 1404 + 1 4134 2300 1404 2301 + 1 2300 1402 1404 1398 + 1 2300 2301 1398 1404 + 1 2271 187 2273 2274 + 1 4118 2273 525 4134 + 1 4120 2274 4134 551 + 1 2271 4118 4120 2274 + 1 2271 4118 2274 2273 + 1 4118 4120 2274 4134 + 1 4118 2273 4134 2274 + 1 2271 187 2274 2265 + 1 2284 2265 2285 189 + 1 4120 2274 551 2285 + 1 2271 2284 2274 4120 + 1 2271 2284 2265 2274 + 1 2284 4120 2285 2274 + 1 2284 2265 2274 2285 + 1 2273 525 4134 2300 + 1 2274 4134 551 2301 + 1 2267 2300 2301 191 + 1 2273 2274 2267 2300 + 1 2273 2274 2300 4134 + 1 2274 2267 2300 2301 + 1 2274 4134 2301 2300 + 1 2265 189 2281 2285 + 1 2274 2285 2301 551 + 1 2267 2281 191 2301 + 1 2265 2274 2281 2267 + 1 2265 2274 2285 2281 + 1 2274 2267 2301 2281 + 1 2274 2285 2281 2301 + 1 1365 77 1369 1361 + 1 4169 1369 558 2589 + 1 2586 1361 2589 231 + 1 1365 4169 2586 1361 + 1 1365 4169 1361 1369 + 1 4169 2586 1361 2589 + 1 4169 1369 2589 1361 + 1 4177 558 1405 2599 + 1 1403 1405 80 1399 + 1 2598 2599 1399 232 + 1 4177 1403 2598 2599 + 1 4177 1403 2599 1405 + 1 1403 2598 2599 1399 + 1 1403 1405 1399 2599 + 1 2572 231 2583 835 + 1 2573 2583 232 836 + 1 834 835 836 17 + 1 2572 2573 834 835 + 1 2572 2573 835 2583 + 1 2573 834 835 836 + 1 2573 2583 836 835 + 1 4167 536 2579 2587 + 1 2578 2579 230 2572 + 1 2586 2587 2572 231 + 1 4167 2578 2586 2587 + 1 4167 2578 2587 2579 + 1 2578 2586 2587 2572 + 1 2578 2579 2572 2587 + 1 4167 536 2587 4177 + 1 4169 4177 2589 558 + 1 2586 2587 231 2589 + 1 4167 4169 2587 2586 + 1 4167 4169 4177 2587 + 1 4169 2586 2589 2587 + 1 4169 4177 2587 2589 + 1 2579 230 2572 2573 + 1 2587 2572 231 2583 + 1 2598 2573 2583 232 + 1 2579 2587 2598 2573 + 1 2579 2587 2573 2572 + 1 2587 2598 2573 2583 + 1 2587 2572 2583 2573 + 1 4177 558 2599 2589 + 1 2587 2589 2583 231 + 1 2598 2599 232 2583 + 1 4177 2587 2599 2598 + 1 4177 2587 2589 2599 + 1 2587 2598 2583 2599 + 1 2587 2589 2599 2583 + 1 1268 68 1270 1273 + 1 4075 1270 520 4108 + 1 4077 1273 4108 523 + 1 1268 4075 4077 1273 + 1 1268 4075 1273 1270 + 1 4075 4077 1273 4108 + 1 4075 1270 4108 1273 + 1 4085 520 1302 4112 + 1 1301 1302 71 1305 + 1 4089 4112 1305 534 + 1 4085 1301 4089 4112 + 1 4085 1301 4112 1302 + 1 1301 4089 4112 1305 + 1 1301 1302 1305 4112 + 1 4098 523 4122 1363 + 1 4100 4122 534 1365 + 1 1362 1363 1365 77 + 1 4098 4100 1362 1363 + 1 4098 4100 1363 4122 + 1 4100 1362 1363 1365 + 1 4100 4122 1365 1363 + 1 4072 515 4084 4086 + 1 4074 4084 518 4098 + 1 4077 4086 4098 523 + 1 4072 4074 4077 4086 + 1 4072 4074 4086 4084 + 1 4074 4077 4086 4098 + 1 4074 4084 4098 4086 + 1 4072 515 4086 4085 + 1 4075 4085 4108 520 + 1 4077 4086 523 4108 + 1 4072 4075 4086 4077 + 1 4072 4075 4085 4086 + 1 4075 4077 4108 4086 + 1 4075 4085 4086 4108 + 1 4084 518 4098 4100 + 1 4086 4098 523 4122 + 1 4089 4100 4122 534 + 1 4084 4086 4089 4100 + 1 4084 4086 4100 4098 + 1 4086 4089 4100 4122 + 1 4086 4098 4122 4100 + 1 4085 520 4112 4108 + 1 4086 4108 4122 523 + 1 4089 4112 534 4122 + 1 4085 4086 4112 4089 + 1 4085 4086 4108 4112 + 1 4086 4089 4122 4112 + 1 4086 4108 4112 4122 + 1 1268 68 1273 1272 + 1 4076 1272 4117 522 + 1 4077 1273 523 4117 + 1 1268 4076 1273 4077 + 1 1268 4076 1272 1273 + 1 4076 4077 4117 1273 + 1 4076 1272 1273 4117 + 1 4091 522 4119 1345 + 1 1344 1345 1346 75 + 1 4093 4119 549 1346 + 1 4091 1344 4119 4093 + 1 4091 1344 1345 4119 + 1 1344 4093 1346 4119 + 1 1344 1345 4119 1346 + 1 4098 523 1363 4124 + 1 4101 4124 1366 549 + 1 1362 1363 77 1366 + 1 4098 4101 1363 1362 + 1 4098 4101 4124 1363 + 1 4101 1362 1366 1363 + 1 4101 4124 1363 1366 + 1 4073 516 4092 4090 + 1 4074 4090 4098 518 + 1 4077 4092 523 4098 + 1 4073 4074 4092 4077 + 1 4073 4074 4090 4092 + 1 4074 4077 4098 4092 + 1 4074 4090 4092 4098 + 1 4073 516 4091 4092 + 1 4076 4091 522 4117 + 1 4077 4092 4117 523 + 1 4073 4076 4077 4092 + 1 4073 4076 4092 4091 + 1 4076 4077 4092 4117 + 1 4076 4091 4117 4092 + 1 4090 518 4101 4098 + 1 4092 4098 4124 523 + 1 4093 4101 549 4124 + 1 4090 4092 4101 4093 + 1 4090 4092 4098 4101 + 1 4092 4093 4124 4101 + 1 4092 4098 4101 4124 + 1 4091 522 4117 4119 + 1 4092 4117 523 4124 + 1 4093 4119 4124 549 + 1 4091 4092 4093 4119 + 1 4091 4092 4119 4117 + 1 4092 4093 4119 4124 + 1 4092 4117 4124 4119 + 1 1302 71 1305 1307 + 1 4112 1305 534 4167 + 1 4114 1307 4167 536 + 1 1302 4112 4114 1307 + 1 1302 4112 1307 1305 + 1 4112 4114 1307 4167 + 1 4112 1305 4167 1307 + 1 4122 534 1365 4169 + 1 1363 1365 77 1369 + 1 4126 4169 1369 558 + 1 4122 1363 4126 4169 + 1 4122 1363 4169 1365 + 1 1363 4126 4169 1369 + 1 1363 1365 1369 4169 + 1 4133 536 4177 1403 + 1 4135 4177 558 1405 + 1 1402 1403 1405 80 + 1 4133 4135 1402 1403 + 1 4133 4135 1403 4177 + 1 4135 1402 1403 1405 + 1 4135 4177 1405 1403 + 1 4108 523 4121 4123 + 1 4110 4121 525 4133 + 1 4114 4123 4133 536 + 1 4108 4110 4114 4123 + 1 4108 4110 4123 4121 + 1 4110 4114 4123 4133 + 1 4110 4121 4133 4123 + 1 4108 523 4123 4122 + 1 4112 4122 4167 534 + 1 4114 4123 536 4167 + 1 4108 4112 4123 4114 + 1 4108 4112 4122 4123 + 1 4112 4114 4167 4123 + 1 4112 4122 4123 4167 + 1 4121 525 4133 4135 + 1 4123 4133 536 4177 + 1 4126 4135 4177 558 + 1 4121 4123 4126 4135 + 1 4121 4123 4135 4133 + 1 4123 4126 4135 4177 + 1 4123 4133 4177 4135 + 1 4122 534 4169 4167 + 1 4123 4167 4177 536 + 1 4126 4169 558 4177 + 1 4122 4123 4169 4126 + 1 4122 4123 4167 4169 + 1 4123 4126 4177 4169 + 1 4123 4167 4169 4177 + 1 1345 75 1348 1346 + 1 4119 1346 4221 549 + 1 4120 1348 551 4221 + 1 1345 4119 1348 4120 + 1 1345 4119 1346 1348 + 1 4119 4120 4221 1348 + 1 4119 1346 1348 4221 + 1 4124 549 4224 1366 + 1 1363 1366 1369 77 + 1 4126 4224 558 1369 + 1 4124 1363 4224 4126 + 1 4124 1363 1366 4224 + 1 1363 4126 1369 4224 + 1 1363 1366 4224 1369 + 1 4134 551 1404 4231 + 1 4135 4231 1405 558 + 1 1402 1404 80 1405 + 1 4134 4135 1404 1402 + 1 4134 4135 4231 1404 + 1 4135 1402 1405 1404 + 1 4135 4231 1404 1405 + 1 4117 523 4125 4121 + 1 4118 4121 4134 525 + 1 4120 4125 551 4134 + 1 4117 4118 4125 4120 + 1 4117 4118 4121 4125 + 1 4118 4120 4134 4125 + 1 4118 4121 4125 4134 + 1 4117 523 4124 4125 + 1 4119 4124 549 4221 + 1 4120 4125 4221 551 + 1 4117 4119 4120 4125 + 1 4117 4119 4125 4124 + 1 4119 4120 4125 4221 + 1 4119 4124 4221 4125 + 1 4121 525 4135 4134 + 1 4125 4134 4231 551 + 1 4126 4135 558 4231 + 1 4121 4125 4135 4126 + 1 4121 4125 4134 4135 + 1 4125 4126 4231 4135 + 1 4125 4134 4135 4231 + 1 4124 549 4221 4224 + 1 4125 4221 551 4231 + 1 4126 4224 4231 558 + 1 4124 4125 4126 4224 + 1 4124 4125 4224 4221 + 1 4125 4126 4224 4231 + 1 4125 4221 4231 4224 + 1 784 11 787 786 + 1 2219 786 2231 182 + 1 2220 787 183 2231 + 1 784 2219 787 2220 + 1 784 2219 786 787 + 1 2219 2220 2231 787 + 1 2219 786 787 2231 + 1 2234 182 2235 1350 + 1 1354 1350 1356 76 + 1 4097 2235 553 1356 + 1 2234 1354 2235 4097 + 1 2234 1354 1350 2235 + 1 1354 4097 1356 2235 + 1 1354 1350 2235 1356 + 1 2240 183 1360 2243 + 1 4102 2243 1367 553 + 1 1362 1360 77 1367 + 1 2240 4102 1360 1362 + 1 2240 4102 2243 1360 + 1 4102 1362 1367 1360 + 1 4102 2243 1360 1367 + 1 2223 517 2239 4094 + 1 2224 4094 2240 518 + 1 2220 2239 183 2240 + 1 2223 2224 2239 2220 + 1 2223 2224 4094 2239 + 1 2224 2220 2240 2239 + 1 2224 4094 2239 2240 + 1 2223 517 2234 2239 + 1 2219 2234 182 2231 + 1 2220 2239 2231 183 + 1 2223 2219 2220 2239 + 1 2223 2219 2239 2234 + 1 2219 2220 2239 2231 + 1 2219 2234 2231 2239 + 1 4094 518 4102 2240 + 1 2239 2240 2243 183 + 1 4097 4102 553 2243 + 1 4094 2239 4102 4097 + 1 4094 2239 2240 4102 + 1 2239 4097 2243 4102 + 1 2239 2240 4102 2243 + 1 2234 182 2231 2235 + 1 2239 2231 183 2243 + 1 4097 2235 2243 553 + 1 2234 2239 4097 2235 + 1 2234 2239 2235 2231 + 1 2239 4097 2235 2243 + 1 2239 2231 2243 2235 + 1 1355 76 1358 1351 + 1 2404 1351 2405 206 + 1 4157 1358 555 2405 + 1 1355 2404 1358 4157 + 1 1355 2404 1351 1358 + 1 2404 4157 2405 1358 + 1 2404 1351 1358 2405 + 1 2394 206 2401 810 + 1 809 810 812 14 + 1 2395 2401 208 812 + 1 2394 809 2401 2395 + 1 2394 809 810 2401 + 1 809 2395 812 2401 + 1 809 810 2401 812 + 1 4165 555 1496 2419 + 1 2418 2419 1490 208 + 1 1494 1496 88 1490 + 1 4165 2418 1496 1494 + 1 4165 2418 2419 1496 + 1 2418 1494 1490 1496 + 1 2418 2419 1496 1490 + 1 2398 205 2400 2399 + 1 4155 2399 4165 533 + 1 4157 2400 555 4165 + 1 2398 4155 2400 4157 + 1 2398 4155 2399 2400 + 1 4155 4157 4165 2400 + 1 4155 2399 2400 4165 + 1 2398 205 2394 2400 + 1 2404 2394 206 2405 + 1 4157 2400 2405 555 + 1 2398 2404 4157 2400 + 1 2398 2404 2400 2394 + 1 2404 4157 2400 2405 + 1 2404 2394 2405 2400 + 1 2399 533 2418 4165 + 1 2400 4165 2419 555 + 1 2395 2418 208 2419 + 1 2399 2400 2418 2395 + 1 2399 2400 4165 2418 + 1 2400 2395 2419 2418 + 1 2400 4165 2418 2419 + 1 2394 206 2405 2401 + 1 2400 2405 555 2419 + 1 2395 2401 2419 208 + 1 2394 2400 2395 2401 + 1 2394 2400 2401 2405 + 1 2400 2395 2401 2419 + 1 2400 2405 2419 2401 + 1 1365 77 1361 1371 + 1 4170 1371 2590 560 + 1 2586 1361 231 2590 + 1 1365 4170 1361 2586 + 1 1365 4170 1371 1361 + 1 4170 2586 2590 1361 + 1 4170 1371 1361 2590 + 1 4182 560 2617 1497 + 1 1495 1497 1491 88 + 1 2616 2617 234 1491 + 1 4182 1495 2617 2616 + 1 4182 1495 1497 2617 + 1 1495 2616 1491 2617 + 1 1495 1497 2617 1491 + 1 2572 231 835 2584 + 1 2575 2584 838 234 + 1 834 835 17 838 + 1 2572 2575 835 834 + 1 2572 2575 2584 835 + 1 2575 834 838 835 + 1 2575 2584 835 838 + 1 4168 538 2588 2581 + 1 2578 2581 2572 230 + 1 2586 2588 231 2572 + 1 4168 2578 2588 2586 + 1 4168 2578 2581 2588 + 1 2578 2586 2572 2588 + 1 2578 2581 2588 2572 + 1 4168 538 4182 2588 + 1 4170 4182 560 2590 + 1 2586 2588 2590 231 + 1 4168 4170 2586 2588 + 1 4168 4170 2588 4182 + 1 4170 2586 2588 2590 + 1 4170 4182 2590 2588 + 1 2581 230 2575 2572 + 1 2588 2572 2584 231 + 1 2616 2575 234 2584 + 1 2581 2588 2575 2616 + 1 2581 2588 2572 2575 + 1 2588 2616 2584 2575 + 1 2588 2572 2575 2584 + 1 4182 560 2590 2617 + 1 2588 2590 231 2584 + 1 2616 2617 2584 234 + 1 4182 2588 2616 2617 + 1 4182 2588 2617 2590 + 1 2588 2616 2617 2584 + 1 2588 2590 2584 2617 + 1 1291 70 1294 1292 + 1 4081 1292 4150 530 + 1 4083 1294 532 4150 + 1 1291 4081 1294 4083 + 1 1291 4081 1292 1294 + 1 4081 4083 4150 1294 + 1 4081 1292 1294 4150 + 1 4087 530 4152 1304 + 1 1301 1304 1305 71 + 1 4089 4152 534 1305 + 1 4087 1301 4152 4089 + 1 4087 1301 1304 4152 + 1 1301 4089 1305 4152 + 1 1301 1304 4152 1305 + 1 4099 532 1364 4159 + 1 4100 4159 1365 534 + 1 1362 1364 77 1365 + 1 4099 4100 1364 1362 + 1 4099 4100 4159 1364 + 1 4100 1362 1365 1364 + 1 4100 4159 1364 1365 + 1 4078 515 4088 4084 + 1 4080 4084 4099 518 + 1 4083 4088 532 4099 + 1 4078 4080 4088 4083 + 1 4078 4080 4084 4088 + 1 4080 4083 4099 4088 + 1 4080 4084 4088 4099 + 1 4078 515 4087 4088 + 1 4081 4087 530 4150 + 1 4083 4088 4150 532 + 1 4078 4081 4083 4088 + 1 4078 4081 4088 4087 + 1 4081 4083 4088 4150 + 1 4081 4087 4150 4088 + 1 4084 518 4100 4099 + 1 4088 4099 4159 532 + 1 4089 4100 534 4159 + 1 4084 4088 4100 4089 + 1 4084 4088 4099 4100 + 1 4088 4089 4159 4100 + 1 4088 4099 4100 4159 + 1 4087 530 4150 4152 + 1 4088 4150 532 4159 + 1 4089 4152 4159 534 + 1 4087 4088 4089 4152 + 1 4087 4088 4152 4150 + 1 4088 4089 4152 4159 + 1 4088 4150 4159 4152 + 1 1291 70 1293 1294 + 1 4082 1293 531 4154 + 1 4083 1294 4154 532 + 1 1291 4082 4083 1294 + 1 1291 4082 1294 1293 + 1 4082 4083 1294 4154 + 1 4082 1293 4154 1294 + 1 4095 531 1355 4156 + 1 1354 1355 76 1356 + 1 4097 4156 1356 553 + 1 4095 1354 4097 4156 + 1 4095 1354 4156 1355 + 1 1354 4097 4156 1356 + 1 1354 1355 1356 4156 + 1 4099 532 4161 1364 + 1 4102 4161 553 1367 + 1 1362 1364 1367 77 + 1 4099 4102 1362 1364 + 1 4099 4102 1364 4161 + 1 4102 1362 1364 1367 + 1 4102 4161 1367 1364 + 1 4079 517 4094 4096 + 1 4080 4094 518 4099 + 1 4083 4096 4099 532 + 1 4079 4080 4083 4096 + 1 4079 4080 4096 4094 + 1 4080 4083 4096 4099 + 1 4080 4094 4099 4096 + 1 4079 517 4096 4095 + 1 4082 4095 4154 531 + 1 4083 4096 532 4154 + 1 4079 4082 4096 4083 + 1 4079 4082 4095 4096 + 1 4082 4083 4154 4096 + 1 4082 4095 4096 4154 + 1 4094 518 4099 4102 + 1 4096 4099 532 4161 + 1 4097 4102 4161 553 + 1 4094 4096 4097 4102 + 1 4094 4096 4102 4099 + 1 4096 4097 4102 4161 + 1 4096 4099 4161 4102 + 1 4095 531 4156 4154 + 1 4096 4154 4161 532 + 1 4097 4156 553 4161 + 1 4095 4096 4156 4097 + 1 4095 4096 4154 4156 + 1 4096 4097 4161 4156 + 1 4096 4154 4156 4161 + 1 1304 71 1309 1305 + 1 4152 1305 4168 534 + 1 4153 1309 538 4168 + 1 1304 4152 1309 4153 + 1 1304 4152 1305 1309 + 1 4152 4153 4168 1309 + 1 4152 1305 1309 4168 + 1 4159 534 4170 1365 + 1 1364 1365 1371 77 + 1 4163 4170 560 1371 + 1 4159 1364 4170 4163 + 1 4159 1364 1365 4170 + 1 1364 4163 1371 4170 + 1 1364 1365 4170 1371 + 1 4164 538 1495 4182 + 1 4166 4182 1497 560 + 1 1494 1495 88 1497 + 1 4164 4166 1495 1494 + 1 4164 4166 4182 1495 + 1 4166 1494 1497 1495 + 1 4166 4182 1495 1497 + 1 4150 532 4160 4158 + 1 4151 4158 4164 533 + 1 4153 4160 538 4164 + 1 4150 4151 4160 4153 + 1 4150 4151 4158 4160 + 1 4151 4153 4164 4160 + 1 4151 4158 4160 4164 + 1 4150 532 4159 4160 + 1 4152 4159 534 4168 + 1 4153 4160 4168 538 + 1 4150 4152 4153 4160 + 1 4150 4152 4160 4159 + 1 4152 4153 4160 4168 + 1 4152 4159 4168 4160 + 1 4158 533 4166 4164 + 1 4160 4164 4182 538 + 1 4163 4166 560 4182 + 1 4158 4160 4166 4163 + 1 4158 4160 4164 4166 + 1 4160 4163 4182 4166 + 1 4160 4164 4166 4182 + 1 4159 534 4168 4170 + 1 4160 4168 538 4182 + 1 4163 4170 4182 560 + 1 4159 4160 4163 4170 + 1 4159 4160 4170 4168 + 1 4160 4163 4170 4182 + 1 4160 4168 4182 4170 + 1 1355 76 1356 1358 + 1 4156 1356 553 4238 + 1 4157 1358 4238 555 + 1 1355 4156 4157 1358 + 1 1355 4156 1358 1356 + 1 4156 4157 1358 4238 + 1 4156 1356 4238 1358 + 1 4161 553 1367 4241 + 1 1364 1367 77 1371 + 1 4163 4241 1371 560 + 1 4161 1364 4163 4241 + 1 4161 1364 4241 1367 + 1 1364 4163 4241 1371 + 1 1364 1367 1371 4241 + 1 4165 555 4248 1496 + 1 4166 4248 560 1497 + 1 1494 1496 1497 88 + 1 4165 4166 1494 1496 + 1 4165 4166 1496 4248 + 1 4166 1494 1496 1497 + 1 4166 4248 1497 1496 + 1 4154 532 4158 4162 + 1 4155 4158 533 4165 + 1 4157 4162 4165 555 + 1 4154 4155 4157 4162 + 1 4154 4155 4162 4158 + 1 4155 4157 4162 4165 + 1 4155 4158 4165 4162 + 1 4154 532 4162 4161 + 1 4156 4161 4238 553 + 1 4157 4162 555 4238 + 1 4154 4156 4162 4157 + 1 4154 4156 4161 4162 + 1 4156 4157 4238 4162 + 1 4156 4161 4162 4238 + 1 4158 533 4165 4166 + 1 4162 4165 555 4248 + 1 4163 4166 4248 560 + 1 4158 4162 4163 4166 + 1 4158 4162 4166 4165 + 1 4162 4163 4166 4248 + 1 4162 4165 4248 4166 + 1 4161 553 4241 4238 + 1 4162 4238 4248 555 + 1 4163 4241 560 4248 + 1 4161 4162 4241 4163 + 1 4161 4162 4238 4241 + 1 4162 4163 4248 4241 + 1 4162 4238 4241 4248 + 1 793 12 795 797 + 1 2281 795 191 2298 + 1 2282 797 2298 193 + 1 793 2281 2282 797 + 1 793 2281 797 795 + 1 2281 2282 797 2298 + 1 2281 795 2298 797 + 1 2301 191 1398 2304 + 1 1404 1398 80 1408 + 1 4233 2304 1408 572 + 1 2301 1404 4233 2304 + 1 2301 1404 2304 1398 + 1 1404 4233 2304 1408 + 1 1404 1398 1408 2304 + 1 2312 193 2313 1422 + 1 4236 2313 572 1430 + 1 1427 1422 1430 82 + 1 2312 4236 1427 1422 + 1 2312 4236 1422 2313 + 1 4236 1427 1422 1430 + 1 4236 2313 1430 1422 + 1 2285 551 4230 2311 + 1 2286 4230 552 2312 + 1 2282 2311 2312 193 + 1 2285 2286 2282 2311 + 1 2285 2286 2311 4230 + 1 2286 2282 2311 2312 + 1 2286 4230 2312 2311 + 1 2285 551 2311 2301 + 1 2281 2301 2298 191 + 1 2282 2311 193 2298 + 1 2285 2281 2311 2282 + 1 2285 2281 2301 2311 + 1 2281 2282 2298 2311 + 1 2281 2301 2311 2298 + 1 4230 552 2312 4236 + 1 2311 2312 193 2313 + 1 4233 4236 2313 572 + 1 4230 2311 4233 4236 + 1 4230 2311 4236 2312 + 1 2311 4233 4236 2313 + 1 2311 2312 2313 4236 + 1 2301 191 2304 2298 + 1 2311 2298 2313 193 + 1 4233 2304 572 2313 + 1 2301 2311 2304 4233 + 1 2301 2311 2298 2304 + 1 2311 4233 2313 2304 + 1 2311 2298 2304 2313 + 1 1405 80 1399 1411 + 1 2599 1399 232 2602 + 1 4263 1411 2602 575 + 1 1405 2599 4263 1411 + 1 1405 2599 1411 1399 + 1 2599 4263 1411 2602 + 1 2599 1399 2602 1411 + 1 2583 232 836 2596 + 1 835 836 17 842 + 1 2585 2596 842 238 + 1 2583 835 2585 2596 + 1 2583 835 2596 836 + 1 835 2585 2596 842 + 1 835 836 842 2596 + 1 4281 575 2652 1692 + 1 2651 2652 238 1686 + 1 1690 1692 1686 104 + 1 4281 2651 1690 1692 + 1 4281 2651 1692 2652 + 1 2651 1690 1692 1686 + 1 2651 2652 1686 1692 + 1 2589 231 2591 2592 + 1 4261 2591 562 4281 + 1 4263 2592 4281 575 + 1 2589 4261 4263 2592 + 1 2589 4261 2592 2591 + 1 4261 4263 2592 4281 + 1 4261 2591 4281 2592 + 1 2589 231 2592 2583 + 1 2599 2583 2602 232 + 1 4263 2592 575 2602 + 1 2589 2599 2592 4263 + 1 2589 2599 2583 2592 + 1 2599 4263 2602 2592 + 1 2599 2583 2592 2602 + 1 2591 562 4281 2651 + 1 2592 4281 575 2652 + 1 2585 2651 2652 238 + 1 2591 2592 2585 2651 + 1 2591 2592 2651 4281 + 1 2592 2585 2651 2652 + 1 2592 4281 2652 2651 + 1 2583 232 2596 2602 + 1 2592 2602 2652 575 + 1 2585 2596 238 2652 + 1 2583 2592 2596 2585 + 1 2583 2592 2602 2596 + 1 2592 2585 2652 2596 + 1 2592 2602 2596 2652 + 1 1429 82 1431 1423 + 1 4286 1431 578 2938 + 1 2936 1423 2938 279 + 1 1429 4286 2936 1423 + 1 1429 4286 1423 1431 + 1 4286 2936 1423 2938 + 1 4286 1431 2938 1423 + 1 4289 578 1693 2953 + 1 1691 1693 104 1687 + 1 2952 2953 1687 281 + 1 4289 1691 2952 2953 + 1 4289 1691 2953 1693 + 1 1691 2952 2953 1687 + 1 1691 1693 1687 2953 + 1 2926 279 2933 883 + 1 2928 2933 281 885 + 1 882 883 885 22 + 1 2926 2928 882 883 + 1 2926 2928 883 2933 + 1 2928 882 883 885 + 1 2928 2933 885 883 + 1 4285 565 2932 2937 + 1 2930 2932 278 2926 + 1 2936 2937 2926 279 + 1 4285 2930 2936 2937 + 1 4285 2930 2937 2932 + 1 2930 2936 2937 2926 + 1 2930 2932 2926 2937 + 1 4285 565 2937 4289 + 1 4286 4289 2938 578 + 1 2936 2937 279 2938 + 1 4285 4286 2937 2936 + 1 4285 4286 4289 2937 + 1 4286 2936 2938 2937 + 1 4286 4289 2937 2938 + 1 2932 278 2926 2928 + 1 2937 2926 279 2933 + 1 2952 2928 2933 281 + 1 2932 2937 2952 2928 + 1 2932 2937 2928 2926 + 1 2937 2952 2928 2933 + 1 2937 2926 2933 2928 + 1 4289 578 2953 2938 + 1 2937 2938 2933 279 + 1 2952 2953 281 2933 + 1 4289 2937 2953 2952 + 1 4289 2937 2938 2953 + 1 2937 2952 2933 2953 + 1 2937 2938 2953 2933 + 1 1366 77 1368 1370 + 1 4223 1368 557 4254 + 1 4225 1370 4254 559 + 1 1366 4223 4225 1370 + 1 1366 4223 1370 1368 + 1 4223 4225 1370 4254 + 1 4223 1368 4254 1370 + 1 4227 557 1380 4257 + 1 1378 1380 78 1381 + 1 4229 4257 1381 563 + 1 4227 1378 4229 4257 + 1 4227 1378 4257 1380 + 1 1378 4229 4257 1381 + 1 1378 1380 1381 4257 + 1 4234 559 4265 1428 + 1 4235 4265 563 1429 + 1 1427 1428 1429 82 + 1 4234 4235 1427 1428 + 1 4234 4235 1428 4265 + 1 4235 1427 1428 1429 + 1 4235 4265 1429 1428 + 1 4220 550 4226 4228 + 1 4222 4226 552 4234 + 1 4225 4228 4234 559 + 1 4220 4222 4225 4228 + 1 4220 4222 4228 4226 + 1 4222 4225 4228 4234 + 1 4222 4226 4234 4228 + 1 4220 550 4228 4227 + 1 4223 4227 4254 557 + 1 4225 4228 559 4254 + 1 4220 4223 4228 4225 + 1 4220 4223 4227 4228 + 1 4223 4225 4254 4228 + 1 4223 4227 4228 4254 + 1 4226 552 4234 4235 + 1 4228 4234 559 4265 + 1 4229 4235 4265 563 + 1 4226 4228 4229 4235 + 1 4226 4228 4235 4234 + 1 4228 4229 4235 4265 + 1 4228 4234 4265 4235 + 1 4227 557 4257 4254 + 1 4228 4254 4265 559 + 1 4229 4257 563 4265 + 1 4227 4228 4257 4229 + 1 4227 4228 4254 4257 + 1 4228 4229 4265 4257 + 1 4228 4254 4257 4265 + 1 1366 77 1370 1369 + 1 4224 1369 4260 558 + 1 4225 1370 559 4260 + 1 1366 4224 1370 4225 + 1 1366 4224 1369 1370 + 1 4224 4225 4260 1370 + 1 4224 1369 1370 4260 + 1 4231 558 4262 1405 + 1 1404 1405 1408 80 + 1 4233 4262 572 1408 + 1 4231 1404 4262 4233 + 1 4231 1404 1405 4262 + 1 1404 4233 1408 4262 + 1 1404 1405 4262 1408 + 1 4234 559 1428 4267 + 1 4236 4267 1430 572 + 1 1427 1428 82 1430 + 1 4234 4236 1428 1427 + 1 4234 4236 4267 1428 + 1 4236 1427 1430 1428 + 1 4236 4267 1428 1430 + 1 4221 551 4232 4230 + 1 4222 4230 4234 552 + 1 4225 4232 559 4234 + 1 4221 4222 4232 4225 + 1 4221 4222 4230 4232 + 1 4222 4225 4234 4232 + 1 4222 4230 4232 4234 + 1 4221 551 4231 4232 + 1 4224 4231 558 4260 + 1 4225 4232 4260 559 + 1 4221 4224 4225 4232 + 1 4221 4224 4232 4231 + 1 4224 4225 4232 4260 + 1 4224 4231 4260 4232 + 1 4230 552 4236 4234 + 1 4232 4234 4267 559 + 1 4233 4236 572 4267 + 1 4230 4232 4236 4233 + 1 4230 4232 4234 4236 + 1 4232 4233 4267 4236 + 1 4232 4234 4236 4267 + 1 4231 558 4260 4262 + 1 4232 4260 559 4267 + 1 4233 4262 4267 572 + 1 4231 4232 4233 4262 + 1 4231 4232 4262 4260 + 1 4232 4233 4262 4267 + 1 4232 4260 4267 4262 + 1 1380 78 1381 1383 + 1 4257 1381 563 4285 + 1 4259 1383 4285 565 + 1 1380 4257 4259 1383 + 1 1380 4257 1383 1381 + 1 4257 4259 1383 4285 + 1 4257 1381 4285 1383 + 1 4265 563 1429 4286 + 1 1428 1429 82 1431 + 1 4269 4286 1431 578 + 1 4265 1428 4269 4286 + 1 4265 1428 4286 1429 + 1 1428 4269 4286 1431 + 1 1428 1429 1431 4286 + 1 4280 565 4289 1691 + 1 4282 4289 578 1693 + 1 1690 1691 1693 104 + 1 4280 4282 1690 1691 + 1 4280 4282 1691 4289 + 1 4282 1690 1691 1693 + 1 4282 4289 1693 1691 + 1 4254 559 4264 4266 + 1 4256 4264 562 4280 + 1 4259 4266 4280 565 + 1 4254 4256 4259 4266 + 1 4254 4256 4266 4264 + 1 4256 4259 4266 4280 + 1 4256 4264 4280 4266 + 1 4254 559 4266 4265 + 1 4257 4265 4285 563 + 1 4259 4266 565 4285 + 1 4254 4257 4266 4259 + 1 4254 4257 4265 4266 + 1 4257 4259 4285 4266 + 1 4257 4265 4266 4285 + 1 4264 562 4280 4282 + 1 4266 4280 565 4289 + 1 4269 4282 4289 578 + 1 4264 4266 4269 4282 + 1 4264 4266 4282 4280 + 1 4266 4269 4282 4289 + 1 4266 4280 4289 4282 + 1 4265 563 4286 4285 + 1 4266 4285 4289 565 + 1 4269 4286 578 4289 + 1 4265 4266 4286 4269 + 1 4265 4266 4285 4286 + 1 4266 4269 4289 4286 + 1 4266 4285 4286 4289 + 1 1405 80 1411 1408 + 1 4262 1408 4321 572 + 1 4263 1411 575 4321 + 1 1405 4262 1411 4263 + 1 1405 4262 1408 1411 + 1 4262 4263 4321 1411 + 1 4262 1408 1411 4321 + 1 4267 572 4322 1430 + 1 1428 1430 1431 82 + 1 4269 4322 578 1431 + 1 4267 1428 4322 4269 + 1 4267 1428 1430 4322 + 1 1428 4269 1431 4322 + 1 1428 1430 4322 1431 + 1 4281 575 1692 4327 + 1 4282 4327 1693 578 + 1 1690 1692 104 1693 + 1 4281 4282 1692 1690 + 1 4281 4282 4327 1692 + 1 4282 1690 1693 1692 + 1 4282 4327 1692 1693 + 1 4260 559 4268 4264 + 1 4261 4264 4281 562 + 1 4263 4268 575 4281 + 1 4260 4261 4268 4263 + 1 4260 4261 4264 4268 + 1 4261 4263 4281 4268 + 1 4261 4264 4268 4281 + 1 4260 559 4267 4268 + 1 4262 4267 572 4321 + 1 4263 4268 4321 575 + 1 4260 4262 4263 4268 + 1 4260 4262 4268 4267 + 1 4262 4263 4268 4321 + 1 4262 4267 4321 4268 + 1 4264 562 4282 4281 + 1 4268 4281 4327 575 + 1 4269 4282 578 4327 + 1 4264 4268 4282 4269 + 1 4264 4268 4281 4282 + 1 4268 4269 4327 4282 + 1 4268 4281 4282 4327 + 1 4267 572 4321 4322 + 1 4268 4321 575 4327 + 1 4269 4322 4327 578 + 1 4267 4268 4269 4322 + 1 4267 4268 4322 4321 + 1 4268 4269 4322 4327 + 1 4268 4321 4327 4322 + 1 810 14 815 812 + 1 2401 812 2415 208 + 1 2402 815 211 2415 + 1 810 2401 815 2402 + 1 810 2401 812 815 + 1 2401 2402 2415 815 + 1 2401 812 815 2415 + 1 2419 208 2421 1490 + 1 1496 1490 1499 88 + 1 4250 2421 602 1499 + 1 2419 1496 2421 4250 + 1 2419 1496 1490 2421 + 1 1496 4250 1499 2421 + 1 1496 1490 2421 1499 + 1 2442 211 1528 2443 + 1 4253 2443 1537 602 + 1 1534 1528 91 1537 + 1 2442 4253 1528 1534 + 1 2442 4253 2443 1528 + 1 4253 1534 1537 1528 + 1 4253 2443 1528 1537 + 1 2405 555 2441 4247 + 1 2406 4247 2442 556 + 1 2402 2441 211 2442 + 1 2405 2406 2441 2402 + 1 2405 2406 4247 2441 + 1 2406 2402 2442 2441 + 1 2406 4247 2441 2442 + 1 2405 555 2419 2441 + 1 2401 2419 208 2415 + 1 2402 2441 2415 211 + 1 2405 2401 2402 2441 + 1 2405 2401 2441 2419 + 1 2401 2402 2441 2415 + 1 2401 2419 2415 2441 + 1 4247 556 4253 2442 + 1 2441 2442 2443 211 + 1 4250 4253 602 2443 + 1 4247 2441 4253 4250 + 1 4247 2441 2442 4253 + 1 2441 4250 2443 4253 + 1 2441 2442 4253 2443 + 1 2419 208 2415 2421 + 1 2441 2415 211 2443 + 1 4250 2421 2443 602 + 1 2419 2441 4250 2421 + 1 2419 2441 2421 2415 + 1 2441 4250 2421 2443 + 1 2441 2415 2443 2421 + 1 1497 88 1502 1491 + 1 2617 1491 2619 234 + 1 4273 1502 605 2619 + 1 1497 2617 1502 4273 + 1 1497 2617 1491 1502 + 1 2617 4273 2619 1502 + 1 2617 1491 1502 2619 + 1 2584 234 2613 838 + 1 835 838 842 17 + 1 2585 2613 238 842 + 1 2584 835 2613 2585 + 1 2584 835 838 2613 + 1 835 2585 842 2613 + 1 835 838 2613 842 + 1 4283 605 1694 2653 + 1 2651 2653 1686 238 + 1 1690 1694 104 1686 + 1 4283 2651 1694 1690 + 1 4283 2651 2653 1694 + 1 2651 1690 1686 1694 + 1 2651 2653 1694 1686 + 1 2590 231 2593 2591 + 1 4271 2591 4283 562 + 1 4273 2593 605 4283 + 1 2590 4271 2593 4273 + 1 2590 4271 2591 2593 + 1 4271 4273 4283 2593 + 1 4271 2591 2593 4283 + 1 2590 231 2584 2593 + 1 2617 2584 234 2619 + 1 4273 2593 2619 605 + 1 2590 2617 4273 2593 + 1 2590 2617 2593 2584 + 1 2617 4273 2593 2619 + 1 2617 2584 2619 2593 + 1 2591 562 2651 4283 + 1 2593 4283 2653 605 + 1 2585 2651 238 2653 + 1 2591 2593 2651 2585 + 1 2591 2593 4283 2651 + 1 2593 2585 2653 2651 + 1 2593 4283 2651 2653 + 1 2584 234 2619 2613 + 1 2593 2619 605 2653 + 1 2585 2613 2653 238 + 1 2584 2593 2585 2613 + 1 2584 2593 2613 2619 + 1 2593 2585 2613 2653 + 1 2593 2619 2653 2613 + 1 1536 91 1529 1539 + 1 4288 1539 2946 619 + 1 2944 1529 280 2946 + 1 1536 4288 1529 2944 + 1 1536 4288 1539 1529 + 1 4288 2944 2946 1529 + 1 4288 1539 1529 2946 + 1 4290 619 2954 1695 + 1 1691 1695 1687 104 + 1 2952 2954 281 1687 + 1 4290 1691 2954 2952 + 1 4290 1691 1695 2954 + 1 1691 2952 1687 2954 + 1 1691 1695 2954 1687 + 1 2927 280 884 2939 + 1 2928 2939 885 281 + 1 882 884 22 885 + 1 2927 2928 884 882 + 1 2927 2928 2939 884 + 1 2928 882 885 884 + 1 2928 2939 884 885 + 1 4287 565 2945 2932 + 1 2931 2932 2927 278 + 1 2944 2945 280 2927 + 1 4287 2931 2945 2944 + 1 4287 2931 2932 2945 + 1 2931 2944 2927 2945 + 1 2931 2932 2945 2927 + 1 4287 565 4290 2945 + 1 4288 4290 619 2946 + 1 2944 2945 2946 280 + 1 4287 4288 2944 2945 + 1 4287 4288 2945 4290 + 1 4288 2944 2945 2946 + 1 4288 4290 2946 2945 + 1 2932 278 2928 2927 + 1 2945 2927 2939 280 + 1 2952 2928 281 2939 + 1 2932 2945 2928 2952 + 1 2932 2945 2927 2928 + 1 2945 2952 2939 2928 + 1 2945 2927 2928 2939 + 1 4290 619 2946 2954 + 1 2945 2946 280 2939 + 1 2952 2954 2939 281 + 1 4290 2945 2952 2954 + 1 4290 2945 2954 2946 + 1 2945 2952 2954 2939 + 1 2945 2946 2939 2954 + 1 1367 77 1372 1368 + 1 4240 1368 4255 557 + 1 4242 1372 561 4255 + 1 1367 4240 1372 4242 + 1 1367 4240 1368 1372 + 1 4240 4242 4255 1372 + 1 4240 1368 1372 4255 + 1 4244 557 4258 1380 + 1 1379 1380 1382 78 + 1 4246 4258 564 1382 + 1 4244 1379 4258 4246 + 1 4244 1379 1380 4258 + 1 1379 4246 1382 4258 + 1 1379 1380 4258 1382 + 1 4251 561 1535 4275 + 1 4252 4275 1536 564 + 1 1534 1535 91 1536 + 1 4251 4252 1535 1534 + 1 4251 4252 4275 1535 + 1 4252 1534 1536 1535 + 1 4252 4275 1535 1536 + 1 4237 554 4245 4243 + 1 4239 4243 4251 556 + 1 4242 4245 561 4251 + 1 4237 4239 4245 4242 + 1 4237 4239 4243 4245 + 1 4239 4242 4251 4245 + 1 4239 4243 4245 4251 + 1 4237 554 4244 4245 + 1 4240 4244 557 4255 + 1 4242 4245 4255 561 + 1 4237 4240 4242 4245 + 1 4237 4240 4245 4244 + 1 4240 4242 4245 4255 + 1 4240 4244 4255 4245 + 1 4243 556 4252 4251 + 1 4245 4251 4275 561 + 1 4246 4252 564 4275 + 1 4243 4245 4252 4246 + 1 4243 4245 4251 4252 + 1 4245 4246 4275 4252 + 1 4245 4251 4252 4275 + 1 4244 557 4255 4258 + 1 4245 4255 561 4275 + 1 4246 4258 4275 564 + 1 4244 4245 4246 4258 + 1 4244 4245 4258 4255 + 1 4245 4246 4258 4275 + 1 4245 4255 4275 4258 + 1 1367 77 1371 1372 + 1 4241 1371 560 4270 + 1 4242 1372 4270 561 + 1 1367 4241 4242 1372 + 1 1367 4241 1372 1371 + 1 4241 4242 1372 4270 + 1 4241 1371 4270 1372 + 1 4248 560 1497 4272 + 1 1496 1497 88 1499 + 1 4250 4272 1499 602 + 1 4248 1496 4250 4272 + 1 4248 1496 4272 1497 + 1 1496 4250 4272 1499 + 1 1496 1497 1499 4272 + 1 4251 561 4277 1535 + 1 4253 4277 602 1537 + 1 1534 1535 1537 91 + 1 4251 4253 1534 1535 + 1 4251 4253 1535 4277 + 1 4253 1534 1535 1537 + 1 4253 4277 1537 1535 + 1 4238 555 4247 4249 + 1 4239 4247 556 4251 + 1 4242 4249 4251 561 + 1 4238 4239 4242 4249 + 1 4238 4239 4249 4247 + 1 4239 4242 4249 4251 + 1 4239 4247 4251 4249 + 1 4238 555 4249 4248 + 1 4241 4248 4270 560 + 1 4242 4249 561 4270 + 1 4238 4241 4249 4242 + 1 4238 4241 4248 4249 + 1 4241 4242 4270 4249 + 1 4241 4248 4249 4270 + 1 4247 556 4251 4253 + 1 4249 4251 561 4277 + 1 4250 4253 4277 602 + 1 4247 4249 4250 4253 + 1 4247 4249 4253 4251 + 1 4249 4250 4253 4277 + 1 4249 4251 4277 4253 + 1 4248 560 4272 4270 + 1 4249 4270 4277 561 + 1 4250 4272 602 4277 + 1 4248 4249 4272 4250 + 1 4248 4249 4270 4272 + 1 4249 4250 4277 4272 + 1 4249 4270 4272 4277 + 1 1380 78 1383 1382 + 1 4258 1382 4287 564 + 1 4259 1383 565 4287 + 1 1380 4258 1383 4259 + 1 1380 4258 1382 1383 + 1 4258 4259 4287 1383 + 1 4258 1382 1383 4287 + 1 4275 564 4288 1536 + 1 1535 1536 1539 91 + 1 4279 4288 619 1539 + 1 4275 1535 4288 4279 + 1 4275 1535 1536 4288 + 1 1535 4279 1539 4288 + 1 1535 1536 4288 1539 + 1 4280 565 1691 4290 + 1 4284 4290 1695 619 + 1 1690 1691 104 1695 + 1 4280 4284 1691 1690 + 1 4280 4284 4290 1691 + 1 4284 1690 1695 1691 + 1 4284 4290 1691 1695 + 1 4255 561 4276 4274 + 1 4256 4274 4280 562 + 1 4259 4276 565 4280 + 1 4255 4256 4276 4259 + 1 4255 4256 4274 4276 + 1 4256 4259 4280 4276 + 1 4256 4274 4276 4280 + 1 4255 561 4275 4276 + 1 4258 4275 564 4287 + 1 4259 4276 4287 565 + 1 4255 4258 4259 4276 + 1 4255 4258 4276 4275 + 1 4258 4259 4276 4287 + 1 4258 4275 4287 4276 + 1 4274 562 4284 4280 + 1 4276 4280 4290 565 + 1 4279 4284 619 4290 + 1 4274 4276 4284 4279 + 1 4274 4276 4280 4284 + 1 4276 4279 4290 4284 + 1 4276 4280 4284 4290 + 1 4275 564 4287 4288 + 1 4276 4287 565 4290 + 1 4279 4288 4290 619 + 1 4275 4276 4279 4288 + 1 4275 4276 4288 4287 + 1 4276 4279 4288 4290 + 1 4276 4287 4290 4288 + 1 1497 88 1499 1502 + 1 4272 1499 602 4437 + 1 4273 1502 4437 605 + 1 1497 4272 4273 1502 + 1 1497 4272 1502 1499 + 1 4272 4273 1502 4437 + 1 4272 1499 4437 1502 + 1 4277 602 1537 4440 + 1 1535 1537 91 1539 + 1 4279 4440 1539 619 + 1 4277 1535 4279 4440 + 1 4277 1535 4440 1537 + 1 1535 4279 4440 1539 + 1 1535 1537 1539 4440 + 1 4283 605 4453 1694 + 1 4284 4453 619 1695 + 1 1690 1694 1695 104 + 1 4283 4284 1690 1694 + 1 4283 4284 1694 4453 + 1 4284 1690 1694 1695 + 1 4284 4453 1695 1694 + 1 4270 561 4274 4278 + 1 4271 4274 562 4283 + 1 4273 4278 4283 605 + 1 4270 4271 4273 4278 + 1 4270 4271 4278 4274 + 1 4271 4273 4278 4283 + 1 4271 4274 4283 4278 + 1 4270 561 4278 4277 + 1 4272 4277 4437 602 + 1 4273 4278 605 4437 + 1 4270 4272 4278 4273 + 1 4270 4272 4277 4278 + 1 4272 4273 4437 4278 + 1 4272 4277 4278 4437 + 1 4274 562 4283 4284 + 1 4278 4283 605 4453 + 1 4279 4284 4453 619 + 1 4274 4278 4279 4284 + 1 4274 4278 4284 4283 + 1 4278 4279 4284 4453 + 1 4278 4283 4453 4284 + 1 4277 602 4440 4437 + 1 4278 4437 4453 605 + 1 4279 4440 619 4453 + 1 4277 4278 4440 4279 + 1 4277 4278 4437 4440 + 1 4278 4279 4453 4440 + 1 4278 4437 4440 4453 + 1 734 2 739 735 + 1 1957 739 135 1962 + 1 1955 735 1962 131 + 1 734 1957 1955 735 + 1 734 1957 735 739 + 1 1957 1955 735 1962 + 1 1957 739 1962 735 + 1 1985 135 998 1986 + 1 1000 998 37 1001 + 1 3294 1986 1001 346 + 1 1985 1000 3294 1986 + 1 1985 1000 1986 998 + 1 1000 3294 1986 1001 + 1 1000 998 1001 1986 + 1 1963 131 1966 964 + 1 3284 1966 346 968 + 1 966 964 968 33 + 1 1963 3284 966 964 + 1 1963 3284 964 1966 + 1 3284 966 964 968 + 1 3284 1966 968 964 + 1 1960 341 3281 1964 + 1 1958 3281 339 1963 + 1 1955 1964 1963 131 + 1 1960 1958 1955 1964 + 1 1960 1958 1964 3281 + 1 1958 1955 1964 1963 + 1 1958 3281 1963 1964 + 1 1960 341 1964 1985 + 1 1957 1985 1962 135 + 1 1955 1964 131 1962 + 1 1960 1957 1964 1955 + 1 1960 1957 1985 1964 + 1 1957 1955 1962 1964 + 1 1957 1985 1964 1962 + 1 3281 339 1963 3284 + 1 1964 1963 131 1966 + 1 3294 3284 1966 346 + 1 3281 1964 3294 3284 + 1 3281 1964 3284 1963 + 1 1964 3294 3284 1966 + 1 1964 1963 1966 3284 + 1 1985 135 1986 1962 + 1 1964 1962 1966 131 + 1 3294 1986 346 1966 + 1 1985 1964 1986 3294 + 1 1985 1964 1962 1986 + 1 1964 3294 1966 1986 + 1 1964 1962 1986 1966 + 1 1006 37 999 1007 + 1 2553 999 228 2554 + 1 3433 1007 2554 370 + 1 1006 2553 3433 1007 + 1 1006 2553 1007 999 + 1 2553 3433 1007 2554 + 1 2553 999 2554 1007 + 1 2548 228 832 2549 + 1 834 832 17 837 + 1 2574 2549 837 233 + 1 2548 834 2574 2549 + 1 2548 834 2549 832 + 1 834 2574 2549 837 + 1 834 832 837 2549 + 1 3439 370 2605 1446 + 1 2607 2605 233 1443 + 1 1448 1446 1443 84 + 1 3439 2607 1448 1446 + 1 3439 2607 1446 2605 + 1 2607 1448 1446 1443 + 1 2607 2605 1443 1446 + 1 2576 230 2580 2577 + 1 3436 2580 537 3439 + 1 3433 2577 3439 370 + 1 2576 3436 3433 2577 + 1 2576 3436 2577 2580 + 1 3436 3433 2577 3439 + 1 3436 2580 3439 2577 + 1 2576 230 2577 2548 + 1 2553 2548 2554 228 + 1 3433 2577 370 2554 + 1 2576 2553 2577 3433 + 1 2576 2553 2548 2577 + 1 2553 3433 2554 2577 + 1 2553 2548 2577 2554 + 1 2580 537 3439 2607 + 1 2577 3439 370 2605 + 1 2574 2607 2605 233 + 1 2580 2577 2574 2607 + 1 2580 2577 2607 3439 + 1 2577 2574 2607 2605 + 1 2577 3439 2605 2607 + 1 2548 228 2549 2554 + 1 2577 2554 2605 370 + 1 2574 2549 233 2605 + 1 2548 2577 2549 2574 + 1 2548 2577 2554 2549 + 1 2577 2574 2605 2549 + 1 2577 2554 2549 2605 + 1 969 33 972 965 + 1 3325 972 350 2319 + 1 2317 965 2319 194 + 1 969 3325 2317 965 + 1 969 3325 965 972 + 1 3325 2317 965 2319 + 1 3325 972 2319 965 + 1 3340 350 1444 2360 + 1 1447 1444 84 1442 + 1 2361 2360 1442 200 + 1 3340 1447 2361 2360 + 1 3340 1447 2360 1444 + 1 1447 2361 2360 1442 + 1 1447 1444 1442 2360 + 1 2314 194 2316 798 + 1 2330 2316 200 804 + 1 800 798 804 13 + 1 2314 2330 800 798 + 1 2314 2330 798 2316 + 1 2330 800 798 804 + 1 2330 2316 804 798 + 1 3327 529 2334 2320 + 1 2331 2334 196 2314 + 1 2317 2320 2314 194 + 1 3327 2331 2317 2320 + 1 3327 2331 2320 2334 + 1 2331 2317 2320 2314 + 1 2331 2334 2314 2320 + 1 3327 529 2320 3340 + 1 3325 3340 2319 350 + 1 2317 2320 194 2319 + 1 3327 3325 2320 2317 + 1 3327 3325 3340 2320 + 1 3325 2317 2319 2320 + 1 3325 3340 2320 2319 + 1 2334 196 2314 2330 + 1 2320 2314 194 2316 + 1 2361 2330 2316 200 + 1 2334 2320 2361 2330 + 1 2334 2320 2330 2314 + 1 2320 2361 2330 2316 + 1 2320 2314 2316 2330 + 1 3340 350 2360 2319 + 1 2320 2319 2316 194 + 1 2361 2360 200 2316 + 1 3340 2320 2360 2361 + 1 3340 2320 2319 2360 + 1 2320 2361 2316 2360 + 1 2320 2319 2360 2316 + 1 1298 71 1303 1299 + 1 3310 1303 526 3331 + 1 3307 1299 3331 348 + 1 1298 3310 3307 1299 + 1 1298 3310 1299 1303 + 1 3310 3307 1299 3331 + 1 3310 1303 3331 1299 + 1 3302 526 1282 3326 + 1 1278 1282 69 1279 + 1 3300 3326 1279 347 + 1 3302 1278 3300 3326 + 1 3302 1278 3326 1282 + 1 1278 3300 3326 1279 + 1 1278 1282 1279 3326 + 1 3286 348 3324 970 + 1 3285 3324 347 969 + 1 966 970 969 33 + 1 3286 3285 966 970 + 1 3286 3285 970 3324 + 1 3285 966 970 969 + 1 3285 3324 969 970 + 1 3299 342 3282 3301 + 1 3283 3282 339 3286 + 1 3307 3301 3286 348 + 1 3299 3283 3307 3301 + 1 3299 3283 3301 3282 + 1 3283 3307 3301 3286 + 1 3283 3282 3286 3301 + 1 3299 342 3301 3302 + 1 3310 3302 3331 526 + 1 3307 3301 348 3331 + 1 3299 3310 3301 3307 + 1 3299 3310 3302 3301 + 1 3310 3307 3331 3301 + 1 3310 3302 3301 3331 + 1 3282 339 3286 3285 + 1 3301 3286 348 3324 + 1 3300 3285 3324 347 + 1 3282 3301 3300 3285 + 1 3282 3301 3285 3286 + 1 3301 3300 3285 3324 + 1 3301 3286 3324 3285 + 1 3302 526 3326 3331 + 1 3301 3331 3324 348 + 1 3300 3326 347 3324 + 1 3302 3301 3326 3300 + 1 3302 3301 3331 3326 + 1 3301 3300 3324 3326 + 1 3301 3331 3326 3324 + 1 1298 71 1299 1300 + 1 3309 1300 3329 369 + 1 3307 1299 348 3329 + 1 1298 3309 1299 3307 + 1 1298 3309 1300 1299 + 1 3309 3307 3329 1299 + 1 3309 1300 1299 3329 + 1 3298 369 3322 1006 + 1 1000 1006 1001 37 + 1 3294 3322 346 1001 + 1 3298 1000 3322 3294 + 1 3298 1000 1006 3322 + 1 1000 3294 1001 3322 + 1 1000 1006 3322 1001 + 1 3286 348 970 3318 + 1 3284 3318 968 346 + 1 966 970 33 968 + 1 3286 3284 970 966 + 1 3286 3284 3318 970 + 1 3284 966 968 970 + 1 3284 3318 970 968 + 1 3293 341 3295 3281 + 1 3283 3281 3286 339 + 1 3307 3295 348 3286 + 1 3293 3283 3295 3307 + 1 3293 3283 3281 3295 + 1 3283 3307 3286 3295 + 1 3283 3281 3295 3286 + 1 3293 341 3298 3295 + 1 3309 3298 369 3329 + 1 3307 3295 3329 348 + 1 3293 3309 3307 3295 + 1 3293 3309 3295 3298 + 1 3309 3307 3295 3329 + 1 3309 3298 3329 3295 + 1 3281 339 3284 3286 + 1 3295 3286 3318 348 + 1 3294 3284 346 3318 + 1 3281 3295 3284 3294 + 1 3281 3295 3286 3284 + 1 3295 3294 3318 3284 + 1 3295 3286 3284 3318 + 1 3298 369 3329 3322 + 1 3295 3329 348 3318 + 1 3294 3322 3318 346 + 1 3298 3295 3294 3322 + 1 3298 3295 3322 3329 + 1 3295 3294 3322 3318 + 1 3295 3329 3318 3322 + 1 1282 69 1279 1285 + 1 3326 1279 347 3327 + 1 4138 1285 3327 529 + 1 1282 3326 4138 1285 + 1 1282 3326 1285 1279 + 1 3326 4138 1285 3327 + 1 3326 1279 3327 1285 + 1 3324 347 969 3325 + 1 970 969 33 972 + 1 3328 3325 972 350 + 1 3324 970 3328 3325 + 1 3324 970 3325 969 + 1 970 3328 3325 972 + 1 970 969 972 3325 + 1 4148 529 3340 1447 + 1 3341 3340 350 1444 + 1 1448 1447 1444 84 + 1 4148 3341 1448 1447 + 1 4148 3341 1447 3340 + 1 3341 1448 1447 1444 + 1 3341 3340 1444 1447 + 1 3331 348 3333 3332 + 1 4140 3333 537 4148 + 1 4138 3332 4148 529 + 1 3331 4140 4138 3332 + 1 3331 4140 3332 3333 + 1 4140 4138 3332 4148 + 1 4140 3333 4148 3332 + 1 3331 348 3332 3324 + 1 3326 3324 3327 347 + 1 4138 3332 529 3327 + 1 3331 3326 3332 4138 + 1 3331 3326 3324 3332 + 1 3326 4138 3327 3332 + 1 3326 3324 3332 3327 + 1 3333 537 4148 3341 + 1 3332 4148 529 3340 + 1 3328 3341 3340 350 + 1 3333 3332 3328 3341 + 1 3333 3332 3341 4148 + 1 3332 3328 3341 3340 + 1 3332 4148 3340 3341 + 1 3324 347 3325 3327 + 1 3332 3327 3340 529 + 1 3328 3325 350 3340 + 1 3324 3332 3325 3328 + 1 3324 3332 3327 3325 + 1 3332 3328 3340 3325 + 1 3332 3327 3325 3340 + 1 1006 37 1007 1001 + 1 3322 1001 3323 346 + 1 3433 1007 370 3323 + 1 1006 3322 1007 3433 + 1 1006 3322 1001 1007 + 1 3322 3433 3323 1007 + 1 3322 1001 1007 3323 + 1 3318 346 3319 968 + 1 970 968 972 33 + 1 3328 3319 350 972 + 1 3318 970 3319 3328 + 1 3318 970 968 3319 + 1 970 3328 972 3319 + 1 970 968 3319 972 + 1 3439 370 1446 3339 + 1 3341 3339 1444 350 + 1 1448 1446 84 1444 + 1 3439 3341 1446 1448 + 1 3439 3341 3339 1446 + 1 3341 1448 1444 1446 + 1 3341 3339 1446 1444 + 1 3329 348 3330 3333 + 1 3436 3333 3439 537 + 1 3433 3330 370 3439 + 1 3329 3436 3330 3433 + 1 3329 3436 3333 3330 + 1 3436 3433 3439 3330 + 1 3436 3333 3330 3439 + 1 3329 348 3318 3330 + 1 3322 3318 346 3323 + 1 3433 3330 3323 370 + 1 3329 3322 3433 3330 + 1 3329 3322 3330 3318 + 1 3322 3433 3330 3323 + 1 3322 3318 3323 3330 + 1 3333 537 3341 3439 + 1 3330 3439 3339 370 + 1 3328 3341 350 3339 + 1 3333 3330 3341 3328 + 1 3333 3330 3439 3341 + 1 3330 3328 3339 3341 + 1 3330 3439 3341 3339 + 1 3318 346 3323 3319 + 1 3330 3323 370 3339 + 1 3328 3319 3339 350 + 1 3318 3330 3328 3319 + 1 3318 3330 3319 3323 + 1 3330 3328 3319 3339 + 1 3330 3323 3339 3319 + 1 836 17 833 841 + 1 2560 833 229 2561 + 1 2595 841 2561 237 + 1 836 2560 2595 841 + 1 836 2560 841 833 + 1 2560 2595 841 2561 + 1 2560 833 2561 841 + 1 2565 229 1154 2566 + 1 1160 1154 56 1162 + 1 3841 2566 1162 462 + 1 2565 1160 3841 2566 + 1 2565 1160 2566 1154 + 1 1160 3841 2566 1162 + 1 1160 1154 1162 2566 + 1 2644 237 2642 1672 + 1 3855 2642 462 1675 + 1 1678 1672 1675 103 + 1 2644 3855 1678 1672 + 1 2644 3855 1672 2642 + 1 3855 1678 1672 1675 + 1 3855 2642 1675 1672 + 1 2597 460 3844 2641 + 1 2601 3844 574 2644 + 1 2595 2641 2644 237 + 1 2597 2601 2595 2641 + 1 2597 2601 2641 3844 + 1 2601 2595 2641 2644 + 1 2601 3844 2644 2641 + 1 2597 460 2641 2565 + 1 2560 2565 2561 229 + 1 2595 2641 237 2561 + 1 2597 2560 2641 2595 + 1 2597 2560 2565 2641 + 1 2560 2595 2561 2641 + 1 2560 2565 2641 2561 + 1 3844 574 2644 3855 + 1 2641 2644 237 2642 + 1 3841 3855 2642 462 + 1 3844 2641 3841 3855 + 1 3844 2641 3855 2644 + 1 2641 3841 3855 2642 + 1 2641 2644 2642 3855 + 1 2565 229 2566 2561 + 1 2641 2561 2642 237 + 1 3841 2566 462 2642 + 1 2565 2641 2566 3841 + 1 2565 2641 2561 2566 + 1 2641 3841 2642 2566 + 1 2641 2561 2566 2642 + 1 1155 56 1153 1156 + 1 2076 1153 154 2078 + 1 3774 1156 2078 456 + 1 1155 2076 3774 1156 + 1 1155 2076 1156 1153 + 1 2076 3774 1156 2078 + 1 2076 1153 2078 1156 + 1 2065 154 758 2072 + 1 757 758 7 759 + 1 2066 2072 759 155 + 1 2065 757 2066 2072 + 1 2065 757 2072 758 + 1 757 2066 2072 759 + 1 757 758 759 2072 + 1 3781 456 2085 1170 + 1 2084 2085 155 1167 + 1 1169 1170 1167 57 + 1 3781 2084 1169 1170 + 1 3781 2084 1170 2085 + 1 2084 1169 1170 1167 + 1 2084 2085 1167 1170 + 1 2068 153 2069 2071 + 1 3769 2069 450 3781 + 1 3774 2071 3781 456 + 1 2068 3769 3774 2071 + 1 2068 3769 2071 2069 + 1 3769 3774 2071 3781 + 1 3769 2069 3781 2071 + 1 2068 153 2071 2065 + 1 2076 2065 2078 154 + 1 3774 2071 456 2078 + 1 2068 2076 2071 3774 + 1 2068 2076 2065 2071 + 1 2076 3774 2078 2071 + 1 2076 2065 2071 2078 + 1 2069 450 3781 2084 + 1 2071 3781 456 2085 + 1 2066 2084 2085 155 + 1 2069 2071 2066 2084 + 1 2069 2071 2084 3781 + 1 2071 2066 2084 2085 + 1 2071 3781 2085 2084 + 1 2065 154 2072 2078 + 1 2071 2078 2085 456 + 1 2066 2072 155 2085 + 1 2065 2071 2072 2066 + 1 2065 2071 2078 2072 + 1 2071 2066 2085 2072 + 1 2071 2078 2072 2085 + 1 1679 103 1676 1673 + 1 3892 1676 469 2857 + 1 2859 1673 2857 266 + 1 1679 3892 2859 1673 + 1 1679 3892 1673 1676 + 1 3892 2859 1673 2857 + 1 3892 1676 2857 1673 + 1 3888 469 1173 2819 + 1 1172 1173 57 1168 + 1 2818 2819 1168 261 + 1 3888 1172 2818 2819 + 1 3888 1172 2819 1173 + 1 1172 2818 2819 1168 + 1 1172 1173 1168 2819 + 1 2830 266 2816 870 + 1 2815 2816 261 865 + 1 867 870 865 20 + 1 2830 2815 867 870 + 1 2830 2815 870 2816 + 1 2815 867 870 865 + 1 2815 2816 865 870 + 1 3889 468 2831 2856 + 1 2834 2831 263 2830 + 1 2859 2856 2830 266 + 1 3889 2834 2859 2856 + 1 3889 2834 2856 2831 + 1 2834 2859 2856 2830 + 1 2834 2831 2830 2856 + 1 3889 468 2856 3888 + 1 3892 3888 2857 469 + 1 2859 2856 266 2857 + 1 3889 3892 2856 2859 + 1 3889 3892 3888 2856 + 1 3892 2859 2857 2856 + 1 3892 3888 2856 2857 + 1 2831 263 2830 2815 + 1 2856 2830 266 2816 + 1 2818 2815 2816 261 + 1 2831 2856 2818 2815 + 1 2831 2856 2815 2830 + 1 2856 2818 2815 2816 + 1 2856 2830 2816 2815 + 1 3888 469 2819 2857 + 1 2856 2857 2816 266 + 1 2818 2819 261 2816 + 1 3888 2856 2819 2818 + 1 3888 2856 2857 2819 + 1 2856 2818 2816 2819 + 1 2856 2857 2819 2816 + 1 1149 55 1150 1152 + 1 3788 1150 453 3796 + 1 3790 1152 3796 455 + 1 1149 3788 3790 1152 + 1 1149 3788 1152 1150 + 1 3788 3790 1152 3796 + 1 3788 1150 3796 1152 + 1 3798 453 1414 3799 + 1 1419 1414 81 1421 + 1 4320 3799 1421 577 + 1 3798 1419 4320 3799 + 1 3798 1419 3799 1414 + 1 1419 4320 3799 1421 + 1 1419 1414 1421 3799 + 1 3809 455 3810 1674 + 1 4325 3810 577 1679 + 1 1678 1674 1679 103 + 1 3809 4325 1678 1674 + 1 3809 4325 1674 3810 + 1 4325 1678 1674 1679 + 1 4325 3810 1679 1674 + 1 3793 571 4319 3808 + 1 3795 4319 574 3809 + 1 3790 3808 3809 455 + 1 3793 3795 3790 3808 + 1 3793 3795 3808 4319 + 1 3795 3790 3808 3809 + 1 3795 4319 3809 3808 + 1 3793 571 3808 3798 + 1 3788 3798 3796 453 + 1 3790 3808 455 3796 + 1 3793 3788 3808 3790 + 1 3793 3788 3798 3808 + 1 3788 3790 3796 3808 + 1 3788 3798 3808 3796 + 1 4319 574 3809 4325 + 1 3808 3809 455 3810 + 1 4320 4325 3810 577 + 1 4319 3808 4320 4325 + 1 4319 3808 4325 3809 + 1 3808 4320 4325 3810 + 1 3808 3809 3810 4325 + 1 3798 453 3799 3796 + 1 3808 3796 3810 455 + 1 4320 3799 577 3810 + 1 3798 3808 3799 4320 + 1 3798 3808 3796 3799 + 1 3808 4320 3810 3799 + 1 3808 3796 3799 3810 + 1 1149 55 1152 1146 + 1 3771 1146 3773 449 + 1 3790 1152 455 3773 + 1 1149 3771 1152 3790 + 1 1149 3771 1146 1152 + 1 3771 3790 3773 1152 + 1 3771 1146 1152 3773 + 1 3776 449 3778 1155 + 1 1160 1155 1162 56 + 1 3841 3778 462 1162 + 1 3776 1160 3778 3841 + 1 3776 1160 1155 3778 + 1 1160 3841 1162 3778 + 1 1160 1155 3778 1162 + 1 3809 455 1674 3805 + 1 3855 3805 1675 462 + 1 1678 1674 103 1675 + 1 3809 3855 1674 1678 + 1 3809 3855 3805 1674 + 1 3855 1678 1675 1674 + 1 3855 3805 1674 1675 + 1 3791 460 3804 3844 + 1 3795 3844 3809 574 + 1 3790 3804 455 3809 + 1 3791 3795 3804 3790 + 1 3791 3795 3844 3804 + 1 3795 3790 3809 3804 + 1 3795 3844 3804 3809 + 1 3791 460 3776 3804 + 1 3771 3776 449 3773 + 1 3790 3804 3773 455 + 1 3791 3771 3790 3804 + 1 3791 3771 3804 3776 + 1 3771 3790 3804 3773 + 1 3771 3776 3773 3804 + 1 3844 574 3855 3809 + 1 3804 3809 3805 455 + 1 3841 3855 462 3805 + 1 3844 3804 3855 3841 + 1 3844 3804 3809 3855 + 1 3804 3841 3805 3855 + 1 3804 3809 3855 3805 + 1 3776 449 3773 3778 + 1 3804 3773 455 3805 + 1 3841 3778 3805 462 + 1 3776 3804 3841 3778 + 1 3776 3804 3778 3773 + 1 3804 3841 3778 3805 + 1 3804 3773 3805 3778 + 1 1414 81 1421 1415 + 1 3799 1421 577 3889 + 1 3797 1415 3889 468 + 1 1414 3799 3797 1415 + 1 1414 3799 1415 1421 + 1 3799 3797 1415 3889 + 1 3799 1421 3889 1415 + 1 3810 577 1679 3892 + 1 1674 1679 103 1676 + 1 3807 3892 1676 469 + 1 3810 1674 3807 3892 + 1 3810 1674 3892 1679 + 1 1674 3807 3892 1676 + 1 1674 1679 1676 3892 + 1 3782 468 3888 1172 + 1 3783 3888 469 1173 + 1 1169 1172 1173 57 + 1 3782 3783 1169 1172 + 1 3782 3783 1172 3888 + 1 3783 1169 1172 1173 + 1 3783 3888 1173 1172 + 1 3796 455 3780 3806 + 1 3779 3780 450 3782 + 1 3797 3806 3782 468 + 1 3796 3779 3797 3806 + 1 3796 3779 3806 3780 + 1 3779 3797 3806 3782 + 1 3779 3780 3782 3806 + 1 3796 455 3806 3810 + 1 3799 3810 3889 577 + 1 3797 3806 468 3889 + 1 3796 3799 3806 3797 + 1 3796 3799 3810 3806 + 1 3799 3797 3889 3806 + 1 3799 3810 3806 3889 + 1 3780 450 3782 3783 + 1 3806 3782 468 3888 + 1 3807 3783 3888 469 + 1 3780 3806 3807 3783 + 1 3780 3806 3783 3782 + 1 3806 3807 3783 3888 + 1 3806 3782 3888 3783 + 1 3810 577 3892 3889 + 1 3806 3889 3888 468 + 1 3807 3892 469 3888 + 1 3810 3806 3892 3807 + 1 3810 3806 3889 3892 + 1 3806 3807 3888 3892 + 1 3806 3889 3892 3888 + 1 1155 56 1156 1162 + 1 3778 1162 3812 462 + 1 3774 1156 456 3812 + 1 1155 3778 1156 3774 + 1 1155 3778 1162 1156 + 1 3778 3774 3812 1156 + 1 3778 1162 1156 3812 + 1 3805 462 3853 1675 + 1 1674 1675 1676 103 + 1 3807 3853 469 1676 + 1 3805 1674 3853 3807 + 1 3805 1674 1675 3853 + 1 1674 3807 1676 3853 + 1 1674 1675 3853 1676 + 1 3781 456 1170 3815 + 1 3783 3815 1173 469 + 1 1169 1170 57 1173 + 1 3781 3783 1170 1169 + 1 3781 3783 3815 1170 + 1 3783 1169 1173 1170 + 1 3783 3815 1170 1173 + 1 3773 455 3803 3780 + 1 3769 3780 3781 450 + 1 3774 3803 456 3781 + 1 3773 3769 3803 3774 + 1 3773 3769 3780 3803 + 1 3769 3774 3781 3803 + 1 3769 3780 3803 3781 + 1 3773 455 3805 3803 + 1 3778 3805 462 3812 + 1 3774 3803 3812 456 + 1 3773 3778 3774 3803 + 1 3773 3778 3803 3805 + 1 3778 3774 3803 3812 + 1 3778 3805 3812 3803 + 1 3780 450 3783 3781 + 1 3803 3781 3815 456 + 1 3807 3783 469 3815 + 1 3780 3803 3783 3807 + 1 3780 3803 3781 3783 + 1 3803 3807 3815 3783 + 1 3803 3781 3783 3815 + 1 3805 462 3812 3853 + 1 3803 3812 456 3815 + 1 3807 3853 3815 469 + 1 3805 3803 3807 3853 + 1 3805 3803 3853 3812 + 1 3803 3807 3853 3815 + 1 3803 3812 3815 3853 + 1 801 13 806 799 + 1 2336 806 202 2323 + 1 2321 799 2323 195 + 1 801 2336 2321 799 + 1 801 2336 799 806 + 1 2336 2321 799 2323 + 1 2336 806 2323 799 + 1 2373 202 1466 2372 + 1 1470 1466 86 1468 + 1 3530 2372 1468 390 + 1 2373 1470 3530 2372 + 1 2373 1470 2372 1466 + 1 1470 3530 2372 1468 + 1 1470 1466 1468 2372 + 1 2324 195 2326 1031 + 1 3515 2326 390 1038 + 1 1035 1031 1038 40 + 1 2324 3515 1035 1031 + 1 2324 3515 1031 2326 + 1 3515 1035 1031 1038 + 1 3515 2326 1038 1031 + 1 2340 545 3517 2327 + 1 2337 3517 387 2324 + 1 2321 2327 2324 195 + 1 2340 2337 2321 2327 + 1 2340 2337 2327 3517 + 1 2337 2321 2327 2324 + 1 2337 3517 2324 2327 + 1 2340 545 2327 2373 + 1 2336 2373 2323 202 + 1 2321 2327 195 2323 + 1 2340 2336 2327 2321 + 1 2340 2336 2373 2327 + 1 2336 2321 2323 2327 + 1 2336 2373 2327 2323 + 1 3517 387 2324 3515 + 1 2327 2324 195 2326 + 1 3530 3515 2326 390 + 1 3517 2327 3530 3515 + 1 3517 2327 3515 2324 + 1 2327 3530 3515 2326 + 1 2327 2324 2326 3515 + 1 2373 202 2372 2323 + 1 2327 2323 2326 195 + 1 3530 2372 390 2326 + 1 2373 2327 2372 3530 + 1 2373 2327 2323 2372 + 1 2327 3530 2326 2372 + 1 2327 2323 2372 2326 + 1 1471 86 1467 1469 + 1 2839 1467 264 2838 + 1 3551 1469 2838 396 + 1 1471 2839 3551 1469 + 1 1471 2839 1469 1467 + 1 2839 3551 1469 2838 + 1 2839 1467 2838 1469 + 1 2823 264 868 2809 + 1 866 868 20 864 + 1 2808 2809 864 260 + 1 2823 866 2808 2809 + 1 2823 866 2809 868 + 1 866 2808 2809 864 + 1 866 868 864 2809 + 1 3543 396 2812 1052 + 1 2811 2812 260 1046 + 1 1050 1052 1046 42 + 1 3543 2811 1050 1052 + 1 3543 2811 1052 2812 + 1 2811 1050 1052 1046 + 1 2811 2812 1046 1052 + 1 2827 262 2824 2825 + 1 3544 2824 394 3543 + 1 3551 2825 3543 396 + 1 2827 3544 3551 2825 + 1 2827 3544 2825 2824 + 1 3544 3551 2825 3543 + 1 3544 2824 3543 2825 + 1 2827 262 2825 2823 + 1 2839 2823 2838 264 + 1 3551 2825 396 2838 + 1 2827 2839 2825 3551 + 1 2827 2839 2823 2825 + 1 2839 3551 2838 2825 + 1 2839 2823 2825 2838 + 1 2824 394 3543 2811 + 1 2825 3543 396 2812 + 1 2808 2811 2812 260 + 1 2824 2825 2808 2811 + 1 2824 2825 2811 3543 + 1 2825 2808 2811 2812 + 1 2825 3543 2812 2811 + 1 2823 264 2809 2838 + 1 2825 2838 2812 396 + 1 2808 2809 260 2812 + 1 2823 2825 2809 2808 + 1 2823 2825 2838 2809 + 1 2825 2808 2812 2809 + 1 2825 2838 2809 2812 + 1 1032 40 1034 1030 + 1 3488 1034 386 2006 + 1 2003 1030 2006 138 + 1 1032 3488 2003 1030 + 1 1032 3488 1030 1034 + 1 3488 2003 1030 2006 + 1 3488 1034 2006 1030 + 1 3492 386 1048 2012 + 1 1047 1048 42 1045 + 1 2010 2012 1045 140 + 1 3492 1047 2010 2012 + 1 3492 1047 2012 1048 + 1 1047 2010 2012 1045 + 1 1047 1048 1045 2012 + 1 1997 138 2002 742 + 1 1998 2002 140 744 + 1 741 742 744 3 + 1 1997 1998 741 742 + 1 1997 1998 742 2002 + 1 1998 741 742 744 + 1 1998 2002 744 742 + 1 3485 382 2000 2004 + 1 1999 2000 137 1997 + 1 2003 2004 1997 138 + 1 3485 1999 2003 2004 + 1 3485 1999 2004 2000 + 1 1999 2003 2004 1997 + 1 1999 2000 1997 2004 + 1 3485 382 2004 3492 + 1 3488 3492 2006 386 + 1 2003 2004 138 2006 + 1 3485 3488 2004 2003 + 1 3485 3488 3492 2004 + 1 3488 2003 2006 2004 + 1 3488 3492 2004 2006 + 1 2000 137 1997 1998 + 1 2004 1997 138 2002 + 1 2010 1998 2002 140 + 1 2000 2004 2010 1998 + 1 2000 2004 1998 1997 + 1 2004 2010 1998 2002 + 1 2004 1997 2002 1998 + 1 3492 386 2012 2006 + 1 2004 2006 2002 138 + 1 2010 2012 140 2002 + 1 3492 2004 2012 2010 + 1 3492 2004 2006 2012 + 1 2004 2010 2002 2012 + 1 2004 2006 2012 2002 + 1 1336 74 1332 1333 + 1 3501 1332 384 3499 + 1 3521 1333 3499 388 + 1 1336 3501 3521 1333 + 1 1336 3501 1333 1332 + 1 3501 3521 1333 3499 + 1 3501 1332 3499 1333 + 1 3495 384 1029 3487 + 1 1028 1029 39 1026 + 1 3486 3487 1026 381 + 1 3495 1028 3486 3487 + 1 3495 1028 3487 1029 + 1 1028 3486 3487 1026 + 1 1028 1029 1026 3487 + 1 3514 388 3490 1036 + 1 3489 3490 381 1032 + 1 1035 1036 1032 40 + 1 3514 3489 1035 1036 + 1 3514 3489 1036 3490 + 1 3489 1035 1036 1032 + 1 3489 3490 1032 1036 + 1 3498 383 3496 3497 + 1 3516 3496 387 3514 + 1 3521 3497 3514 388 + 1 3498 3516 3521 3497 + 1 3498 3516 3497 3496 + 1 3516 3521 3497 3514 + 1 3516 3496 3514 3497 + 1 3498 383 3497 3495 + 1 3501 3495 3499 384 + 1 3521 3497 388 3499 + 1 3498 3501 3497 3521 + 1 3498 3501 3495 3497 + 1 3501 3521 3499 3497 + 1 3501 3495 3497 3499 + 1 3496 387 3514 3489 + 1 3497 3514 388 3490 + 1 3486 3489 3490 381 + 1 3496 3497 3486 3489 + 1 3496 3497 3489 3514 + 1 3497 3486 3489 3490 + 1 3497 3514 3490 3489 + 1 3495 384 3487 3499 + 1 3497 3499 3490 388 + 1 3486 3487 381 3490 + 1 3495 3497 3487 3486 + 1 3495 3497 3499 3487 + 1 3497 3486 3490 3487 + 1 3497 3499 3487 3490 + 1 1336 74 1333 1339 + 1 4203 1339 3523 548 + 1 3521 1333 388 3523 + 1 1336 4203 1333 3521 + 1 1336 4203 1339 1333 + 1 4203 3521 3523 1333 + 1 4203 1339 1333 3523 + 1 4208 548 3531 1471 + 1 1470 1471 1468 86 + 1 3530 3531 390 1468 + 1 4208 1470 3531 3530 + 1 4208 1470 1471 3531 + 1 1470 3530 1468 3531 + 1 1470 1471 3531 1468 + 1 3514 388 1036 3518 + 1 3515 3518 1038 390 + 1 1035 1036 40 1038 + 1 3514 3515 1036 1035 + 1 3514 3515 3518 1036 + 1 3515 1035 1038 1036 + 1 3515 3518 1036 1038 + 1 4201 545 3522 3517 + 1 3516 3517 3514 387 + 1 3521 3522 388 3514 + 1 4201 3516 3522 3521 + 1 4201 3516 3517 3522 + 1 3516 3521 3514 3522 + 1 3516 3517 3522 3514 + 1 4201 545 4208 3522 + 1 4203 4208 548 3523 + 1 3521 3522 3523 388 + 1 4201 4203 3521 3522 + 1 4201 4203 3522 4208 + 1 4203 3521 3522 3523 + 1 4203 4208 3523 3522 + 1 3517 387 3515 3514 + 1 3522 3514 3518 388 + 1 3530 3515 390 3518 + 1 3517 3522 3515 3530 + 1 3517 3522 3514 3515 + 1 3522 3530 3518 3515 + 1 3522 3514 3515 3518 + 1 4208 548 3523 3531 + 1 3522 3523 388 3518 + 1 3530 3531 3518 390 + 1 4208 3522 3530 3531 + 1 4208 3522 3531 3523 + 1 3522 3530 3531 3518 + 1 3522 3523 3518 3531 + 1 1029 39 1026 1027 + 1 3487 1026 381 3485 + 1 3491 1027 3485 382 + 1 1029 3487 3491 1027 + 1 1029 3487 1027 1026 + 1 3487 3491 1027 3485 + 1 3487 1026 3485 1027 + 1 3490 381 1032 3488 + 1 1036 1032 40 1034 + 1 3507 3488 1034 386 + 1 3490 1036 3507 3488 + 1 3490 1036 3488 1032 + 1 1036 3507 3488 1034 + 1 1036 1032 1034 3488 + 1 3494 382 3492 1047 + 1 3511 3492 386 1048 + 1 1050 1047 1048 42 + 1 3494 3511 1050 1047 + 1 3494 3511 1047 3492 + 1 3511 1050 1047 1048 + 1 3511 3492 1048 1047 + 1 3499 388 3519 3493 + 1 3500 3519 394 3494 + 1 3491 3493 3494 382 + 1 3499 3500 3491 3493 + 1 3499 3500 3493 3519 + 1 3500 3491 3493 3494 + 1 3500 3519 3494 3493 + 1 3499 388 3493 3490 + 1 3487 3490 3485 381 + 1 3491 3493 382 3485 + 1 3499 3487 3493 3491 + 1 3499 3487 3490 3493 + 1 3487 3491 3485 3493 + 1 3487 3490 3493 3485 + 1 3519 394 3494 3511 + 1 3493 3494 382 3492 + 1 3507 3511 3492 386 + 1 3519 3493 3507 3511 + 1 3519 3493 3511 3494 + 1 3493 3507 3511 3492 + 1 3493 3494 3492 3511 + 1 3490 381 3488 3485 + 1 3493 3485 3492 382 + 1 3507 3488 386 3492 + 1 3490 3493 3488 3507 + 1 3490 3493 3485 3488 + 1 3493 3507 3492 3488 + 1 3493 3485 3488 3492 + 1 1471 86 1469 1468 + 1 3531 1468 3529 390 + 1 3551 1469 396 3529 + 1 1471 3531 1469 3551 + 1 1471 3531 1468 1469 + 1 3531 3551 3529 1469 + 1 3531 1468 1469 3529 + 1 3518 390 3509 1038 + 1 1036 1038 1034 40 + 1 3507 3509 386 1034 + 1 3518 1036 3509 3507 + 1 3518 1036 1038 3509 + 1 1036 3507 1034 3509 + 1 1036 1038 3509 1034 + 1 3543 396 1052 3513 + 1 3511 3513 1048 386 + 1 1050 1052 42 1048 + 1 3543 3511 1052 1050 + 1 3543 3511 3513 1052 + 1 3511 1050 1048 1052 + 1 3511 3513 1052 1048 + 1 3523 388 3520 3519 + 1 3544 3519 3543 394 + 1 3551 3520 396 3543 + 1 3523 3544 3520 3551 + 1 3523 3544 3519 3520 + 1 3544 3551 3543 3520 + 1 3544 3519 3520 3543 + 1 3523 388 3518 3520 + 1 3531 3518 390 3529 + 1 3551 3520 3529 396 + 1 3523 3531 3551 3520 + 1 3523 3531 3520 3518 + 1 3531 3551 3520 3529 + 1 3531 3518 3529 3520 + 1 3519 394 3511 3543 + 1 3520 3543 3513 396 + 1 3507 3511 386 3513 + 1 3519 3520 3511 3507 + 1 3519 3520 3543 3511 + 1 3520 3507 3513 3511 + 1 3520 3543 3511 3513 + 1 3518 390 3529 3509 + 1 3520 3529 396 3513 + 1 3507 3509 3513 386 + 1 3518 3520 3507 3509 + 1 3518 3520 3509 3529 + 1 3520 3507 3509 3513 + 1 3520 3529 3513 3509 + 1 791 12 792 794 + 1 2264 792 188 2275 + 1 2266 794 2275 190 + 1 791 2264 2266 794 + 1 791 2264 794 792 + 1 2264 2266 794 2275 + 1 2264 792 2275 794 + 1 2278 188 1311 2279 + 1 1315 1311 72 1318 + 1 4116 2279 1318 541 + 1 2278 1315 4116 2279 + 1 2278 1315 2279 1311 + 1 1315 4116 2279 1318 + 1 1315 1311 1318 2279 + 1 2290 190 2292 1384 + 1 4130 2292 541 1390 + 1 1387 1384 1390 79 + 1 2290 4130 1387 1384 + 1 2290 4130 1384 2292 + 1 4130 1387 1384 1390 + 1 4130 2292 1390 1384 + 1 2270 521 4115 2289 + 1 2272 4115 524 2290 + 1 2266 2289 2290 190 + 1 2270 2272 2266 2289 + 1 2270 2272 2289 4115 + 1 2272 2266 2289 2290 + 1 2272 4115 2290 2289 + 1 2270 521 2289 2278 + 1 2264 2278 2275 188 + 1 2266 2289 190 2275 + 1 2270 2264 2289 2266 + 1 2270 2264 2278 2289 + 1 2264 2266 2275 2289 + 1 2264 2278 2289 2275 + 1 4115 524 2290 4130 + 1 2289 2290 190 2292 + 1 4116 4130 2292 541 + 1 4115 2289 4116 4130 + 1 4115 2289 4130 2290 + 1 2289 4116 4130 2292 + 1 2289 2290 2292 4130 + 1 2278 188 2279 2275 + 1 2289 2275 2292 190 + 1 4116 2279 541 2292 + 1 2278 2289 2279 4116 + 1 2278 2289 2275 2279 + 1 2289 4116 2292 2279 + 1 2289 2275 2279 2292 + 1 1314 72 1310 1316 + 1 2195 1310 175 2196 + 1 4058 1316 2196 539 + 1 1314 2195 4058 1316 + 1 1314 2195 1316 1310 + 1 2195 4058 1316 2196 + 1 2195 1310 2196 1316 + 1 2185 175 779 2192 + 1 778 779 10 780 + 1 2186 2192 780 176 + 1 2185 778 2186 2192 + 1 2185 778 2192 779 + 1 778 2186 2192 780 + 1 778 779 780 2192 + 1 4062 539 2201 1326 + 1 2200 2201 176 1320 + 1 1324 1326 1320 73 + 1 4062 2200 1324 1326 + 1 4062 2200 1326 2201 + 1 2200 1324 1326 1320 + 1 2200 2201 1320 1326 + 1 2189 174 2190 2191 + 1 4055 2190 511 4062 + 1 4058 2191 4062 539 + 1 2189 4055 4058 2191 + 1 2189 4055 2191 2190 + 1 4055 4058 2191 4062 + 1 4055 2190 4062 2191 + 1 2189 174 2191 2185 + 1 2195 2185 2196 175 + 1 4058 2191 539 2196 + 1 2189 2195 2191 4058 + 1 2189 2195 2185 2191 + 1 2195 4058 2196 2191 + 1 2195 2185 2191 2196 + 1 2190 511 4062 2200 + 1 2191 4062 539 2201 + 1 2186 2200 2201 176 + 1 2190 2191 2186 2200 + 1 2190 2191 2200 4062 + 1 2191 2186 2200 2201 + 1 2191 4062 2201 2200 + 1 2185 175 2192 2196 + 1 2191 2196 2201 539 + 1 2186 2192 176 2201 + 1 2185 2191 2192 2186 + 1 2185 2191 2196 2192 + 1 2191 2186 2201 2192 + 1 2191 2196 2192 2201 + 1 1388 79 1391 1385 + 1 4145 1391 544 2346 + 1 2344 1385 2346 198 + 1 1388 4145 2344 1385 + 1 1388 4145 1385 1391 + 1 4145 2344 1385 2346 + 1 4145 1391 2346 1385 + 1 4142 544 1328 2339 + 1 1325 1328 73 1321 + 1 2338 2339 1321 197 + 1 4142 1325 2338 2339 + 1 4142 1325 2339 1328 + 1 1325 2338 2339 1321 + 1 1325 1328 1321 2339 + 1 2329 198 2335 802 + 1 2328 2335 197 801 + 1 800 802 801 13 + 1 2329 2328 800 802 + 1 2329 2328 802 2335 + 1 2328 800 802 801 + 1 2328 2335 801 802 + 1 4141 527 2332 2343 + 1 2333 2332 196 2329 + 1 2344 2343 2329 198 + 1 4141 2333 2344 2343 + 1 4141 2333 2343 2332 + 1 2333 2344 2343 2329 + 1 2333 2332 2329 2343 + 1 4141 527 2343 4142 + 1 4145 4142 2346 544 + 1 2344 2343 198 2346 + 1 4141 4145 2343 2344 + 1 4141 4145 4142 2343 + 1 4145 2344 2346 2343 + 1 4145 4142 2343 2346 + 1 2332 196 2329 2328 + 1 2343 2329 198 2335 + 1 2338 2328 2335 197 + 1 2332 2343 2338 2328 + 1 2332 2343 2328 2329 + 1 2343 2338 2328 2335 + 1 2343 2329 2335 2328 + 1 4142 544 2339 2346 + 1 2343 2346 2335 198 + 1 2338 2339 197 2335 + 1 4142 2343 2339 2338 + 1 4142 2343 2346 2339 + 1 2343 2338 2335 2339 + 1 2343 2346 2339 2335 + 1 1247 66 1248 1251 + 1 4044 1248 509 4051 + 1 4046 1251 4051 512 + 1 1247 4044 4046 1251 + 1 1247 4044 1251 1248 + 1 4044 4046 1251 4051 + 1 4044 1248 4051 1251 + 1 4052 509 1280 4054 + 1 1281 1280 69 1284 + 1 4106 4054 1284 528 + 1 4052 1281 4106 4054 + 1 4052 1281 4054 1280 + 1 1281 4106 4054 1284 + 1 1281 1280 1284 4054 + 1 4066 512 4068 1386 + 1 4128 4068 528 1388 + 1 1387 1386 1388 79 + 1 4066 4128 1387 1386 + 1 4066 4128 1386 4068 + 1 4128 1387 1386 1388 + 1 4128 4068 1388 1386 + 1 4047 519 4104 4064 + 1 4049 4104 524 4066 + 1 4046 4064 4066 512 + 1 4047 4049 4046 4064 + 1 4047 4049 4064 4104 + 1 4049 4046 4064 4066 + 1 4049 4104 4066 4064 + 1 4047 519 4064 4052 + 1 4044 4052 4051 509 + 1 4046 4064 512 4051 + 1 4047 4044 4064 4046 + 1 4047 4044 4052 4064 + 1 4044 4046 4051 4064 + 1 4044 4052 4064 4051 + 1 4104 524 4066 4128 + 1 4064 4066 512 4068 + 1 4106 4128 4068 528 + 1 4104 4064 4106 4128 + 1 4104 4064 4128 4066 + 1 4064 4106 4128 4068 + 1 4064 4066 4068 4128 + 1 4052 509 4054 4051 + 1 4064 4051 4068 512 + 1 4106 4054 528 4068 + 1 4052 4064 4054 4106 + 1 4052 4064 4051 4054 + 1 4064 4106 4068 4054 + 1 4064 4051 4054 4068 + 1 1247 66 1251 1249 + 1 4045 1249 4056 510 + 1 4046 1251 512 4056 + 1 1247 4045 1251 4046 + 1 1247 4045 1249 1251 + 1 4045 4046 4056 1251 + 1 4045 1249 1251 4056 + 1 4057 510 4059 1314 + 1 1315 1314 1318 72 + 1 4116 4059 541 1318 + 1 4057 1315 4059 4116 + 1 4057 1315 1314 4059 + 1 1315 4116 1318 4059 + 1 1315 1314 4059 1318 + 1 4066 512 1386 4070 + 1 4130 4070 1390 541 + 1 1387 1386 79 1390 + 1 4066 4130 1386 1387 + 1 4066 4130 4070 1386 + 1 4130 1387 1390 1386 + 1 4130 4070 1386 1390 + 1 4048 521 4065 4115 + 1 4049 4115 4066 524 + 1 4046 4065 512 4066 + 1 4048 4049 4065 4046 + 1 4048 4049 4115 4065 + 1 4049 4046 4066 4065 + 1 4049 4115 4065 4066 + 1 4048 521 4057 4065 + 1 4045 4057 510 4056 + 1 4046 4065 4056 512 + 1 4048 4045 4046 4065 + 1 4048 4045 4065 4057 + 1 4045 4046 4065 4056 + 1 4045 4057 4056 4065 + 1 4115 524 4130 4066 + 1 4065 4066 4070 512 + 1 4116 4130 541 4070 + 1 4115 4065 4130 4116 + 1 4115 4065 4066 4130 + 1 4065 4116 4070 4130 + 1 4065 4066 4130 4070 + 1 4057 510 4056 4059 + 1 4065 4056 512 4070 + 1 4116 4059 4070 541 + 1 4057 4065 4116 4059 + 1 4057 4065 4059 4056 + 1 4065 4116 4059 4070 + 1 4065 4056 4070 4059 + 1 1280 69 1284 1283 + 1 4054 1284 528 4141 + 1 4053 1283 4141 527 + 1 1280 4054 4053 1283 + 1 1280 4054 1283 1284 + 1 4054 4053 1283 4141 + 1 4054 1284 4141 1283 + 1 4068 528 1388 4145 + 1 1386 1388 79 1391 + 1 4071 4145 1391 544 + 1 4068 1386 4071 4145 + 1 4068 1386 4145 1388 + 1 1386 4071 4145 1391 + 1 1386 1388 1391 4145 + 1 4061 527 4142 1325 + 1 4063 4142 544 1328 + 1 1324 1325 1328 73 + 1 4061 4063 1324 1325 + 1 4061 4063 1325 4142 + 1 4063 1324 1325 1328 + 1 4063 4142 1328 1325 + 1 4051 512 4060 4067 + 1 4050 4060 511 4061 + 1 4053 4067 4061 527 + 1 4051 4050 4053 4067 + 1 4051 4050 4067 4060 + 1 4050 4053 4067 4061 + 1 4050 4060 4061 4067 + 1 4051 512 4067 4068 + 1 4054 4068 4141 528 + 1 4053 4067 527 4141 + 1 4051 4054 4067 4053 + 1 4051 4054 4068 4067 + 1 4054 4053 4141 4067 + 1 4054 4068 4067 4141 + 1 4060 511 4061 4063 + 1 4067 4061 527 4142 + 1 4071 4063 4142 544 + 1 4060 4067 4071 4063 + 1 4060 4067 4063 4061 + 1 4067 4071 4063 4142 + 1 4067 4061 4142 4063 + 1 4068 528 4145 4141 + 1 4067 4141 4142 527 + 1 4071 4145 544 4142 + 1 4068 4067 4145 4071 + 1 4068 4067 4141 4145 + 1 4067 4071 4142 4145 + 1 4067 4141 4145 4142 + 1 1314 72 1316 1318 + 1 4059 1318 4184 541 + 1 4058 1316 539 4184 + 1 1314 4059 1316 4058 + 1 1314 4059 1318 1316 + 1 4059 4058 4184 1316 + 1 4059 1318 1316 4184 + 1 4070 541 4194 1390 + 1 1386 1390 1391 79 + 1 4071 4194 544 1391 + 1 4070 1386 4194 4071 + 1 4070 1386 1390 4194 + 1 1386 4071 1391 4194 + 1 1386 1390 4194 1391 + 1 4062 539 1326 4186 + 1 4063 4186 1328 544 + 1 1324 1326 73 1328 + 1 4062 4063 1326 1324 + 1 4062 4063 4186 1326 + 1 4063 1324 1328 1326 + 1 4063 4186 1326 1328 + 1 4056 512 4069 4060 + 1 4055 4060 4062 511 + 1 4058 4069 539 4062 + 1 4056 4055 4069 4058 + 1 4056 4055 4060 4069 + 1 4055 4058 4062 4069 + 1 4055 4060 4069 4062 + 1 4056 512 4070 4069 + 1 4059 4070 541 4184 + 1 4058 4069 4184 539 + 1 4056 4059 4058 4069 + 1 4056 4059 4069 4070 + 1 4059 4058 4069 4184 + 1 4059 4070 4184 4069 + 1 4060 511 4063 4062 + 1 4069 4062 4186 539 + 1 4071 4063 544 4186 + 1 4060 4069 4063 4071 + 1 4060 4069 4062 4063 + 1 4069 4071 4186 4063 + 1 4069 4062 4063 4186 + 1 4070 541 4184 4194 + 1 4069 4184 539 4186 + 1 4071 4194 4186 544 + 1 4070 4069 4071 4194 + 1 4070 4069 4194 4184 + 1 4069 4071 4194 4186 + 1 4069 4184 4186 4194 + 1 791 12 794 795 + 1 2267 795 2287 191 + 1 2266 794 190 2287 + 1 791 2267 794 2266 + 1 791 2267 795 794 + 1 2267 2266 2287 794 + 1 2267 795 794 2287 + 1 2300 191 2302 1398 + 1 1402 1398 1406 80 + 1 4136 2302 566 1406 + 1 2300 1402 2302 4136 + 1 2300 1402 1398 2302 + 1 1402 4136 1406 2302 + 1 1402 1398 2302 1406 + 1 2290 190 1384 2294 + 1 4131 2294 1393 566 + 1 1387 1384 79 1393 + 1 2290 4131 1384 1387 + 1 2290 4131 2294 1384 + 1 4131 1387 1393 1384 + 1 4131 2294 1384 1393 + 1 2273 525 2291 4127 + 1 2272 4127 2290 524 + 1 2266 2291 190 2290 + 1 2273 2272 2291 2266 + 1 2273 2272 4127 2291 + 1 2272 2266 2290 2291 + 1 2272 4127 2291 2290 + 1 2273 525 2300 2291 + 1 2267 2300 191 2287 + 1 2266 2291 2287 190 + 1 2273 2267 2266 2291 + 1 2273 2267 2291 2300 + 1 2267 2266 2291 2287 + 1 2267 2300 2287 2291 + 1 4127 524 4131 2290 + 1 2291 2290 2294 190 + 1 4136 4131 566 2294 + 1 4127 2291 4131 4136 + 1 4127 2291 2290 4131 + 1 2291 4136 2294 4131 + 1 2291 2290 4131 2294 + 1 2300 191 2287 2302 + 1 2291 2287 190 2294 + 1 4136 2302 2294 566 + 1 2300 2291 4136 2302 + 1 2300 2291 2302 2287 + 1 2291 4136 2302 2294 + 1 2291 2287 2294 2302 + 1 1403 80 1409 1399 + 1 2598 1399 2600 232 + 1 4179 1409 573 2600 + 1 1403 2598 1409 4179 + 1 1403 2598 1399 1409 + 1 2598 4179 2600 1409 + 1 2598 1399 1409 2600 + 1 2573 232 2594 836 + 1 834 836 837 17 + 1 2574 2594 233 837 + 1 2573 834 2594 2574 + 1 2573 834 836 2594 + 1 834 2574 837 2594 + 1 834 836 2594 837 + 1 4181 573 1450 2608 + 1 2607 2608 1443 233 + 1 1448 1450 84 1443 + 1 4181 2607 1450 1448 + 1 4181 2607 2608 1450 + 1 2607 1448 1443 1450 + 1 2607 2608 1450 1443 + 1 2579 230 2582 2580 + 1 4176 2580 4181 537 + 1 4179 2582 573 4181 + 1 2579 4176 2582 4179 + 1 2579 4176 2580 2582 + 1 4176 4179 4181 2582 + 1 4176 2580 2582 4181 + 1 2579 230 2573 2582 + 1 2598 2573 232 2600 + 1 4179 2582 2600 573 + 1 2579 2598 4179 2582 + 1 2579 2598 2582 2573 + 1 2598 4179 2582 2600 + 1 2598 2573 2600 2582 + 1 2580 537 2607 4181 + 1 2582 4181 2608 573 + 1 2574 2607 233 2608 + 1 2580 2582 2607 2574 + 1 2580 2582 4181 2607 + 1 2582 2574 2608 2607 + 1 2582 4181 2607 2608 + 1 2573 232 2600 2594 + 1 2582 2600 573 2608 + 1 2574 2594 2608 233 + 1 2573 2582 2574 2594 + 1 2573 2582 2594 2600 + 1 2582 2574 2594 2608 + 1 2582 2600 2608 2594 + 1 1388 79 1385 1395 + 1 4146 1395 2348 568 + 1 2344 1385 198 2348 + 1 1388 4146 1385 2344 + 1 1388 4146 1395 1385 + 1 4146 2344 2348 1385 + 1 4146 1395 1385 2348 + 1 4149 568 2362 1449 + 1 1447 1449 1442 84 + 1 2361 2362 200 1442 + 1 4149 1447 2362 2361 + 1 4149 1447 1449 2362 + 1 1447 2361 1442 2362 + 1 1447 1449 2362 1442 + 1 2329 198 802 2341 + 1 2330 2341 804 200 + 1 800 802 13 804 + 1 2329 2330 802 800 + 1 2329 2330 2341 802 + 1 2330 800 804 802 + 1 2330 2341 802 804 + 1 4143 529 2345 2334 + 1 2333 2334 2329 196 + 1 2344 2345 198 2329 + 1 4143 2333 2345 2344 + 1 4143 2333 2334 2345 + 1 2333 2344 2329 2345 + 1 2333 2334 2345 2329 + 1 4143 529 4149 2345 + 1 4146 4149 568 2348 + 1 2344 2345 2348 198 + 1 4143 4146 2344 2345 + 1 4143 4146 2345 4149 + 1 4146 2344 2345 2348 + 1 4146 4149 2348 2345 + 1 2334 196 2330 2329 + 1 2345 2329 2341 198 + 1 2361 2330 200 2341 + 1 2334 2345 2330 2361 + 1 2334 2345 2329 2330 + 1 2345 2361 2341 2330 + 1 2345 2329 2330 2341 + 1 4149 568 2348 2362 + 1 2345 2348 198 2341 + 1 2361 2362 2341 200 + 1 4149 2345 2361 2362 + 1 4149 2345 2362 2348 + 1 2345 2361 2362 2341 + 1 2345 2348 2341 2362 + 1 1302 71 1306 1303 + 1 4111 1303 4139 526 + 1 4113 1306 535 4139 + 1 1302 4111 1306 4113 + 1 1302 4111 1303 1306 + 1 4111 4113 4139 1306 + 1 4111 1303 1306 4139 + 1 4105 526 4137 1282 + 1 1281 1282 1284 69 + 1 4106 4137 528 1284 + 1 4105 1281 4137 4106 + 1 4105 1281 1282 4137 + 1 1281 4106 1284 4137 + 1 1281 1282 4137 1284 + 1 4129 535 1389 4144 + 1 4128 4144 1388 528 + 1 1387 1389 79 1388 + 1 4129 4128 1389 1387 + 1 4129 4128 4144 1389 + 1 4128 1387 1388 1389 + 1 4128 4144 1389 1388 + 1 4103 519 4107 4104 + 1 4109 4104 4129 524 + 1 4113 4107 535 4129 + 1 4103 4109 4107 4113 + 1 4103 4109 4104 4107 + 1 4109 4113 4129 4107 + 1 4109 4104 4107 4129 + 1 4103 519 4105 4107 + 1 4111 4105 526 4139 + 1 4113 4107 4139 535 + 1 4103 4111 4113 4107 + 1 4103 4111 4107 4105 + 1 4111 4113 4107 4139 + 1 4111 4105 4139 4107 + 1 4104 524 4128 4129 + 1 4107 4129 4144 535 + 1 4106 4128 528 4144 + 1 4104 4107 4128 4106 + 1 4104 4107 4129 4128 + 1 4107 4106 4144 4128 + 1 4107 4129 4128 4144 + 1 4105 526 4139 4137 + 1 4107 4139 535 4144 + 1 4106 4137 4144 528 + 1 4105 4107 4106 4137 + 1 4105 4107 4137 4139 + 1 4107 4106 4137 4144 + 1 4107 4139 4144 4137 + 1 1302 71 1307 1306 + 1 4114 1307 536 4171 + 1 4113 1306 4171 535 + 1 1302 4114 4113 1306 + 1 1302 4114 1306 1307 + 1 4114 4113 1306 4171 + 1 4114 1307 4171 1306 + 1 4133 536 1403 4178 + 1 1402 1403 80 1406 + 1 4136 4178 1406 566 + 1 4133 1402 4136 4178 + 1 4133 1402 4178 1403 + 1 1402 4136 4178 1406 + 1 1402 1403 1406 4178 + 1 4129 535 4173 1389 + 1 4131 4173 566 1393 + 1 1387 1389 1393 79 + 1 4129 4131 1387 1389 + 1 4129 4131 1389 4173 + 1 4131 1387 1389 1393 + 1 4131 4173 1393 1389 + 1 4110 525 4127 4132 + 1 4109 4127 524 4129 + 1 4113 4132 4129 535 + 1 4110 4109 4113 4132 + 1 4110 4109 4132 4127 + 1 4109 4113 4132 4129 + 1 4109 4127 4129 4132 + 1 4110 525 4132 4133 + 1 4114 4133 4171 536 + 1 4113 4132 535 4171 + 1 4110 4114 4132 4113 + 1 4110 4114 4133 4132 + 1 4114 4113 4171 4132 + 1 4114 4133 4132 4171 + 1 4127 524 4129 4131 + 1 4132 4129 535 4173 + 1 4136 4131 4173 566 + 1 4127 4132 4136 4131 + 1 4127 4132 4131 4129 + 1 4132 4136 4131 4173 + 1 4132 4129 4173 4131 + 1 4133 536 4178 4171 + 1 4132 4171 4173 535 + 1 4136 4178 566 4173 + 1 4133 4132 4178 4136 + 1 4133 4132 4171 4178 + 1 4132 4136 4173 4178 + 1 4132 4171 4178 4173 + 1 1282 69 1285 1284 + 1 4137 1284 4143 528 + 1 4138 1285 529 4143 + 1 1282 4137 1285 4138 + 1 1282 4137 1284 1285 + 1 4137 4138 4143 1285 + 1 4137 1284 1285 4143 + 1 4144 528 4146 1388 + 1 1389 1388 1395 79 + 1 4174 4146 568 1395 + 1 4144 1389 4146 4174 + 1 4144 1389 1388 4146 + 1 1389 4174 1395 4146 + 1 1389 1388 4146 1395 + 1 4148 529 1447 4149 + 1 4180 4149 1449 568 + 1 1448 1447 84 1449 + 1 4148 4180 1447 1448 + 1 4148 4180 4149 1447 + 1 4180 1448 1449 1447 + 1 4180 4149 1447 1449 + 1 4139 535 4147 4172 + 1 4140 4172 4148 537 + 1 4138 4147 529 4148 + 1 4139 4140 4147 4138 + 1 4139 4140 4172 4147 + 1 4140 4138 4148 4147 + 1 4140 4172 4147 4148 + 1 4139 535 4144 4147 + 1 4137 4144 528 4143 + 1 4138 4147 4143 529 + 1 4139 4137 4138 4147 + 1 4139 4137 4147 4144 + 1 4137 4138 4147 4143 + 1 4137 4144 4143 4147 + 1 4172 537 4180 4148 + 1 4147 4148 4149 529 + 1 4174 4180 568 4149 + 1 4172 4147 4180 4174 + 1 4172 4147 4148 4180 + 1 4147 4174 4149 4180 + 1 4147 4148 4180 4149 + 1 4144 528 4143 4146 + 1 4147 4143 529 4149 + 1 4174 4146 4149 568 + 1 4144 4147 4174 4146 + 1 4144 4147 4146 4143 + 1 4147 4174 4146 4149 + 1 4147 4143 4149 4146 + 1 1403 80 1406 1409 + 1 4178 1406 566 4295 + 1 4179 1409 4295 573 + 1 1403 4178 4179 1409 + 1 1403 4178 1409 1406 + 1 4178 4179 1409 4295 + 1 4178 1406 4295 1409 + 1 4173 566 1393 4292 + 1 1389 1393 79 1395 + 1 4174 4292 1395 568 + 1 4173 1389 4174 4292 + 1 4173 1389 4292 1393 + 1 1389 4174 4292 1395 + 1 1389 1393 1395 4292 + 1 4181 573 4304 1450 + 1 4180 4304 568 1449 + 1 1448 1450 1449 84 + 1 4181 4180 1448 1450 + 1 4181 4180 1450 4304 + 1 4180 1448 1450 1449 + 1 4180 4304 1449 1450 + 1 4171 535 4172 4175 + 1 4176 4172 537 4181 + 1 4179 4175 4181 573 + 1 4171 4176 4179 4175 + 1 4171 4176 4175 4172 + 1 4176 4179 4175 4181 + 1 4176 4172 4181 4175 + 1 4171 535 4175 4173 + 1 4178 4173 4295 566 + 1 4179 4175 573 4295 + 1 4171 4178 4175 4179 + 1 4171 4178 4173 4175 + 1 4178 4179 4295 4175 + 1 4178 4173 4175 4295 + 1 4172 537 4181 4180 + 1 4175 4181 573 4304 + 1 4174 4180 4304 568 + 1 4172 4175 4174 4180 + 1 4172 4175 4180 4181 + 1 4175 4174 4180 4304 + 1 4175 4181 4304 4180 + 1 4173 566 4292 4295 + 1 4175 4295 4304 573 + 1 4174 4292 568 4304 + 1 4173 4175 4292 4174 + 1 4173 4175 4295 4292 + 1 4175 4174 4304 4292 + 1 4175 4295 4292 4304 + 1 779 10 780 781 + 1 2192 780 176 2198 + 1 2193 781 2198 177 + 1 779 2192 2193 781 + 1 779 2192 781 780 + 1 2192 2193 781 2198 + 1 2192 780 2198 781 + 1 2201 176 1320 2202 + 1 1326 1320 73 1327 + 1 4185 2202 1327 543 + 1 2201 1326 4185 2202 + 1 2201 1326 2202 1320 + 1 1326 4185 2202 1327 + 1 1326 1320 1327 2202 + 1 2206 177 2207 1330 + 1 4190 2207 543 1336 + 1 1335 1330 1336 74 + 1 2206 4190 1335 1330 + 1 2206 4190 1330 2207 + 1 4190 1335 1330 1336 + 1 4190 2207 1336 1330 + 1 2196 539 4183 2205 + 1 2197 4183 540 2206 + 1 2193 2205 2206 177 + 1 2196 2197 2193 2205 + 1 2196 2197 2205 4183 + 1 2197 2193 2205 2206 + 1 2197 4183 2206 2205 + 1 2196 539 2205 2201 + 1 2192 2201 2198 176 + 1 2193 2205 177 2198 + 1 2196 2192 2205 2193 + 1 2196 2192 2201 2205 + 1 2192 2193 2198 2205 + 1 2192 2201 2205 2198 + 1 4183 540 2206 4190 + 1 2205 2206 177 2207 + 1 4185 4190 2207 543 + 1 4183 2205 4185 4190 + 1 4183 2205 4190 2206 + 1 2205 4185 4190 2207 + 1 2205 2206 2207 4190 + 1 2201 176 2202 2198 + 1 2205 2198 2207 177 + 1 4185 2202 543 2207 + 1 2201 2205 2202 4185 + 1 2201 2205 2198 2202 + 1 2205 4185 2207 2202 + 1 2205 2198 2202 2207 + 1 1328 73 1321 1329 + 1 2339 1321 197 2340 + 1 4204 1329 2340 545 + 1 1328 2339 4204 1329 + 1 1328 2339 1329 1321 + 1 2339 4204 1329 2340 + 1 2339 1321 2340 1329 + 1 2335 197 801 2336 + 1 802 801 13 806 + 1 2342 2336 806 202 + 1 2335 802 2342 2336 + 1 2335 802 2336 801 + 1 802 2342 2336 806 + 1 802 801 806 2336 + 1 4209 545 2373 1470 + 1 2374 2373 202 1466 + 1 1472 1470 1466 86 + 1 4209 2374 1472 1470 + 1 4209 2374 1470 2373 + 1 2374 1472 1470 1466 + 1 2374 2373 1466 1470 + 1 2346 198 2349 2347 + 1 4206 2349 569 4209 + 1 4204 2347 4209 545 + 1 2346 4206 4204 2347 + 1 2346 4206 2347 2349 + 1 4206 4204 2347 4209 + 1 4206 2349 4209 2347 + 1 2346 198 2347 2335 + 1 2339 2335 2340 197 + 1 4204 2347 545 2340 + 1 2346 2339 2347 4204 + 1 2346 2339 2335 2347 + 1 2339 4204 2340 2347 + 1 2339 2335 2347 2340 + 1 2349 569 4209 2374 + 1 2347 4209 545 2373 + 1 2342 2374 2373 202 + 1 2349 2347 2342 2374 + 1 2349 2347 2374 4209 + 1 2347 2342 2374 2373 + 1 2347 4209 2373 2374 + 1 2335 197 2336 2340 + 1 2347 2340 2373 545 + 1 2342 2336 202 2373 + 1 2335 2347 2336 2342 + 1 2335 2347 2340 2336 + 1 2347 2342 2373 2336 + 1 2347 2340 2336 2373 + 1 1338 74 1339 1331 + 1 4215 1339 548 2827 + 1 2826 1331 2827 262 + 1 1338 4215 2826 1331 + 1 1338 4215 1331 1339 + 1 4215 2826 1331 2827 + 1 4215 1339 2827 1331 + 1 4219 548 1471 2839 + 1 1473 1471 86 1467 + 1 2840 2839 1467 264 + 1 4219 1473 2840 2839 + 1 4219 1473 2839 1471 + 1 1473 2840 2839 1467 + 1 1473 1471 1467 2839 + 1 2822 262 2823 866 + 1 2829 2823 264 868 + 1 867 866 868 20 + 1 2822 2829 867 866 + 1 2822 2829 866 2823 + 1 2829 867 866 868 + 1 2829 2823 868 866 + 1 4217 576 2833 2828 + 1 2832 2833 263 2822 + 1 2826 2828 2822 262 + 1 4217 2832 2826 2828 + 1 4217 2832 2828 2833 + 1 2832 2826 2828 2822 + 1 2832 2833 2822 2828 + 1 4217 576 2828 4219 + 1 4215 4219 2827 548 + 1 2826 2828 262 2827 + 1 4217 4215 2828 2826 + 1 4217 4215 4219 2828 + 1 4215 2826 2827 2828 + 1 4215 4219 2828 2827 + 1 2833 263 2822 2829 + 1 2828 2822 262 2823 + 1 2840 2829 2823 264 + 1 2833 2828 2840 2829 + 1 2833 2828 2829 2822 + 1 2828 2840 2829 2823 + 1 2828 2822 2823 2829 + 1 4219 548 2839 2827 + 1 2828 2827 2823 262 + 1 2840 2839 264 2823 + 1 4219 2828 2839 2840 + 1 4219 2828 2827 2839 + 1 2828 2840 2823 2839 + 1 2828 2827 2839 2823 + 1 1390 79 1394 1392 + 1 4196 1394 567 4212 + 1 4195 1392 4212 546 + 1 1390 4196 4195 1392 + 1 1390 4196 1392 1394 + 1 4196 4195 1392 4212 + 1 4196 1394 4212 1392 + 1 4199 567 1418 4216 + 1 1416 1418 81 1417 + 1 4198 4216 1417 547 + 1 4199 1416 4198 4216 + 1 4199 1416 4216 1418 + 1 1416 4198 4216 1417 + 1 1416 1418 1417 4216 + 1 4191 546 4210 1337 + 1 4192 4210 547 1338 + 1 1335 1337 1338 74 + 1 4191 4192 1335 1337 + 1 4191 4192 1337 4210 + 1 4192 1335 1337 1338 + 1 4192 4210 1338 1337 + 1 4193 542 4189 4197 + 1 4188 4189 540 4191 + 1 4195 4197 4191 546 + 1 4193 4188 4195 4197 + 1 4193 4188 4197 4189 + 1 4188 4195 4197 4191 + 1 4188 4189 4191 4197 + 1 4193 542 4197 4199 + 1 4196 4199 4212 567 + 1 4195 4197 546 4212 + 1 4193 4196 4197 4195 + 1 4193 4196 4199 4197 + 1 4196 4195 4212 4197 + 1 4196 4199 4197 4212 + 1 4189 540 4191 4192 + 1 4197 4191 546 4210 + 1 4198 4192 4210 547 + 1 4189 4197 4198 4192 + 1 4189 4197 4192 4191 + 1 4197 4198 4192 4210 + 1 4197 4191 4210 4192 + 1 4199 567 4216 4212 + 1 4197 4212 4210 546 + 1 4198 4216 547 4210 + 1 4199 4197 4216 4198 + 1 4199 4197 4212 4216 + 1 4197 4198 4210 4216 + 1 4197 4212 4216 4210 + 1 1390 79 1392 1391 + 1 4194 1391 4205 544 + 1 4195 1392 546 4205 + 1 1390 4194 1392 4195 + 1 1390 4194 1391 1392 + 1 4194 4195 4205 1392 + 1 4194 1391 1392 4205 + 1 4186 544 4200 1328 + 1 1326 1328 1327 73 + 1 4185 4200 543 1327 + 1 4186 1326 4200 4185 + 1 4186 1326 1328 4200 + 1 1326 4185 1327 4200 + 1 1326 1328 4200 1327 + 1 4191 546 1337 4202 + 1 4190 4202 1336 543 + 1 1335 1337 74 1336 + 1 4191 4190 1337 1335 + 1 4191 4190 4202 1337 + 1 4190 1335 1336 1337 + 1 4190 4202 1337 1336 + 1 4184 539 4187 4183 + 1 4188 4183 4191 540 + 1 4195 4187 546 4191 + 1 4184 4188 4187 4195 + 1 4184 4188 4183 4187 + 1 4188 4195 4191 4187 + 1 4188 4183 4187 4191 + 1 4184 539 4186 4187 + 1 4194 4186 544 4205 + 1 4195 4187 4205 546 + 1 4184 4194 4195 4187 + 1 4184 4194 4187 4186 + 1 4194 4195 4187 4205 + 1 4194 4186 4205 4187 + 1 4183 540 4190 4191 + 1 4187 4191 4202 546 + 1 4185 4190 543 4202 + 1 4183 4187 4190 4185 + 1 4183 4187 4191 4190 + 1 4187 4185 4202 4190 + 1 4187 4191 4190 4202 + 1 4186 544 4205 4200 + 1 4187 4205 546 4202 + 1 4185 4200 4202 543 + 1 4186 4187 4185 4200 + 1 4186 4187 4200 4205 + 1 4187 4185 4200 4202 + 1 4187 4205 4202 4200 + 1 1418 81 1417 1420 + 1 4216 1417 547 4217 + 1 4300 1420 4217 576 + 1 1418 4216 4300 1420 + 1 1418 4216 1420 1417 + 1 4216 4300 1420 4217 + 1 4216 1417 4217 1420 + 1 4210 547 1338 4215 + 1 1337 1338 74 1339 + 1 4211 4215 1339 548 + 1 4210 1337 4211 4215 + 1 4210 1337 4215 1338 + 1 1337 4211 4215 1339 + 1 1337 1338 1339 4215 + 1 4308 576 4219 1473 + 1 4218 4219 548 1471 + 1 1472 1473 1471 86 + 1 4308 4218 1472 1473 + 1 4308 4218 1473 4219 + 1 4218 1472 1473 1471 + 1 4218 4219 1471 1473 + 1 4212 546 4213 4214 + 1 4297 4213 569 4308 + 1 4300 4214 4308 576 + 1 4212 4297 4300 4214 + 1 4212 4297 4214 4213 + 1 4297 4300 4214 4308 + 1 4297 4213 4308 4214 + 1 4212 546 4214 4210 + 1 4216 4210 4217 547 + 1 4300 4214 576 4217 + 1 4212 4216 4214 4300 + 1 4212 4216 4210 4214 + 1 4216 4300 4217 4214 + 1 4216 4210 4214 4217 + 1 4213 569 4308 4218 + 1 4214 4308 576 4219 + 1 4211 4218 4219 548 + 1 4213 4214 4211 4218 + 1 4213 4214 4218 4308 + 1 4214 4211 4218 4219 + 1 4214 4308 4219 4218 + 1 4210 547 4215 4217 + 1 4214 4217 4219 576 + 1 4211 4215 548 4219 + 1 4210 4214 4215 4211 + 1 4210 4214 4217 4215 + 1 4214 4211 4219 4215 + 1 4214 4217 4215 4219 + 1 1328 73 1329 1327 + 1 4200 1327 4201 543 + 1 4204 1329 545 4201 + 1 1328 4200 1329 4204 + 1 1328 4200 1327 1329 + 1 4200 4204 4201 1329 + 1 4200 1327 1329 4201 + 1 4202 543 4203 1336 + 1 1337 1336 1339 74 + 1 4211 4203 548 1339 + 1 4202 1337 4203 4211 + 1 4202 1337 1336 4203 + 1 1337 4211 1339 4203 + 1 1337 1336 4203 1339 + 1 4209 545 1470 4208 + 1 4218 4208 1471 548 + 1 1472 1470 86 1471 + 1 4209 4218 1470 1472 + 1 4209 4218 4208 1470 + 1 4218 1472 1471 1470 + 1 4218 4208 1470 1471 + 1 4205 546 4207 4213 + 1 4206 4213 4209 569 + 1 4204 4207 545 4209 + 1 4205 4206 4207 4204 + 1 4205 4206 4213 4207 + 1 4206 4204 4209 4207 + 1 4206 4213 4207 4209 + 1 4205 546 4202 4207 + 1 4200 4202 543 4201 + 1 4204 4207 4201 545 + 1 4205 4200 4204 4207 + 1 4205 4200 4207 4202 + 1 4200 4204 4207 4201 + 1 4200 4202 4201 4207 + 1 4213 569 4218 4209 + 1 4207 4209 4208 545 + 1 4211 4218 548 4208 + 1 4213 4207 4218 4211 + 1 4213 4207 4209 4218 + 1 4207 4211 4208 4218 + 1 4207 4209 4218 4208 + 1 4202 543 4201 4203 + 1 4207 4201 545 4208 + 1 4211 4203 4208 548 + 1 4202 4207 4211 4203 + 1 4202 4207 4203 4201 + 1 4207 4211 4203 4208 + 1 4207 4201 4208 4203 + 1 836 17 841 837 + 1 2594 837 2604 233 + 1 2595 841 237 2604 + 1 836 2594 841 2595 + 1 836 2594 837 841 + 1 2594 2595 2604 841 + 1 2594 837 841 2604 + 1 2608 233 2610 1443 + 1 1450 1443 1455 84 + 1 4324 2610 588 1455 + 1 2608 1450 2610 4324 + 1 2608 1450 1443 2610 + 1 1450 4324 1455 2610 + 1 1450 1443 2610 1455 + 1 2644 237 1672 2645 + 1 4326 2645 1680 588 + 1 1678 1672 103 1680 + 1 2644 4326 1672 1678 + 1 2644 4326 2645 1672 + 1 4326 1678 1680 1672 + 1 4326 2645 1672 1680 + 1 2600 573 2643 4323 + 1 2601 4323 2644 574 + 1 2595 2643 237 2644 + 1 2600 2601 2643 2595 + 1 2600 2601 4323 2643 + 1 2601 2595 2644 2643 + 1 2601 4323 2643 2644 + 1 2600 573 2608 2643 + 1 2594 2608 233 2604 + 1 2595 2643 2604 237 + 1 2600 2594 2595 2643 + 1 2600 2594 2643 2608 + 1 2594 2595 2643 2604 + 1 2594 2608 2604 2643 + 1 4323 574 4326 2644 + 1 2643 2644 2645 237 + 1 4324 4326 588 2645 + 1 4323 2643 4326 4324 + 1 4323 2643 2644 4326 + 1 2643 4324 2645 4326 + 1 2643 2644 4326 2645 + 1 2608 233 2604 2610 + 1 2643 2604 237 2645 + 1 4324 2610 2645 588 + 1 2608 2643 4324 2610 + 1 2608 2643 2610 2604 + 1 2643 4324 2610 2645 + 1 2643 2604 2645 2610 + 1 1449 84 1452 1442 + 1 2362 1442 2365 200 + 1 4305 1452 585 2365 + 1 1449 2362 1452 4305 + 1 1449 2362 1442 1452 + 1 2362 4305 2365 1452 + 1 2362 1442 1452 2365 + 1 2341 200 2358 804 + 1 802 804 806 13 + 1 2342 2358 202 806 + 1 2341 802 2358 2342 + 1 2341 802 804 2358 + 1 802 2342 806 2358 + 1 802 804 2358 806 + 1 4309 585 1475 2376 + 1 2374 2376 1466 202 + 1 1472 1475 86 1466 + 1 4309 2374 1475 1472 + 1 4309 2374 2376 1475 + 1 2374 1472 1466 1475 + 1 2374 2376 1475 1466 + 1 2348 198 2350 2349 + 1 4302 2349 4309 569 + 1 4305 2350 585 4309 + 1 2348 4302 2350 4305 + 1 2348 4302 2349 2350 + 1 4302 4305 4309 2350 + 1 4302 2349 2350 4309 + 1 2348 198 2341 2350 + 1 2362 2341 200 2365 + 1 4305 2350 2365 585 + 1 2348 2362 4305 2350 + 1 2348 2362 2350 2341 + 1 2362 4305 2350 2365 + 1 2362 2341 2365 2350 + 1 2349 569 2374 4309 + 1 2350 4309 2376 585 + 1 2342 2374 202 2376 + 1 2349 2350 2374 2342 + 1 2349 2350 4309 2374 + 1 2350 2342 2376 2374 + 1 2350 4309 2374 2376 + 1 2341 200 2365 2358 + 1 2350 2365 585 2376 + 1 2342 2358 2376 202 + 1 2341 2350 2342 2358 + 1 2341 2350 2358 2365 + 1 2350 2342 2358 2376 + 1 2350 2365 2376 2358 + 1 1679 103 1673 1681 + 1 4330 1681 2860 594 + 1 2859 1673 266 2860 + 1 1679 4330 1673 2859 + 1 1679 4330 1681 1673 + 1 4330 2859 2860 1673 + 1 4330 1681 1673 2860 + 1 4329 594 2842 1478 + 1 1473 1478 1467 86 + 1 2840 2842 264 1467 + 1 4329 1473 2842 2840 + 1 4329 1473 1478 2842 + 1 1473 2840 1467 2842 + 1 1473 1478 2842 1467 + 1 2830 266 870 2836 + 1 2829 2836 868 264 + 1 867 870 20 868 + 1 2830 2829 870 867 + 1 2830 2829 2836 870 + 1 2829 867 868 870 + 1 2829 2836 870 868 + 1 4328 576 2858 2833 + 1 2834 2833 2830 263 + 1 2859 2858 266 2830 + 1 4328 2834 2858 2859 + 1 4328 2834 2833 2858 + 1 2834 2859 2830 2858 + 1 2834 2833 2858 2830 + 1 4328 576 4329 2858 + 1 4330 4329 594 2860 + 1 2859 2858 2860 266 + 1 4328 4330 2859 2858 + 1 4328 4330 2858 4329 + 1 4330 2859 2858 2860 + 1 4330 4329 2860 2858 + 1 2833 263 2829 2830 + 1 2858 2830 2836 266 + 1 2840 2829 264 2836 + 1 2833 2858 2829 2840 + 1 2833 2858 2830 2829 + 1 2858 2840 2836 2829 + 1 2858 2830 2829 2836 + 1 4329 594 2860 2842 + 1 2858 2860 266 2836 + 1 2840 2842 2836 264 + 1 4329 2858 2840 2842 + 1 4329 2858 2842 2860 + 1 2858 2840 2842 2836 + 1 2858 2860 2836 2842 + 1 1393 79 1397 1394 + 1 4291 1394 4298 567 + 1 4293 1397 570 4298 + 1 1393 4291 1397 4293 + 1 1393 4291 1394 1397 + 1 4291 4293 4298 1397 + 1 4291 1394 1397 4298 + 1 4299 567 4301 1418 + 1 1419 1418 1421 81 + 1 4320 4301 577 1421 + 1 4299 1419 4301 4320 + 1 4299 1419 1418 4301 + 1 1419 4320 1421 4301 + 1 1419 1418 4301 1421 + 1 4313 570 1677 4315 + 1 4325 4315 1679 577 + 1 1678 1677 103 1679 + 1 4313 4325 1677 1678 + 1 4313 4325 4315 1677 + 1 4325 1678 1679 1677 + 1 4325 4315 1677 1679 + 1 4294 571 4311 4319 + 1 4296 4319 4313 574 + 1 4293 4311 570 4313 + 1 4294 4296 4311 4293 + 1 4294 4296 4319 4311 + 1 4296 4293 4313 4311 + 1 4296 4319 4311 4313 + 1 4294 571 4299 4311 + 1 4291 4299 567 4298 + 1 4293 4311 4298 570 + 1 4294 4291 4293 4311 + 1 4294 4291 4311 4299 + 1 4291 4293 4311 4298 + 1 4291 4299 4298 4311 + 1 4319 574 4325 4313 + 1 4311 4313 4315 570 + 1 4320 4325 577 4315 + 1 4319 4311 4325 4320 + 1 4319 4311 4313 4325 + 1 4311 4320 4315 4325 + 1 4311 4313 4325 4315 + 1 4299 567 4298 4301 + 1 4311 4298 570 4315 + 1 4320 4301 4315 577 + 1 4299 4311 4320 4301 + 1 4299 4311 4301 4298 + 1 4311 4320 4301 4315 + 1 4311 4298 4315 4301 + 1 1393 79 1395 1397 + 1 4292 1395 568 4303 + 1 4293 1397 4303 570 + 1 1393 4292 4293 1397 + 1 1393 4292 1397 1395 + 1 4292 4293 1397 4303 + 1 4292 1395 4303 1397 + 1 4304 568 1449 4306 + 1 1450 1449 84 1455 + 1 4324 4306 1455 588 + 1 4304 1450 4324 4306 + 1 4304 1450 4306 1449 + 1 1450 4324 4306 1455 + 1 1450 1449 1455 4306 + 1 4313 570 4317 1677 + 1 4326 4317 588 1680 + 1 1678 1677 1680 103 + 1 4313 4326 1678 1677 + 1 4313 4326 1677 4317 + 1 4326 1678 1677 1680 + 1 4326 4317 1680 1677 + 1 4295 573 4323 4312 + 1 4296 4323 574 4313 + 1 4293 4312 4313 570 + 1 4295 4296 4293 4312 + 1 4295 4296 4312 4323 + 1 4296 4293 4312 4313 + 1 4296 4323 4313 4312 + 1 4295 573 4312 4304 + 1 4292 4304 4303 568 + 1 4293 4312 570 4303 + 1 4295 4292 4312 4293 + 1 4295 4292 4304 4312 + 1 4292 4293 4303 4312 + 1 4292 4304 4312 4303 + 1 4323 574 4313 4326 + 1 4312 4313 570 4317 + 1 4324 4326 4317 588 + 1 4323 4312 4324 4326 + 1 4323 4312 4326 4313 + 1 4312 4324 4326 4317 + 1 4312 4313 4317 4326 + 1 4304 568 4306 4303 + 1 4312 4303 4317 570 + 1 4324 4306 588 4317 + 1 4304 4312 4306 4324 + 1 4304 4312 4303 4306 + 1 4312 4324 4317 4306 + 1 4312 4303 4306 4317 + 1 1418 81 1420 1421 + 1 4301 1421 4328 577 + 1 4300 1420 576 4328 + 1 1418 4301 1420 4300 + 1 1418 4301 1421 1420 + 1 4301 4300 4328 1420 + 1 4301 1421 1420 4328 + 1 4315 577 4330 1679 + 1 1677 1679 1681 103 + 1 4318 4330 594 1681 + 1 4315 1677 4330 4318 + 1 4315 1677 1679 4330 + 1 1677 4318 1681 4330 + 1 1677 1679 4330 1681 + 1 4308 576 1473 4329 + 1 4310 4329 1478 594 + 1 1472 1473 86 1478 + 1 4308 4310 1473 1472 + 1 4308 4310 4329 1473 + 1 4310 1472 1478 1473 + 1 4310 4329 1473 1478 + 1 4298 570 4314 4307 + 1 4297 4307 4308 569 + 1 4300 4314 576 4308 + 1 4298 4297 4314 4300 + 1 4298 4297 4307 4314 + 1 4297 4300 4308 4314 + 1 4297 4307 4314 4308 + 1 4298 570 4315 4314 + 1 4301 4315 577 4328 + 1 4300 4314 4328 576 + 1 4298 4301 4300 4314 + 1 4298 4301 4314 4315 + 1 4301 4300 4314 4328 + 1 4301 4315 4328 4314 + 1 4307 569 4310 4308 + 1 4314 4308 4329 576 + 1 4318 4310 594 4329 + 1 4307 4314 4310 4318 + 1 4307 4314 4308 4310 + 1 4314 4318 4329 4310 + 1 4314 4308 4310 4329 + 1 4315 577 4328 4330 + 1 4314 4328 576 4329 + 1 4318 4330 4329 594 + 1 4315 4314 4318 4330 + 1 4315 4314 4330 4328 + 1 4314 4318 4330 4329 + 1 4314 4328 4329 4330 + 1 1449 84 1455 1452 + 1 4306 1455 588 4363 + 1 4305 1452 4363 585 + 1 1449 4306 4305 1452 + 1 1449 4306 1452 1455 + 1 4306 4305 1452 4363 + 1 4306 1455 4363 1452 + 1 4317 588 1680 4376 + 1 1677 1680 103 1681 + 1 4318 4376 1681 594 + 1 4317 1677 4318 4376 + 1 4317 1677 4376 1680 + 1 1677 4318 4376 1681 + 1 1677 1680 1681 4376 + 1 4309 585 4365 1475 + 1 4310 4365 594 1478 + 1 1472 1475 1478 86 + 1 4309 4310 1472 1475 + 1 4309 4310 1475 4365 + 1 4310 1472 1475 1478 + 1 4310 4365 1478 1475 + 1 4303 570 4307 4316 + 1 4302 4307 569 4309 + 1 4305 4316 4309 585 + 1 4303 4302 4305 4316 + 1 4303 4302 4316 4307 + 1 4302 4305 4316 4309 + 1 4302 4307 4309 4316 + 1 4303 570 4316 4317 + 1 4306 4317 4363 588 + 1 4305 4316 585 4363 + 1 4303 4306 4316 4305 + 1 4303 4306 4317 4316 + 1 4306 4305 4363 4316 + 1 4306 4317 4316 4363 + 1 4307 569 4309 4310 + 1 4316 4309 585 4365 + 1 4318 4310 4365 594 + 1 4307 4316 4318 4310 + 1 4307 4316 4310 4309 + 1 4316 4318 4310 4365 + 1 4316 4309 4365 4310 + 1 4317 588 4376 4363 + 1 4316 4363 4365 585 + 1 4318 4376 594 4365 + 1 4317 4316 4376 4318 + 1 4317 4316 4363 4376 + 1 4316 4318 4365 4376 + 1 4316 4363 4376 4365 +3072 + 1 1 732 733 + 1 1 733 731 + 2 1 730 732 + 2 2 738 736 + 3 4 749 748 + 3 4 747 749 + 4 5 752 753 + 4 3 744 743 + 5 2 740 738 + 5 2 737 740 + 6 2 735 737 + 6 1 731 730 + 1 4 748 745 + 1 7 757 760 + 1 11 788 785 + 1 7 759 757 + 1 3 741 744 + 1 12 796 792 + 2 2 736 734 + 2 4 745 746 + 2 9 774 771 + 2 6 755 754 + 2 4 746 747 + 2 16 830 828 + 3 8 767 764 + 3 7 760 762 + 3 23 896 894 + 3 6 756 755 + 3 8 764 766 + 3 21 879 878 + 4 7 762 761 + 4 8 765 767 + 4 24 905 904 + 4 7 761 759 + 4 5 751 752 + 4 20 872 871 + 5 8 766 763 + 5 6 754 756 + 5 18 856 850 + 5 5 753 750 + 5 8 763 765 + 5 15 825 821 + 6 3 743 742 + 6 5 750 751 + 6 13 805 803 + 6 3 742 741 + 6 2 734 735 + 6 10 780 778 + 1 11 785 782 + 1 12 789 793 + 1 30 946 943 + 1 12 792 789 + 1 10 776 779 + 1 31 954 950 + 2 9 771 768 + 2 11 782 784 + 2 28 932 929 + 2 16 828 826 + 2 14 807 811 + 2 36 996 994 + 3 23 894 888 + 3 22 880 886 + 3 47 1094 1090 + 3 21 878 873 + 3 23 888 893 + 3 45 1077 1074 + 4 24 904 897 + 4 25 906 910 + 4 50 1118 1114 + 4 20 871 864 + 4 19 858 862 + 4 42 1053 1049 + 5 18 850 846 + 5 16 826 829 + 5 38 1022 1016 + 5 15 821 817 + 5 18 846 849 + 5 35 991 987 + 6 13 803 798 + 6 15 817 819 + 6 33 971 967 + 6 10 778 776 + 6 9 768 770 + 6 29 938 936 + 1 22 882 880 + 1 11 783 788 + 1 46 1083 1080 + 1 12 797 790 + 1 22 881 883 + 1 55 1151 1148 + 1 22 883 882 + 1 12 793 797 + 1 78 1381 1378 + 1 20 867 865 + 1 12 790 796 + 1 57 1172 1169 + 1 10 781 777 + 1 20 864 866 + 1 39 1029 1027 + 1 20 866 867 + 1 10 779 781 + 1 81 1417 1416 + 2 14 809 807 + 2 9 769 774 + 2 34 979 975 + 2 11 786 783 + 2 14 808 810 + 2 43 1058 1056 + 2 14 810 809 + 2 11 784 786 + 2 70 1293 1291 + 2 21 876 874 + 2 16 827 830 + 2 53 1135 1133 + 2 14 814 808 + 2 21 873 875 + 2 44 1068 1064 + 2 21 875 876 + 2 14 811 814 + 2 100 1643 1642 + 3 27 923 919 + 3 23 889 896 + 3 65 1240 1237 + 3 22 887 881 + 3 27 918 922 + 3 58 1183 1180 + 3 27 922 923 + 3 22 886 887 + 3 122 1907 1906 + 3 26 916 912 + 3 21 874 879 + 3 54 1143 1141 + 3 23 895 889 + 3 26 913 917 + 3 62 1220 1216 + 3 26 917 916 + 3 23 893 895 + 3 118 1867 1866 + 4 27 924 918 + 4 24 898 905 + 4 60 1200 1197 + 4 25 911 907 + 4 27 919 925 + 4 63 1227 1225 + 4 27 925 924 + 4 25 910 911 + 4 124 1927 1926 + 4 24 903 898 + 4 20 865 872 + 4 59 1191 1187 + 4 19 863 859 + 4 24 897 902 + 4 49 1109 1107 + 4 24 902 903 + 4 19 862 863 + 4 116 1847 1846 + 5 26 915 913 + 5 18 847 856 + 5 64 1232 1230 + 5 16 831 827 + 5 26 912 914 + 5 52 1130 1128 + 5 26 914 915 + 5 16 829 831 + 5 112 1799 1798 + 5 25 908 906 + 5 15 818 825 + 5 51 1123 1121 + 5 18 855 847 + 5 25 907 909 + 5 61 1208 1204 + 5 25 909 908 + 5 18 849 855 + 5 98 1626 1623 + 6 19 860 858 + 6 13 799 805 + 6 41 1043 1041 + 6 15 822 818 + 6 19 859 861 + 6 48 1100 1097 + 6 19 861 860 + 6 15 819 822 + 6 85 1463 1461 + 6 13 801 799 + 6 10 777 780 + 6 40 1035 1032 + 6 9 773 769 + 6 13 798 800 + 6 32 961 958 + 6 13 800 801 + 6 9 770 773 + 6 73 1325 1324 + 1 30 943 940 + 1 31 947 951 + 1 128 1950 1947 + 1 31 950 947 + 1 29 934 937 + 1 129 1953 1944 + 2 28 929 926 + 2 30 940 942 + 2 126 1942 1939 + 2 36 994 992 + 2 34 973 976 + 2 134 1981 1967 + 3 47 1090 1086 + 3 46 1078 1082 + 3 145 2037 2030 + 3 45 1074 1071 + 3 47 1086 1089 + 3 143 2029 2026 + 4 50 1114 1110 + 4 51 1119 1122 + 4 148 2052 2048 + 4 42 1049 1045 + 4 41 1039 1042 + 4 140 2013 2007 + 5 38 1016 1012 + 5 36 992 995 + 5 136 1995 1980 + 5 35 987 983 + 5 38 1012 1015 + 5 133 1979 1975 + 6 33 967 964 + 6 35 983 985 + 6 131 1965 1961 + 6 29 936 934 + 6 28 926 928 + 6 127 1945 1938 + 1 46 1080 1078 + 1 43 1054 1057 + 1 144 2031 2015 + 1 55 1148 1144 + 1 58 1176 1178 + 1 153 2070 2067 + 1 78 1378 1374 + 1 75 1340 1347 + 1 184 2247 2226 + 1 57 1169 1167 + 1 55 1144 1147 + 1 155 2084 2066 + 1 39 1027 1024 + 1 42 1045 1047 + 1 137 2000 1998 + 1 81 1416 1412 + 1 72 1311 1319 + 1 192 2306 2276 + 2 34 975 973 + 2 32 956 959 + 2 132 1970 1956 + 2 43 1056 1054 + 2 44 1061 1063 + 2 141 2016 2014 + 2 70 1291 1286 + 2 67 1252 1257 + 2 170 2167 2144 + 2 53 1133 1131 + 2 52 1125 1127 + 2 151 2060 2055 + 2 44 1064 1061 + 2 45 1071 1073 + 2 142 2023 2019 + 2 100 1642 1638 + 2 87 1481 1488 + 2 226 2540 2526 + 3 65 1237 1234 + 3 62 1213 1217 + 3 163 2122 2111 + 3 58 1180 1176 + 3 60 1193 1196 + 3 156 2091 2088 + 3 122 1906 1898 + 3 119 1869 1877 + 3 292 3030 3017 + 3 54 1141 1138 + 3 53 1131 1134 + 3 152 2064 2059 + 3 62 1216 1213 + 3 64 1228 1231 + 3 160 2114 2110 + 3 118 1866 1858 + 3 117 1848 1856 + 3 275 2913 2905 + 4 60 1197 1193 + 4 59 1184 1188 + 4 158 2099 2092 + 4 63 1225 1222 + 4 65 1234 1238 + 4 161 2118 2116 + 4 124 1926 1918 + 4 123 1908 1916 + 4 301 3094 3086 + 4 59 1187 1184 + 4 57 1167 1171 + 4 157 2095 2083 + 4 49 1107 1104 + 4 50 1110 1113 + 4 147 2047 2045 + 4 116 1846 1838 + 4 114 1819 1827 + 4 268 2871 2863 + 5 64 1230 1228 + 5 61 1201 1205 + 5 162 2119 2102 + 5 52 1128 1125 + 5 54 1138 1140 + 5 150 2058 2056 + 5 112 1798 1794 + 5 99 1629 1637 + 5 252 2767 2719 + 5 51 1121 1119 + 5 48 1095 1099 + 5 149 2053 2040 + 5 61 1204 1201 + 5 63 1222 1224 + 5 159 2105 2101 + 5 98 1623 1618 + 5 94 1570 1576 + 5 221 2515 2485 + 6 41 1041 1039 + 6 40 1030 1033 + 6 139 2008 2001 + 6 48 1097 1095 + 6 49 1104 1106 + 6 146 2041 2038 + 6 85 1461 1456 + 6 83 1432 1437 + 6 201 2369 2352 + 6 40 1032 1030 + 6 39 1024 1026 + 6 138 2003 1997 + 6 32 958 956 + 6 33 964 966 + 6 130 1958 1955 + 6 73 1324 1320 + 6 66 1243 1250 + 6 176 2200 2186 + 1 75 1342 1340 + 1 30 941 946 + 1 181 2227 2209 + 1 31 955 948 + 1 75 1341 1343 + 1 185 2255 2252 + 1 75 1343 1342 + 1 31 951 955 + 1 334 3265 3252 + 1 72 1313 1311 + 1 31 948 954 + 1 188 2277 2251 + 1 29 939 935 + 1 72 1310 1312 + 1 172 2180 2178 + 1 72 1312 1313 + 1 29 937 939 + 1 337 3249 3244 + 2 67 1254 1252 + 2 28 927 932 + 2 167 2146 2125 + 2 30 944 941 + 2 67 1253 1255 + 2 178 2210 2208 + 2 67 1255 1254 + 2 30 942 944 + 2 326 3233 3216 + 2 87 1483 1481 + 2 36 993 996 + 2 224 2527 2517 + 2 34 980 974 + 2 87 1480 1482 + 2 203 2383 2379 + 2 87 1482 1483 + 2 34 976 980 + 2 365 3367 3346 + 3 119 1871 1869 + 3 47 1087 1094 + 3 290 3018 2969 + 3 46 1085 1079 + 3 119 1868 1870 + 3 276 2919 2916 + 3 119 1870 1871 + 3 46 1082 1085 + 3 421 3646 3638 + 3 117 1850 1848 + 3 45 1072 1077 + 3 274 2906 2873 + 3 47 1093 1087 + 3 117 1849 1851 + 3 284 2971 2968 + 3 117 1851 1850 + 3 47 1089 1093 + 3 413 3632 3619 + 4 123 1910 1908 + 4 50 1111 1118 + 4 300 3087 3033 + 4 51 1124 1120 + 4 123 1909 1911 + 4 302 3098 3096 + 4 123 1911 1910 + 4 51 1122 1124 + 4 436 3726 3710 + 4 114 1821 1819 + 4 42 1046 1053 + 4 267 2864 2810 + 4 41 1044 1040 + 4 114 1818 1820 + 4 254 2780 2778 + 4 114 1820 1821 + 4 41 1042 1044 + 4 397 3541 3536 + 5 99 1631 1629 + 5 38 1013 1022 + 5 246 2720 2682 + 5 36 997 993 + 5 99 1628 1630 + 5 222 2520 2518 + 5 99 1630 1631 + 5 36 995 997 + 5 379 3420 3415 + 5 94 1572 1570 + 5 35 984 991 + 5 217 2486 2455 + 5 38 1021 1013 + 5 94 1571 1573 + 5 242 2685 2681 + 5 94 1573 1572 + 5 38 1015 1021 + 5 363 3410 3389 + 6 83 1434 1432 + 6 33 965 971 + 6 199 2354 2315 + 6 35 988 984 + 6 83 1433 1435 + 6 213 2456 2453 + 6 83 1435 1434 + 6 35 985 988 + 6 349 3335 3313 + 6 66 1245 1243 + 6 29 935 938 + 6 174 2187 2177 + 6 28 931 927 + 6 66 1242 1244 + 6 164 2127 2124 + 6 66 1244 1245 + 6 28 928 931 + 6 329 3229 3213 + 1 78 1377 1375 + 1 46 1079 1083 + 1 278 2929 2914 + 1 43 1059 1055 + 1 78 1374 1376 + 1 179 2216 2214 + 1 78 1376 1377 + 1 43 1057 1059 + 1 415 3573 3565 + 1 82 1424 1422 + 1 55 1145 1151 + 1 193 2310 2259 + 1 58 1181 1177 + 1 82 1423 1426 + 1 277 2923 2920 + 1 82 1426 1424 + 1 58 1178 1181 + 1 454 3801 3784 + 1 82 1429 1423 + 1 78 1375 1381 + 1 279 2936 2926 + 1 75 1349 1341 + 1 82 1422 1427 + 1 189 2286 2282 + 1 82 1427 1429 + 1 75 1347 1349 + 1 563 4235 4229 + 1 81 1415 1413 + 1 57 1168 1172 + 1 263 2831 2815 + 1 55 1150 1145 + 1 81 1412 1414 + 1 186 2261 2258 + 1 81 1414 1415 + 1 55 1147 1150 + 1 468 3797 3782 + 1 74 1332 1330 + 1 39 1025 1029 + 1 177 2204 2182 + 1 42 1050 1046 + 1 74 1331 1334 + 1 260 2811 2808 + 1 74 1334 1332 + 1 42 1047 1050 + 1 384 3500 3491 + 1 74 1338 1331 + 1 81 1413 1417 + 1 262 2826 2822 + 1 72 1317 1310 + 1 74 1330 1335 + 1 175 2197 2193 + 1 74 1335 1338 + 1 72 1319 1317 + 1 547 4192 4198 + 2 70 1289 1287 + 2 34 974 979 + 2 205 2396 2378 + 2 32 962 957 + 2 70 1286 1288 + 2 165 2134 2131 + 2 70 1288 1289 + 2 32 959 962 + 2 354 3304 3290 + 2 76 1352 1350 + 2 43 1055 1058 + 2 182 2233 2213 + 2 44 1067 1062 + 2 76 1351 1353 + 2 204 2390 2386 + 2 76 1353 1352 + 2 44 1063 1067 + 2 400 3569 3557 + 2 76 1355 1351 + 2 70 1287 1293 + 2 206 2404 2394 + 2 67 1260 1253 + 2 76 1350 1354 + 2 180 2223 2219 + 2 76 1354 1355 + 2 67 1257 1260 + 2 531 4095 4082 + 2 100 1641 1639 + 2 53 1132 1135 + 2 272 2891 2877 + 2 52 1129 1126 + 2 100 1638 1640 + 2 223 2523 2521 + 2 100 1640 1641 + 2 52 1127 1129 + 2 444 3743 3736 + 2 90 1520 1518 + 2 44 1062 1068 + 2 210 2433 2387 + 2 45 1075 1072 + 2 90 1519 1521 + 2 269 2874 2872 + 2 90 1521 1520 + 2 45 1073 1075 + 2 407 3605 3585 + 2 90 1525 1519 + 2 100 1639 1643 + 2 271 2886 2882 + 2 87 1486 1480 + 2 90 1518 1522 + 2 207 2412 2408 + 2 90 1522 1525 + 2 87 1488 1486 + 2 615 4411 4419 + 3 122 1901 1899 + 3 65 1235 1240 + 3 319 3196 3164 + 3 62 1221 1214 + 3 122 1898 1900 + 3 285 2979 2976 + 3 122 1900 1901 + 3 62 1217 1221 + 3 506 4026 4011 + 3 120 1881 1878 + 3 58 1177 1183 + 3 283 2963 2922 + 3 60 1199 1194 + 3 120 1879 1882 + 3 314 3161 3158 + 3 120 1882 1881 + 3 60 1196 1199 + 3 475 3911 3904 + 3 120 1887 1879 + 3 122 1899 1907 + 3 318 3195 3190 + 3 119 1876 1868 + 3 120 1878 1886 + 3 282 2961 2957 + 3 120 1886 1887 + 3 119 1877 1876 + 3 726 4909 4910 + 3 118 1861 1859 + 3 54 1139 1143 + 3 312 3148 3127 + 3 53 1137 1132 + 3 118 1858 1860 + 3 270 2880 2878 + 3 118 1860 1861 + 3 53 1134 1137 + 3 448 3763 3752 + 3 121 1891 1888 + 3 62 1214 1220 + 3 291 3023 2975 + 3 64 1233 1229 + 3 121 1889 1892 + 3 309 3133 3131 + 3 121 1892 1891 + 3 64 1231 1233 + 3 498 4024 4006 + 3 121 1897 1889 + 3 118 1859 1867 + 3 313 3156 3147 + 3 117 1857 1849 + 3 121 1888 1896 + 3 289 3016 3012 + 3 121 1896 1897 + 3 117 1856 1857 + 3 723 4907 4906 + 4 124 1921 1919 + 4 60 1194 1200 + 4 320 3201 3159 + 4 59 1192 1185 + 4 124 1918 1920 + 4 294 3043 3040 + 4 124 1920 1921 + 4 59 1188 1192 + 4 483 3930 3916 + 4 125 1931 1928 + 4 63 1223 1227 + 4 307 3122 3100 + 4 65 1241 1235 + 4 125 1929 1932 + 4 315 3168 3165 + 4 125 1932 1931 + 4 65 1238 1241 + 4 502 4033 4029 + 4 125 1937 1929 + 4 124 1919 1927 + 4 321 3209 3200 + 4 123 1917 1909 + 4 125 1928 1936 + 4 306 3120 3116 + 4 125 1936 1937 + 4 123 1916 1917 + 4 729 4913 4912 + 4 116 1841 1839 + 4 59 1185 1191 + 4 299 3082 3039 + 4 57 1175 1168 + 4 116 1838 1840 + 4 261 2820 2817 + 4 116 1840 1841 + 4 57 1171 1175 + 4 479 3901 3887 + 4 115 1831 1828 + 4 49 1105 1109 + 4 259 2804 2782 + 4 50 1117 1111 + 4 115 1829 1832 + 4 293 3035 3032 + 4 115 1832 1831 + 4 50 1113 1117 + 4 431 3707 3703 + 4 115 1837 1829 + 4 116 1839 1847 + 4 298 3081 3076 + 4 114 1826 1818 + 4 115 1828 1836 + 4 258 2802 2798 + 4 115 1836 1837 + 4 114 1827 1826 + 4 720 4903 4904 + 5 112 1797 1795 + 5 64 1229 1232 + 5 311 3143 3130 + 5 61 1209 1202 + 5 112 1794 1796 + 5 243 2696 2692 + 5 112 1796 1797 + 5 61 1205 1209 + 5 503 3981 3958 + 5 101 1650 1648 + 5 52 1126 1130 + 5 227 2544 2522 + 5 54 1142 1139 + 5 101 1649 1652 + 5 308 3128 3126 + 5 101 1652 1650 + 5 54 1140 1142 + 5 442 3747 3738 + 5 101 1656 1649 + 5 112 1795 1799 + 5 310 3138 3134 + 5 99 1635 1628 + 5 101 1648 1653 + 5 225 2537 2533 + 5 101 1653 1656 + 5 99 1637 1635 + 5 666 4689 4695 + 5 98 1622 1619 + 5 51 1120 1123 + 5 304 3105 3095 + 5 48 1102 1096 + 5 98 1618 1620 + 5 214 2465 2462 + 5 98 1620 1622 + 5 48 1099 1102 + 5 437 3693 3679 + 5 111 1786 1784 + 5 61 1202 1208 + 5 251 2762 2691 + 5 63 1226 1223 + 5 111 1785 1787 + 5 303 3101 3099 + 5 111 1787 1786 + 5 63 1224 1226 + 5 489 3977 3950 + 5 111 1789 1785 + 5 98 1619 1626 + 5 305 3113 3103 + 5 94 1579 1571 + 5 111 1784 1788 + 5 245 2717 2713 + 5 111 1788 1789 + 5 94 1576 1579 + 5 656 4601 4592 + 6 85 1459 1457 + 6 41 1040 1043 + 6 256 2787 2777 + 6 40 1037 1031 + 6 85 1456 1458 + 6 195 2325 2322 + 6 85 1458 1459 + 6 40 1033 1037 + 6 392 3525 3505 + 6 95 1582 1580 + 6 48 1096 1100 + 6 218 2492 2460 + 6 49 1108 1105 + 6 95 1581 1583 + 6 255 2783 2781 + 6 95 1583 1582 + 6 49 1106 1108 + 6 425 3682 3662 + 6 95 1585 1581 + 6 85 1457 1463 + 6 257 2795 2785 + 6 83 1440 1433 + 6 95 1580 1584 + 6 215 2472 2468 + 6 95 1584 1585 + 6 83 1437 1440 + 6 590 4354 4341 + 6 73 1323 1321 + 6 40 1031 1035 + 6 197 2337 2321 + 6 39 1028 1025 + 6 73 1320 1322 + 6 173 2183 2181 + 6 73 1322 1323 + 6 39 1026 1028 + 6 387 3496 3489 + 6 69 1278 1276 + 6 32 957 961 + 6 169 2160 2130 + 6 33 969 965 + 6 69 1277 1279 + 6 194 2317 2314 + 6 69 1279 1278 + 6 33 966 969 + 6 342 3300 3282 + 6 69 1283 1277 + 6 73 1321 1325 + 6 196 2332 2328 + 6 66 1248 1242 + 6 69 1276 1280 + 6 166 2141 2137 + 6 69 1280 1283 + 6 66 1250 1248 + 6 527 4053 4061 + 1 128 1947 732 + 1 129 733 1947 + 1 732 1947 733 + 1 129 1944 733 + 1 127 731 1944 + 1 733 1944 731 + 2 126 1939 730 + 2 128 732 1939 + 2 730 1939 732 + 2 134 1967 738 + 2 132 736 1967 + 2 738 1967 736 + 3 145 2030 749 + 3 144 748 2030 + 3 749 2030 748 + 3 143 2026 747 + 3 145 749 2026 + 3 747 2026 749 + 4 148 2048 752 + 4 149 753 2048 + 4 752 2048 753 + 4 140 2007 744 + 4 139 743 2007 + 4 744 2007 743 + 5 136 1980 740 + 5 134 738 1980 + 5 740 1980 738 + 5 133 1975 737 + 5 136 740 1975 + 5 737 1975 740 + 6 131 1961 735 + 6 133 737 1961 + 6 735 1961 737 + 6 127 1938 731 + 6 126 730 1938 + 6 731 1938 730 + 1 144 2015 748 + 1 141 745 2015 + 1 748 2015 745 + 1 153 2067 757 + 1 156 760 2067 + 1 757 2067 760 + 1 184 2226 788 + 1 181 785 2226 + 1 788 2226 785 + 1 155 2066 759 + 1 153 757 2066 + 1 759 2066 757 + 1 137 1998 741 + 1 140 744 1998 + 1 741 1998 744 + 1 192 2276 796 + 1 188 792 2276 + 1 796 2276 792 + 2 132 1956 736 + 2 130 734 1956 + 2 736 1956 734 + 2 141 2014 745 + 2 142 746 2014 + 2 745 2014 746 + 2 170 2144 774 + 2 167 771 2144 + 2 774 2144 771 + 2 151 2055 755 + 2 150 754 2055 + 2 755 2055 754 + 2 142 2019 746 + 2 143 747 2019 + 2 746 2019 747 + 2 226 2526 830 + 2 224 828 2526 + 2 830 2526 828 + 3 163 2111 767 + 3 160 764 2111 + 3 767 2111 764 + 3 156 2088 760 + 3 158 762 2088 + 3 760 2088 762 + 3 292 3017 896 + 3 290 894 3017 + 3 896 3017 894 + 3 152 2059 756 + 3 151 755 2059 + 3 756 2059 755 + 3 160 2110 764 + 3 162 766 2110 + 3 764 2110 766 + 3 275 2905 879 + 3 274 878 2905 + 3 879 2905 878 + 4 158 2092 762 + 4 157 761 2092 + 4 762 2092 761 + 4 161 2116 765 + 4 163 767 2116 + 4 765 2116 767 + 4 301 3086 905 + 4 300 904 3086 + 4 905 3086 904 + 4 157 2083 761 + 4 155 759 2083 + 4 761 2083 759 + 4 147 2045 751 + 4 148 752 2045 + 4 751 2045 752 + 4 268 2863 872 + 4 267 871 2863 + 4 872 2863 871 + 5 162 2102 766 + 5 159 763 2102 + 5 766 2102 763 + 5 150 2056 754 + 5 152 756 2056 + 5 754 2056 756 + 5 252 2719 856 + 5 246 850 2719 + 5 856 2719 850 + 5 149 2040 753 + 5 146 750 2040 + 5 753 2040 750 + 5 159 2101 763 + 5 161 765 2101 + 5 763 2101 765 + 5 221 2485 825 + 5 217 821 2485 + 5 825 2485 821 + 6 139 2001 743 + 6 138 742 2001 + 6 743 2001 742 + 6 146 2038 750 + 6 147 751 2038 + 6 750 2038 751 + 6 201 2352 805 + 6 199 803 2352 + 6 805 2352 803 + 6 138 1997 742 + 6 137 741 1997 + 6 742 1997 741 + 6 130 1955 734 + 6 131 735 1955 + 6 734 1955 735 + 6 176 2186 780 + 6 174 778 2186 + 6 780 2186 778 + 1 181 2209 785 + 1 178 782 2209 + 1 785 2209 782 + 1 185 2252 789 + 1 189 793 2252 + 1 789 2252 793 + 1 334 3252 946 + 1 331 943 3252 + 1 946 3252 943 + 1 188 2251 792 + 1 185 789 2251 + 1 792 2251 789 + 1 172 2178 776 + 1 175 779 2178 + 1 776 2178 779 + 1 337 3244 954 + 1 328 950 3244 + 1 954 3244 950 + 2 167 2125 771 + 2 164 768 2125 + 2 771 2125 768 + 2 178 2208 782 + 2 180 784 2208 + 2 782 2208 784 + 2 326 3216 932 + 2 323 929 3216 + 2 932 3216 929 + 2 224 2517 828 + 2 222 826 2517 + 2 828 2517 826 + 2 203 2379 807 + 2 207 811 2379 + 2 807 2379 811 + 2 365 3346 996 + 2 351 994 3346 + 2 996 3346 994 + 3 290 2969 894 + 3 284 888 2969 + 3 894 2969 888 + 3 276 2916 880 + 3 282 886 2916 + 3 880 2916 886 + 3 421 3638 1094 + 3 414 1090 3638 + 3 1094 3638 1090 + 3 274 2873 878 + 3 269 873 2873 + 3 878 2873 873 + 3 284 2968 888 + 3 289 893 2968 + 3 888 2968 893 + 3 413 3619 1077 + 3 410 1074 3619 + 3 1077 3619 1074 + 4 300 3033 904 + 4 293 897 3033 + 4 904 3033 897 + 4 302 3096 906 + 4 306 910 3096 + 4 906 3096 910 + 4 436 3710 1118 + 4 432 1114 3710 + 4 1118 3710 1114 + 4 267 2810 871 + 4 260 864 2810 + 4 871 2810 864 + 4 254 2778 858 + 4 258 862 2778 + 4 858 2778 862 + 4 397 3536 1053 + 4 391 1049 3536 + 4 1053 3536 1049 + 5 246 2682 850 + 5 242 846 2682 + 5 850 2682 846 + 5 222 2518 826 + 5 225 829 2518 + 5 826 2518 829 + 5 379 3415 1022 + 5 364 1016 3415 + 5 1022 3415 1016 + 5 217 2455 821 + 5 213 817 2455 + 5 821 2455 817 + 5 242 2681 846 + 5 245 849 2681 + 5 846 2681 849 + 5 363 3389 991 + 5 359 987 3389 + 5 991 3389 987 + 6 199 2315 803 + 6 194 798 2315 + 6 803 2315 798 + 6 213 2453 817 + 6 215 819 2453 + 6 817 2453 819 + 6 349 3313 971 + 6 345 967 3313 + 6 971 3313 967 + 6 174 2177 778 + 6 172 776 2177 + 6 778 2177 776 + 6 164 2124 768 + 6 166 770 2124 + 6 768 2124 770 + 6 329 3213 938 + 6 322 936 3213 + 6 938 3213 936 + 1 278 2914 882 + 1 276 880 2914 + 1 882 2914 880 + 1 179 2214 783 + 1 184 788 2214 + 1 783 2214 788 + 1 415 3565 1083 + 1 399 1080 3565 + 1 1083 3565 1080 + 1 193 2259 797 + 1 186 790 2259 + 1 797 2259 790 + 1 277 2920 881 + 1 279 883 2920 + 1 881 2920 883 + 1 454 3784 1151 + 1 451 1148 3784 + 1 1151 3784 1148 + 1 279 2926 883 + 1 278 882 2926 + 1 883 2926 882 + 1 189 2282 793 + 1 193 797 2282 + 1 793 2282 797 + 1 563 4229 1381 + 1 550 1378 4229 + 1 1381 4229 1378 + 1 263 2815 867 + 1 261 865 2815 + 1 867 2815 865 + 1 186 2258 790 + 1 192 796 2258 + 1 790 2258 796 + 1 468 3782 1172 + 1 450 1169 3782 + 1 1172 3782 1169 + 1 177 2182 781 + 1 173 777 2182 + 1 781 2182 777 + 1 260 2808 864 + 1 262 866 2808 + 1 864 2808 866 + 1 384 3491 1029 + 1 382 1027 3491 + 1 1029 3491 1027 + 1 262 2822 866 + 1 263 867 2822 + 1 866 2822 867 + 1 175 2193 779 + 1 177 781 2193 + 1 779 2193 781 + 1 547 4198 1417 + 1 542 1416 4198 + 1 1417 4198 1416 + 2 205 2378 809 + 2 203 807 2378 + 2 809 2378 807 + 2 165 2131 769 + 2 170 774 2131 + 2 769 2131 774 + 2 354 3290 979 + 2 340 975 3290 + 2 979 3290 975 + 2 182 2213 786 + 2 179 783 2213 + 2 786 2213 783 + 2 204 2386 808 + 2 206 810 2386 + 2 808 2386 810 + 2 400 3557 1058 + 2 398 1056 3557 + 2 1058 3557 1056 + 2 206 2394 810 + 2 205 809 2394 + 2 810 2394 809 + 2 180 2219 784 + 2 182 786 2219 + 2 784 2219 786 + 2 531 4082 1293 + 2 514 1291 4082 + 2 1293 4082 1291 + 2 272 2877 876 + 2 270 874 2877 + 2 876 2877 874 + 2 223 2521 827 + 2 226 830 2521 + 2 827 2521 830 + 2 444 3736 1135 + 2 439 1133 3736 + 2 1135 3736 1133 + 2 210 2387 814 + 2 204 808 2387 + 2 814 2387 808 + 2 269 2872 873 + 2 271 875 2872 + 2 873 2872 875 + 2 407 3585 1068 + 2 403 1064 3585 + 2 1068 3585 1064 + 2 271 2882 875 + 2 272 876 2882 + 2 875 2882 876 + 2 207 2408 811 + 2 210 814 2408 + 2 811 2408 814 + 2 615 4419 1643 + 2 599 1642 4419 + 2 1643 4419 1642 + 3 319 3164 923 + 3 315 919 3164 + 3 923 3164 919 + 3 285 2976 889 + 3 292 896 2976 + 3 889 2976 896 + 3 506 4011 1240 + 3 495 1237 4011 + 3 1240 4011 1237 + 3 283 2922 887 + 3 277 881 2922 + 3 887 2922 881 + 3 314 3158 918 + 3 318 922 3158 + 3 918 3158 922 + 3 475 3904 1183 + 3 472 1180 3904 + 3 1183 3904 1180 + 3 318 3190 922 + 3 319 923 3190 + 3 922 3190 923 + 3 282 2957 886 + 3 283 887 2957 + 3 886 2957 887 + 3 726 4910 1907 + 3 725 1906 4910 + 3 1907 4910 1906 + 3 312 3127 916 + 3 308 912 3127 + 3 916 3127 912 + 3 270 2878 874 + 3 275 879 2878 + 3 874 2878 879 + 3 448 3752 1143 + 3 443 1141 3752 + 3 1143 3752 1141 + 3 291 2975 895 + 3 285 889 2975 + 3 895 2975 889 + 3 309 3131 913 + 3 313 917 3131 + 3 913 3131 917 + 3 498 4006 1220 + 3 494 1216 4006 + 3 1220 4006 1216 + 3 313 3147 917 + 3 312 916 3147 + 3 917 3147 916 + 3 289 3012 893 + 3 291 895 3012 + 3 893 3012 895 + 3 723 4906 1867 + 3 721 1866 4906 + 3 1867 4906 1866 + 4 320 3159 924 + 4 314 918 3159 + 4 924 3159 918 + 4 294 3040 898 + 4 301 905 3040 + 4 898 3040 905 + 4 483 3916 1200 + 4 476 1197 3916 + 4 1200 3916 1197 + 4 307 3100 911 + 4 303 907 3100 + 4 911 3100 907 + 4 315 3165 919 + 4 321 925 3165 + 4 919 3165 925 + 4 502 4029 1227 + 4 500 1225 4029 + 4 1227 4029 1225 + 4 321 3200 925 + 4 320 924 3200 + 4 925 3200 924 + 4 306 3116 910 + 4 307 911 3116 + 4 910 3116 911 + 4 729 4912 1927 + 4 727 1926 4912 + 4 1927 4912 1926 + 4 299 3039 903 + 4 294 898 3039 + 4 903 3039 898 + 4 261 2817 865 + 4 268 872 2817 + 4 865 2817 872 + 4 479 3887 1191 + 4 467 1187 3887 + 4 1191 3887 1187 + 4 259 2782 863 + 4 255 859 2782 + 4 863 2782 859 + 4 293 3032 897 + 4 298 902 3032 + 4 897 3032 902 + 4 431 3703 1109 + 4 429 1107 3703 + 4 1109 3703 1107 + 4 298 3076 902 + 4 299 903 3076 + 4 902 3076 903 + 4 258 2798 862 + 4 259 863 2798 + 4 862 2798 863 + 4 720 4904 1847 + 4 719 1846 4904 + 4 1847 4904 1846 + 5 311 3130 915 + 5 309 913 3130 + 5 915 3130 913 + 5 243 2692 847 + 5 252 856 2692 + 5 847 2692 856 + 5 503 3958 1232 + 5 486 1230 3958 + 5 1232 3958 1230 + 5 227 2522 831 + 5 223 827 2522 + 5 831 2522 827 + 5 308 3126 912 + 5 310 914 3126 + 5 912 3126 914 + 5 442 3738 1130 + 5 440 1128 3738 + 5 1130 3738 1128 + 5 310 3134 914 + 5 311 915 3134 + 5 914 3134 915 + 5 225 2533 829 + 5 227 831 2533 + 5 829 2533 831 + 5 666 4695 1799 + 5 661 1798 4695 + 5 1799 4695 1798 + 5 304 3095 908 + 5 302 906 3095 + 5 908 3095 906 + 5 214 2462 818 + 5 221 825 2462 + 5 818 2462 825 + 5 437 3679 1123 + 5 424 1121 3679 + 5 1123 3679 1121 + 5 251 2691 855 + 5 243 847 2691 + 5 855 2691 847 + 5 303 3099 907 + 5 305 909 3099 + 5 907 3099 909 + 5 489 3950 1208 + 5 485 1204 3950 + 5 1208 3950 1204 + 5 305 3103 909 + 5 304 908 3103 + 5 909 3103 908 + 5 245 2713 849 + 5 251 855 2713 + 5 849 2713 855 + 5 656 4592 1626 + 5 635 1623 4592 + 5 1626 4592 1623 + 6 256 2777 860 + 6 254 858 2777 + 6 860 2777 858 + 6 195 2322 799 + 6 201 805 2322 + 6 799 2322 805 + 6 392 3505 1043 + 6 385 1041 3505 + 6 1043 3505 1041 + 6 218 2460 822 + 6 214 818 2460 + 6 822 2460 818 + 6 255 2781 859 + 6 257 861 2781 + 6 859 2781 861 + 6 425 3662 1100 + 6 422 1097 3662 + 6 1100 3662 1097 + 6 257 2785 861 + 6 256 860 2785 + 6 861 2785 860 + 6 215 2468 819 + 6 218 822 2468 + 6 819 2468 822 + 6 590 4341 1463 + 6 580 1461 4341 + 6 1463 4341 1461 + 6 197 2321 801 + 6 195 799 2321 + 6 801 2321 799 + 6 173 2181 777 + 6 176 780 2181 + 6 777 2181 780 + 6 387 3489 1035 + 6 381 1032 3489 + 6 1035 3489 1032 + 6 169 2130 773 + 6 165 769 2130 + 6 773 2130 769 + 6 194 2314 798 + 6 196 800 2314 + 6 798 2314 800 + 6 342 3282 961 + 6 339 958 3282 + 6 961 3282 958 + 6 196 2328 800 + 6 197 801 2328 + 6 800 2328 801 + 6 166 2137 770 + 6 169 773 2137 + 6 770 2137 773 + 6 527 4061 1325 + 6 511 1324 4061 + 6 1325 4061 1324 + 1 331 1950 943 + 1 128 940 1950 + 1 943 1950 940 + 1 129 1954 947 + 1 331 951 1954 + 1 947 1954 951 + 1 331 1954 1950 + 1 129 1947 1954 + 1 1950 1954 1947 + 1 328 1953 950 + 1 129 947 1953 + 1 950 1953 947 + 1 127 1946 934 + 1 328 937 1946 + 1 934 1946 937 + 1 328 1946 1953 + 1 127 1944 1946 + 1 1953 1946 1944 + 2 323 1942 929 + 2 126 926 1942 + 2 929 1942 926 + 2 128 1948 940 + 2 323 942 1948 + 2 940 1948 942 + 2 323 1948 1942 + 2 128 1939 1948 + 2 1942 1948 1939 + 2 351 1981 994 + 2 134 992 1981 + 2 994 1981 992 + 2 132 1971 973 + 2 351 976 1971 + 2 973 1971 976 + 2 351 1971 1981 + 2 132 1967 1971 + 2 1981 1971 1967 + 3 414 2037 1090 + 3 145 1086 2037 + 3 1090 2037 1086 + 3 144 2033 1078 + 3 414 1082 2033 + 3 1078 2033 1082 + 3 414 2033 2037 + 3 144 2030 2033 + 3 2037 2033 2030 + 3 410 2029 1074 + 3 143 1071 2029 + 3 1074 2029 1071 + 3 145 2036 1086 + 3 410 1089 2036 + 3 1086 2036 1089 + 3 410 2036 2029 + 3 145 2026 2036 + 3 2029 2036 2026 + 4 432 2052 1114 + 4 148 1110 2052 + 4 1114 2052 1110 + 4 149 2054 1119 + 4 432 1122 2054 + 4 1119 2054 1122 + 4 432 2054 2052 + 4 149 2048 2054 + 4 2052 2054 2048 + 4 391 2013 1049 + 4 140 1045 2013 + 4 1049 2013 1045 + 4 139 2009 1039 + 4 391 1042 2009 + 4 1039 2009 1042 + 4 391 2009 2013 + 4 139 2007 2009 + 4 2013 2009 2007 + 5 364 1995 1016 + 5 136 1012 1995 + 5 1016 1995 1012 + 5 134 1982 992 + 5 364 995 1982 + 5 992 1982 995 + 5 364 1982 1995 + 5 134 1980 1982 + 5 1995 1982 1980 + 5 359 1979 987 + 5 133 983 1979 + 5 987 1979 983 + 5 136 1994 1012 + 5 359 1015 1994 + 5 1012 1994 1015 + 5 359 1994 1979 + 5 136 1975 1994 + 5 1979 1994 1975 + 6 345 1965 967 + 6 131 964 1965 + 6 967 1965 964 + 6 133 1976 983 + 6 345 985 1976 + 6 983 1976 985 + 6 345 1976 1965 + 6 133 1961 1976 + 6 1965 1976 1961 + 6 322 1945 936 + 6 127 934 1945 + 6 936 1945 934 + 6 126 1941 926 + 6 322 928 1941 + 6 926 1941 928 + 6 322 1941 1945 + 6 126 1938 1941 + 6 1945 1941 1938 + 1 399 2031 1080 + 1 144 1078 2031 + 1 1080 2031 1078 + 1 141 2017 1054 + 1 399 1057 2017 + 1 1054 2017 1057 + 1 399 2017 2031 + 1 141 2015 2017 + 1 2031 2017 2015 + 1 451 2070 1148 + 1 153 1144 2070 + 1 1148 2070 1144 + 1 156 2089 1176 + 1 451 1178 2089 + 1 1176 2089 1178 + 1 451 2089 2070 + 1 156 2067 2089 + 1 2070 2089 2067 + 1 550 2247 1378 + 1 184 1374 2247 + 1 1378 2247 1374 + 1 181 2230 1340 + 1 550 1347 2230 + 1 1340 2230 1347 + 1 550 2230 2247 + 1 181 2226 2230 + 1 2247 2230 2226 + 1 450 2084 1169 + 1 155 1167 2084 + 1 1169 2084 1167 + 1 153 2069 1144 + 1 450 1147 2069 + 1 1144 2069 1147 + 1 450 2069 2084 + 1 153 2066 2069 + 1 2084 2069 2066 + 1 382 2000 1027 + 1 137 1024 2000 + 1 1027 2000 1024 + 1 140 2010 1045 + 1 382 1047 2010 + 1 1045 2010 1047 + 1 382 2010 2000 + 1 140 1998 2010 + 1 2000 2010 1998 + 1 542 2306 1416 + 1 192 1412 2306 + 1 1416 2306 1412 + 1 188 2280 1311 + 1 542 1319 2280 + 1 1311 2280 1319 + 1 542 2280 2306 + 1 188 2276 2280 + 1 2306 2280 2276 + 2 340 1970 975 + 2 132 973 1970 + 2 975 1970 973 + 2 130 1959 956 + 2 340 959 1959 + 2 956 1959 959 + 2 340 1959 1970 + 2 130 1956 1959 + 2 1970 1959 1956 + 2 398 2016 1056 + 2 141 1054 2016 + 2 1056 2016 1054 + 2 142 2022 1061 + 2 398 1063 2022 + 2 1061 2022 1063 + 2 398 2022 2016 + 2 142 2014 2022 + 2 2016 2022 2014 + 2 514 2167 1291 + 2 170 1286 2167 + 2 1291 2167 1286 + 2 167 2148 1252 + 2 514 1257 2148 + 2 1252 2148 1257 + 2 514 2148 2167 + 2 167 2144 2148 + 2 2167 2148 2144 + 2 439 2060 1133 + 2 151 1131 2060 + 2 1133 2060 1131 + 2 150 2057 1125 + 2 439 1127 2057 + 2 1125 2057 1127 + 2 439 2057 2060 + 2 150 2055 2057 + 2 2060 2057 2055 + 2 403 2023 1064 + 2 142 1061 2023 + 2 1064 2023 1061 + 2 143 2027 1071 + 2 403 1073 2027 + 2 1071 2027 1073 + 2 403 2027 2023 + 2 143 2019 2027 + 2 2023 2027 2019 + 2 599 2540 1642 + 2 226 1638 2540 + 2 1642 2540 1638 + 2 224 2530 1481 + 2 599 1488 2530 + 2 1481 2530 1488 + 2 599 2530 2540 + 2 224 2526 2530 + 2 2540 2530 2526 + 3 495 2122 1237 + 3 163 1234 2122 + 3 1237 2122 1234 + 3 160 2115 1213 + 3 495 1217 2115 + 3 1213 2115 1217 + 3 495 2115 2122 + 3 160 2111 2115 + 3 2122 2115 2111 + 3 472 2091 1180 + 3 156 1176 2091 + 3 1180 2091 1176 + 3 158 2098 1193 + 3 472 1196 2098 + 3 1193 2098 1196 + 3 472 2098 2091 + 3 158 2088 2098 + 3 2091 2098 2088 + 3 725 3030 1906 + 3 292 1898 3030 + 3 1906 3030 1898 + 3 290 3021 1869 + 3 725 1877 3021 + 3 1869 3021 1877 + 3 725 3021 3030 + 3 290 3017 3021 + 3 3030 3021 3017 + 3 443 2064 1141 + 3 152 1138 2064 + 3 1141 2064 1138 + 3 151 2062 1131 + 3 443 1134 2062 + 3 1131 2062 1134 + 3 443 2062 2064 + 3 151 2059 2062 + 3 2064 2062 2059 + 3 494 2114 1216 + 3 160 1213 2114 + 3 1216 2114 1213 + 3 162 2120 1228 + 3 494 1231 2120 + 3 1228 2120 1231 + 3 494 2120 2114 + 3 162 2110 2120 + 3 2114 2120 2110 + 3 721 2913 1866 + 3 275 1858 2913 + 3 1866 2913 1858 + 3 274 2909 1848 + 3 721 1856 2909 + 3 1848 2909 1856 + 3 721 2909 2913 + 3 274 2905 2909 + 3 2913 2909 2905 + 4 476 2099 1197 + 4 158 1193 2099 + 4 1197 2099 1193 + 4 157 2096 1184 + 4 476 1188 2096 + 4 1184 2096 1188 + 4 476 2096 2099 + 4 157 2092 2096 + 4 2099 2096 2092 + 4 500 2118 1225 + 4 161 1222 2118 + 4 1225 2118 1222 + 4 163 2123 1234 + 4 500 1238 2123 + 4 1234 2123 1238 + 4 500 2123 2118 + 4 163 2116 2123 + 4 2118 2123 2116 + 4 727 3094 1926 + 4 301 1918 3094 + 4 1926 3094 1918 + 4 300 3090 1908 + 4 727 1916 3090 + 4 1908 3090 1916 + 4 727 3090 3094 + 4 300 3086 3090 + 4 3094 3090 3086 + 4 467 2095 1187 + 4 157 1184 2095 + 4 1187 2095 1184 + 4 155 2087 1167 + 4 467 1171 2087 + 4 1167 2087 1171 + 4 467 2087 2095 + 4 155 2083 2087 + 4 2095 2087 2083 + 4 429 2047 1107 + 4 147 1104 2047 + 4 1107 2047 1104 + 4 148 2051 1110 + 4 429 1113 2051 + 4 1110 2051 1113 + 4 429 2051 2047 + 4 148 2045 2051 + 4 2047 2051 2045 + 4 719 2871 1846 + 4 268 1838 2871 + 4 1846 2871 1838 + 4 267 2867 1819 + 4 719 1827 2867 + 4 1819 2867 1827 + 4 719 2867 2871 + 4 267 2863 2867 + 4 2871 2867 2863 + 5 486 2119 1230 + 5 162 1228 2119 + 5 1230 2119 1228 + 5 159 2106 1201 + 5 486 1205 2106 + 5 1201 2106 1205 + 5 486 2106 2119 + 5 159 2102 2106 + 5 2119 2106 2102 + 5 440 2058 1128 + 5 150 1125 2058 + 5 1128 2058 1125 + 5 152 2063 1138 + 5 440 1140 2063 + 5 1138 2063 1140 + 5 440 2063 2058 + 5 152 2056 2063 + 5 2058 2063 2056 + 5 661 2767 1798 + 5 252 1794 2767 + 5 1798 2767 1794 + 5 246 2723 1629 + 5 661 1637 2723 + 5 1629 2723 1637 + 5 661 2723 2767 + 5 246 2719 2723 + 5 2767 2723 2719 + 5 424 2053 1121 + 5 149 1119 2053 + 5 1121 2053 1119 + 5 146 2043 1095 + 5 424 1099 2043 + 5 1095 2043 1099 + 5 424 2043 2053 + 5 146 2040 2043 + 5 2053 2043 2040 + 5 485 2105 1204 + 5 159 1201 2105 + 5 1204 2105 1201 + 5 161 2117 1222 + 5 485 1224 2117 + 5 1222 2117 1224 + 5 485 2117 2105 + 5 161 2101 2117 + 5 2105 2117 2101 + 5 635 2515 1623 + 5 221 1618 2515 + 5 1623 2515 1618 + 5 217 2489 1570 + 5 635 1576 2489 + 5 1570 2489 1576 + 5 635 2489 2515 + 5 217 2485 2489 + 5 2515 2489 2485 + 6 385 2008 1041 + 6 139 1039 2008 + 6 1041 2008 1039 + 6 138 2005 1030 + 6 385 1033 2005 + 6 1030 2005 1033 + 6 385 2005 2008 + 6 138 2001 2005 + 6 2008 2005 2001 + 6 422 2041 1097 + 6 146 1095 2041 + 6 1097 2041 1095 + 6 147 2046 1104 + 6 422 1106 2046 + 6 1104 2046 1106 + 6 422 2046 2041 + 6 147 2038 2046 + 6 2041 2046 2038 + 6 580 2369 1461 + 6 201 1456 2369 + 6 1461 2369 1456 + 6 199 2356 1432 + 6 580 1437 2356 + 6 1432 2356 1437 + 6 580 2356 2369 + 6 199 2352 2356 + 6 2369 2356 2352 + 6 381 2003 1032 + 6 138 1030 2003 + 6 1032 2003 1030 + 6 137 1999 1024 + 6 381 1026 1999 + 6 1024 1999 1026 + 6 381 1999 2003 + 6 137 1997 1999 + 6 2003 1999 1997 + 6 339 1958 958 + 6 130 956 1958 + 6 958 1958 956 + 6 131 1963 964 + 6 339 966 1963 + 6 964 1963 966 + 6 339 1963 1958 + 6 131 1955 1963 + 6 1958 1963 1955 + 6 511 2200 1324 + 6 176 1320 2200 + 6 1324 2200 1320 + 6 174 2190 1243 + 6 511 1250 2190 + 6 1243 2190 1250 + 6 511 2190 2200 + 6 174 2186 2190 + 6 2200 2190 2186 + 1 334 2227 1342 + 1 181 1340 2227 + 1 1342 2227 1340 + 1 178 2211 941 + 1 334 946 2211 + 1 941 2211 946 + 1 334 2211 2227 + 1 178 2209 2211 + 1 2227 2211 2209 + 1 338 2255 955 + 1 185 948 2255 + 1 955 2255 948 + 1 189 2283 1341 + 1 338 1343 2283 + 1 1341 2283 1343 + 1 338 2283 2255 + 1 189 2252 2283 + 1 2255 2283 2252 + 1 338 3265 1343 + 1 334 1342 3265 + 1 1343 3265 1342 + 1 331 3254 951 + 1 338 955 3254 + 1 951 3254 955 + 1 338 3254 3265 + 1 331 3252 3254 + 1 3265 3254 3252 + 1 337 2277 1313 + 1 188 1311 2277 + 1 1313 2277 1311 + 1 185 2254 948 + 1 337 954 2254 + 1 948 2254 954 + 1 337 2254 2277 + 1 185 2251 2254 + 1 2277 2254 2251 + 1 330 2180 939 + 1 172 935 2180 + 1 939 2180 935 + 1 175 2194 1310 + 1 330 1312 2194 + 1 1310 2194 1312 + 1 330 2194 2180 + 1 175 2178 2194 + 1 2180 2194 2178 + 1 330 3249 1312 + 1 337 1313 3249 + 1 1312 3249 1313 + 1 328 3242 937 + 1 330 939 3242 + 1 937 3242 939 + 1 330 3242 3249 + 1 328 3244 3242 + 1 3249 3242 3244 + 2 326 2146 1254 + 2 167 1252 2146 + 2 1254 2146 1252 + 2 164 2128 927 + 2 326 932 2128 + 2 927 2128 932 + 2 326 2128 2146 + 2 164 2125 2128 + 2 2146 2128 2125 + 2 332 2210 944 + 2 178 941 2210 + 2 944 2210 941 + 2 180 2221 1253 + 2 332 1255 2221 + 2 1253 2221 1255 + 2 332 2221 2210 + 2 180 2208 2221 + 2 2210 2221 2208 + 2 332 3233 1255 + 2 326 1254 3233 + 2 1255 3233 1254 + 2 323 3219 942 + 2 332 944 3219 + 2 942 3219 944 + 2 332 3219 3233 + 2 323 3216 3219 + 2 3233 3219 3216 + 2 365 2527 1483 + 2 224 1481 2527 + 2 1483 2527 1481 + 2 222 2519 993 + 2 365 996 2519 + 2 993 2519 996 + 2 365 2519 2527 + 2 222 2517 2519 + 2 2527 2519 2517 + 2 355 2383 980 + 2 203 974 2383 + 2 980 2383 974 + 2 207 2409 1480 + 2 355 1482 2409 + 2 1480 2409 1482 + 2 355 2409 2383 + 2 207 2379 2409 + 2 2383 2409 2379 + 2 355 3367 1482 + 2 365 1483 3367 + 2 1482 3367 1483 + 2 351 3344 976 + 2 355 980 3344 + 2 976 3344 980 + 2 355 3344 3367 + 2 351 3346 3344 + 2 3367 3344 3346 + 3 421 3018 1871 + 3 290 1869 3018 + 3 1871 3018 1869 + 3 284 2972 1087 + 3 421 1094 2972 + 3 1087 2972 1094 + 3 421 2972 3018 + 3 284 2969 2972 + 3 3018 2972 2969 + 3 417 2919 1085 + 3 276 1079 2919 + 3 1085 2919 1079 + 3 282 2958 1868 + 3 417 1870 2958 + 3 1868 2958 1870 + 3 417 2958 2919 + 3 282 2916 2958 + 3 2919 2958 2916 + 3 417 3646 1870 + 3 421 1871 3646 + 3 1870 3646 1871 + 3 414 3636 1082 + 3 417 1085 3636 + 3 1082 3636 1085 + 3 417 3636 3646 + 3 414 3638 3636 + 3 3646 3636 3638 + 3 413 2906 1850 + 3 274 1848 2906 + 3 1850 2906 1848 + 3 269 2875 1072 + 3 413 1077 2875 + 3 1072 2875 1077 + 3 413 2875 2906 + 3 269 2873 2875 + 3 2906 2875 2873 + 3 420 2971 1093 + 3 284 1087 2971 + 3 1093 2971 1087 + 3 289 3013 1849 + 3 420 1851 3013 + 3 1849 3013 1851 + 3 420 3013 2971 + 3 289 2968 3013 + 3 2971 3013 2968 + 3 420 3632 1851 + 3 413 1850 3632 + 3 1851 3632 1850 + 3 410 3621 1089 + 3 420 1093 3621 + 3 1089 3621 1093 + 3 420 3621 3632 + 3 410 3619 3621 + 3 3632 3621 3619 + 4 436 3087 1910 + 4 300 1908 3087 + 4 1910 3087 1908 + 4 293 3036 1111 + 4 436 1118 3036 + 4 1111 3036 1118 + 4 436 3036 3087 + 4 293 3033 3036 + 4 3087 3036 3033 + 4 438 3098 1124 + 4 302 1120 3098 + 4 1124 3098 1120 + 4 306 3117 1909 + 4 438 1911 3117 + 4 1909 3117 1911 + 4 438 3117 3098 + 4 306 3096 3117 + 4 3098 3117 3096 + 4 438 3726 1911 + 4 436 1910 3726 + 4 1911 3726 1910 + 4 432 3712 1122 + 4 438 1124 3712 + 4 1122 3712 1124 + 4 438 3712 3726 + 4 432 3710 3712 + 4 3726 3712 3710 + 4 397 2864 1821 + 4 267 1819 2864 + 4 1821 2864 1819 + 4 260 2813 1046 + 4 397 1053 2813 + 4 1046 2813 1053 + 4 397 2813 2864 + 4 260 2810 2813 + 4 2864 2813 2810 + 4 393 2780 1044 + 4 254 1040 2780 + 4 1044 2780 1040 + 4 258 2799 1818 + 4 393 1820 2799 + 4 1818 2799 1820 + 4 393 2799 2780 + 4 258 2778 2799 + 4 2780 2799 2778 + 4 393 3541 1820 + 4 397 1821 3541 + 4 1820 3541 1821 + 4 391 3534 1042 + 4 393 1044 3534 + 4 1042 3534 1044 + 4 393 3534 3541 + 4 391 3536 3534 + 4 3541 3534 3536 + 5 379 2720 1631 + 5 246 1629 2720 + 5 1631 2720 1629 + 5 242 2686 1013 + 5 379 1022 2686 + 5 1013 2686 1022 + 5 379 2686 2720 + 5 242 2682 2686 + 5 2720 2686 2682 + 5 366 2520 997 + 5 222 993 2520 + 5 997 2520 993 + 5 225 2534 1628 + 5 366 1630 2534 + 5 1628 2534 1630 + 5 366 2534 2520 + 5 225 2518 2534 + 5 2520 2534 2518 + 5 366 3420 1630 + 5 379 1631 3420 + 5 1630 3420 1631 + 5 364 3413 995 + 5 366 997 3413 + 5 995 3413 997 + 5 366 3413 3420 + 5 364 3415 3413 + 5 3420 3413 3415 + 5 363 2486 1572 + 5 217 1570 2486 + 5 1572 2486 1570 + 5 213 2458 984 + 5 363 991 2458 + 5 984 2458 991 + 5 363 2458 2486 + 5 213 2455 2458 + 5 2486 2458 2455 + 5 378 2685 1021 + 5 242 1013 2685 + 5 1021 2685 1013 + 5 245 2714 1571 + 5 378 1573 2714 + 5 1571 2714 1573 + 5 378 2714 2685 + 5 245 2681 2714 + 5 2685 2714 2681 + 5 378 3410 1573 + 5 363 1572 3410 + 5 1573 3410 1572 + 5 359 3392 1015 + 5 378 1021 3392 + 5 1015 3392 1021 + 5 378 3392 3410 + 5 359 3389 3392 + 5 3410 3392 3389 + 6 349 2354 1434 + 6 199 1432 2354 + 6 1434 2354 1432 + 6 194 2318 965 + 6 349 971 2318 + 6 965 2318 971 + 6 349 2318 2354 + 6 194 2315 2318 + 6 2354 2318 2315 + 6 360 2456 988 + 6 213 984 2456 + 6 988 2456 984 + 6 215 2470 1433 + 6 360 1435 2470 + 6 1433 2470 1435 + 6 360 2470 2456 + 6 215 2453 2470 + 6 2456 2470 2453 + 6 360 3335 1435 + 6 349 1434 3335 + 6 1435 3335 1434 + 6 345 3316 985 + 6 360 988 3316 + 6 985 3316 988 + 6 360 3316 3335 + 6 345 3313 3316 + 6 3335 3316 3313 + 6 329 2187 1245 + 6 174 1243 2187 + 6 1245 2187 1243 + 6 172 2179 935 + 6 329 938 2179 + 6 935 2179 938 + 6 329 2179 2187 + 6 172 2177 2179 + 6 2187 2179 2177 + 6 325 2127 931 + 6 164 927 2127 + 6 931 2127 927 + 6 166 2138 1242 + 6 325 1244 2138 + 6 1242 2138 1244 + 6 325 2138 2127 + 6 166 2124 2138 + 6 2127 2138 2124 + 6 325 3229 1244 + 6 329 1245 3229 + 6 1244 3229 1245 + 6 322 3211 928 + 6 325 931 3211 + 6 928 3211 931 + 6 325 3211 3229 + 6 322 3213 3211 + 6 3229 3211 3213 + 1 415 2929 1377 + 1 278 1375 2929 + 1 1377 2929 1375 + 1 276 2917 1079 + 1 415 1083 2917 + 1 1079 2917 1083 + 1 415 2917 2929 + 1 276 2914 2917 + 1 2929 2917 2914 + 1 401 2216 1059 + 1 179 1055 2216 + 1 1059 2216 1055 + 1 184 2246 1374 + 1 401 1376 2246 + 1 1374 2246 1376 + 1 401 2246 2216 + 1 184 2214 2246 + 1 2216 2246 2214 + 1 401 3573 1376 + 1 415 1377 3573 + 1 1376 3573 1377 + 1 399 3562 1057 + 1 401 1059 3562 + 1 1057 3562 1059 + 1 401 3562 3573 + 1 399 3565 3562 + 1 3573 3562 3565 + 1 454 2310 1424 + 1 193 1422 2310 + 1 1424 2310 1422 + 1 186 2262 1145 + 1 454 1151 2262 + 1 1145 2262 1151 + 1 454 2262 2310 + 1 186 2259 2262 + 1 2310 2262 2259 + 1 473 2923 1181 + 1 277 1177 2923 + 1 1181 2923 1177 + 1 279 2934 1423 + 1 473 1426 2934 + 1 1423 2934 1426 + 1 473 2934 2923 + 1 279 2920 2934 + 1 2923 2934 2920 + 1 473 3801 1426 + 1 454 1424 3801 + 1 1426 3801 1424 + 1 451 3787 1178 + 1 473 1181 3787 + 1 1178 3787 1181 + 1 473 3787 3801 + 1 451 3784 3787 + 1 3801 3787 3784 + 1 563 2936 1429 + 1 279 1423 2936 + 1 1429 2936 1423 + 1 278 2930 1375 + 1 563 1381 2930 + 1 1375 2930 1381 + 1 563 2930 2936 + 1 278 2926 2930 + 1 2936 2930 2926 + 1 552 2286 1349 + 1 189 1341 2286 + 1 1349 2286 1341 + 1 193 2312 1422 + 1 552 1427 2312 + 1 1422 2312 1427 + 1 552 2312 2286 + 1 193 2282 2312 + 1 2286 2312 2282 + 1 552 4235 1427 + 1 563 1429 4235 + 1 1427 4235 1429 + 1 550 4226 1347 + 1 552 1349 4226 + 1 1347 4226 1349 + 1 552 4226 4235 + 1 550 4229 4226 + 1 4235 4226 4229 + 1 468 2831 1415 + 1 263 1413 2831 + 1 1415 2831 1413 + 1 261 2818 1168 + 1 468 1172 2818 + 1 1168 2818 1172 + 1 468 2818 2831 + 1 261 2815 2818 + 1 2831 2818 2815 + 1 453 2261 1150 + 1 186 1145 2261 + 1 1150 2261 1145 + 1 192 2305 1412 + 1 453 1414 2305 + 1 1412 2305 1414 + 1 453 2305 2261 + 1 192 2258 2305 + 1 2261 2305 2258 + 1 453 3797 1414 + 1 468 1415 3797 + 1 1414 3797 1415 + 1 450 3779 1147 + 1 453 1150 3779 + 1 1147 3779 1150 + 1 453 3779 3797 + 1 450 3782 3779 + 1 3797 3779 3782 + 1 384 2204 1332 + 1 177 1330 2204 + 1 1332 2204 1330 + 1 173 2184 1025 + 1 384 1029 2184 + 1 1025 2184 1029 + 1 384 2184 2204 + 1 173 2182 2184 + 1 2204 2184 2182 + 1 394 2811 1050 + 1 260 1046 2811 + 1 1050 2811 1046 + 1 262 2824 1331 + 1 394 1334 2824 + 1 1331 2824 1334 + 1 394 2824 2811 + 1 262 2808 2824 + 1 2811 2824 2808 + 1 394 3500 1334 + 1 384 1332 3500 + 1 1334 3500 1332 + 1 382 3494 1047 + 1 394 1050 3494 + 1 1047 3494 1050 + 1 394 3494 3500 + 1 382 3491 3494 + 1 3500 3494 3491 + 1 547 2826 1338 + 1 262 1331 2826 + 1 1338 2826 1331 + 1 263 2832 1413 + 1 547 1417 2832 + 1 1413 2832 1417 + 1 547 2832 2826 + 1 263 2822 2832 + 1 2826 2832 2822 + 1 540 2197 1317 + 1 175 1310 2197 + 1 1317 2197 1310 + 1 177 2206 1330 + 1 540 1335 2206 + 1 1330 2206 1335 + 1 540 2206 2197 + 1 177 2193 2206 + 1 2197 2206 2193 + 1 540 4192 1335 + 1 547 1338 4192 + 1 1335 4192 1338 + 1 542 4189 1319 + 1 540 1317 4189 + 1 1319 4189 1317 + 1 540 4189 4192 + 1 542 4198 4189 + 1 4192 4189 4198 + 2 354 2396 1289 + 2 205 1287 2396 + 2 1289 2396 1287 + 2 203 2382 974 + 2 354 979 2382 + 2 974 2382 979 + 2 354 2382 2396 + 2 203 2378 2382 + 2 2396 2382 2378 + 2 343 2134 962 + 2 165 957 2134 + 2 962 2134 957 + 2 170 2165 1286 + 2 343 1288 2165 + 2 1286 2165 1288 + 2 343 2165 2134 + 2 170 2131 2165 + 2 2134 2165 2131 + 2 343 3304 1288 + 2 354 1289 3304 + 2 1288 3304 1289 + 2 340 3288 959 + 2 343 962 3288 + 2 959 3288 962 + 2 343 3288 3304 + 2 340 3290 3288 + 2 3304 3288 3290 + 2 400 2233 1352 + 2 182 1350 2233 + 2 1352 2233 1350 + 2 179 2215 1055 + 2 400 1058 2215 + 2 1055 2215 1058 + 2 400 2215 2233 + 2 179 2213 2215 + 2 2233 2215 2213 + 2 406 2390 1067 + 2 204 1062 2390 + 2 1067 2390 1062 + 2 206 2403 1351 + 2 406 1353 2403 + 2 1351 2403 1353 + 2 406 2403 2390 + 2 206 2386 2403 + 2 2390 2403 2386 + 2 406 3569 1353 + 2 400 1352 3569 + 2 1353 3569 1352 + 2 398 3560 1063 + 2 406 1067 3560 + 2 1063 3560 1067 + 2 406 3560 3569 + 2 398 3557 3560 + 2 3569 3560 3557 + 2 531 2404 1355 + 2 206 1351 2404 + 2 1355 2404 1351 + 2 205 2398 1287 + 2 531 1293 2398 + 2 1287 2398 1293 + 2 531 2398 2404 + 2 205 2394 2398 + 2 2404 2398 2394 + 2 517 2223 1260 + 2 180 1253 2223 + 2 1260 2223 1253 + 2 182 2234 1350 + 2 517 1354 2234 + 2 1350 2234 1354 + 2 517 2234 2223 + 2 182 2219 2234 + 2 2223 2234 2219 + 2 517 4095 1354 + 2 531 1355 4095 + 2 1354 4095 1355 + 2 514 4079 1257 + 2 517 1260 4079 + 2 1257 4079 1260 + 2 517 4079 4095 + 2 514 4082 4079 + 2 4095 4079 4082 + 2 444 2891 1641 + 2 272 1639 2891 + 2 1641 2891 1639 + 2 270 2879 1132 + 2 444 1135 2879 + 2 1132 2879 1135 + 2 444 2879 2891 + 2 270 2877 2879 + 2 2891 2879 2877 + 2 441 2523 1129 + 2 223 1126 2523 + 2 1129 2523 1126 + 2 226 2539 1638 + 2 441 1640 2539 + 2 1638 2539 1640 + 2 441 2539 2523 + 2 226 2521 2539 + 2 2523 2539 2521 + 2 441 3743 1640 + 2 444 1641 3743 + 2 1640 3743 1641 + 2 439 3733 1127 + 2 441 1129 3733 + 2 1127 3733 1129 + 2 441 3733 3743 + 2 439 3736 3733 + 2 3743 3733 3736 + 2 407 2433 1520 + 2 210 1518 2433 + 2 1520 2433 1518 + 2 204 2391 1062 + 2 407 1068 2391 + 2 1062 2391 1068 + 2 407 2391 2433 + 2 204 2387 2391 + 2 2433 2391 2387 + 2 411 2874 1075 + 2 269 1072 2874 + 2 1075 2874 1072 + 2 271 2885 1519 + 2 411 1521 2885 + 2 1519 2885 1521 + 2 411 2885 2874 + 2 271 2872 2885 + 2 2874 2885 2872 + 2 411 3605 1521 + 2 407 1520 3605 + 2 1521 3605 1520 + 2 403 3588 1073 + 2 411 1075 3588 + 2 1073 3588 1075 + 2 411 3588 3605 + 2 403 3585 3588 + 2 3605 3588 3585 + 2 615 2886 1525 + 2 271 1519 2886 + 2 1525 2886 1519 + 2 272 2892 1639 + 2 615 1643 2892 + 2 1639 2892 1643 + 2 615 2892 2886 + 2 272 2882 2892 + 2 2886 2892 2882 + 2 597 2412 1486 + 2 207 1480 2412 + 2 1486 2412 1480 + 2 210 2434 1518 + 2 597 1522 2434 + 2 1518 2434 1522 + 2 597 2434 2412 + 2 210 2408 2434 + 2 2412 2434 2408 + 2 597 4411 1522 + 2 615 1525 4411 + 2 1522 4411 1525 + 2 599 4408 1488 + 2 597 1486 4408 + 2 1488 4408 1486 + 2 597 4408 4411 + 2 599 4419 4408 + 2 4411 4408 4419 + 3 506 3196 1901 + 3 319 1899 3196 + 3 1901 3196 1899 + 3 315 3167 1235 + 3 506 1240 3167 + 3 1235 3167 1240 + 3 506 3167 3196 + 3 315 3164 3167 + 3 3196 3167 3164 + 3 499 2979 1221 + 3 285 1214 2979 + 3 1221 2979 1214 + 3 292 3027 1898 + 3 499 1900 3027 + 3 1898 3027 1900 + 3 499 3027 2979 + 3 292 2976 3027 + 3 2979 3027 2976 + 3 499 4026 1900 + 3 506 1901 4026 + 3 1900 4026 1901 + 3 495 4009 1217 + 3 499 1221 4009 + 3 1217 4009 1221 + 3 499 4009 4026 + 3 495 4011 4009 + 3 4026 4009 4011 + 3 475 2963 1881 + 3 283 1878 2963 + 3 1881 2963 1878 + 3 277 2925 1177 + 3 475 1183 2925 + 3 1177 2925 1183 + 3 475 2925 2963 + 3 277 2922 2925 + 3 2963 2925 2922 + 3 482 3161 1199 + 3 314 1194 3161 + 3 1199 3161 1194 + 3 318 3192 1879 + 3 482 1882 3192 + 3 1879 3192 1882 + 3 482 3192 3161 + 3 318 3158 3192 + 3 3161 3192 3158 + 3 482 3911 1882 + 3 475 1881 3911 + 3 1882 3911 1881 + 3 472 3905 1196 + 3 482 1199 3905 + 3 1196 3905 1199 + 3 482 3905 3911 + 3 472 3904 3905 + 3 3911 3905 3904 + 3 726 3195 1887 + 3 318 1879 3195 + 3 1887 3195 1879 + 3 319 3199 1899 + 3 726 1907 3199 + 3 1899 3199 1907 + 3 726 3199 3195 + 3 319 3190 3199 + 3 3195 3199 3190 + 3 724 2961 1876 + 3 282 1868 2961 + 3 1876 2961 1868 + 3 283 2966 1878 + 3 724 1886 2966 + 3 1878 2966 1886 + 3 724 2966 2961 + 3 283 2957 2966 + 3 2961 2966 2957 + 3 724 4909 1886 + 3 726 1887 4909 + 3 1886 4909 1887 + 3 725 4908 1877 + 3 724 1876 4908 + 3 1877 4908 1876 + 3 724 4908 4909 + 3 725 4910 4908 + 3 4909 4908 4910 + 3 448 3148 1861 + 3 312 1859 3148 + 3 1861 3148 1859 + 3 308 3129 1139 + 3 448 1143 3129 + 3 1139 3129 1143 + 3 448 3129 3148 + 3 308 3127 3129 + 3 3148 3129 3127 + 3 446 2880 1137 + 3 270 1132 2880 + 3 1137 2880 1132 + 3 275 2910 1858 + 3 446 1860 2910 + 3 1858 2910 1860 + 3 446 2910 2880 + 3 275 2878 2910 + 3 2880 2910 2878 + 3 446 3763 1860 + 3 448 1861 3763 + 3 1860 3763 1861 + 3 443 3750 1134 + 3 446 1137 3750 + 3 1134 3750 1137 + 3 446 3750 3763 + 3 443 3752 3750 + 3 3763 3750 3752 + 3 498 3023 1891 + 3 291 1888 3023 + 3 1891 3023 1888 + 3 285 2978 1214 + 3 498 1220 2978 + 3 1214 2978 1220 + 3 498 2978 3023 + 3 285 2975 2978 + 3 3023 2978 2975 + 3 504 3133 1233 + 3 309 1229 3133 + 3 1233 3133 1229 + 3 313 3153 1889 + 3 504 1892 3153 + 3 1889 3153 1892 + 3 504 3153 3133 + 3 313 3131 3153 + 3 3133 3153 3131 + 3 504 4024 1892 + 3 498 1891 4024 + 3 1892 4024 1891 + 3 494 4007 1231 + 3 504 1233 4007 + 3 1231 4007 1233 + 3 504 4007 4024 + 3 494 4006 4007 + 3 4024 4007 4006 + 3 723 3156 1897 + 3 313 1889 3156 + 3 1897 3156 1889 + 3 312 3151 1859 + 3 723 1867 3151 + 3 1859 3151 1867 + 3 723 3151 3156 + 3 312 3147 3151 + 3 3156 3151 3147 + 3 722 3016 1857 + 3 289 1849 3016 + 3 1857 3016 1849 + 3 291 3026 1888 + 3 722 1896 3026 + 3 1888 3026 1896 + 3 722 3026 3016 + 3 291 3012 3026 + 3 3016 3026 3012 + 3 722 4907 1896 + 3 723 1897 4907 + 3 1896 4907 1897 + 3 721 4905 1856 + 3 722 1857 4905 + 3 1856 4905 1857 + 3 722 4905 4907 + 3 721 4906 4905 + 3 4907 4905 4906 + 4 483 3201 1921 + 4 320 1919 3201 + 4 1921 3201 1919 + 4 314 3162 1194 + 4 483 1200 3162 + 4 1194 3162 1200 + 4 483 3162 3201 + 4 314 3159 3162 + 4 3201 3162 3159 + 4 480 3043 1192 + 4 294 1185 3043 + 4 1192 3043 1185 + 4 301 3091 1918 + 4 480 1920 3091 + 4 1918 3091 1920 + 4 480 3091 3043 + 4 301 3040 3091 + 4 3043 3091 3040 + 4 480 3930 1920 + 4 483 1921 3930 + 4 1920 3930 1921 + 4 476 3914 1188 + 4 480 1192 3914 + 4 1188 3914 1192 + 4 480 3914 3930 + 4 476 3916 3914 + 4 3930 3914 3916 + 4 502 3122 1931 + 4 307 1928 3122 + 4 1931 3122 1928 + 4 303 3102 1223 + 4 502 1227 3102 + 4 1223 3102 1227 + 4 502 3102 3122 + 4 303 3100 3102 + 4 3122 3102 3100 + 4 507 3168 1241 + 4 315 1235 3168 + 4 1241 3168 1235 + 4 321 3206 1929 + 4 507 1932 3206 + 4 1929 3206 1932 + 4 507 3206 3168 + 4 321 3165 3206 + 4 3168 3206 3165 + 4 507 4033 1932 + 4 502 1931 4033 + 4 1932 4033 1931 + 4 500 4030 1238 + 4 507 1241 4030 + 4 1238 4030 1241 + 4 507 4030 4033 + 4 500 4029 4030 + 4 4033 4030 4029 + 4 729 3209 1937 + 4 321 1929 3209 + 4 1937 3209 1929 + 4 320 3204 1919 + 4 729 1927 3204 + 4 1919 3204 1927 + 4 729 3204 3209 + 4 320 3200 3204 + 4 3209 3204 3200 + 4 728 3120 1917 + 4 306 1909 3120 + 4 1917 3120 1909 + 4 307 3125 1928 + 4 728 1936 3125 + 4 1928 3125 1936 + 4 728 3125 3120 + 4 307 3116 3125 + 4 3120 3125 3116 + 4 728 4913 1936 + 4 729 1937 4913 + 4 1936 4913 1937 + 4 727 4911 1916 + 4 728 1917 4911 + 4 1916 4911 1917 + 4 728 4911 4913 + 4 727 4912 4911 + 4 4913 4911 4912 + 4 479 3082 1841 + 4 299 1839 3082 + 4 1841 3082 1839 + 4 294 3042 1185 + 4 479 1191 3042 + 4 1185 3042 1191 + 4 479 3042 3082 + 4 294 3039 3042 + 4 3082 3042 3039 + 4 471 2820 1175 + 4 261 1168 2820 + 4 1175 2820 1168 + 4 268 2868 1838 + 4 471 1840 2868 + 4 1838 2868 1840 + 4 471 2868 2820 + 4 268 2817 2868 + 4 2820 2868 2817 + 4 471 3901 1840 + 4 479 1841 3901 + 4 1840 3901 1841 + 4 467 3885 1171 + 4 471 1175 3885 + 4 1171 3885 1175 + 4 471 3885 3901 + 4 467 3887 3885 + 4 3901 3885 3887 + 4 431 2804 1831 + 4 259 1828 2804 + 4 1831 2804 1828 + 4 255 2784 1105 + 4 431 1109 2784 + 4 1105 2784 1109 + 4 431 2784 2804 + 4 255 2782 2784 + 4 2804 2784 2782 + 4 435 3035 1117 + 4 293 1111 3035 + 4 1117 3035 1111 + 4 298 3078 1829 + 4 435 1832 3078 + 4 1829 3078 1832 + 4 435 3078 3035 + 4 298 3032 3078 + 4 3035 3078 3032 + 4 435 3707 1832 + 4 431 1831 3707 + 4 1832 3707 1831 + 4 429 3704 1113 + 4 435 1117 3704 + 4 1113 3704 1117 + 4 435 3704 3707 + 4 429 3703 3704 + 4 3707 3704 3703 + 4 720 3081 1837 + 4 298 1829 3081 + 4 1837 3081 1829 + 4 299 3085 1839 + 4 720 1847 3085 + 4 1839 3085 1847 + 4 720 3085 3081 + 4 299 3076 3085 + 4 3081 3085 3076 + 4 718 2802 1826 + 4 258 1818 2802 + 4 1826 2802 1818 + 4 259 2807 1828 + 4 718 1836 2807 + 4 1828 2807 1836 + 4 718 2807 2802 + 4 259 2798 2807 + 4 2802 2807 2798 + 4 718 4903 1836 + 4 720 1837 4903 + 4 1836 4903 1837 + 4 719 4902 1827 + 4 718 1826 4902 + 4 1827 4902 1826 + 4 718 4902 4903 + 4 719 4904 4902 + 4 4903 4902 4904 + 5 503 3143 1797 + 5 311 1795 3143 + 5 1797 3143 1795 + 5 309 3132 1229 + 5 503 1232 3132 + 5 1229 3132 1232 + 5 503 3132 3143 + 5 309 3130 3132 + 5 3143 3132 3130 + 5 490 2696 1209 + 5 243 1202 2696 + 5 1209 2696 1202 + 5 252 2766 1794 + 5 490 1796 2766 + 5 1794 2766 1796 + 5 490 2766 2696 + 5 252 2692 2766 + 5 2696 2766 2692 + 5 490 3981 1796 + 5 503 1797 3981 + 5 1796 3981 1797 + 5 486 3955 1205 + 5 490 1209 3955 + 5 1205 3955 1209 + 5 490 3955 3981 + 5 486 3958 3955 + 5 3981 3955 3958 + 5 442 2544 1650 + 5 227 1648 2544 + 5 1650 2544 1648 + 5 223 2524 1126 + 5 442 1130 2524 + 5 1126 2524 1130 + 5 442 2524 2544 + 5 223 2522 2524 + 5 2544 2524 2522 + 5 447 3128 1142 + 5 308 1139 3128 + 5 1142 3128 1139 + 5 310 3136 1649 + 5 447 1652 3136 + 5 1649 3136 1652 + 5 447 3136 3128 + 5 310 3126 3136 + 5 3128 3136 3126 + 5 447 3747 1652 + 5 442 1650 3747 + 5 1652 3747 1650 + 5 440 3741 1140 + 5 447 1142 3741 + 5 1140 3741 1142 + 5 447 3741 3747 + 5 440 3738 3741 + 5 3747 3741 3738 + 5 666 3138 1656 + 5 310 1649 3138 + 5 1656 3138 1649 + 5 311 3144 1795 + 5 666 1799 3144 + 5 1795 3144 1799 + 5 666 3144 3138 + 5 311 3134 3144 + 5 3138 3144 3134 + 5 659 2537 1635 + 5 225 1628 2537 + 5 1635 2537 1628 + 5 227 2546 1648 + 5 659 1653 2546 + 5 1648 2546 1653 + 5 659 2546 2537 + 5 227 2533 2546 + 5 2537 2546 2533 + 5 659 4689 1653 + 5 666 1656 4689 + 5 1653 4689 1656 + 5 661 4686 1637 + 5 659 1635 4686 + 5 1637 4686 1635 + 5 659 4686 4689 + 5 661 4695 4686 + 5 4689 4686 4695 + 5 437 3105 1622 + 5 304 1619 3105 + 5 1622 3105 1619 + 5 302 3097 1120 + 5 437 1123 3097 + 5 1120 3097 1123 + 5 437 3097 3105 + 5 302 3095 3097 + 5 3105 3097 3095 + 5 427 2465 1102 + 5 214 1096 2465 + 5 1102 2465 1096 + 5 221 2513 1618 + 5 427 1620 2513 + 5 1618 2513 1620 + 5 427 2513 2465 + 5 221 2462 2513 + 5 2465 2513 2462 + 5 427 3693 1620 + 5 437 1622 3693 + 5 1620 3693 1622 + 5 424 3676 1099 + 5 427 1102 3676 + 5 1099 3676 1102 + 5 427 3676 3693 + 5 424 3679 3676 + 5 3693 3676 3679 + 5 489 2762 1786 + 5 251 1784 2762 + 5 1786 2762 1784 + 5 243 2695 1202 + 5 489 1208 2695 + 5 1202 2695 1208 + 5 489 2695 2762 + 5 243 2691 2695 + 5 2762 2695 2691 + 5 501 3101 1226 + 5 303 1223 3101 + 5 1226 3101 1223 + 5 305 3112 1785 + 5 501 1787 3112 + 5 1785 3112 1787 + 5 501 3112 3101 + 5 305 3099 3112 + 5 3101 3112 3099 + 5 501 3977 1787 + 5 489 1786 3977 + 5 1787 3977 1786 + 5 485 3953 1224 + 5 501 1226 3953 + 5 1224 3953 1226 + 5 501 3953 3977 + 5 485 3950 3953 + 5 3977 3953 3950 + 5 656 3113 1789 + 5 305 1785 3113 + 5 1789 3113 1785 + 5 304 3107 1619 + 5 656 1626 3107 + 5 1619 3107 1626 + 5 656 3107 3113 + 5 304 3103 3107 + 5 3113 3107 3103 + 5 638 2717 1579 + 5 245 1571 2717 + 5 1579 2717 1571 + 5 251 2763 1784 + 5 638 1788 2763 + 5 1784 2763 1788 + 5 638 2763 2717 + 5 251 2713 2763 + 5 2717 2763 2713 + 5 638 4601 1788 + 5 656 1789 4601 + 5 1788 4601 1789 + 5 635 4589 1576 + 5 638 1579 4589 + 5 1576 4589 1579 + 5 638 4589 4601 + 5 635 4592 4589 + 5 4601 4589 4592 + 6 392 2787 1459 + 6 256 1457 2787 + 6 1459 2787 1457 + 6 254 2779 1040 + 6 392 1043 2779 + 6 1040 2779 1043 + 6 392 2779 2787 + 6 254 2777 2779 + 6 2787 2779 2777 + 6 389 2325 1037 + 6 195 1031 2325 + 6 1037 2325 1031 + 6 201 2367 1456 + 6 389 1458 2367 + 6 1456 2367 1458 + 6 389 2367 2325 + 6 201 2322 2367 + 6 2325 2367 2322 + 6 389 3525 1458 + 6 392 1459 3525 + 6 1458 3525 1459 + 6 385 3503 1033 + 6 389 1037 3503 + 6 1033 3503 1037 + 6 389 3503 3525 + 6 385 3505 3503 + 6 3525 3503 3505 + 6 425 2492 1582 + 6 218 1580 2492 + 6 1582 2492 1580 + 6 214 2463 1096 + 6 425 1100 2463 + 6 1096 2463 1100 + 6 425 2463 2492 + 6 214 2460 2463 + 6 2492 2463 2460 + 6 430 2783 1108 + 6 255 1105 2783 + 6 1108 2783 1105 + 6 257 2794 1581 + 6 430 1583 2794 + 6 1581 2794 1583 + 6 430 2794 2783 + 6 257 2781 2794 + 6 2783 2794 2781 + 6 430 3682 1583 + 6 425 1582 3682 + 6 1583 3682 1582 + 6 422 3665 1106 + 6 430 1108 3665 + 6 1106 3665 1108 + 6 430 3665 3682 + 6 422 3662 3665 + 6 3682 3665 3662 + 6 590 2795 1585 + 6 257 1581 2795 + 6 1585 2795 1581 + 6 256 2789 1457 + 6 590 1463 2789 + 6 1457 2789 1463 + 6 590 2789 2795 + 6 256 2785 2789 + 6 2795 2789 2785 + 6 583 2472 1440 + 6 215 1433 2472 + 6 1440 2472 1433 + 6 218 2493 1580 + 6 583 1584 2493 + 6 1580 2493 1584 + 6 583 2493 2472 + 6 218 2468 2493 + 6 2472 2493 2468 + 6 583 4354 1584 + 6 590 1585 4354 + 6 1584 4354 1585 + 6 580 4338 1437 + 6 583 1440 4338 + 6 1437 4338 1440 + 6 583 4338 4354 + 6 580 4341 4338 + 6 4354 4338 4341 + 6 387 2337 1323 + 6 197 1321 2337 + 6 1323 2337 1321 + 6 195 2324 1031 + 6 387 1035 2324 + 6 1031 2324 1035 + 6 387 2324 2337 + 6 195 2321 2324 + 6 2337 2324 2321 + 6 383 2183 1028 + 6 173 1025 2183 + 6 1028 2183 1025 + 6 176 2199 1320 + 6 383 1322 2199 + 6 1320 2199 1322 + 6 383 2199 2183 + 6 176 2181 2199 + 6 2183 2199 2181 + 6 383 3496 1322 + 6 387 1323 3496 + 6 1322 3496 1323 + 6 381 3486 1026 + 6 383 1028 3486 + 6 1026 3486 1028 + 6 383 3486 3496 + 6 381 3489 3486 + 6 3496 3486 3489 + 6 342 2160 1278 + 6 169 1276 2160 + 6 1278 2160 1276 + 6 165 2133 957 + 6 342 961 2133 + 6 957 2133 961 + 6 342 2133 2160 + 6 165 2130 2133 + 6 2160 2133 2130 + 6 347 2317 969 + 6 194 965 2317 + 6 969 2317 965 + 6 196 2331 1277 + 6 347 1279 2331 + 6 1277 2331 1279 + 6 347 2331 2317 + 6 196 2314 2331 + 6 2317 2331 2314 + 6 347 3300 1279 + 6 342 1278 3300 + 6 1279 3300 1278 + 6 339 3285 966 + 6 347 969 3285 + 6 966 3285 969 + 6 347 3285 3300 + 6 339 3282 3285 + 6 3300 3285 3282 + 6 527 2332 1283 + 6 196 1277 2332 + 6 1283 2332 1277 + 6 197 2338 1321 + 6 527 1325 2338 + 6 1321 2338 1325 + 6 527 2338 2332 + 6 197 2328 2338 + 6 2332 2338 2328 + 6 509 2141 1248 + 6 166 1242 2141 + 6 1248 2141 1242 + 6 169 2161 1276 + 6 509 1280 2161 + 6 1276 2161 1280 + 6 509 2161 2141 + 6 169 2137 2161 + 6 2141 2161 2137 + 6 509 4053 1280 + 6 527 1283 4053 + 6 1280 4053 1283 + 6 511 4050 1250 + 6 509 1248 4050 + 6 1250 4050 1248 + 6 509 4050 4053 + 6 511 4061 4050 + 6 4053 4050 4061 diff --git a/src/UnitTests/Meshes/data/triangles/mrizka_1.vtk b/src/UnitTests/Meshes/data/triangles/mrizka_1.vtk new file mode 100644 index 0000000000000000000000000000000000000000..3235be4ddf567bfa05f9c8c2d23fe22b38699023 --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles/mrizka_1.vtk @@ -0,0 +1,723 @@ +# vtk DataFile Version 2.0 +mrizka_1, Created by Gmsh +ASCII +DATASET UNSTRUCTURED_GRID +POINTS 142 double +0 0 0 +1 0 0 +1 1 0 +0 1 0 +0.09999999999981467 0 0 +0.1999999999995579 0 0 +0.2999999999992664 0 0 +0.3999999999989749 0 0 +0.4999999999986943 0 0 +0.5999999999989468 0 0 +0.69999999999921 0 0 +0.7999999999994734 0 0 +0.8999999999997368 0 0 +1 0.09999999999981467 0 +1 0.1999999999995579 0 +1 0.2999999999992664 0 +1 0.3999999999989749 0 +1 0.4999999999986943 0 +1 0.5999999999989468 0 +1 0.69999999999921 0 +1 0.7999999999994734 0 +1 0.8999999999997368 0 +0.8999999999995836 1 0 +0.7999999999999998 1 0 +0.7000000000006934 1 0 +0.6000000000013869 1 0 +0.5000000000020587 1 0 +0.4000000000016644 1 0 +0.3000000000012483 1 0 +0.2000000000008322 1 0 +0.100000000000416 1 0 +0 0.8999999999995836 0 +0 0.7999999999999998 0 +0 0.7000000000006934 0 +0 0.6000000000013869 0 +0 0.5000000000020587 0 +0 0.4000000000016644 0 +0 0.3000000000012483 0 +0 0.2000000000008322 0 +0 0.100000000000416 0 +0.4500000000018615 0.9133974596216763 0 +0.09236792741084221 0.4605742807383675 0 +0.5499999999988207 0.08660254037843171 0 +0.9152217186777627 0.5468402906274978 0 +0.6500000000008006 0.9133974596219512 0 +0.08885430207206277 0.6509201999024387 0 +0.9133974596218086 0.3499999999991206 0 +0.3475303635242556 0.08190748804974735 0 +0.9103703875043379 0.7586725654707319 0 +0.2508173017623437 0.9138693290131876 0 +0.7459788032314769 0.07959225689678902 0 +0.0866025403788042 0.2500000000010402 0 +0.09056972474440218 0.8408174380940533 0 +0.8495762630717529 0.9153227954948184 0 +0.1504237369277891 0.08467720450543256 0 +0.9170502595852439 0.150593231699023 0 +0.3501362169617226 0.9134761045201862 0 +0.400022702828373 0.8268080267265582 0 +0.5000037838059157 0.8267971038241978 0 +0.4500044144402654 0.7401949275428756 0 +0.550001366375115 0.740193167742059 0 +0.5000009634704055 0.6535903947466404 0 +0.4001556725867777 0.6531143281569608 0 +0.4503430472096985 0.566725153011282 0 +0.5500573351142912 0.5669436999698718 0 +0.5000667303886402 0.4803338005253144 0 +0.6000000000014443 0.4803847577318124 0 +0.4003852374668766 0.4801495879277082 0 +0.450075327977456 0.3937345295185466 0 +0.3510369880177372 0.3942894617931989 0 +0.6500095558532315 0.5669800317532796 0 +0.7044674125168495 0.4836527537169565 0 +0.6507445687539916 0.3943268833512884 0 +0.3000000000028113 0.4803847577315177 0 +0.4001853860009422 0.3072562697428891 0 +0.3000000000029343 0.3071796769753513 0 +0.5000434523310811 0.3071844944642995 0 +0.4500000000024978 0.2205771365973903 0 +0.7516166973808509 0.5701276397389337 0 +0.7002710422061426 0.6541120177001093 0 +0.7535395641764234 0.3987231651695797 0 +0.7000000000012377 0.3071796769756578 0 +0.8000000000003898 0.6535898384882725 0 +0.7471445386066088 0.7386047262821198 0 +0.550000000002142 0.2205771365975501 0 +0.8109814372419677 0.3047533749256941 0 +0.7487737599745192 0.2215627443409141 0 +0.3001627035928666 0.8268888562054006 0 +0.1994089234451489 0.8296981761689504 0 +0.2499158852568564 0.7399423795286558 0 +0.149492396861092 0.743027350173192 0 +0.1967279003056701 0.6521628070748455 0 +0.1475039555908151 0.5594685643720907 0 +0.2461396475420015 0.5647585225767253 0 +0.2007885125292274 0.4737805524310309 0 +0.1629581819751206 0.3803886475368558 0 +0.2991401254814288 0.6526766329656057 0 +0.6000008583640171 0.8267954148199814 0 +0.8994183955992585 0.6528983889292929 0 +0.6499999999991333 0.08660254037864012 0 +0.9157740970141777 0.4494733817703521 0 +0.8167986354126133 0.4899798535417859 0 +0.4498499977837828 0.08393456559302379 0 +0.5500007736960068 0.9133979063146344 0 +0.2471893802660856 0.08407329706072986 0 +0.1856343100129115 0.1794039491425928 0 +0.9132470455755112 0.2508911011037038 0 +0.600056710503325 0.6536686151296461 0 +0.7499293771789076 0.9137183489341745 0 +0.3492099568452324 0.2288273220822138 0 +0.350000000002115 0.7401923788654271 0 +0.5501550132423814 0.393857357094494 0 +0.6495790860092404 0.7400281434863161 0 +0.6994423100265897 0.8265565020648068 0 +0.6001571723887492 0.307283780846802 0 +0.8150411059704117 0.8183022016898427 0 +0.6500000000016622 0.2205771365975224 0 +0.3506052056236115 0.5660996445862312 0 +0.1530678781040006 0.9178724624825141 0 +0.9167537497766272 0.8508718257779521 0 +0.08296629115975823 0.1498875452108687 0 +0.1890575670470589 0.2940842362159237 0 +0.8440933898604552 0.09385434397709339 0 +0.2506402082624816 0.3883512221139797 0 +0.07972803913573585 0.3493512757062999 0 +0.8380531170040469 0.1999999999995609 0 +0.8406936244151951 0.399278548510347 0 +0.2898266778730385 0.1633996013333093 0 +0.0657832847355114 0.7469529976340754 0 +0.6999999999992161 0.1535898384871374 0 +0.5999999999988376 0.1535898384867515 0 +0.4999999999989004 0.1535898384865982 0 +0.3977361660046179 0.1553726586903804 0 +0.8325961894321569 0.730144284150141 0 +0.06525626353148779 0.5500000000017229 0 +0.8366110894141751 0.5826872022651566 0 +0.261388664636693 0.2359882399069594 0 +0.926794919243098 0.9267949192431389 0 +0.07320508075687601 0.9267949192431241 0 +0.9267949192432314 0.07320508075664824 0 +0.07320508075662228 0.07320508075678339 0 +0.7753798140139428 0.149719836740299 0 + +CELLS 286 1096 +1 0 +1 1 +1 2 +1 3 +2 0 4 +2 4 5 +2 5 6 +2 6 7 +2 7 8 +2 8 9 +2 9 10 +2 10 11 +2 11 12 +2 12 1 +2 1 13 +2 13 14 +2 14 15 +2 15 16 +2 16 17 +2 17 18 +2 18 19 +2 19 20 +2 20 21 +2 21 2 +2 2 22 +2 22 23 +2 23 24 +2 24 25 +2 25 26 +2 26 27 +2 27 28 +2 28 29 +2 29 30 +2 30 3 +2 3 31 +2 31 32 +2 32 33 +2 33 34 +2 34 35 +2 35 36 +2 36 37 +2 37 38 +2 38 39 +2 39 0 +3 71 80 101 +3 75 123 121 +3 48 119 115 +3 51 120 105 +3 51 105 121 +3 48 115 133 +3 95 121 123 +3 46 85 106 +3 51 121 124 +3 41 94 92 +3 52 90 88 +3 95 124 121 +3 80 126 101 +3 85 125 106 +3 71 101 78 +3 41 92 134 +3 52 128 90 +3 45 91 90 +3 45 92 91 +3 46 126 85 +3 41 95 94 +3 53 115 119 +3 54 105 120 +3 82 98 133 +3 52 88 118 +3 55 125 122 +3 85 86 125 +3 47 132 127 +3 89 96 110 +3 73 117 93 +3 82 135 98 +3 73 93 94 +3 48 133 98 +3 93 117 96 +3 62 110 96 +3 89 91 96 +3 91 92 93 +3 122 125 141 +3 45 90 128 +3 73 94 123 +3 109 127 132 +3 75 121 136 +3 92 94 93 +3 91 93 96 +3 40 56 57 +3 56 87 57 +3 27 56 40 +3 26 27 40 +3 35 36 41 +3 44 103 97 +3 87 89 110 +3 18 98 43 +3 25 103 44 +3 57 87 110 +3 9 99 42 +3 26 40 103 +3 28 49 56 +3 17 18 43 +3 8 9 42 +3 40 57 58 +3 27 28 56 +3 49 87 56 +3 25 26 103 +3 17 43 100 +3 7 102 47 +3 8 42 102 +3 87 88 89 +3 16 100 46 +3 19 48 98 +3 40 58 103 +3 88 90 89 +3 44 97 113 +3 7 8 102 +3 10 50 99 +3 16 17 100 +3 18 19 98 +3 89 90 91 +3 58 97 103 +3 9 10 99 +3 28 29 49 +3 49 88 87 +3 108 113 115 +3 57 110 59 +3 19 20 48 +3 59 110 62 +3 37 38 51 +3 43 101 100 +3 44 113 108 +3 10 11 50 +3 57 59 58 +3 22 23 53 +3 6 7 47 +3 67 73 69 +3 31 32 52 +3 15 16 46 +3 59 62 61 +3 63 67 65 +3 6 47 104 +3 79 83 112 +3 33 34 45 +3 65 67 68 +3 68 74 76 +3 15 46 106 +3 64 66 70 +3 24 25 44 +3 79 82 83 +3 70 78 79 +3 14 15 106 +3 70 71 78 +3 61 62 63 +3 5 6 104 +3 66 71 70 +3 63 65 64 +3 64 65 66 +3 74 77 76 +3 70 79 107 +3 61 63 64 +3 76 77 84 +3 58 60 97 +3 61 64 107 +3 64 70 107 +3 13 14 55 +3 74 109 77 +3 60 112 97 +3 71 72 80 +3 68 69 74 +3 80 81 85 +3 65 68 111 +3 59 61 60 +3 4 5 54 +3 66 72 71 +3 65 111 66 +3 58 59 60 +3 60 61 107 +3 23 108 53 +3 67 69 68 +3 23 24 108 +3 14 106 55 +3 68 76 111 +3 60 107 112 +3 78 82 79 +3 72 81 80 +3 66 111 72 +3 5 104 54 +3 74 75 109 +3 81 86 85 +3 24 44 108 +3 69 75 74 +3 83 113 112 +3 54 104 105 +3 79 112 107 +3 97 112 113 +3 76 114 111 +3 72 111 114 +3 83 115 113 +3 76 84 114 +3 84 116 114 +3 72 114 81 +3 81 114 116 +3 53 108 115 +3 81 116 86 +3 94 95 123 +3 62 96 117 +3 67 117 73 +3 62 117 63 +3 41 124 95 +3 63 117 67 +3 49 118 88 +3 29 30 118 +3 20 21 119 +3 38 39 120 +3 11 12 122 +3 69 123 75 +3 36 124 41 +3 37 51 124 +3 45 134 92 +3 100 101 126 +3 80 85 126 +3 29 118 49 +3 20 119 48 +3 38 120 51 +3 11 122 50 +3 47 127 104 +3 69 73 123 +3 32 128 52 +3 33 45 128 +3 83 133 115 +3 35 41 134 +3 34 134 45 +3 43 98 135 +3 2 22 137 +3 3 31 138 +3 2 137 21 +3 1 13 139 +3 1 139 12 +3 0 4 140 +3 0 140 39 +3 3 138 30 +3 36 37 124 +3 55 106 125 +3 105 136 121 +3 46 100 126 +3 75 136 109 +3 78 101 135 +3 104 127 105 +3 78 135 82 +3 116 130 129 +3 47 102 132 +3 84 131 130 +3 77 131 84 +3 84 130 116 +3 86 116 129 +3 32 33 128 +3 42 99 130 +3 99 129 130 +3 50 129 99 +3 42 130 131 +3 42 131 102 +3 77 109 132 +3 77 132 131 +3 102 131 132 +3 82 133 83 +3 34 35 134 +3 43 135 101 +3 50 122 141 +3 30 138 118 +3 39 140 120 +3 21 137 119 +3 12 139 122 +3 22 53 137 +3 31 52 138 +3 13 55 139 +3 4 54 140 +3 109 136 127 +3 52 118 138 +3 53 119 137 +3 54 120 140 +3 55 122 139 +3 105 127 136 +3 86 141 125 +3 86 129 141 +3 50 141 129 + +CELL_TYPES 286 +1 +1 +1 +1 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 diff --git a/src/UnitTests/Meshes/data/triangles/mrizka_1.vtu b/src/UnitTests/Meshes/data/triangles/mrizka_1.vtu new file mode 100644 index 0000000000000000000000000000000000000000..12e9133318194aae973812cf043dc1cf96895ba1 --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles/mrizka_1.vtu @@ -0,0 +1,23 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64" compressor="vtkZLibDataCompressor"> +<UnstructuredGrid> +<Piece NumberOfPoints="142" NumberOfCells="242"> +<Points> +<DataArray type="Float64" Name="Points" NumberOfComponents="3" format="binary"> +AQAAAAAAAABQDQAAAAAAAFANAAAAAAAA4QYAAAAAAAA=eJyFlnlUU1cQh4OKiAseFWwFFXFDgwUlhCoYRnChIDsKVkTBIKBAxaOIVagbiwJKcaMRCiqIYg+CigtxJ6DEioSAUTAISExCNCUubOVg+uKr776Q1M4fyblfJnPvb2buvEehfM0U8HX+f79TKJs3sDAr0/ALDlBxrgY/prSm0Wh1GjzWW+XfoMFN85WYNWvwGQZYGFqbBs9yDcVMrMHHJqvit2vwFM5jzN7+p07t+hSgXZ8CtOtTgHZ9CtCuTwHa9SlAuz4FaNengIH6Zt4hr1Edf2OR/4/441/I+yGuZJLPR+qHH1SfLRq8zOAkST/iI1JppHwN9Odq8MufeZkG164Pmbo+ZOr6kKnrQ6auD5m6PmTq+gb6a94PdX0Uyp+e1ZgeIXStp3oespMTPOhR1B+RZ69DFcslbeTOJoKbRKt0tsK1oUVJxy2uEZwt4xrsdpGDjJpGv767leA9UlW+RHAmUj3+dvN9teZ3r4Fn0BqWX72I4DlhuF/iLFXeBASXDYv61MEQQE/Ojpy27lJS/1gb3jeTQ7/t1JIRzlKCez8wGhwyigd2NyeJNjmgfVuiIhUGzRJgfFwfNysIxUnfjOuhuahWPIKbvat6etTqOuSd4/X0SmQE/9veIp1t9QaONPfr+bqi+Pk1PhwjRw6Mdx1zL6zoKsGtc225P6+Sw/YbR07kLeMQPIENt06HC2Bohw/D2h7FiU89yu/B6v1dWoCJbQzad5Hvpg49rD8YzhY0UxJPEld4NWN1PPbgydKiYgnBR1dQY7Oxej3P1D1eSOIOgU66g7A461e4h9nKUP71IysOzsxuAP3tyiFeYsQ7qjryI/hCsDa7x82e+orgx0rNn4052QrGYY6TwqYjfujhyXepWHxFo3Ef9/ZLgg8Jxftex7T/au4dxEUWlmHtuQ1QnLnSr5KNOP8o6+6wJ0LYk/fa87016v9GxpNnzFgBRD9qa9JfiHjSktHPWrB+m3PppscV0nlSttg7KFPE4BDRWUT9iOJ3TjVZJuaLYO3qPn4BKY5eL36vlgxXP+fQBHdqHpafklX7aOMvoHtXrGPz2b/resH7+vOIv5K6TgnA8uCnZJq3k3hGHH7veJbdZs32jwkuNn4c4zBKCjaWEu84B3T+CenjanPCxeA5+xffuL9QXY6bj9RRTpRCrjiPejEBnf9DBj53kqvVz+N9Dp9T/eWFC+mkup/eKCjMkkpgSIlOcMEZ1CfdIvy+uy9VP+fM+3X+6R/aQXSp0M1wL4q/ZF4o82OnBGQbdg6yWIP8I5waTzXR6yAheXVOM6lvp00OdLVP4sIZl6S5bWmIe7/tCnHor4FepWl+VhE6z6Do8kkZUzkQ0zJleesDxIN0BzOCLbmQxNY5mPAS6ZqdfFYY3loOblXMHKoEzaXew/OH7N1bAwf8xsXuGYvyXNm0xjT6ChdSBqdeiPAh9Un0BE/eiwrImrvwlMuq5yiOW3fuxBl1II2wNGG/QvtSG/UodKzPf/IIOW9C0pt9ymu8ftVbmKfcOztVhPw9LuJzMshRfa52hRTs1PWQw6ZxVZQ5FUI0J2O9RLbTZEBffiGmPgA9329mzDjr/0gIoS8W+N2KQ/OHm9E7PwurIz20z+EwaQ73FBjyxHk1QLnt31SXiPx3FTvFNJU/hP1ZFmFXux4Q3H0546X3Ajl0OyWlsQzQnDwQFWF2AdPbL03b0kjqq7KgQlGEUgJ2Re6LLRloX8jVvbHtRwFsm8wstXWtJrh9Hz73X9vulp8jz6vwK8UvsTnjcZoS32mD+jwx3MdwNVcExifc9nheRP5l37QI6oPFwFpslDtzK8r/iLpdvDibNujTWZl5kHR/Jy9sNao1lEGLkdeEA1bI30Wv+nNdwhzV+98mvp/nFS2AfdU7KPGTSHNvzuIodiYHlgQOG2u7DukV1N/oHOEnB/ebEw75270h+LaTNKYz4yqsHBcs3G+Fngvf5nNq9WlVMNLJpmQZn0/wR6P0pvMGvQEn4x6WYOgN9L5kzbSLH86DmqfHje42ov5MTCw8YLCxFKwCP22tDEDP04Y+u8oVtTKoHvCeqUNv9OoSy+D32V3ZDw+hPBsuuzMvMY0PL7o/0JxlFWjefkoPmvOsBMpZo3v1JSj//H/fI+mRqvmDdLkPx+e/mK7Ocy/j76m+U9S50DkgZN+2BuAsfeW7qA3xwhVpnFP5MtgyqyzVPxDt22nEjjpTWgLzBfjc+sI3m/+ak1Apg6qGktPrzqJ6Fc5PScxk82DUSB+B0OYJur+K5Fr383LIeod/f+FrY+9tzbh9GYwGcOFHfO34Pf77F/7BCl+7BarzN8zXvu01Utjib6mrS0W6/gFoJeqo +</DataArray> +</Points> +<Cells> +<DataArray type="Int32" Name="connectivity" format="binary"> +AQAAAAAAAABYCwAAAAAAAFgLAAAAAAAAFAQAAAAAAAA=eJxNlYdTk0EQxc8OIgo2FBvNhhFpARUQgoRQJEoVCL1JlSqgIqGIioH/2X1zP4d8M2++K3tv3+5eiTjnPhgmDa2G74avhmLDhmHVUGbYNMzQnkmy0fyBYZgxrS8ydBtmsdf4luGpYcgwYCg39Bt6WbuFnbRso0ccP+CJMBaFRxy/4NmB67khltQeoF8EZzdrh9ERRL/irCAuxdlhGCOucjSuGyrR8w2uHvovDD8NcUOfYcTw2dBs+GIYhPM3vM2MDZHDA8YHsdf6N3CMwBmjHSOuQXTI/zHx9pOLZrhViwV0/aS+yvEfOIbgifEX/xPDS8Mr/h9p36Gv+Wz6aucbCshrwPDJMMq6PmK4SnzPDLexCcD7EZtUw7ihEP4n2N01lOA7Ey7xpLCmEFtxvUbXXexL4H+J32w4M+GYMFwwTFHDFPimWNdLDBnYah9do2Zj+H0NZy/57yM25WAZ/hQ4LxpKiTMDHRPEdA3OPnhicI/Cn8r6ceK7R3wl+JbeeXyukg/ltQru6+iuYlz766HhkfNnVPmYRE8Annl8pqH7Feul66Yhy/kzdJ44lcO3zu+/sOGBIcf5M3SFmIvgkP8aQy1rQvCIY9rw3tBpWDLkGvKc3+Mh7BtAi+Ed/OLWXVFnqDc0Gm45X/sAnB3wai7K2GXWzzIeYa4GndJ4Dn3TcEewrUVTHQgxL11taGvEz1xSzHXMyaaLnFY7X+8a5uf4N9JOR2sl/AusryZPo+hqcv4ebaAOLfTbnb+3QswtUosaOM4SZwUxNMEXwrYenVXYV7NW2rQXtF+C1CeMjyxqMI/2WfQ3EP8iPHPEEKVG7/HfjvZ6bJvQOI1OxdZKLmTbQ4zyGcBvGBvZqvbL+KqAZwZ/S+gYpb2MxpUk34v0xbOaZNPFuP5rtJv4t4MV5oLoWmV8Dd26j/U26d7Wvhtx/j14y7+ZcbW1h3TnbrGmNslWd4LeK90Luifu09cdcMP5907n/rHz753O9yXn35Mw/pWvAnfybuuuKKOvc6i3V2+I7gvdG9vUqZv2PXyW4Fc+i/G7CVcaPnW36NzHqUeYWKUjx/k3TXdILr53yP8BOcxHozTl8Zed7jTdqXp3Tzt/Zx0azjh/N/1l/JC8nHL+jCVoJ8iLPp2NI9pH5O4MHPfJ1UPyo/2tfa63WXtL763e3SLytU1+Na59GyWHv4k/zrooYzoP2iN7hl1ypfdEb7r22z5zbbS7wJ472VtrrM0hj8qh3rpx7MaZ36Meu+7kPd6Dt5D/FL4W0NDG///cPv0OatRJXfKpzTPimsSX9sAxeVQ+18mv8rxJbVSjDeqRYI3qGWRO9SxnfTo1SFC3CrgWyHkc23Xsg3AfYruJfSV+EtQjzvoe9P6gvUu/lL/6/wCfat7A +</DataArray> +<DataArray type="Int32" Name="offsets" format="binary"> +AQAAAAAAAADIAwAAAAAAAMgDAAAAAAAAgwEAAAAAAAA=eJwNwwOMUAEAANB/l3nZtm3btm3bdZdt27Zt21itVqvVarVarVarVe9tL1IQBFGNYWzDTGBik5nSNKY3k1nNYW7zWdAiFreUZa1gZatZ0zrWt5FNbWFr29nRLna3l30d4GCHOdIxjnWCk53mTOc430UudYWrXedGt7jdXe71gIc95knPeN5LXvWGt73nQ5/4zBe+8o3v/OAnv/jNH/7yj/8MDQmCKEY3lnGNbyKTmsLUpjOjWcxuLvNawMIWs6RlLG8lq1rD2tazoU1sbivb2sHOdrOnfezvIIc6wtFGON5JTnWGs53nQpe43FWudYOb3eZO97jfQx71hKc950WveN1b3vWBj33qc1/62re+96Of/ep3f/rbv4aEBkFkoxnTOMYzoUlMbirTmsHMZjOnecxvIYtawtKWs6JVrG4t69rAxjazpW1sbye72sPe9nOgQxzuKMMd50SnON1ZznWBi13mSte43k1udYe73edBj3jcU571gpe95k3veN9H/gcAo3R3 +</DataArray> +<DataArray type="UInt8" Name="types" format="binary"> +AQAAAAAAAADyAAAAAAAAAPIAAAAAAAAADAAAAAAAAAA=eJxjZR1pAAA/VwS7 +</DataArray> +</Cells> +</Piece> +</UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles/netgen_square.in2d b/src/UnitTests/Meshes/data/triangles/netgen_square.in2d new file mode 100644 index 0000000000000000000000000000000000000000..0e1f23c90dbca8e3d400240ac852cfaed5424e7a --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles/netgen_square.in2d @@ -0,0 +1,17 @@ +splinecurves2dv2 +# grading parameter +5 + +points +# number x_n y_n +1 0.0 0.0 +2 1.0 0.0 +3 1.0 1.0 +4 0.0 1.0 + +segments +# dil dir line/arc P_1 P_2 boundary condition +1 0 2 1 2 --bc=1 +1 0 2 2 3 --bc=1 +1 0 2 3 4 --bc=1 +1 0 2 4 1 --bc=1 diff --git a/src/UnitTests/Meshes/data/triangles/netgen_square.ng b/src/UnitTests/Meshes/data/triangles/netgen_square.ng new file mode 100644 index 0000000000000000000000000000000000000000..719f31e76cfab31f95542415a5052d7e1cccef45 --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles/netgen_square.ng @@ -0,0 +1,868 @@ +289 + 0.000000 0.000000 + 1.000000 0.000000 + 1.000000 1.000000 + 0.000000 1.000000 + 0.500000 0.000000 + 0.500000 0.500000 + 0.000000 0.500000 + 1.000000 0.500000 + 0.500000 1.000000 + 0.250000 0.000000 + 0.250000 0.250000 + 0.000000 0.250000 + 0.750000 0.000000 + 1.000000 0.250000 + 0.750000 0.750000 + 1.000000 0.750000 + 0.750000 1.000000 + 0.000000 0.750000 + 0.250000 1.000000 + 0.500000 0.250000 + 0.750000 0.250000 + 0.250000 0.500000 + 0.750000 0.500000 + 0.500000 0.750000 + 0.250000 0.750000 + 0.125000 0.000000 + 0.125000 0.125000 + 0.000000 0.125000 + 0.875000 0.000000 + 1.000000 0.125000 + 0.875000 0.875000 + 1.000000 0.875000 + 0.875000 1.000000 + 0.000000 0.875000 + 0.125000 1.000000 + 0.375000 0.000000 + 0.625000 0.000000 + 0.500000 0.125000 + 0.625000 0.125000 + 0.375000 0.375000 + 0.625000 0.625000 + 0.500000 0.375000 + 0.375000 0.500000 + 0.625000 0.500000 + 0.500000 0.625000 + 0.000000 0.375000 + 0.000000 0.625000 + 0.125000 0.500000 + 0.125000 0.625000 + 1.000000 0.375000 + 1.000000 0.625000 + 0.875000 0.375000 + 0.875000 0.500000 + 0.625000 1.000000 + 0.375000 1.000000 + 0.500000 0.875000 + 0.375000 0.875000 + 0.250000 0.125000 + 0.375000 0.125000 + 0.125000 0.250000 + 0.375000 0.250000 + 0.250000 0.375000 + 0.125000 0.375000 + 0.875000 0.125000 + 0.750000 0.125000 + 0.875000 0.250000 + 0.875000 0.750000 + 0.750000 0.875000 + 0.750000 0.625000 + 0.625000 0.750000 + 0.875000 0.625000 + 0.625000 0.875000 + 0.125000 0.875000 + 0.125000 0.750000 + 0.250000 0.875000 + 0.625000 0.250000 + 0.625000 0.375000 + 0.750000 0.375000 + 0.375000 0.625000 + 0.250000 0.625000 + 0.375000 0.750000 + 0.062500 0.000000 + 0.062500 0.062500 + 0.000000 0.062500 + 0.937500 0.000000 + 1.000000 0.062500 + 0.937500 0.937500 + 1.000000 0.937500 + 0.937500 1.000000 + 0.000000 0.937500 + 0.062500 1.000000 + 0.437500 0.000000 + 0.562500 0.000000 + 0.500000 0.062500 + 0.562500 0.062500 + 0.437500 0.437500 + 0.562500 0.562500 + 0.500000 0.437500 + 0.437500 0.500000 + 0.562500 0.500000 + 0.500000 0.562500 + 0.000000 0.437500 + 0.000000 0.562500 + 0.062500 0.500000 + 0.062500 0.562500 + 1.000000 0.437500 + 1.000000 0.562500 + 0.937500 0.437500 + 0.937500 0.500000 + 0.562500 1.000000 + 0.437500 1.000000 + 0.500000 0.937500 + 0.437500 0.937500 + 0.187500 0.000000 + 0.312500 0.000000 + 0.250000 0.062500 + 0.312500 0.062500 + 0.187500 0.187500 + 0.312500 0.312500 + 0.250000 0.187500 + 0.187500 0.250000 + 0.312500 0.250000 + 0.250000 0.312500 + 0.000000 0.187500 + 0.000000 0.312500 + 0.062500 0.250000 + 0.062500 0.312500 + 0.812500 0.000000 + 0.687500 0.000000 + 0.812500 0.062500 + 0.750000 0.062500 + 1.000000 0.187500 + 1.000000 0.312500 + 0.937500 0.187500 + 0.937500 0.250000 + 0.812500 0.812500 + 0.687500 0.687500 + 0.812500 0.750000 + 0.750000 0.812500 + 0.750000 0.687500 + 0.687500 0.750000 + 1.000000 0.812500 + 1.000000 0.687500 + 0.937500 0.750000 + 0.937500 0.687500 + 0.812500 1.000000 + 0.687500 1.000000 + 0.750000 0.937500 + 0.687500 0.937500 + 0.000000 0.812500 + 0.000000 0.687500 + 0.062500 0.812500 + 0.062500 0.750000 + 0.187500 1.000000 + 0.312500 1.000000 + 0.187500 0.937500 + 0.250000 0.937500 + 0.500000 0.187500 + 0.500000 0.312500 + 0.437500 0.187500 + 0.437500 0.250000 + 0.562500 0.250000 + 0.562500 0.312500 + 0.687500 0.187500 + 0.812500 0.312500 + 0.750000 0.187500 + 0.812500 0.250000 + 0.687500 0.250000 + 0.750000 0.312500 + 0.312500 0.500000 + 0.187500 0.500000 + 0.250000 0.437500 + 0.187500 0.437500 + 0.312500 0.562500 + 0.250000 0.562500 + 0.687500 0.500000 + 0.812500 0.500000 + 0.750000 0.562500 + 0.812500 0.562500 + 0.687500 0.437500 + 0.750000 0.437500 + 0.500000 0.687500 + 0.500000 0.812500 + 0.562500 0.750000 + 0.562500 0.812500 + 0.437500 0.687500 + 0.437500 0.750000 + 0.187500 0.687500 + 0.312500 0.812500 + 0.187500 0.750000 + 0.250000 0.812500 + 0.250000 0.687500 + 0.312500 0.750000 + 0.125000 0.062500 + 0.187500 0.062500 + 0.062500 0.125000 + 0.187500 0.125000 + 0.125000 0.187500 + 0.062500 0.187500 + 0.937500 0.062500 + 0.875000 0.062500 + 0.937500 0.125000 + 0.937500 0.875000 + 0.875000 0.937500 + 0.875000 0.812500 + 0.812500 0.875000 + 0.937500 0.812500 + 0.812500 0.937500 + 0.062500 0.937500 + 0.062500 0.875000 + 0.125000 0.937500 + 0.437500 0.062500 + 0.375000 0.062500 + 0.625000 0.062500 + 0.687500 0.062500 + 0.562500 0.125000 + 0.437500 0.125000 + 0.562500 0.187500 + 0.687500 0.125000 + 0.625000 0.187500 + 0.437500 0.375000 + 0.375000 0.437500 + 0.375000 0.312500 + 0.312500 0.375000 + 0.625000 0.562500 + 0.562500 0.625000 + 0.687500 0.625000 + 0.625000 0.687500 + 0.562500 0.437500 + 0.437500 0.312500 + 0.562500 0.375000 + 0.437500 0.562500 + 0.312500 0.437500 + 0.375000 0.562500 + 0.687500 0.562500 + 0.625000 0.437500 + 0.562500 0.687500 + 0.437500 0.625000 + 0.062500 0.437500 + 0.062500 0.375000 + 0.062500 0.625000 + 0.062500 0.687500 + 0.125000 0.562500 + 0.125000 0.437500 + 0.187500 0.562500 + 0.125000 0.687500 + 0.187500 0.625000 + 0.937500 0.375000 + 0.937500 0.312500 + 0.937500 0.562500 + 0.937500 0.625000 + 0.875000 0.437500 + 0.875000 0.312500 + 0.812500 0.375000 + 0.875000 0.562500 + 0.812500 0.437500 + 0.562500 0.937500 + 0.625000 0.937500 + 0.375000 0.937500 + 0.312500 0.937500 + 0.437500 0.875000 + 0.562500 0.875000 + 0.437500 0.812500 + 0.312500 0.875000 + 0.375000 0.812500 + 0.312500 0.125000 + 0.312500 0.187500 + 0.375000 0.187500 + 0.187500 0.312500 + 0.125000 0.312500 + 0.187500 0.375000 + 0.812500 0.125000 + 0.875000 0.187500 + 0.812500 0.187500 + 0.812500 0.687500 + 0.875000 0.687500 + 0.687500 0.812500 + 0.687500 0.875000 + 0.812500 0.625000 + 0.625000 0.812500 + 0.125000 0.812500 + 0.187500 0.875000 + 0.187500 0.812500 + 0.625000 0.312500 + 0.687500 0.312500 + 0.687500 0.375000 + 0.312500 0.625000 + 0.375000 0.687500 + 0.312500 0.687500 +512 + 1 1 82 83 + 1 1 83 84 + 1 2 86 85 + 1 3 87 88 + 1 5 95 94 + 1 3 89 87 + 1 4 90 91 + 1 6 101 99 + 1 5 94 92 + 1 6 96 98 + 1 10 117 116 + 1 6 99 96 + 1 7 102 104 + 1 11 123 121 + 1 8 108 106 + 1 5 93 95 + 1 14 135 134 + 1 6 100 97 + 1 8 107 109 + 1 15 140 138 + 1 8 109 108 + 1 6 98 100 + 1 21 169 168 + 1 9 112 110 + 1 6 97 101 + 1 17 149 148 + 1 7 105 103 + 1 9 111 113 + 1 18 153 152 + 1 9 113 112 + 1 7 104 105 + 1 24 187 186 + 1 10 116 114 + 1 11 118 120 + 1 26 195 194 + 1 11 121 118 + 1 12 124 126 + 1 27 198 196 + 1 14 134 132 + 1 13 128 130 + 1 30 202 200 + 1 15 138 136 + 1 16 142 144 + 1 31 205 203 + 1 21 168 164 + 1 20 158 162 + 1 39 220 216 + 1 17 148 146 + 1 15 136 139 + 1 33 208 204 + 1 18 152 150 + 1 19 154 156 + 1 34 210 209 + 1 24 186 182 + 1 22 170 174 + 1 45 238 232 + 1 20 160 158 + 1 10 115 117 + 1 38 217 212 + 1 11 122 119 + 1 20 159 161 + 1 40 223 221 + 1 20 161 160 + 1 11 120 122 + 1 59 268 266 + 1 22 172 170 + 1 11 119 123 + 1 43 233 222 + 1 12 127 125 + 1 22 171 173 + 1 46 240 239 + 1 22 173 172 + 1 12 126 127 + 1 62 271 269 + 1 21 167 165 + 1 14 133 135 + 1 52 253 248 + 1 13 131 129 + 1 21 164 166 + 1 37 215 214 + 1 21 166 167 + 1 13 130 131 + 1 66 274 273 + 1 23 178 176 + 1 15 137 140 + 1 44 235 225 + 1 16 145 143 + 1 23 177 179 + 1 51 251 250 + 1 23 179 178 + 1 16 144 145 + 1 69 279 275 + 1 23 181 177 + 1 21 165 169 + 1 53 256 252 + 1 20 163 159 + 1 23 176 180 + 1 42 231 229 + 1 23 180 181 + 1 20 162 163 + 1 78 286 285 + 1 24 185 183 + 1 17 147 149 + 1 56 262 257 + 1 15 141 137 + 1 24 182 184 + 1 41 228 226 + 1 24 184 185 + 1 15 139 141 + 1 72 280 278 + 1 25 190 188 + 1 18 151 153 + 1 49 246 241 + 1 19 157 155 + 1 25 189 191 + 1 55 260 259 + 1 25 191 190 + 1 19 156 157 + 1 74 283 281 + 1 25 193 189 + 1 24 183 187 + 1 57 265 261 + 1 22 175 171 + 1 25 188 192 + 1 48 245 243 + 1 25 192 193 + 1 22 174 175 + 1 81 289 288 + 1 26 194 82 + 1 27 83 194 + 1 82 194 83 + 1 27 196 83 + 1 28 84 196 + 1 83 196 84 + 1 30 200 86 + 1 29 85 200 + 1 86 200 85 + 1 31 203 87 + 1 32 88 203 + 1 87 203 88 + 1 39 216 95 + 1 38 94 216 + 1 95 216 94 + 1 33 204 89 + 1 31 87 204 + 1 89 204 87 + 1 34 209 90 + 1 35 91 209 + 1 90 209 91 + 1 45 232 101 + 1 43 99 232 + 1 101 232 99 + 1 38 212 94 + 1 36 92 212 + 1 94 212 92 + 1 40 221 96 + 1 42 98 221 + 1 96 221 98 + 1 59 266 117 + 1 58 116 266 + 1 117 266 116 + 1 43 222 99 + 1 40 96 222 + 1 99 222 96 + 1 46 239 102 + 1 48 104 239 + 1 102 239 104 + 1 62 269 123 + 1 60 121 269 + 1 123 269 121 + 1 52 248 108 + 1 50 106 248 + 1 108 248 106 + 1 37 214 93 + 1 39 95 214 + 1 93 214 95 + 1 66 273 135 + 1 64 134 273 + 1 135 273 134 + 1 44 225 100 + 1 41 97 225 + 1 100 225 97 + 1 51 250 107 + 1 53 109 250 + 1 107 250 109 + 1 69 275 140 + 1 67 138 275 + 1 140 275 138 + 1 53 252 109 + 1 52 108 252 + 1 109 252 108 + 1 42 229 98 + 1 44 100 229 + 1 98 229 100 + 1 78 285 169 + 1 76 168 285 + 1 169 285 168 + 1 56 257 112 + 1 54 110 257 + 1 112 257 110 + 1 41 226 97 + 1 45 101 226 + 1 97 226 101 + 1 72 278 149 + 1 68 148 278 + 1 149 278 148 + 1 49 241 105 + 1 47 103 241 + 1 105 241 103 + 1 55 259 111 + 1 57 113 259 + 1 111 259 113 + 1 74 281 153 + 1 73 152 281 + 1 153 281 152 + 1 57 261 113 + 1 56 112 261 + 1 113 261 112 + 1 48 243 104 + 1 49 105 243 + 1 104 243 105 + 1 81 288 187 + 1 79 186 288 + 1 187 288 186 + 1 58 195 116 + 1 26 114 195 + 1 116 195 114 + 1 27 197 118 + 1 58 120 197 + 1 118 197 120 + 1 58 197 195 + 1 27 194 197 + 1 195 197 194 + 1 60 198 121 + 1 27 118 198 + 1 121 198 118 + 1 28 199 124 + 1 60 126 199 + 1 124 199 126 + 1 60 199 198 + 1 28 196 199 + 1 198 199 196 + 1 64 202 134 + 1 30 132 202 + 1 134 202 132 + 1 29 201 128 + 1 64 130 201 + 1 128 201 130 + 1 64 201 202 + 1 29 200 201 + 1 202 201 200 + 1 67 205 138 + 1 31 136 205 + 1 138 205 136 + 1 32 207 142 + 1 67 144 207 + 1 142 207 144 + 1 67 207 205 + 1 32 203 207 + 1 205 207 203 + 1 76 220 168 + 1 39 164 220 + 1 168 220 164 + 1 38 218 158 + 1 76 162 218 + 1 158 218 162 + 1 76 218 220 + 1 38 216 218 + 1 220 218 216 + 1 68 208 148 + 1 33 146 208 + 1 148 208 146 + 1 31 206 136 + 1 68 139 206 + 1 136 206 139 + 1 68 206 208 + 1 31 204 206 + 1 208 206 204 + 1 73 210 152 + 1 34 150 210 + 1 152 210 150 + 1 35 211 154 + 1 73 156 211 + 1 154 211 156 + 1 73 211 210 + 1 35 209 211 + 1 210 211 209 + 1 79 238 186 + 1 45 182 238 + 1 186 238 182 + 1 43 234 170 + 1 79 174 234 + 1 170 234 174 + 1 79 234 238 + 1 43 232 234 + 1 238 234 232 + 1 59 217 160 + 1 38 158 217 + 1 160 217 158 + 1 36 213 115 + 1 59 117 213 + 1 115 213 117 + 1 59 213 217 + 1 36 212 213 + 1 217 213 212 + 1 61 223 122 + 1 40 119 223 + 1 122 223 119 + 1 42 230 159 + 1 61 161 230 + 1 159 230 161 + 1 61 230 223 + 1 42 221 230 + 1 223 230 221 + 1 61 268 161 + 1 59 160 268 + 1 161 268 160 + 1 58 267 120 + 1 61 122 267 + 1 120 267 122 + 1 61 267 268 + 1 58 266 267 + 1 268 267 266 + 1 62 233 172 + 1 43 170 233 + 1 172 233 170 + 1 40 224 119 + 1 62 123 224 + 1 119 224 123 + 1 62 224 233 + 1 40 222 224 + 1 233 224 222 + 1 63 240 127 + 1 46 125 240 + 1 127 240 125 + 1 48 244 171 + 1 63 173 244 + 1 171 244 173 + 1 63 244 240 + 1 48 239 244 + 1 240 244 239 + 1 63 271 173 + 1 62 172 271 + 1 173 271 172 + 1 60 270 126 + 1 63 127 270 + 1 126 270 127 + 1 63 270 271 + 1 60 269 270 + 1 271 270 269 + 1 66 253 167 + 1 52 165 253 + 1 167 253 165 + 1 50 249 133 + 1 66 135 249 + 1 133 249 135 + 1 66 249 253 + 1 50 248 249 + 1 253 249 248 + 1 65 215 131 + 1 37 129 215 + 1 131 215 129 + 1 39 219 164 + 1 65 166 219 + 1 164 219 166 + 1 65 219 215 + 1 39 214 219 + 1 215 219 214 + 1 65 274 166 + 1 66 167 274 + 1 166 274 167 + 1 64 272 130 + 1 65 131 272 + 1 130 272 131 + 1 65 272 274 + 1 64 273 272 + 1 274 272 273 + 1 69 235 178 + 1 44 176 235 + 1 178 235 176 + 1 41 227 137 + 1 69 140 227 + 1 137 227 140 + 1 69 227 235 + 1 41 225 227 + 1 235 227 225 + 1 71 251 145 + 1 51 143 251 + 1 145 251 143 + 1 53 255 177 + 1 71 179 255 + 1 177 255 179 + 1 71 255 251 + 1 53 250 255 + 1 251 255 250 + 1 71 279 179 + 1 69 178 279 + 1 179 279 178 + 1 67 276 144 + 1 71 145 276 + 1 144 276 145 + 1 71 276 279 + 1 67 275 276 + 1 279 276 275 + 1 78 256 181 + 1 53 177 256 + 1 181 256 177 + 1 52 254 165 + 1 78 169 254 + 1 165 254 169 + 1 78 254 256 + 1 52 252 254 + 1 256 254 252 + 1 77 231 163 + 1 42 159 231 + 1 163 231 159 + 1 44 236 176 + 1 77 180 236 + 1 176 236 180 + 1 77 236 231 + 1 44 229 236 + 1 231 236 229 + 1 77 286 180 + 1 78 181 286 + 1 180 286 181 + 1 76 284 162 + 1 77 163 284 + 1 162 284 163 + 1 77 284 286 + 1 76 285 284 + 1 286 284 285 + 1 72 262 185 + 1 56 183 262 + 1 185 262 183 + 1 54 258 147 + 1 72 149 258 + 1 147 258 149 + 1 72 258 262 + 1 54 257 258 + 1 262 258 257 + 1 70 228 141 + 1 41 137 228 + 1 141 228 137 + 1 45 237 182 + 1 70 184 237 + 1 182 237 184 + 1 70 237 228 + 1 45 226 237 + 1 228 237 226 + 1 70 280 184 + 1 72 185 280 + 1 184 280 185 + 1 68 277 139 + 1 70 141 277 + 1 139 277 141 + 1 70 277 280 + 1 68 278 277 + 1 280 277 278 + 1 74 246 190 + 1 49 188 246 + 1 190 246 188 + 1 47 242 151 + 1 74 153 242 + 1 151 242 153 + 1 74 242 246 + 1 47 241 242 + 1 246 242 241 + 1 75 260 157 + 1 55 155 260 + 1 157 260 155 + 1 57 264 189 + 1 75 191 264 + 1 189 264 191 + 1 75 264 260 + 1 57 259 264 + 1 260 264 259 + 1 75 283 191 + 1 74 190 283 + 1 191 283 190 + 1 73 282 156 + 1 75 157 282 + 1 156 282 157 + 1 75 282 283 + 1 73 281 282 + 1 283 282 281 + 1 81 265 193 + 1 57 189 265 + 1 193 265 189 + 1 56 263 183 + 1 81 187 263 + 1 183 263 187 + 1 81 263 265 + 1 56 261 263 + 1 265 263 261 + 1 80 245 175 + 1 48 171 245 + 1 175 245 171 + 1 49 247 188 + 1 80 192 247 + 1 188 247 192 + 1 80 247 245 + 1 49 243 247 + 1 245 247 243 + 1 80 289 192 + 1 81 193 289 + 1 192 289 193 + 1 79 287 174 + 1 80 175 287 + 1 174 287 175 + 1 80 287 289 + 1 79 288 287 + 1 289 287 288 +64 + 1 1 82 + 1 2 86 + 1 3 89 + 1 4 90 + 1 5 93 + 1 8 107 + 1 9 111 + 1 7 102 + 1 10 115 + 1 14 133 + 1 17 147 + 1 18 151 + 1 13 128 + 1 16 142 + 1 19 154 + 1 12 124 + 1 26 114 + 1 30 132 + 1 33 146 + 1 34 150 + 1 37 129 + 1 51 143 + 1 55 155 + 1 46 125 + 1 36 92 + 1 50 106 + 1 54 110 + 1 47 103 + 1 29 85 + 1 32 88 + 1 35 91 + 1 28 84 + 1 82 26 + 1 86 30 + 1 89 33 + 1 90 34 + 1 93 37 + 1 107 51 + 1 111 55 + 1 102 46 + 1 115 36 + 1 133 50 + 1 147 54 + 1 151 47 + 1 128 29 + 1 142 32 + 1 154 35 + 1 124 28 + 1 114 10 + 1 132 14 + 1 146 17 + 1 150 18 + 1 129 13 + 1 143 16 + 1 155 19 + 1 125 12 + 1 92 5 + 1 106 8 + 1 110 9 + 1 103 7 + 1 85 2 + 1 88 3 + 1 91 4 + 1 84 1 diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/DataFile_version_5.1_exported_from_paraview.vtk b/src/UnitTests/Meshes/data/triangles_2x2x2/DataFile_version_5.1_exported_from_paraview.vtk new file mode 100644 index 0000000000000000000000000000000000000000..d305f5aa6d28d2e0a2060e9364e717f34ed16c69 Binary files /dev/null and b/src/UnitTests/Meshes/data/triangles_2x2x2/DataFile_version_5.1_exported_from_paraview.vtk differ diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_binary.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_binary.vtu new file mode 100644 index 0000000000000000000000000000000000000000..814e7f26f855ac0814575d02d0b6425b607df9e7 Binary files /dev/null and b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_binary.vtu differ diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_binary_compressed.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_binary_compressed.vtu new file mode 100644 index 0000000000000000000000000000000000000000..b8be4feabf78d30fb63c6ccc26341763664c5a3c Binary files /dev/null and b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_binary_compressed.vtu differ diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_encoded.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_encoded.vtu new file mode 100644 index 0000000000000000000000000000000000000000..c4818dc23345ebd803baa63c0586f7397a9c5782 --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_encoded.vtu @@ -0,0 +1,40 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64"> + <UnstructuredGrid> + <Piece NumberOfPoints="9" NumberOfCells="8" > + <PointData> + </PointData> + <CellData> + </CellData> + <Points> + <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="appended" RangeMin="0" RangeMax="70.710678119" offset="0" > + <InformationKey name="L2_NORM_FINITE_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + <InformationKey name="L2_NORM_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + </DataArray> + </Points> + <Cells> + <DataArray type="Int64" Name="connectivity" format="appended" RangeMin="" RangeMax="" offset="156" /> + <DataArray type="Int64" Name="offsets" format="appended" RangeMin="" RangeMax="" offset="424" /> + <DataArray type="UInt8" Name="types" format="appended" RangeMin="" RangeMax="" offset="520" > + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> + <AppendedData encoding="base64"> + _bAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhBAAAAAAAAAAAAAEhCAAAAAAAAAAAAAAAAAADIQQAAAAAAAMhBAADIQQAAAAAAAEhCAADIQQAAAAAAAAAAAABIQgAAAAAAAMhBAABIQgAAAAAAAEhCAABIQgAAAAA=wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAwAAAAAAAAABAAAAAAAAAAIAAAAAAAAABQAAAAAAAAABAAAAAAAAAAUAAAAAAAAABAAAAAAAAAADAAAAAAAAAAQAAAAAAAAABwAAAAAAAAADAAAAAAAAAAcAAAAAAAAABgAAAAAAAAAEAAAAAAAAAAUAAAAAAAAACAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAABwAAAAAAAAA=QAAAAAAAAAADAAAAAAAAAAYAAAAAAAAACQAAAAAAAAAMAAAAAAAAAA8AAAAAAAAAEgAAAAAAAAAVAAAAAAAAABgAAAAAAAAACAAAAAAAAAAFBQUFBQUFBQ== + </AppendedData> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_encoded_compressed.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_encoded_compressed.vtu new file mode 100644 index 0000000000000000000000000000000000000000..0ca9a86e80abb01f798e26ab2542112b2cd19c84 --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_appended_encoded_compressed.vtu @@ -0,0 +1,40 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64" compressor="vtkZLibDataCompressor"> + <UnstructuredGrid> + <Piece NumberOfPoints="9" NumberOfCells="8" > + <PointData> + </PointData> + <CellData> + </CellData> + <Points> + <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="appended" RangeMin="0" RangeMax="70.710678119" offset="0" > + <InformationKey name="L2_NORM_FINITE_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + <InformationKey name="L2_NORM_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + </DataArray> + </Points> + <Cells> + <DataArray type="Int64" Name="connectivity" format="appended" RangeMin="" RangeMax="" offset="92" /> + <DataArray type="Int64" Name="offsets" format="appended" RangeMin="" RangeMax="" offset="204" /> + <DataArray type="UInt8" Name="types" format="appended" RangeMin="" RangeMax="" offset="288" > + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> + <AppendedData encoding="base64"> + _AQAAAAAAAAAAgAAAAAAAAGwAAAAAAAAAIwAAAAAAAAA=eJxjYEAGJxwRbA8nBqxyIBrGBqnBpgckBmODaAgbAMC5CXM=AQAAAAAAAAAAgAAAAAAAAMAAAAAAAAAAMgAAAAAAAAA=eJxjYIAARijNwoAKYHxmNHVMUJoVTRzGR9cH47OjicP4bGjqYOZwoInD+DB9AB0gAGE=AQAAAAAAAAAAgAAAAAAAAEAAAAAAAAAAHgAAAAAAAAA=eJxjZoAANijNCaV5oDQ/lBaC0qJQWgJKAwALgABtAQAAAAAAAAAAgAAAAAAAAAgAAAAAAAAACwAAAAAAAAA=eJxjZYUAAAC8ACk= + </AppendedData> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_ascii.vtk b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_ascii.vtk new file mode 100644 index 0000000000000000000000000000000000000000..5385dd47b07ab4b806999c6028ff43a824f9996e --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_ascii.vtk @@ -0,0 +1,34 @@ +# vtk DataFile Version 2.0 +TNL DATA +ASCII +DATASET UNSTRUCTURED_GRID +POINTS 9 float +0 0 0 +25 0 0 +50 0 0 +0 25 0 +25 25 0 +50 25 0 +0 50 0 +25 50 0 +50 50 0 + +CELLS 8 32 +3 0 1 4 +3 0 4 3 +3 1 2 5 +3 1 5 4 +3 3 4 7 +3 3 7 6 +3 4 5 8 +3 4 8 7 + +CELL_TYPES 8 +5 +5 +5 +5 +5 +5 +5 +5 diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_ascii.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_ascii.vtu new file mode 100644 index 0000000000000000000000000000000000000000..cd99e3cb9a22f40229a55b1dec07433b43f6c39e --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_ascii.vtu @@ -0,0 +1,51 @@ +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64"> + <UnstructuredGrid> + <Piece NumberOfPoints="9" NumberOfCells="8"> + <PointData> + </PointData> + <CellData> + </CellData> + <Points> + <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="ascii" RangeMin="0" RangeMax="70.71067811865476"> + 0 0 0 25 0 0 + 50 0 0 0 25 0 + 25 25 0 50 25 0 + 0 50 0 25 50 0 + 50 50 0 + <InformationKey name="L2_NORM_FINITE_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + <InformationKey name="L2_NORM_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + </DataArray> + </Points> + <Cells> + <DataArray type="Int64" Name="connectivity" format="ascii" RangeMin="0" RangeMax="8"> + 0 1 4 0 4 3 + 1 2 5 1 5 4 + 3 4 7 3 7 6 + 4 5 8 4 8 7 + </DataArray> + <DataArray type="Int64" Name="offsets" format="ascii" RangeMin="3" RangeMax="24"> + 3 6 9 12 15 18 + 21 24 + </DataArray> + <DataArray type="UInt8" Name="types" format="ascii" RangeMin="5" RangeMax="5"> + 5 5 5 5 5 5 + 5 5 + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_binary.vtk b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_binary.vtk new file mode 100644 index 0000000000000000000000000000000000000000..b4372d9f4aa53b0b5d2535120209171eeb972c86 Binary files /dev/null and b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_binary.vtk differ diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_compressed_paraview.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_compressed_paraview.vtu new file mode 100644 index 0000000000000000000000000000000000000000..9c1139ba2f9e6226589c72d8324ab000b42befbc --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_compressed_paraview.vtu @@ -0,0 +1,42 @@ +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64" compressor="vtkZLibDataCompressor"> + <UnstructuredGrid> + <Piece NumberOfPoints="9" NumberOfCells="8"> + <PointData> + </PointData> + <CellData> + </CellData> + <Points> + <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="binary" RangeMin="0" RangeMax="70.71067811865476"> + AQAAAAAAAAAAgAAAAAAAAGwAAAAAAAAAIwAAAAAAAAA=eJxjYEAGJxwRbA8nBqxyIBrGBqnBpgckBmODaAgbAMC5CXM= + <InformationKey name="L2_NORM_FINITE_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + <InformationKey name="L2_NORM_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + </DataArray> + </Points> + <Cells> + <DataArray type="Int64" Name="connectivity" format="binary" RangeMin="0" RangeMax="8"> + AQAAAAAAAAAAgAAAAAAAAMAAAAAAAAAAMgAAAAAAAAA=eJxjYIAARijNwoAKYHxmNHVMUJoVTRzGR9cH47OjicP4bGjqYOZwoInD+DB9AB0gAGE= + </DataArray> + <DataArray type="Int64" Name="offsets" format="binary" RangeMin="3" RangeMax="24"> + AQAAAAAAAAAAgAAAAAAAAEAAAAAAAAAAHgAAAAAAAAA=eJxjZoAANijNCaV5oDQ/lBaC0qJQWgJKAwALgABt + </DataArray> + <DataArray type="UInt8" Name="types" format="binary" RangeMin="5" RangeMax="5"> + AQAAAAAAAAAAgAAAAAAAAAgAAAAAAAAACwAAAAAAAAA=eJxjZYUAAAC8ACk= + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_compressed_tnl.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_compressed_tnl.vtu new file mode 100644 index 0000000000000000000000000000000000000000..4decb8ea8439f6ef08b75a624bdaecc298328feb --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_compressed_tnl.vtu @@ -0,0 +1,23 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64" compressor="vtkZLibDataCompressor"> +<UnstructuredGrid> +<Piece NumberOfPoints="9" NumberOfCells="8"> +<Points> +<DataArray type="Float32" Name="Points" NumberOfComponents="3" format="binary"> +AQAAAAAAAABsAAAAAAAAAGwAAAAAAAAAIwAAAAAAAAA=eJxjYEAGJxwRbA8nBqxyIBrGBqnBpgckBmODaAgbAMC5CXM= +</DataArray> +</Points> +<Cells> +<DataArray type="Int32" Name="connectivity" format="binary"> +AQAAAAAAAABgAAAAAAAAAGAAAAAAAAAALwAAAAAAAAA=eJxjYGBgYARiFgYIANHMUDEmIGaFslmR5EA0O5QNotmgYiA1HFA2B1QOAA6QAGE= +</DataArray> +<DataArray type="Int32" Name="offsets" format="binary"> +AQAAAAAAAAAgAAAAAAAAACAAAAAAAAAAHQAAAAAAAAA=eJxjZmBgYANiTiDmAWJ+IBYCYlEglgBiAAXAAG0= +</DataArray> +<DataArray type="UInt8" Name="types" format="binary"> +AQAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACwAAAAAAAAA=eJxjZYUAAAC8ACk= +</DataArray> +</Cells> +</Piece> +</UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_encoded_paraview.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_encoded_paraview.vtu new file mode 100644 index 0000000000000000000000000000000000000000..1e9e8801a2000a644700ed9606b8e0bf0b91de3a --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_encoded_paraview.vtu @@ -0,0 +1,42 @@ +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64"> + <UnstructuredGrid> + <Piece NumberOfPoints="9" NumberOfCells="8"> + <PointData> + </PointData> + <CellData> + </CellData> + <Points> + <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="binary" RangeMin="0" RangeMax="70.71067811865476"> + bAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhBAAAAAAAAAAAAAEhCAAAAAAAAAAAAAAAAAADIQQAAAAAAAMhBAADIQQAAAAAAAEhCAADIQQAAAAAAAAAAAABIQgAAAAAAAMhBAABIQgAAAAAAAEhCAABIQgAAAAA= + <InformationKey name="L2_NORM_FINITE_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + <InformationKey name="L2_NORM_RANGE" location="vtkDataArray" length="2"> + <Value index="0"> + 0 + </Value> + <Value index="1"> + 70.710678119 + </Value> + </InformationKey> + </DataArray> + </Points> + <Cells> + <DataArray type="Int64" Name="connectivity" format="binary" RangeMin="0" RangeMax="8"> + wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAwAAAAAAAAABAAAAAAAAAAIAAAAAAAAABQAAAAAAAAABAAAAAAAAAAUAAAAAAAAABAAAAAAAAAADAAAAAAAAAAQAAAAAAAAABwAAAAAAAAADAAAAAAAAAAcAAAAAAAAABgAAAAAAAAAEAAAAAAAAAAUAAAAAAAAACAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAABwAAAAAAAAA= + </DataArray> + <DataArray type="Int64" Name="offsets" format="binary" RangeMin="3" RangeMax="24"> + QAAAAAAAAAADAAAAAAAAAAYAAAAAAAAACQAAAAAAAAAMAAAAAAAAAA8AAAAAAAAAEgAAAAAAAAAVAAAAAAAAABgAAAAAAAAA + </DataArray> + <DataArray type="UInt8" Name="types" format="binary" RangeMin="5" RangeMax="5"> + CAAAAAAAAAAFBQUFBQUFBQ== + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_encoded_tnl.vtu b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_encoded_tnl.vtu new file mode 100644 index 0000000000000000000000000000000000000000..1b8b7e2b0cfe76b1d783690e7d604449925ab4aa --- /dev/null +++ b/src/UnitTests/Meshes/data/triangles_2x2x2/minimized_encoded_tnl.vtu @@ -0,0 +1,23 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64"> +<UnstructuredGrid> +<Piece NumberOfPoints="9" NumberOfCells="8"> +<Points> +<DataArray type="Float32" Name="Points" NumberOfComponents="3" format="binary"> +bAAAAAAAAAA=AAAAAAAAAAAAAAAAAADIQQAAAAAAAAAAAABIQgAAAAAAAAAAAAAAAAAAyEEAAAAAAADIQQAAyEEAAAAAAABIQgAAyEEAAAAAAAAAAAAASEIAAAAAAADIQQAASEIAAAAAAABIQgAASEIAAAAA +</DataArray> +</Points> +<Cells> +<DataArray type="Int32" Name="connectivity" format="binary"> +YAAAAAAAAAA=AAAAAAEAAAAEAAAAAAAAAAQAAAADAAAAAQAAAAIAAAAFAAAAAQAAAAUAAAAEAAAAAwAAAAQAAAAHAAAAAwAAAAcAAAAGAAAABAAAAAUAAAAIAAAABAAAAAgAAAAHAAAA +</DataArray> +<DataArray type="Int32" Name="offsets" format="binary"> +IAAAAAAAAAA=AwAAAAYAAAAJAAAADAAAAA8AAAASAAAAFQAAABgAAAA= +</DataArray> +<DataArray type="UInt8" Name="types" format="binary"> +CAAAAAAAAAA=BQUFBQUFBQU= +</DataArray> +</Cells> +</Piece> +</UnstructuredGrid> +</VTKFile> diff --git a/src/UnitTests/Meshes/data/triangles_2x2x2/original_with_metadata_and_cell_data.vtk b/src/UnitTests/Meshes/data/triangles_2x2x2/original_with_metadata_and_cell_data.vtk new file mode 100644 index 0000000000000000000000000000000000000000..79ca1dea42223d7dabeca6b267bdcdcff72f3c60 Binary files /dev/null and b/src/UnitTests/Meshes/data/triangles_2x2x2/original_with_metadata_and_cell_data.vtk differ