diff --git a/.travis.yml b/.travis.yml index 216137bf797..3c12e76f14d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,7 +55,7 @@ env: compiler: clang install: - echo "$PWD" - - if [ -n "$TRAVIS_PULL_REQUEST" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi + - if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi - /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh - export CXX=clang++ CC=clang; before_script: diff --git a/.travis/build_package.sh b/.travis/build_package.sh index e7bf90935a1..c55fc19b5a9 100755 --- a/.travis/build_package.sh +++ b/.travis/build_package.sh @@ -12,7 +12,7 @@ function build_examples { mkdir -p build-travis cd build-travis mytime cmake -DCGAL_DIR="/usr/local/lib/cmake/CGAL" -DCMAKE_CXX_FLAGS="${CXX_FLAGS}" .. - mytime make -j2 + mytime make -j2 VERBOSE=1 } function build_tests { @@ -29,7 +29,7 @@ function build_demo { ;; esac mytime cmake -DCGAL_DIR="/usr/local/lib/cmake/CGAL" -DCGAL_DONT_OVERRIDE_CMAKE_FLAGS:BOOL=ON -DCMAKE_CXX_FLAGS="${CXX_FLAGS} ${EXTRA_CXX_FLAGS}" .. - mytime make -j2 + mytime make -j2 VERBOSE=1 } old_IFS=$IFS IFS=$' ' @@ -116,7 +116,7 @@ cd $ROOT fi IFS=$old_IFS - if [ -n "$TRAVIS_PULL_REQUEST" ] && [ "$ARG" != Polyhedron_demo ]; then + if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$ARG" != Polyhedron_demo ]; then DO_IGNORE=FALSE . $ROOT/.travis/test_package.sh "$ROOT" "$ARG" echo "DO_IGNORE is $DO_IGNORE" diff --git a/.travis/template.txt b/.travis/template.txt index 0958db78412..5c70fa11ca0 100644 --- a/.travis/template.txt +++ b/.travis/template.txt @@ -10,7 +10,7 @@ env: compiler: clang install: - echo "$PWD" - - if [ -n "$TRAVIS_PULL_REQUEST" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi + - if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi - /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh - export CXX=clang++ CC=clang; before_script: diff --git a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Advancing_front_surface_reconstruction.txt b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Advancing_front_surface_reconstruction.txt index 3d30ac514f7..ecc33833c13 100644 --- a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Advancing_front_surface_reconstruction.txt +++ b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Advancing_front_surface_reconstruction.txt @@ -130,7 +130,7 @@ We define the *plausibility* grade \f$ p(t) \f$ as \f$ 1/r_t \f$, if Let's have a look at the figure below. \cgalFigureBegin{figAFSRplausible,wedges.png} -Plausibility. Triangle `t'` and incidident triangles sharing edge `e` seen from the side. +Plausibility. Triangle `t'` and incident triangles sharing edge `e` seen from the side. \cgalFigureEnd \f$ \alpha_\mathrm{sliver}\f$ corresponds to the red wedge. The algorithm will never select triangle `t1` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt b/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt index 6e08371d24e..b15d831286c 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt +++ b/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt @@ -145,7 +145,7 @@ but does not provide any arithmetic operations. As for algebraic structures this concept is also traits class oriented. The main functionality related to `RealEmbeddable` is gathered in -the class `Real_embeddable_traits`. In particular, it porivdes the boolean +the class `Real_embeddable_traits`. In particular, it provides the boolean tag `Is_real_embeddable` indicating whether a type is a model of `RealEmbeddable`. The comparison operators are required to be realized via \cpp operator overloading. diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/IntegralDomainWithoutDivision.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/IntegralDomainWithoutDivision.h index 5c1cef11fa3..6d694ad1690 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/IntegralDomainWithoutDivision.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/IntegralDomainWithoutDivision.h @@ -3,7 +3,7 @@ \ingroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts \cgalConcept -This is the most basic concept for algebraic structures considered within CGAL. +This is the most basic concept for algebraic structures considered within \cgal. A model `IntegralDomainWithoutDivision` represents an integral domain, i.e.\ commutative ring with 0, 1, +, * and unity free of zero divisors. diff --git a/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h b/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h index afd75f37b71..a1e4dc4e3ab 100644 --- a/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h +++ b/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h @@ -27,6 +27,7 @@ #ifndef CGAL_SCALAR_FACTOR_TRAITS_H #define CGAL_SCALAR_FACTOR_TRAITS_H +#include #include /*! \file NiX/Scalar_factor_traits.h diff --git a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h index c88c5d2aa72..1a7649fe88f 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h @@ -28,10 +28,10 @@ // within this file AS ^= Type -#include #include //#include +#include #include #include #include diff --git a/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h index d0ad1169d75..5fc863f3505 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h @@ -24,7 +24,6 @@ // within this file FT ^= Fraction_traits -#include #include #include #include diff --git a/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h index 46fe242c08e..0e36149a4f4 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h @@ -24,7 +24,6 @@ // within this file FT ^= Fraction_traits -#include #include #include diff --git a/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h b/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h index 961dc0e13a8..3047b8bc08b 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h @@ -24,8 +24,6 @@ // \brief provides test functions for the \c RealEmbeddable concept of // number types. -#include - #include #include #include diff --git a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp index f938c90e6d8..f974955819a 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp index 9d87938c82b..28f3d1f19e4 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Algebraic_foundations/test/Algebraic_foundations/Chinese_remainder_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Chinese_remainder_traits.cpp index 1e6121f8c91..219014011fe 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Chinese_remainder_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Chinese_remainder_traits.cpp @@ -17,7 +17,7 @@ // ---------------------------------------------------------------------------- // // Library : CGAL -// File : test/Chinese_remaminder_test.C +// File : test/Chinese_remaminder_traits.cpp // CGAL_release : $Name: $ // Revision : $Revision$ // Revision_date : $Date$ @@ -29,7 +29,6 @@ // ============================================================================ #undef NDEBUG -#include #include #include #include @@ -171,7 +170,7 @@ int main(){ #ifdef CGAL_USE_CORE test_CR(); -#endif // Lis_HAVE_CORE +#endif // CGAL_USE_CORE return 0; } diff --git a/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp index e125f25d5f0..f9d27b8640b 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include int main(){ diff --git a/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp index 28d7a490cc4..721b6cb81c7 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp index f55719e9a78..a67651684e8 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include diff --git a/Algebraic_foundations/test/Algebraic_foundations/extended_euclidean_algorithm.cpp b/Algebraic_foundations/test/Algebraic_foundations/extended_euclidean_algorithm.cpp index ef3aebbef16..dac663be466 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/extended_euclidean_algorithm.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/extended_euclidean_algorithm.cpp @@ -20,7 +20,6 @@ // // ============================================================================ -#include #include #include #include diff --git a/Algebraic_foundations/test/Algebraic_foundations/ipower.cpp b/Algebraic_foundations/test/Algebraic_foundations/ipower.cpp index 18569a161fb..4759ec30f78 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/ipower.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/ipower.cpp @@ -21,7 +21,6 @@ // // ============================================================================ -#include #include #include diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Shear_controller.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Shear_controller.h index 1c4c16fa68b..8635c252d0b 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Shear_controller.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Shear_controller.h @@ -110,7 +110,7 @@ namespace CGAL { int pos_next_factor; - // Unsuccessfull shear factors + // Unsuccessful shear factors std::set bad_shears; }; diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_curve_kernel_2.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_curve_kernel_2.cpp index 8b0301a451d..b44ed894399 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_curve_kernel_2.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_curve_kernel_2.cpp @@ -18,7 +18,6 @@ #define CGAL_AK_ENABLE_DEPRECATED_INTERFACE 1 #include -#include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_1.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_1.h index a1987a44ca1..e12bfc06b14 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_1.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_1.h @@ -16,7 +16,6 @@ #define CGAL_TEST_ALL_AK_VARIANTS 1 -#include #include #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_2.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_2.cpp index f075abe0212..4421850d42a 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_2.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_kernel_d_2.cpp @@ -18,7 +18,6 @@ //#define CGAL_AK_ENABLE_DEPRECATED_INTERFACE 1 #include -#include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_real_d_1.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_real_d_1.cpp index 81d28a9f107..226d06d8527 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_real_d_1.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Algebraic_real_d_1.cpp @@ -18,8 +18,6 @@ This is the test file for the class NiX::Algebraic_real_d_1. */ -#include - #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Bitstream_descartes.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Bitstream_descartes.cpp index 64b62dca7ab..09a572c18cb 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Bitstream_descartes.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Bitstream_descartes.cpp @@ -19,7 +19,6 @@ */ -#include #include // include these traits here by 'hand', since not in release 3.3 diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_pair_analysis_2.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_pair_analysis_2.cpp index 40daac26aa1..7b13743ffbd 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_pair_analysis_2.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_pair_analysis_2.cpp @@ -21,7 +21,6 @@ #endif #endif -#include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Descartes.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Descartes.cpp index 3f9435b38cc..96d42c984b8 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Descartes.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Descartes.cpp @@ -19,8 +19,6 @@ */ -#include - // include these traits here by 'hand', since not in release 3.3 #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp index 40bea31f5bc..fc3a48cdc4c 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp @@ -24,7 +24,6 @@ -#include #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.cpp index cd3695355cc..a25ea770526 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.cpp @@ -13,8 +13,6 @@ #include -#include - #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/cyclic.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/cyclic.cpp index dad7e3fd0a1..4d9bdbdf806 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/cyclic.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/cyclic.cpp @@ -1,5 +1,5 @@ -#include +#include #include #ifdef CGAL_HAS_CORE_ARITHMETIC_KERNEL diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h index c5e242e57a2..919c4b7fe1c 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h @@ -21,10 +21,12 @@ // // ============================================================================ -#include -#include +#include +#include + +#include +#include -//#include #ifndef CGAL_TEST_ALGEBRAIC_CURVE_KERNEL_2_H #define CGAL_TEST_ALGEBRAIC_CURVE_KERNEL_2_H diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h index b84293b0c69..ca637c4d528 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h @@ -21,7 +21,6 @@ // // ============================================================================ -#include #include #include #include @@ -339,7 +338,7 @@ void test_algebraic_kernel_1(const AlgebraicKernel_d_1& ak_1){ c0i != coeffs.end(); c0i++) { for (typename std::vector< int >::const_iterator c2i = coeffs.begin(); c2i != coeffs.end(); c2i++) { - // we basically test a quadratic polynomial (with choosen small and large + // we basically test a quadratic polynomial (with chosen small and large // quadratic and constant coefficient, which is disturbed by a root close to zero). //Polynomial_1 poly((*c2i*x*x - *c0i) * (c*x-1)); Polynomial_1 poly((*c2i*x*x - *c0i) * (c*x-1)); diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h index 1de44826604..eb1643d06ea 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h @@ -20,7 +20,6 @@ // // ============================================================================ -#include #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_bitstream_descartes.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_bitstream_descartes.h index 944abeab5e3..bacc94179fd 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_bitstream_descartes.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_bitstream_descartes.h @@ -24,8 +24,6 @@ // #include -#include - #include #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h index c51798e124f..4811dc2d882 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h @@ -31,12 +31,8 @@ #ifndef CGAL_TEST_REAL_COMPARABLE_H #define CGAL_TEST_REAL_COMPARABLE_H -#include #include #include -/*#include -#include -#include */ #include #include #include diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_root_isolator.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_root_isolator.h index 9c0693b5535..1004ef75c75 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_root_isolator.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_root_isolator.h @@ -23,7 +23,6 @@ // TODO: The comments are all original EXACUS comments and aren't adapted. So // they may be wrong now. -#include #include #include diff --git a/Apollonius_graph_2/examples/Apollonius_graph_2/ag2_exact_traits_sqrt.cpp b/Apollonius_graph_2/examples/Apollonius_graph_2/ag2_exact_traits_sqrt.cpp index c03848ad334..bdd70099b7a 100644 --- a/Apollonius_graph_2/examples/Apollonius_graph_2/ag2_exact_traits_sqrt.cpp +++ b/Apollonius_graph_2/examples/Apollonius_graph_2/ag2_exact_traits_sqrt.cpp @@ -5,10 +5,8 @@ #include #include -#if defined CGAL_USE_LEDA -# include -#elif defined CGAL_USE_CORE -# include +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) +# include #endif // *** WARNING *** @@ -18,13 +16,10 @@ // benchmarking the Apollonius_graph_filtered_traits_2<> class should // be used. -#if defined CGAL_USE_LEDA +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) // If LEDA is present use leda_real as the exact number type -typedef leda_real NT; - -#elif defined CGAL_USE_CORE // Otherwise if CORE is present use CORE's Expr as the exact number type -typedef CORE::Expr NT; +typedef CGAL::Exact_algebraic NT; #else diff --git a/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test8_C2.h b/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test8_C2.h index bdff3dbd9e2..04552d6598d 100644 --- a/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test8_C2.h +++ b/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test8_C2.h @@ -386,7 +386,7 @@ public: // both circles exist - // check whether the shadow region is connected, i.e., wether it is + // check whether the shadow region is connected, i.e., whether it is // of the form (a, b) or (-oo, a) U (b, +oo) Bitangent_line bl_12(p1, p2); @@ -524,7 +524,7 @@ public: // both circles exist - // check whether the shadow region is connected, i.e., wether it is + // check whether the shadow region is connected, i.e., whether it is // of the form (a, b) or (-oo, a) U (b, +oo) Bitangent_line bl_12(p1, p2); diff --git a/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test_C2.h b/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test_C2.h index 097c507ff49..ed326d992ac 100644 --- a/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test_C2.h +++ b/Apollonius_graph_2/include/CGAL/Apollonius_graph_2/Finite_edge_test_C2.h @@ -383,7 +383,7 @@ public: // both circles exist - // check whether the shadow region is connected, i.e., wether it is + // check whether the shadow region is connected, i.e., whether it is // of the form (a, b) or (-oo, a) U (b, +oo) Bitangent_line bl_12(p1, p2); @@ -507,7 +507,7 @@ public: // both circles exist - // check whether the shadow region is connected, i.e., wether it is + // check whether the shadow region is connected, i.e., whether it is // of the form (a, b) or (-oo, a) U (b, +oo) Bitangent_line bl_12(p1, p2); @@ -581,7 +581,7 @@ public: // both circles exist - // check whether the shadow region is connected, i.e., wether it is + // check whether the shadow region is connected, i.e., whether it is // of the form (a, b) or (-oo, a) U (b, +oo) return !b; diff --git a/Apollonius_graph_2/include/CGAL/Parabola_2.h b/Apollonius_graph_2/include/CGAL/Parabola_2.h index 52b94ba6aeb..199a2186a3b 100644 --- a/Apollonius_graph_2/include/CGAL/Parabola_2.h +++ b/Apollonius_graph_2/include/CGAL/Parabola_2.h @@ -60,9 +60,20 @@ protected: // } inline static - FT divide(const FT& x, const FT& y) { - return CGAL::integral_division(x,y); + FT divide(const FT& x, const FT& y, Integral_domain_without_division_tag) { + return FT(CGAL::to_double(x) / CGAL::to_double(y)); } + + inline static + FT divide(const FT& x, const FT& y, Field_tag) { + return x / y; + } + + inline static + FT divide(const FT& x, const FT& y) { + return divide(x,y, typename AST::Algebraic_category()); + } + inline static FT sqrt(const FT& x, Integral_domain_without_division_tag) { return CGAL::sqrt(CGAL::to_double(x)); @@ -97,7 +108,8 @@ protected: { return sqrt( distance2(p1, p2) ); } - + + inline static FT distance(const Point_2& p, const Line_2& l) { @@ -105,6 +117,8 @@ protected: sqrt( CGAL::square(l.a()) + CGAL::square(l.b()) ) ); } + + // instance stuff Point_2 c; Line_2 l; @@ -136,8 +150,8 @@ protected: std::vector< Point_2 > p; - if ( l.a() == ZERO ) { - FT y = d2 * CGAL::sign(l.b()) - divide(l.c(), l.b()); + if ( l.a() == FT(0) ) { + FT y = d2 * int(CGAL::sign(l.b())) - divide(l.c(), l.b()); FT C = CGAL::square(y) - FT(2) * c.y() * y + CGAL::square(c.x()) + CGAL::square(c.y()) - d1; diff --git a/Apollonius_graph_2/test/Apollonius_graph_2/include/IO/Null_output_stream.h b/Apollonius_graph_2/test/Apollonius_graph_2/include/IO/Null_output_stream.h index d5d2210f060..2caa189aa95 100644 --- a/Apollonius_graph_2/test/Apollonius_graph_2/include/IO/Null_output_stream.h +++ b/Apollonius_graph_2/test/Apollonius_graph_2/include/IO/Null_output_stream.h @@ -26,8 +26,6 @@ #ifndef CGAL_NULL_OUTPUT_STREAM_H #define CGAL_NULL_OUTPUT_STREAM_H -#include - namespace CGAL { diff --git a/Apollonius_graph_2/test/Apollonius_graph_2/include/test.h b/Apollonius_graph_2/test/Apollonius_graph_2/include/test.h index a87f00f5a17..666f5e13166 100644 --- a/Apollonius_graph_2/test/Apollonius_graph_2/include/test.h +++ b/Apollonius_graph_2/test/Apollonius_graph_2/include/test.h @@ -1,7 +1,6 @@ #ifndef CGAL_APOLLONIUS_GRAPH_2_TEST_H #define CGAL_APOLLONIUS_GRAPH_2_TEST_H -#include #include #include #include diff --git a/Apollonius_graph_2/test/Apollonius_graph_2/test_ag2.cpp b/Apollonius_graph_2/test/Apollonius_graph_2/test_ag2.cpp index 1fc81aaa1ba..22c23e75145 100644 --- a/Apollonius_graph_2/test/Apollonius_graph_2/test_ag2.cpp +++ b/Apollonius_graph_2/test/Apollonius_graph_2/test_ag2.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Apollonius_graph_2/test/Apollonius_graph_2/test_ag_hierarchy_2.cpp b/Apollonius_graph_2/test/Apollonius_graph_2/test_ag_hierarchy_2.cpp index 7546bd42bed..51baa1a0cab 100644 --- a/Apollonius_graph_2/test/Apollonius_graph_2/test_ag_hierarchy_2.cpp +++ b/Apollonius_graph_2/test/Apollonius_graph_2/test_ag_hierarchy_2.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/Arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/Arithmetic_kernel.cpp index 890467c3f73..1bb1400beea 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/Arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/Arithmetic_kernel.cpp @@ -1,5 +1,5 @@ #include -#include + #include #if defined(CGAL_HAS_DEFAULT_ARITHMETIC_KERNEL) diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/CORE_arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/CORE_arithmetic_kernel.cpp index 4a20d786ec2..8b874751511 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/CORE_arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/CORE_arithmetic_kernel.cpp @@ -1,5 +1,4 @@ #include -#include #include diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/GMPXX_arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/GMPXX_arithmetic_kernel.cpp index b51a5d6de00..adf5508caa9 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/GMPXX_arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/GMPXX_arithmetic_kernel.cpp @@ -1,5 +1,5 @@ #include -#include + #include #ifdef CGAL_USE_GMPXX diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/GMP_arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/GMP_arithmetic_kernel.cpp index 26320a91047..a9334033d0c 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/GMP_arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/GMP_arithmetic_kernel.cpp @@ -1,5 +1,5 @@ #include -#include + #include #ifdef CGAL_HAS_GMP_ARITHMETIC_KERNEL diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp index 5a563839d4f..0dacebfcb77 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp @@ -1,6 +1,6 @@ #include -#include + #include #include #include diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/LEDA_arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/LEDA_arithmetic_kernel.cpp index 74ae1f33dfe..a17df95e767 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/LEDA_arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/LEDA_arithmetic_kernel.cpp @@ -1,5 +1,5 @@ #include -#include + #include #ifdef CGAL_HAS_LEDA_ARITHMETIC_KERNEL diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/include/CGAL/Test/_test_arithmetic_kernel.h b/Arithmetic_kernel/test/Arithmetic_kernel/include/CGAL/Test/_test_arithmetic_kernel.h index ea092512083..5f9525e86ca 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/include/CGAL/Test/_test_arithmetic_kernel.h +++ b/Arithmetic_kernel/test/Arithmetic_kernel/include/CGAL/Test/_test_arithmetic_kernel.h @@ -26,7 +26,7 @@ #ifndef CGAL_TEST_ARITHMETIC_KERNEL_H #define CGAL_TEST_ARITHMETIC_KERNEL_H -#include + #include namespace CGAL { diff --git a/Arrangement_on_surface_2/TODO b/Arrangement_on_surface_2/TODO index fdd2033cfa3..8a6f37d6457 100644 --- a/Arrangement_on_surface_2/TODO +++ b/Arrangement_on_surface_2/TODO @@ -125,7 +125,7 @@ pair of begin/end functions can be changed, so that they return a range of objects that represent either edges or vertices. - The second problem can be fixed by introducing a heirarchy of 2 layers + The second problem can be fixed by introducing a hierarchy of 2 layers to the arrangement with history. The top layer represent the split of general curves into x-monotone curves, and the one below represents the split at intersection points. As a response to a user request for the items diff --git a/Arrangement_on_surface_2/archive/demo/Arr_algebraic_segment_traits_2/xalci/data/test_sequence b/Arrangement_on_surface_2/archive/demo/Arr_algebraic_segment_traits_2/xalci/data/test_sequence index 472cfb8be36..9ac0c3de83b 100644 --- a/Arrangement_on_surface_2/archive/demo/Arr_algebraic_segment_traits_2/xalci/data/test_sequence +++ b/Arrangement_on_surface_2/archive/demo/Arr_algebraic_segment_traits_2/xalci/data/test_sequence @@ -7,7 +7,7 @@ Curve_analyser INPUT "P[6(0,P[6(0,34186452217925)(1,-47333108912824)(2,859012718 // Same with some content Curve_analyser INPUT "P[6(0,P[10(0,239305165525475)(1,-433891119043543)(2,-105547852922974)(3,544084567642102)(4,-168636318668897)(5,-121992740815323)(6,34879008294620)(7,11799206430140)(8,-36175872)(9,85786624)(10,33947648)])(1,P[9(0,-54239848065004)(1,99913497126828)(2,19760931822856)(3,-122064771317912)(4,42619705096452)(5,24317888697724)(6,-8140916911648)(7,-2166674406544)(8,128057344)(9,59899904)])(2,P[8(0,7433741935312)(1,-9062611931072)(2,-7038911122368)(3,10741692910944)(4,-394721728272)(5,-1679188229536)(6,-164069376)(7,107249664)(8,54984704)])(3,P[7(0,-218665076224)(1,264879835136)(2,207970109440)(3,-313676665856)(4,10561338880)(5,48743222272)(6,133627904)(7,53608448)])(4,P[6(0,68812800)(1,23724032)(2,52953088)(3,-109314048)(4,-168689664)(5,85590016)(6,46923776)])(5,P[5(1,219054080)(2,-93880320)(3,-281640960)(4,93880320)(5,62586880)])(6,P[4(0,28672000)(1,-12288000)(2,-36864000)(3,12288000)(4,8192000)])]" -hmm smth realy heavy... +hmm smth really heavy... P[34(0,P[34(0,12952101536523102192492711540000000)(1,-84147098480789650665250232160000000)(2,-69088664533801811202671946450000000)(3,-12990598879942044092505125010000000)(4,27052642714728288021127698670000000)(5,26683266093731013401148721880000000)(6,5372171464167151111739335793000000)(7,-8934425711222817088377016721000000)(8,-8465742196405103553796952613000000)(9,-1737345552069859077855633714000000)(10,2393898184518898797964635987000000)(11,2234406641615936885853597509000000)(12,479873852041504440602579852100000)(13,-547557654615450328195988452500000)(14,-514849404082170848294946339800000)(15,-115417366169449334489378073500000)(16,113234224818672992436814644400000)(17,107962164812116405549461548900000)(18,25135425283858380820959007860000)(19,-21694664362506393046334314800000)(20,-21025627462526285456489755280000)(21,-5057323915115735386146156273000)(22,3901460484323335482987702100000)(23,3846534854318572165730297444000)(24,950752053910955172204451437900)(25,-665241246757279897517641949200)(26,-666960287213849591322741077200)(27,-168596633306616989111809611900)(28,108415065221291211390422093200)(29,110420084629074642463546936400)(30,28431730759059073988652406240)(31,-16992776198434916741021022360)(32,-17557477656685153453414375500)(33,-4588689239444215584479993393)(34,2574250362779616822482848012)])(2,P[0(0,-123917486647761741318703576800000000)])(4,P[0(0,79246903881551255661144190100000000)])(6,P[0(0,2186663392639010037975810829000000)])(8,P[0(0,-30912413603643981961132659450000000)])(10,P[0(0,22784177877224038711887972820000000)])(12,P[0(0,-8699274014787859551101246025000000)])(14,P[0(0,836940561843498171726587625200000)])(16,P[0(0,1367060050733175030564444040000000)])(18,P[0(0,-1171114486352462799313004128000000)])(20,P[0(0,567955949125204086770735562700000)])(22,P[0(0,-181911283701056707932126214300000)])(24,P[0(0,25732945948997554536421517900000)])(26,P[0(0,13209567106923403694087544950000)])(28,P[0(0,-13184322903675827636908029720000)])(30,P[0(0,6798109015505303221533146500000)])(32,P[0(0,-2528588426392935931038968129000)])(34,P[0(0,669962430844565364862639688900)])] Maldenbrot's curve: 0 segments ? diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index dc4d957e931..8611c6bc49e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -782,7 +782,7 @@ ability to answer such queries effectively. The `Arrangement_2` class template does not support point-location queries directly, as the arrangement representation is decoupled from the geometric algorithms that operate on it. The 2D Arrangements -package includes a set of classe templates that are capable of +package includes a set of class templates that are capable of answering such queries; all are models of the concept `ArrangementPointLocation_2`. Each model employs a different algorithm or strategy for answering queries. A model of this diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h index 463588b9b1f..9d6967e4b46 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h @@ -43,6 +43,8 @@ #include #include +#include + namespace CGAL { namespace VariantFunctors{ diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h index ae06841ffea..c47a5dc5096 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h @@ -590,7 +590,7 @@ private: * \param cache Caches the vertical tangency points and intersection points. * \param ipts Output: A vector of intersection points + multiplicities. * \param ovlp_cv Output: An overlapping subcurve (if exists). - * \return Whether an overlap has occured. + * \return Whether an overlap has occurred. */ bool _intersect (const Self& cv, Intersection_map& inter_map, @@ -1488,14 +1488,14 @@ bool _Bezier_x_monotone_2::_is_in_range if ((p_gt_ps && p_lt_pt) || (p_lt_ps && p_gt_pt)) { - // The point p is definately in the x-range of the subcurve, as its + // The point p is definitely in the x-range of the subcurve, as its // parameter is between the source and target parameters. return (true); } if ((p_lt_ps && p_lt_pt) || (p_gt_ps && p_gt_pt)) { - // The point p is definately not in the x-range of the subcurve, + // The point p is definitely not in the x-range of the subcurve, // as its parameter is smaller than both source and target parameter // (or greater than both of them). return (false); @@ -1562,14 +1562,14 @@ bool _Bezier_x_monotone_2::_is_in_range if ((p_gt_ps && p_lt_pt) || (p_lt_ps && p_gt_pt)) { - // The point p is definately in the x-range of the subcurve, as its + // The point p is definitely in the x-range of the subcurve, as its // parameter is between the source and target parameters. return (true); } if ((p_lt_ps && p_lt_pt) || (p_gt_ps && p_gt_pt)) { - // The point p is definately not in the x-range of the subcurve, + // The point p is definitely not in the x-range of the subcurve, // as its parameter is smaller than both source and target parameter // (or greater than both of them). return (false); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h index 9fc37cacd11..5c97ae275dd 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h @@ -42,7 +42,7 @@ namespace CGAL { /*! \class * A class that answers nearest neighbor queries. - * It recieves a set of points, and builds a kd-tree for them. + * It receives a set of points, and builds a kd-tree for them. * Given a query point, it finds the closest point to the query. */ template diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h index 3d7d706e655..03d229e8aa6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h @@ -719,7 +719,7 @@ public: m_traits->construct_min_vertex_2_object()( ce2.cv()) : m_traits->construct_max_vertex_2_object()( ce2.cv()) ), ce1.cv(), ce1.ce()); - //need to return the opposite because the function recieved + //need to return the opposite because the function received // the curve ends in a reverse order if (res != EQUAL) return (res == SMALLER) ? LARGER : SMALLER; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h index 5a95a74b6fb..02f099b8b54 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h @@ -1899,7 +1899,7 @@ public: return old; } - //This method occasionaly(!) checks the guarantees + //This method occasionally(!) checks the guarantees // It is currently not in use, since the guarantees are constantly checked in O(1) time bool needs_update() { diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h index c1271e03fc5..ba5c3a9b30b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h @@ -878,7 +878,7 @@ public: // The left point of the current subcurve of one polycurve // coincides with the current subcurve of the other polycurve. if (left_overlap) { - // An overlap occured at the previous iteration: + // An overlap occurred at the previous iteration: // Output the overlapping polycurve. CGAL_assertion(ocv.number_of_subcurves() > 0); *oi++ = make_object(ocv); @@ -887,7 +887,7 @@ public: else { // The left point of the current subcurve of one // polycurve coincides with the current subcurve of the - // other polycurve, and no overlap occured at the + // other polycurve, and no overlap occurred at the // previous iteration: Output the intersection // point. The derivative of at least one of the // polycurves is not defined at this point, so we give diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h index aac94d85371..139a06473f6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h @@ -251,7 +251,7 @@ public: if (is_vertical(xcv1)) return (is_vertical(xcv2)) ? EQUAL : SMALLER; else if (is_vertical(xcv2)) return (LARGER); - // Perform the comparison based on the existance of bounded left + // Perform the comparison based on the existence of bounded left // endpoints. if (has_left1 && has_left2) { // Obtain the left endpoints of xcv1 and xcv2. diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h index c624e260824..c686a0f553c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h @@ -240,7 +240,7 @@ void insert(Arrangement_on_surface_2& arr, /*! Insert a range of x-monotone curves into an empty arrangement * \param arr the resulting arrangement - * \param begin the begining of the curve range + * \param begin the beginning of the curve range * \param end past-the-end curve range */ template & arr, /*! Insert a range of x-monotone curves and a range of isolated points into * an empty arrangement * \param arr the resulting arrangement - * \param begin_xcurves the begining of the curve range + * \param begin_xcurves the beginning of the curve range * \param end_xcurves past-the-end curve range - * \param begin_points the begining of the point range + * \param begin_points the beginning of the point range * \param end_points past-the-end point range */ template & /*! Insert a range of x-monotone curves into a non-empty arrangement * \param arr the resulting arrangement - * \param begin the begining of the curve range + * \param begin the beginning of the curve range * \param end past-the-end curve range */ template :: remove_edge(Halfedge_handle e, bool remove_source, bool remove_target) { // Comment EBEB 2012-08-06: this has become a simple forwarding function - // the intelligence of wether to swap he with he->opposite() + // the intelligence of whether to swap he with he->opposite() // has been moved to _remove_edge itself, as additional computed // data is reused there @@ -2495,7 +2495,7 @@ _insert_at_vertices(DHalfedge* he_to, DInner_ccb* hole2 = (prev2->is_on_inner_ccb()) ? prev2->inner_ccb() : NULL; if ((hole1 == hole2) && (hole1 != NULL)) { - // .. only in this special case, we have to check wether swapping should + // .. only in this special case, we have to check whether swapping should // take place // EBEB 2012-07-26 the following code enables optimizations: @@ -4245,7 +4245,7 @@ _remove_edge(DHalfedge* e, bool remove_source, bool remove_target) } else { // If f1 == f2 (same_face-case), then we consider two loops that occur when - // he1 and he2 get removed; if f1 != f2, then he1 and he2 seperates the two + // he1 and he2 get removed; if f1 != f2, then he1 and he2 separates the two // faces that will be merged upon their removal---here both he1 and he2 // belong to a full cycle, and THAT IS WHY we give the f1 == f2 test to // determine whether end of loop should be he1->opposite() and @@ -4753,7 +4753,7 @@ _remove_edge(DHalfedge* e, bool remove_source, bool remove_target) // As the outer CCB of f1 may be represented by any of the // halfedges in between he1 -> ... -> he2 (the halfedges in between // are on the new outer CCB we have just created), we represent the - // former outer CCB by prev1, which definately stays on it. + // former outer CCB by prev1, which definitely stays on it. oc1->set_halfedge(prev1); // Notify the observers that a new outer CCB has been formed. diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Filtered_curved_kernel_via_analysis_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Filtered_curved_kernel_via_analysis_2_impl.h index 899f0903976..5c6a11da847 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Filtered_curved_kernel_via_analysis_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Filtered_curved_kernel_via_analysis_2_impl.h @@ -511,7 +511,7 @@ public: }; -//! checks wether and how two arcs are intersection - with first filtering +//! checks whether and how two arcs are intersection - with first filtering template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Intersect_2 : public FunctorBase::Intersect_2 { diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h index da01afea544..1a1172b9ce6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h @@ -1200,7 +1200,7 @@ Lexit: } // while(!s_stack.empty()) std::reverse(rev_points.begin(), rev_points.end()); - // resize rev_points to accomodate the size of points vector + // resize rev_points to accommodate the size of points vector unsigned rsize = rev_points.size(); rev_points.resize(rsize + points.size()); std::copy(points.begin(), points.end(), rev_points.begin() + rsize); diff --git a/Arrangement_on_surface_2/include/CGAL/IO/Arrangement_2_reader.h b/Arrangement_on_surface_2/include/CGAL/IO/Arrangement_2_reader.h index 39fec110b09..f54b55599eb 100644 --- a/Arrangement_on_surface_2/include/CGAL/IO/Arrangement_2_reader.h +++ b/Arrangement_on_surface_2/include/CGAL/IO/Arrangement_2_reader.h @@ -251,7 +251,7 @@ namespace CGAL { { formatter.read_face_begin(); - // Allocate a new face and determine whether it is unbounded and wether it + // Allocate a new face and determine whether it is unbounded and whether it // is valid (non-fictitious). DFace* new_f = m_arr_access.new_face(); const bool is_unbounded = (formatter.read_vertex_index() != 0); diff --git a/Arrangement_on_surface_2/include/CGAL/IO/Fig_stream.h b/Arrangement_on_surface_2/include/CGAL/IO/Fig_stream.h index 739bc40f2e1..32d878ee56e 100644 --- a/Arrangement_on_surface_2/include/CGAL/IO/Fig_stream.h +++ b/Arrangement_on_surface_2/include/CGAL/IO/Fig_stream.h @@ -514,7 +514,7 @@ public: } /*! - * Get the arrow drawing mode (this mode is relevent when drawing segments, + * Get the arrow drawing mode (this mode is relevant when drawing segments, * polylines, circular arcs or splines). */ Fig_arrow_mode arrow_mode () const diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h index 18d16894804..963f4cdc8f1 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h @@ -5,7 +5,6 @@ #include #include -#include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Construction_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Construction_test.h index 9aae6a62e83..f0cb8b30e63 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Construction_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Construction_test.h @@ -6,7 +6,7 @@ #include #include -#include + #include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Overlay_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Overlay_test.h index 211169fe288..6a45618aeb9 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Overlay_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Overlay_test.h @@ -6,7 +6,7 @@ #include #include -#include + #include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_dynamic_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_dynamic_test.h index 4c851cb0e72..0c23728c5bb 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_dynamic_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_dynamic_test.h @@ -1,7 +1,6 @@ #ifndef CGAL_POINT_LOCATION_DYNAMIC_TEST_H #define CGAL_POINT_LOCATION_DYNAMIC_TEST_H -#include #include "Point_location_test.h" diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h index d18fdc47f67..28c69831a9e 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h @@ -16,7 +16,6 @@ #include -#include #include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Segment_reader.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Segment_reader.h index cf8a81bd108..7fb5476ace5 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Segment_reader.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Segment_reader.h @@ -1,7 +1,6 @@ #ifndef SEGMENT_READER_H #define SEGMENT_READER_H -#include #include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h index 0457ad0504f..1d95d3eefef 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h @@ -1,7 +1,6 @@ #ifndef CGAL_TRAITS_BASE_TEST_H #define CGAL_TRAITS_BASE_TEST_H -#include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h index b035ef73c33..b69443c205d 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h @@ -1,7 +1,6 @@ #ifndef CGAL_TRAITS_TEST_H #define CGAL_TRAITS_TEST_H -#include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h index adcc6533c06..dbe744c9fdd 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h @@ -5,7 +5,7 @@ #include #include -#include + #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake index 4753352d565..552b435d9a4 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake @@ -70,7 +70,11 @@ set(CGAL_GMPZ_NT 14) set(CORE_INT_NT 15) set(CORE_RAT_NT 16) -if($ENV{CGAL_DISABLE_GMP}) +if(CGAL_DISABLE_GMP) + set(CGAL_DISABLE_GMP ON) +endif() + +if(CGAL_DISABLE_GMP) message(STATUS "GMP is disable. Try to use LEDA instead.") set(GMPZ_NT ${LEDA_INT_NT}) set(QUOTIENT_CGAL_GMPZ_NT ${LEDA_RAT_NT}) @@ -894,7 +898,7 @@ endfunction() #---------------------------------------------------------------------# function(test_polycurve_conic_traits) # echo polycurve test starting - if($ENV{CGAL_DISABLE_GMP}) + if(CGAL_DISABLE_GMP) MESSAGE(STATUS "test_polycurve_conic_traits requires CORE and will not be executed") return() endif() @@ -965,7 +969,7 @@ endfunction() # polycurve bezier traits #---------------------------------------------------------------------# function(test_polycurve_bezier_traits) - if($ENV{CGAL_DISABLE_GMP}) + if(CGAL_DISABLE_GMP) MESSAGE(STATUS "test_polycurve_bezier_traits requires CORE and will not be executed") return() endif() @@ -1074,7 +1078,7 @@ endfunction() # conic traits #---------------------------------------------------------------------# function(test_conic_traits) - if($ENV{CGAL_DISABLE_GMP}) + if(CGAL_DISABLE_GMP) MESSAGE(STATUS "test_conic_traits requires CORE and will not be executed") return() endif() @@ -1205,7 +1209,7 @@ endfunction() # bezier traits #---------------------------------------------------------------------# function(test_bezier_traits) - if($ENV{CGAL_DISABLE_GMP}) + if(CGAL_DISABLE_GMP) MESSAGE(STATUS "test_bezier_traits requires CORE and will not be executed") return() endif() @@ -1252,7 +1256,7 @@ endfunction() # rational arc traits #---------------------------------------------------------------------# function(test_rational_arc_traits) - if($ENV{CGAL_DISABLE_GMP}) + if(CGAL_DISABLE_GMP) MESSAGE(STATUS "test_rational_arc_traits requires CORE and will not be executed") return() endif() @@ -1277,7 +1281,10 @@ endfunction() #---------------------------------------------------------------------# function(test_algebraic_traits_gmp) #TODO: Adapt - + if(CGAL_DISABLE_GMP) + MESSAGE(STATUS "test_traits_algebraic_traits_gmp requires GMP and will not be executed") + return() + endif() set(nt ${CGAL_GMPZ_NT}) set(kernel ${UNIVARIATE_ALGEBRAIC_KERNEL}) set(geom_traits ${ALGEBRAIC_GEOM_TRAITS}) @@ -1316,7 +1323,7 @@ endfunction() #---------------------------------------------------------------------# function(test_algebraic_traits_core) #TODO: Adapt - if($ENV{CGAL_DISABLE_GMP}) + if(CGAL_DISABLE_GMP) MESSAGE(STATUS "test_algebraic_traits_core requires CORE and will not be executed") return() endif() diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake index 33cd53adeea..78c93619658 100755 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake @@ -1751,7 +1751,7 @@ compile_and_run test_io compile_and_run test_sgm -# if any error occured then append the full error description file to error file +# if any error occurred then append the full error description file to error file if [ -f $FULL_ERROR_DESCRIPTION_FILE ] ; then echo "******************** appending all error outputs ********************" >> $ERRORFILE diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp index e8075d66b95..56ff34ec53b 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp @@ -1,7 +1,7 @@ // Constructing an arrangement of polycurves. -#include +#include #ifndef CGAL_USE_CORE #include int main() diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_batched_point_location.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_batched_point_location.cpp index 2983da5a445..ad3e9e86dae 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_batched_point_location.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_batched_point_location.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include "test_configuration.h" diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp index c19425ba93e..4dec1318a6d 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp @@ -1,4 +1,4 @@ -#include +#include #ifndef CGAL_USE_CORE #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp index 84a86f283e0..1cf5a0e06f8 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp @@ -1,7 +1,7 @@ // Constructing an arrangement of polycurves. -#include +#include #ifndef CGAL_USE_CORE #include int main () diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp index 086e6e834a2..eab53350ab6 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp @@ -1,6 +1,6 @@ // Testing the do_equal function -#include +#include #ifndef CGAL_USE_CORE #include int main() diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.cpp index 94bdea197ff..00d885fdb7f 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.cpp @@ -5,7 +5,7 @@ #include "test_configuration.h" -#include +#include #if ((TEST_GEOM_TRAITS == CORE_CONIC_GEOM_TRAITS) || \ (TEST_GEOM_TRAITS == BEZIER_GEOM_TRAITS) || \ diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_overlay.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_overlay.cpp index 2274bbbf97a..6077f7efa35 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_overlay.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_overlay.cpp @@ -32,7 +32,7 @@ #include "test_configuration.h" -#include +#include #if ((TEST_GEOM_TRAITS == CORE_CONIC_GEOM_TRAITS) || \ (TEST_GEOM_TRAITS == BEZIER_GEOM_TRAITS) || \ diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location.cpp index cba42a891eb..4bb7a0e0b1d 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location.cpp @@ -2,7 +2,7 @@ #include "test_configuration.h" -#include +#include #if ((TEST_GEOM_TRAITS == CORE_CONIC_GEOM_TRAITS) || \ (TEST_GEOM_TRAITS == BEZIER_GEOM_TRAITS) || \ diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location_dynamic.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location_dynamic.cpp index eb15bcb32cf..4ecd96f4ddb 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location_dynamic.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location_dynamic.cpp @@ -2,7 +2,7 @@ #include "test_configuration.h" -#include +#include #if ((TEST_GEOM_TRAITS == CORE_CONIC_GEOM_TRAITS) || \ (TEST_GEOM_TRAITS == BEZIER_GEOM_TRAITS) || \ diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_rational_function_traits_2.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_rational_function_traits_2.cpp index 407d5e27016..f695982c1fb 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_rational_function_traits_2.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_rational_function_traits_2.cpp @@ -1,6 +1,6 @@ #include -#include +#include #if !defined(CGAL_USE_CORE) int main() diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp index 3da4a0d70ec..167a5be79e6 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp @@ -1,4 +1,4 @@ -#include + #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits.cpp index 3d876196d87..9b7958c5700 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits.cpp @@ -1,4 +1,4 @@ -#include + #include "test_configuration.h" #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_adaptor.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_adaptor.cpp index 8f0e88de89b..36127580b9d 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_adaptor.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_adaptor.cpp @@ -1,4 +1,4 @@ -#include + #include "test_configuration.h" #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp index 94595c96a80..4c3f2391be1 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_direct_insertion.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_direct_insertion.cpp index dd3d5db1936..818fc4718a7 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_direct_insertion.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_direct_insertion.cpp @@ -17,7 +17,7 @@ * Thus, a special treatment is required. */ -#include +#include #ifndef CGAL_USE_CORE #include @@ -107,7 +107,7 @@ int main() } } - // If a failure has already occured, abort. + // If a failure has already occurred, abort. if (result < 0) return result; std::cout << std::endl; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_insertion.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_insertion.cpp index 227b37602b3..c8e88eb0b27 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_insertion.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_unbounded_rational_insertion.cpp @@ -17,7 +17,7 @@ * Thus, a special treatment is required. */ -#include +#include #ifndef CGAL_USE_CORE #include @@ -106,7 +106,7 @@ int main() } } - // If a failure has already occured, abort. + // If a failure has already occurred, abort. if (result < 0) return result; std::cout << std::endl; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vertical_decomposition.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vertical_decomposition.cpp index da447b2b993..3eae7596c98 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vertical_decomposition.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vertical_decomposition.cpp @@ -1,7 +1,6 @@ #include #include -#include #include "test_configuration.h" diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index fb6036dc89e..8cf3c7884eb 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -463,64 +463,57 @@ struct Face_filtered_graph /// returns `true` if around any vertex of a selected face, /// there is at most one connected set of selected faces. - bool is_selection_valid() + bool is_selection_valid() const { - for(vertex_descriptor vd : vertices(*this) ) + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + // Non-manifoldness can appear either: + // - if 'pm' is pinched at a vertex. While traversing the incoming halfedges at this vertex, + // we will meet strictly more than one border halfedge. + // - if there are multiple umbrellas around a vertex. In that case, we will find a non-visited + // halfedge that has for target a vertex that is already visited. + + boost::unordered_set vertices_visited; + boost::unordered_set halfedges_handled; + + for(halfedge_descriptor hd : halfedges(*this)) { - face_descriptor first_selected = boost::graph_traits::null_face(); - bool first_unselected_found(false), - second_unselected_found(false); + CGAL_assertion(is_in_cc(hd)); - //find an unselected face, then find the first selected face. - //Find another unselected face, the next selected face must be the first; - //else this is not valid. - halfedge_descriptor hd = halfedge(vd, _graph); - face_descriptor first_tested = boost::graph_traits::null_face(); - while(1) //will break if valid, return false if not valid + if(!halfedges_handled.insert(hd).second) // already treated this halfedge + continue; + + vertex_descriptor vd = target(hd, *this); + CGAL_assertion(is_in_cc(vd)); + + // Check if we have already met this vertex before (necessarily in a different umbrella + // since we have never treated the halfedge 'hd') + if(!vertices_visited.insert(vd).second) + return false; + + std::size_t border_halfedge_counter = 0; + + // Can't simply call halfedges_around_target(vd, *this) because 'halfedge(vd)' is not necessarily 'hd' + halfedge_descriptor ihd = hd; + do { - face_descriptor fd = face(hd, _graph); + halfedges_handled.insert(ihd); + if(is_border(ihd, *this)) + ++border_halfedge_counter; - if(first_tested == boost::graph_traits::null_face()) - first_tested = fd; - else if(fd == first_tested ) + do { - //if there is no unselected face, break - if(selected_faces[get(fimap, fd)] && !first_unselected_found) - break; - //if there is no selected face, break - else if(!selected_faces[get(fimap, fd)] && - first_selected == boost::graph_traits::null_face()) - break; + ihd = prev(opposite(ihd, _graph), _graph); } - - if(fd != boost::graph_traits::null_face()) - { - if(selected_faces[get(fimap, fd)]) - { - if(first_unselected_found && - first_selected == boost::graph_traits::null_face()) - { - first_selected = fd; - } - else if(second_unselected_found) - { - if(fd == first_selected) - break; - else - return false; - } - } - else - { - if(first_selected == boost::graph_traits::null_face()) - first_unselected_found = true; - else - second_unselected_found = true; - } - } - hd = next(opposite(hd, _graph), _graph); + while(!is_in_cc(ihd) && ihd != hd); } + while(ihd != hd); + + if(border_halfedge_counter > 1) + return false; } + return true; } diff --git a/BGL/include/CGAL/boost/graph/helpers.h b/BGL/include/CGAL/boost/graph/helpers.h index 85a468bf33a..065c37448a3 100644 --- a/BGL/include/CGAL/boost/graph/helpers.h +++ b/BGL/include/CGAL/boost/graph/helpers.h @@ -358,152 +358,174 @@ bool is_valid_face_descriptor( typename boost::graph_traits::face_des /*! \ingroup PkgBGLHelperFct * \brief checks the integrity of `g`. - * + * * `g` is valid if it follows the rules of the `HalfedgeListGraph` concept, * and all of its associations are reciprocal. - * For example, `prev(next(h, g), g)` must be `h`, + * For example, `prev(next(h, g), g)` must be `h`, * and `next(prev(h, g), g)` must be `h`. * \param g the `Graph` to test. * \param verb : if `true`, the details of the check will be written in the standard output. * * \tparam `Graph` a model of `HalfedgeListGraph` * \return `true` if `g` is valid, `false` otherwise. - * + * */ template bool is_valid_halfedge_graph(const Graph& g, bool verb = false) { - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::vertices_size_type vertex_size_type; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::halfedges_size_type halfedges_size_type; + Verbose_ostream verr(verb); std::size_t num_v(std::distance(boost::begin(vertices(g)), boost::end(vertices(g)))), - num_h(std::distance(boost::begin(halfedges(g)), boost::end(halfedges(g)))); - bool valid = ( 1 != (num_h& 1)); - if ( ! valid) + num_e(std::distance(boost::begin(edges(g)), boost::end(edges(g)))), + num_h(std::distance(boost::begin(halfedges(g)), boost::end(halfedges(g)))); + + bool valid = (1 != (num_h&1) && (2*num_e == num_h)); + if(!valid) verr << "number of halfedges is odd." << std::endl; // All halfedges. - - halfedges_size_type n = 0; - for(halfedge_descriptor begin : halfedges(g)) { + halfedges_size_type n = 0; + for(halfedge_descriptor begin : halfedges(g)) + { if(!valid) break; - verr << "halfedge " << n << std::endl; + // Pointer integrity. - valid = valid && ( next(begin, g) != boost::graph_traits::null_halfedge()); - valid = valid && ( opposite(begin, g) != boost::graph_traits::null_halfedge()); - if ( ! valid) { - verr << " pointer integrity corrupted (ptr==0)." - << std::endl; + valid = valid && (next(begin, g) != boost::graph_traits::null_halfedge()); + valid = valid && (opposite(begin, g) != boost::graph_traits::null_halfedge()); + if(!valid) + { + verr << "halfedge " << n << " next / opposite halfedges are null." << std::endl; break; } - //edge integrity - valid = valid && ( halfedge(edge(begin, g), g) == begin); + + // edge integrity + valid = valid && (halfedge(edge(begin, g), g) == begin); + // opposite integrity. - valid = valid && ( opposite(begin, g) != begin); - valid = valid && ( opposite(opposite(begin, g), g) == begin); - if ( ! valid) { - verr << " opposite pointer integrity corrupted." - << std::endl; + valid = valid && (opposite(begin, g) != begin); + valid = valid && (opposite(opposite(begin, g), g) == begin); + if(!valid) + { + verr << "halfedge " << n << " invalid halfedge opposite()." << std::endl; break; } + // previous integrity. - valid = valid && ( prev(next(begin, g), g) == begin); - valid = valid && ( next(prev(begin, g), g) == begin); - if ( ! valid) { - verr << " previous pointer integrity corrupted." - << std::endl; + valid = valid && (prev(next(begin, g), g) == begin); + valid = valid && (next(prev(begin, g), g) == begin); + if(!valid) + { + verr << "halfedge " << n << " prev(next(hd)) != hd OR next(prev(hd)) != hd" << std::endl; break; } + // vertex integrity. - valid = valid && ( target(begin, g) != boost::graph_traits::null_vertex()); - if ( ! valid) { - verr << " vertex pointer integrity corrupted." - << std::endl; + valid = valid && (target(begin, g) != boost::graph_traits::null_vertex()); + if(!valid) + { + verr << "halfedge " << n << " target of halfedge is the null vertex." << std::endl; break; } - valid = valid && ( target(begin, g) == - target(opposite(next(begin, g), g), g)); - if ( ! valid) { - verr << " vertex pointer integrity2 corrupted." - << std::endl; + + valid = valid && (target(begin, g) == target(opposite(next(begin, g), g), g)); + if(!valid) + { + verr << "halfedge " << n << " target(hd) != source(next(hd))." << std::endl; break; } ++n; } - if ( valid && n != num_h) + + if(valid && n != num_h) verr << "counting halfedges failed." << std::endl; + // All vertices. vertex_size_type v = 0; n = 0; - for(vertex_descriptor vbegin : vertices(g)){ + for(vertex_descriptor vbegin : vertices(g)) + { if(!valid) break; - verr << "vertex " << v << std::endl; + // Pointer integrity. - if ( halfedge(vbegin, g) != boost::graph_traits::null_halfedge()) - valid = valid && ( - target( halfedge(vbegin, g), g) == vbegin); + if(halfedge(vbegin, g) != boost::graph_traits::null_halfedge()) + valid = valid && (target(halfedge(vbegin, g), g) == vbegin); else valid = false; - if ( ! valid) { - verr << " halfedge pointer in vertex corrupted." - << std::endl; + + if(!valid) + { + verr << "vertex " << v << " halfedge incident to vertex is the null halfedge." << std::endl; break; } + // cycle-around-vertex test. halfedge_descriptor h = halfedge(vbegin, g); - if ( h != boost::graph_traits::null_halfedge()) { + if(h != boost::graph_traits::null_halfedge()) + { halfedge_descriptor ge = h; - do { - verr << " halfedge " << n << std::endl; + do + { ++n; h = opposite(next(h, g), g); - valid = valid && ( n <= num_h && n!=0); - if ( ! valid) - verr << " too many halfedges around vertices." - << std::endl; - } while ( valid && (h != ge)); + valid = valid && (n <= num_h && n!=0); + if(!valid) + { + verr << "vertex " << v << " too many halfedges around vertex." << std::endl; + break; + } + } + while (valid && (h != ge)); } + + if(!valid) + break; + ++v; } - if ( valid && v != num_v) - verr << "counting vertices failed." << std::endl; - if ( valid && ( n != num_h)) - verr << "counting halfedges via vertices failed." << std::endl; - valid = valid && ( v == num_v); + if(valid && v != num_v) + verr << "counting vertices failed." << std::endl; + + if(valid && (n != num_h)) + verr << "counting halfedges via vertices failed." << std::endl; + + valid = valid && (v == num_v); // All halfedges. n = 0; - for(halfedge_descriptor i : halfedges(g)){ - verr << "halfedge " << n << std::endl; - // At least triangular facets and distinct geometry. - valid = valid && ( next(i, g) != i); - valid = valid && ( target(i, g) != target(opposite(i, g), g)); - if ( ! valid) { - verr << " pointer validity corrupted." - << std::endl; + for(halfedge_descriptor i : halfedges(g)) + { + // At least triangular facets and distinct geometry. + valid = valid && (next(i, g) != i); + valid = valid && (target(i, g) != target(opposite(i, g), g)); + if(!valid) + { + verr << "halfedge " << n << " pointer validity corrupted." << std::endl; break; - } - ++n; -} -valid = valid && (n == num_h); -if ( n != num_h) - verr << "counting halfedges failed." << std::endl; + } -verr << "structure is " - << ( valid ? "valid." : "NOT VALID.") << std::endl; -return valid; + ++n; + } + + valid = valid && (n == num_h); + if(n != num_h) + verr << "counting halfedges failed." << std::endl; + verr << "Halfedge Graph Structure is " << (valid ? "valid." : "NOT VALID.") << std::endl; + + return valid; } /*! \ingroup PkgBGLHelperFct * \brief checks the integrity of `g`. - * + * * `g` is valid if it is a valid `HalfedgeListGraph`, if it follows the rules * of the `FaceListGraph` concept, and all of its associations are reciprocal. * For example, `face(halfedge(f,g),g)` must be `f`. @@ -513,134 +535,159 @@ return valid; * * \tparam `Graph` a model of `FaceListGraph` * \return `true` if `g` is valid, `false` otherwise. - * - * \see `is_valid_halfedge_graph()` + * + * \see `is_valid_halfedge_graph()` */ template bool is_valid_face_graph(const Graph& g, bool verb = false) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::halfedges_size_type halfedges_size_type; typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename boost::graph_traits::faces_size_type faces_size_type; - typedef typename boost::graph_traits::halfedges_size_type halfedges_size_type; + std::size_t num_f(std::distance(boost::begin(faces(g)), boost::end(faces(g)))), - num_h(std::distance(boost::begin(halfedges(g)), boost::end(halfedges(g)))); - + num_h(std::distance(boost::begin(halfedges(g)), boost::end(halfedges(g)))); + //is valid halfedge_graph ? - bool valid=is_valid_halfedge_graph(g, verb); - if ( ! valid) { + bool valid = is_valid_halfedge_graph(g, verb); + if(!valid) return false; - } + Verbose_ostream verr(verb); - + // All faces. faces_size_type f = 0; std::size_t n = 0; halfedges_size_type nb = 0; - for(face_descriptor fbegin : faces(g)){ + + for(face_descriptor fbegin : faces(g)) + { if(!valid) break; - verr << "face " << f << std::endl; + // Pointer integrity. - if ( halfedge(fbegin, g) != boost::graph_traits::null_halfedge()) - valid = valid && ( - face(halfedge(fbegin, g), g) == fbegin); + if(halfedge(fbegin, g) != boost::graph_traits::null_halfedge()) + valid = valid && (face(halfedge(fbegin, g), g) == fbegin); else valid = false; - if ( ! valid) { - verr << " halfedge pointer in face corrupted." << std::endl; + + if(! valid) + { + verr << "face " << f << " halfedge incident to face is the null halfedge." << std::endl; break; } + // cycle-around-face test. halfedge_descriptor h = halfedge( fbegin, g); - if (h != boost::graph_traits::null_halfedge()) { + if(h != boost::graph_traits::null_halfedge()) + { halfedge_descriptor ge = h; - do { - verr << " halfedge " << n << std::endl; + do + { ++n; h = next(h, g); - valid = valid && ( n <= num_h && n!=0); - if ( ! valid) - verr << " too many halfedges around faces." - << std::endl; - } while ( valid && (h != ge)); + valid = valid && (n <= num_h && n != 0); + if(!valid) + { + verr << "face " << f << " too many halfedges around face." << std::endl; + break; + } + } + while(valid && (h != ge)); } + + if(! valid) + break; + ++f; } - if ( valid && f != num_f) + + if(valid && f != num_f) verr << "counting faces failed." << std::endl; - - for(halfedge_descriptor i : halfedges(g)){ + + std::size_t hn = 0; + for(halfedge_descriptor i : halfedges(g)) + { + ++hn; + //counting borders - if ( is_border(i, g)) + if(is_border(i, g)) ++nb; + // face integrity. - - valid = valid && ( face(i, g) == face(next(i, g), g)); - if ( ! valid) { - verr << " face pointer integrity2 corrupted." - << std::endl; + valid = valid && (face(i, g) == face(next(i, g), g)); + if(!valid) + { + verr << "halfedge " << hn << " face(hd) != face(next(hd))." << std::endl; break; } } + verr << "sum border halfedges (2*nb) = " << 2 * nb << std::endl; - if ( valid && n + nb != num_h) + if(valid && n + nb != num_h) verr << "counting halfedges via faces failed." << std::endl; - valid = valid && ( f == num_f); - valid = valid && ( n + nb == num_h); - verr << "is_valid(): structure is " << ( valid ? "valid." : - "NOT VALID.") << std::endl; + + valid = valid && (f == num_f); + valid = valid && (n + nb == num_h); + verr << "Face Graph Structure is " << (valid ? "valid." : "NOT VALID.") << std::endl; + return valid; } + /*! \ingroup PkgBGLHelperFct * \brief checks the integrity of `g`. - * + * * `g` is valid if it is a valid `FaceListGraph` and it has distinct faces on each side of an edge. * calls `is_valid_face_graph()`. - * + * * \param g the `Mesh` to test. * \param verb : if `true`, the details of the check will be written in the standard output. * - * \tparam Mesh a model of `FaceListGraph` and `HalfedgeListGraph`, and follows + * \tparam Mesh a model of `FaceListGraph` and `HalfedgeListGraph`, and follows * the definition of a \ref PMPDef "PolygonMesh" * \return `true` if `g` is valid, `false` otherwise. - * + * * \see `is_valid_face_graph()` * \see `is_valid_halfedge_graph()` - * + * */ template bool is_valid_polygon_mesh(const Mesh& g, bool verb = false) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - Verbose_ostream verr(verb); - bool valid=is_valid_face_graph(g, verb); - //test for 2-manifoldness - // Distinct facets on each side of an halfedge. - for(halfedge_descriptor i : halfedges(g)){ - valid = valid && (face(i, g) != face(opposite(i, g), g)); - if ( ! valid) { - verr << " both incident facets are equal." << std::endl; - break; - } - valid = valid && ( next(next(i, g), g) != i); - valid = valid && ( target(i, g) != target(next(i, g), g)); - valid = valid && ( target(i, g) != target(next(next(i, g), g), g)); - if ( ! valid) { - verr << " incident facet is not at least a triangle." - << std::endl; - break; - } - if ( ! valid) { - verr << " incident facet is not at least a triangle." - << std::endl; - break; - } - } - return valid; -} + Verbose_ostream verr(verb); + bool valid = is_valid_face_graph(g, verb); + if(!valid) + return false; + + // test for 2-manifoldness + // Distinct facets on each side of an halfedge. + for(halfedge_descriptor i : halfedges(g)) + { + valid = valid && (face(i, g) != face(opposite(i, g), g)); + if(!valid) + { + verr << " both incident facets are equal." << std::endl; + break; + } + + valid = valid && (next(next(i, g), g) != i); + valid = valid && (target(i, g) != target(next(i, g), g)); + valid = valid && (target(i, g) != target(next(next(i, g), g), g)); + if(!valid) + { + verr << " incident facet is not at least a triangle." << std::endl; + break; + } + } + + verr << "Polygon Mesh Structure is " << (valid ? "valid." : "NOT VALID.") << std::endl; + + return valid; +} /*! \ingroup PkgBGLHelperFct diff --git a/BGL/include/CGAL/boost/graph/parameters_interface.h b/BGL/include/CGAL/boost/graph/parameters_interface.h index bd4f15d8e23..e65ca57729a 100644 --- a/BGL/include/CGAL/boost/graph/parameters_interface.h +++ b/BGL/include/CGAL/boost/graph/parameters_interface.h @@ -91,6 +91,7 @@ CGAL_add_named_parameter(get_placement_policy_t, get_placement_policy, get_place CGAL_add_named_parameter(face_normal_t, face_normal, face_normal_map) CGAL_add_named_parameter(random_seed_t, random_seed, random_seed) CGAL_add_named_parameter(do_project_t, do_project, do_project) +CGAL_add_named_parameter(tolerance_map_t, tolerance_map, tolerance_map) //internal CGAL_add_named_parameter(weight_calculator_t, weight_calculator, weight_calculator) diff --git a/BGL/include/CGAL/boost/graph/selection.h b/BGL/include/CGAL/boost/graph/selection.h index 7768d62b792..720516f283c 100644 --- a/BGL/include/CGAL/boost/graph/selection.h +++ b/BGL/include/CGAL/boost/graph/selection.h @@ -85,7 +85,7 @@ Each new face added in the selection is added exactly once in `out`. \param fg the graph containing the selected faces. \param k the number of times the expansion procedure is iteratively applied. \param is_selected indicates if a face is part of the selection. It is updated by the function - to accomodate new faces added to the selection. + to accommodate new faces added to the selection. \param out new faces added to the selection are added exactly once in `out`. */ template @@ -154,7 +154,7 @@ Each face removed from the selection is added exactly once in `out`. \param fg the graph containing the selected faces. \param k the number of times the reduction procedure is iteratively applied. \param is_selected indicates if a face is part of the selection. It is updated by the function - to accomodate faces removed from the selection. + to accommodate faces removed from the selection. \param out faces removed from the selection are added exactly once in `out`. */ template @@ -271,7 +271,7 @@ Each new edge added in the selection is added exactly once in `out`. \param fg the graph containing the selected edges. \param k the number of times the expansion procedure is iteratively applied. \param is_selected indicates if an edge is part of the selection. It is updated by the function - to accomodate new edges added to the selection. + to accommodate new edges added to the selection. \param out new edges added to the selection are added exactly once in `out`. */ template @@ -337,7 +337,7 @@ Each edge removed from the selection is added exactly once in `out`. \param fg the graph containing the selected edges. \param k the number of times the reduction procedure is iteratively applied. \param is_selected indicates if an edge is part of the selection. It is updated by the function - to accomodate edges removed from the selection. + to accommodate edges removed from the selection. \param out edges removed from the selection are added exactly once in `out`. */ template @@ -424,7 +424,7 @@ Each new vertex added in the selection is added exactly once in `out`. \param fg the graph containing the selected vertices. \param k the number of times the expansion procedure is iteratively applied. \param is_selected indicates if a vertex is part of the selection. It is updated by the function - to accomodate new vertices added to the selection. + to accommodate new vertices added to the selection. \param out new vertices added to the selection are added exactly once in `out`. */ template @@ -478,7 +478,7 @@ Each vertex removed from the selection is added exactly once in `out`. \param fg the graph containing the selected vertices. \param k the number of times the reduction procedure is iteratively applied. \param is_selected indicates if a vertex is part of the selection. It is updated by the function - to accomodate vertices removed from the selection. + to accommodate vertices removed from the selection. \param out vertices removed from the selection are added exactly once in `out`. */ template diff --git a/BGL/include/CGAL/boost/parameter.h b/BGL/include/CGAL/boost/parameter.h index 6549eba09d9..785a8ab97a5 100644 --- a/BGL/include/CGAL/boost/parameter.h +++ b/BGL/include/CGAL/boost/parameter.h @@ -111,6 +111,7 @@ BOOST_PARAMETER_NAME( (dump_after_perturb_prefix, tag ) dump_after_perturb_prefi BOOST_PARAMETER_NAME( (dump_after_exude_prefix, tag ) dump_after_exude_prefix_) BOOST_PARAMETER_NAME( (number_of_initial_points, tag) number_of_initial_points_) BOOST_PARAMETER_NAME( (maximal_number_of_vertices, tag ) maximal_number_of_vertices_) +BOOST_PARAMETER_NAME( (nonlinear_growth_of_balls, tag ) nonlinear_growth_of_balls_) BOOST_PARAMETER_NAME( (pointer_to_error_code, tag ) pointer_to_error_code_) BOOST_PARAMETER_NAME( (pointer_to_stop_atomic_boolean, tag ) pointer_to_stop_atomic_boolean_) diff --git a/BGL/test/BGL/data/7_faces_traingle.off b/BGL/test/BGL/data/7_faces_traingle.off deleted file mode 100644 index b2b64d78e64..00000000000 --- a/BGL/test/BGL/data/7_faces_traingle.off +++ /dev/null @@ -1,17 +0,0 @@ -OFF -6 7 0 - -1 1 0 -3 1 0 -2 2 0 -2 3 0 -0 0 0 -4 0 0 -3 0 1 2 -3 0 2 3 -3 1 3 2 -3 0 4 1 -3 1 4 5 -3 1 5 3 -3 0 3 4 - diff --git a/BGL/test/BGL/test_Face_filtered_graph.cpp b/BGL/test/BGL/test_Face_filtered_graph.cpp index 9e234d411f3..a1e20169345 100644 --- a/BGL/test/BGL/test_Face_filtered_graph.cpp +++ b/BGL/test/BGL/test_Face_filtered_graph.cpp @@ -268,17 +268,20 @@ void test_read(const Graph& g) typedef typename boost::graph_traits::face_descriptor g_face_descriptor; typedef CGAL::Face_filtered_graph Adapter; CGAL_GRAPH_TRAITS_MEMBERS(Adapter); + std::map map; CGAL::Polygon_mesh_processing::connected_components(g, boost::make_assoc_property_map(map), CGAL::Polygon_mesh_processing::parameters::all_default()); Adapter fg(g, 0, boost::make_assoc_property_map(map)); + assert(fg.is_selection_valid()); assert(CGAL::is_valid_polygon_mesh(fg)); } template void -test(const std::vector& graphs) +test_graph_range(const std::vector& graphs) { - for(Graph p : graphs){ + for(Graph p : graphs) + { test_read(p); test_vertex_iterators(p); test_out_edges(p); @@ -392,14 +395,75 @@ void test_mesh(Adapter fga) CGAL::copy_face_graph(fga, copy); } - -int -main() +template +void merge_vertices(typename boost::graph_traits::vertex_descriptor v_keep, + typename boost::graph_traits::vertex_descriptor v_rm, + std::vector::face_descriptor>& incident_faces, + PolygonMesh& mesh) { - test(sm_data()); -#ifdef CGAL_USE_OPENMESH - test(omesh_data()); + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + halfedge_descriptor oh = halfedge(v_keep, mesh), done = oh; + do + { + incident_faces.push_back(face(oh, mesh)); + oh = opposite(next(oh, mesh), mesh); + } + while(oh != done); + + halfedge_descriptor h = halfedge(v_rm, mesh); + halfedge_descriptor start = h; + do + { + set_target(h, v_keep, mesh); + incident_faces.push_back(face(h, mesh)); + h = opposite(next(h, mesh), mesh); + } + while(h != start); + + remove_vertex(v_rm, mesh); +} + +void test_invalid_selections() +{ + // this creates a non-manifold (pinched) vertex + SM mesh; + read_a_mesh(mesh, "data/7_faces_triangle.off"); + + std::vector face_range; + face_range.push_back(SM::Face_index(1)); + face_range.push_back(SM::Face_index(2)); + face_range.push_back(SM::Face_index(3)); + + CGAL::Face_filtered_graph bad_fg(mesh, face_range); + assert(!bad_fg.is_selection_valid()); + + // this creates a non-manifold vertex (multiple umbrellas) + clear(mesh); + read_a_mesh(mesh, "data/genus3.off"); + assert(is_valid_polygon_mesh(mesh)); + + face_range.clear(); + merge_vertices(SM::Vertex_index(1337), SM::Vertex_index(87), face_range, mesh); + + CGAL::Face_filtered_graph bad_fg_2(mesh, face_range); + assert(!bad_fg_2.is_selection_valid()); +} + +int main() +{ + test_graph_range(poly_data()); + +#if defined(CGAL_USE_SURFACE_MESH) + test_graph_range(sm_data()); #endif + +#ifdef CGAL_USE_OPENMESH + test_graph_range(omesh_data()); +#endif + + test_invalid_selections(); + //Make a tetrahedron and test the adapter for a patch that only contains 2 faces typedef CGAL::Face_filtered_graph SM_Adapter; typedef SM::Property_map::face_descriptor , std::size_t> SM_FCCMap; diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt index 9ec647a34eb..f68af835919 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt @@ -10,7 +10,7 @@ namespace CGAL { \section gbc_introduction Introduction -The package 2D Generalized Barycentric Coordinates offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbour coordinates from the package \ref PkgInterpolation2 "2D and Surface Function Interpolation". +The package 2D Generalized Barycentric Coordinates offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbor coordinates from the package \ref PkgInterpolation2 "2D and Surface Function Interpolation". In particular, the package includes an implementation of \ref wp_example "Wachspress", \ref mv_example "mean value", and \ref dh_example "discrete harmonic" coordinates and provides some extra functions to compute barycentric coordinates with respect to segments (\ref seg_example "segment coordinates") and triangles (\ref tri_example "triangle coordinates"). The section \ref gbc_theory gives a short introduction to the topic of barycentric coordinates. @@ -33,7 +33,7 @@ The output of the computation is a set of coordinate values at the current query \section gbc_examples Examples \subsection seg_example Segment Coordinates -This is a simple example to show the use of the global function \ref seg_coord_global "CGAL::Barycentric_coordinates::compute_segment_coordinates_2()". We compute coordinates at three green points along the segment \f$[v_0, v_1]\f$ and at two blue points outside this segment but along its supporting line. We use the exact kernel and return coordinates as an array of two values. Again, the symmetry of the query points helps us to recognize errors that may have occured during the computation. +This is a simple example to show the use of the global function \ref seg_coord_global "CGAL::Barycentric_coordinates::compute_segment_coordinates_2()". We compute coordinates at three green points along the segment \f$[v_0, v_1]\f$ and at two blue points outside this segment but along its supporting line. We use the exact kernel and return coordinates as an array of two values. Again, the symmetry of the query points helps us to recognize errors that may have occurred during the computation. \anchor seg_coord_example \cgalFigureBegin{seg__example,segment_coordinates_example.png} @@ -79,7 +79,7 @@ Example's point pattern. \subsection height_inter_example Height Interpolation for Terrain Modeling -This is an advanced example that shows how to use generalized barycentric coordinates for height interpolation with applications to terrain modelling. It also shows how to use a non-default traits class with our package instead of a `Kernel` traits class. Suppose we know the boundary of three-dimensional piece of terrain that can be represented as a polygon with several three-dimensional vertices, where the third dimension gives the corresponding height. The task is to propagate the height from the known sample points on the boundary to the polygon's interior. This gives an approximate estimation of the terrain's surface in this region. +This is an advanced example that shows how to use generalized barycentric coordinates for height interpolation with applications to terrain modeling. It also shows how to use a non-default traits class with our package instead of a `Kernel` traits class. Suppose we know the boundary of three-dimensional piece of terrain that can be represented as a polygon with several three-dimensional vertices, where the third dimension gives the corresponding height. The task is to propagate the height from the known sample points on the boundary to the polygon's interior. This gives an approximate estimation of the terrain's surface in this region. \cgalFigureBegin{terrain__example,terrain.png} A 2D polygon with 50 vertices representing a piece of terrain with convex and concave parts. The height is not shown. @@ -92,7 +92,7 @@ In this example we project a three-dimensional polygon orthogonally onto the two As a result we get a smooth function inside the polygon that approximates the underlying terrain's surface. \cgalFigureBegin{terrain__inter__example,terrain_interpolated.png} -The interpolated data. The colour bar represents the corresponding height. +The interpolated data. The color bar represents the corresponding height. \cgalFigureEnd \section gbc_degeneracies Degeneracies and Special Cases @@ -201,7 +201,7 @@ are also normalized. Note that they are unstable if a query point is closer than \section gbc_performance Performance -Apart from the most important requirement on barycentric coordinates to be as precise as possible, it is very important for them to be as fast as possible to evaluate. These coordinates are used in many applications where they must be computed for millions of points and, thus, the real time usage of coordinates is crucial. When writing the code, we tried to fulfil this important requirement, and in this section we present a few results about the computation times of the implemented coordinates. +Apart from the most important requirement on barycentric coordinates to be as precise as possible, it is very important for them to be as fast as possible to evaluate. These coordinates are used in many applications where they must be computed for millions of points and, thus, the real time usage of coordinates is crucial. When writing the code, we tried to fulfill this important requirement, and in this section we present a few results about the computation times of the implemented coordinates. The structure of the speed test that we ran for all functions consists of computing coordinate values (or weights) at >= 1 million strictly interior points with respect to some polygon (or triangle, or segment). At each iteration of the loop we create a query point, pass it to the function, and compute all the related coordinates. We run this loop 10 times in a row, and the time presented in the log-log scale plot at the end of the section is the arithmetic mean of all trials. @@ -244,16 +244,16 @@ Segment coordinates (blue) for all the segment points (green) with respect to th If we want to plot triangle coordinates, we follow a similar approach. We take \ref fig__tri__example "a triangle" \f$[v_0, v_1, v_2]\f$ in the plane and sample its interior and boundary with a number of points. Once we have this sampling, we plot one of the triangle coordinate functions (here with respect to the third vertex of the triangle) at all the defined sample points. Likewise, we can plot the coordinate function with respect to the first or second vertex. The resulting function is linear (shown in the figure below) that grows from zero along the first edge \f$[v_0, v_1]\f$ to one at the chosen vertex \f$v_2\f$. \cgalFigureBegin{tri__coord__interp,tri__coord__interp.png} -Triangle coordinates with respect to \f$v_2 = (1.0,\ 2.0)\f$. The colour bar indicates the range of values for the chosen coordinate. +Triangle coordinates with respect to \f$v_2 = (1.0,\ 2.0)\f$. The color bar indicates the range of values for the chosen coordinate. \cgalFigureEnd Since many applications require to work with more complex planar geometric shapes than segments and triangles, it seems natural to investigate a generalized version of triangle coordinates with respect to arbitrary polygons. The first attempt was taken in 1975 by E. L. Wachspress \cite cgal:bc:w-rfeb-75, and the resulting generalized barycentric coordinates are now called Wachspress coordinates \cite cgal:bc:mlbd-gbcip-02. \ref gbc_deg_wachspress_coordinates "These coordinates" are well-defined for arbitrary strictly convex polygons and have all the properties of triangle coordinates \cite cgal:bc:fhk-gcbcocp-06. Unfortunately, they are not well-defined for weakly convex and concave polygons. -Analogously to the previous cases, we want to plot the Wachspress coordinates and see how they look like. Let us choose a \ref wp_polygon "non-regular hexagon", slightly rotate it, and move one of its vertices towards the line through its two adjacent neighbours. We sample the interior and the boundary of this polygon as before and plot the coordinate function with respect to the vertex that we moved at all the sample points. We see that we get a smooth function, which is linear along all edges and grows from zero to one, as the colour bar indicates. +Analogously to the previous cases, we want to plot the Wachspress coordinates and see how they look like. Let us choose a \ref wp_polygon "non-regular hexagon", slightly rotate it, and move one of its vertices towards the line through its two adjacent neighbors. We sample the interior and the boundary of this polygon as before and plot the coordinate function with respect to the vertex that we moved at all the sample points. We see that we get a smooth function, which is linear along all edges and grows from zero to one, as the color bar indicates. \anchor wp_plot \cgalFigureBegin{wp__coord__interp,wp__coord__interp.png} -The Wachspress coordinate function with respect to the indicated vertex with values from zero to one as the colour bar indicates. +The Wachspress coordinate function with respect to the indicated vertex with values from zero to one as the color bar indicates. \cgalFigureEnd Another type of generalized barycentric coordinates goes back to Pinkall and Polthier in 1993 \cite cgal:pp-cdmsc-93 and Eck et al. in 1995 \cite cgal:bc:eddhls-maam-95 in the context of \ref PkgSurfaceMeshParameterization "triangle mesh parameterization". They are called discrete harmonic coordinates. \ref gbc_deg_discrete_harmonic_coordinates "These coordinates" are well-defined, similarly to Wachspress coordinates, for arbitrary strictly convex polygons and inherit all the properties of triangle coordinates apart from the positivity inside a polygon because they can take on negative values \ref gbc_deg_discrete_harmonic_coordinates "for some polygons". Another interesting property of these coordinate functions is that they coincide with Wachspress coordinates for any polygon whose vertices lie on a common circle. @@ -262,15 +262,15 @@ To plot discrete harmonic coordinates we take \ref wp_plot "the same polygon" as \anchor dh_plot \cgalFigureBegin{dh__coord__interp,dh__coord__interp.png} -The discrete harmonic coordinate function with respect to the indicated vertex with values from zero to one as the colour bar indicates. +The discrete harmonic coordinate function with respect to the indicated vertex with values from zero to one as the color bar indicates. \cgalFigureEnd The last type of generalized barycentric coordinates that we discuss are mean value coordinates \cite cgal:f-mvc-03 proposed by M. Floater in 2003. Based on the mean value theorem, \ref gbc_deg_mean_value_coordinates "these coordinates", unlike Wachspress and discrete harmonic coordinates, are well-defined for arbitrary simple polygons, inherit all the properties of triangle coordinates for any convex polygon, and lack only the positivity property for general concave polygons. Hormann and Floater prove in \cite cgal:bc:hf-mvcapp-06 that these coordinates are positive inside the kernel of a star-shaped polygon. They are also positive in the closure of any quadrilateral. Like discrete harmonic weights, mean value weights are often used in the context of \ref PkgSurfaceMeshParameterization "triangle mesh parameterization." -In order to show the particular behaviour of mean value coordinates with an application to concave polygons, we take \ref fig__mv__example "a star-shaped polygon" with ten vertices \f$[v_0, \dots, v_9]\f$, sample its interior and boundary, and plot the coordinate function with respect to the fourth vertex \f$v_3\f$. As the colour bar indicates, the obtained function grows from a slightly negative value to one at the chosen vertex. It is also smooth inside the polygon and linear along all edges. +In order to show the particular behaviour of mean value coordinates with an application to concave polygons, we take \ref fig__mv__example "a star-shaped polygon" with ten vertices \f$[v_0, \dots, v_9]\f$, sample its interior and boundary, and plot the coordinate function with respect to the fourth vertex \f$v_3\f$. As the color bar indicates, the obtained function grows from a slightly negative value to one at the chosen vertex. It is also smooth inside the polygon and linear along all edges. \cgalFigureBegin{mv__coord__interp,mv__coord__interp.png} -Mean value coordinates with respect to \f$v_3\f$. The colour bar indicates the range of values for the chosen coordinate function. +Mean value coordinates with respect to \f$v_3\f$. The color bar indicates the range of values for the chosen coordinate function. \cgalFigureEnd Interesting fact: all the coordinates discussed in this section and implemented in the package come from one and the same family of generalized barycentric coordinates named 3-point family of coordinates \cite cgal:bc:fhk-gcbcocp-06. diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h index af15ec92ac8..7c5c7229db9 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h @@ -336,8 +336,8 @@ private: // Following section 4.2 from [2] we denote P_j = r_j*r_{j+1} + dot_product(d_j, d_{j+1}). // Vector s_i from [1] corresponds to that one with the name d_i in [2]. for(int j = 0; j < n-1; ++j) - P[j] = (CGAL::max)(r[j]*r[j+1] + scalar_product_2(s[j], s[j+1]), FT(0)); - P[n-1] = (CGAL::max)(r[n-1]*r[0] + scalar_product_2(s[n-1], s[0]), FT(0)); + P[j] = CGAL::max(r[j]*r[j+1] + scalar_product_2(s[j], s[j+1]), 0); + P[n-1] = CGAL::max(r[n-1]*r[0] + scalar_product_2(s[n-1], s[0]), 0); // Compute mean value weights using the formula (16) from [2]. // Since the formula (16) always gives positive values, we have to add a proper sign to all the weight functions. diff --git a/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/CMakeLists.txt b/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/CMakeLists.txt index 2a05bfa5c19..142cc80dda3 100644 --- a/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/CMakeLists.txt +++ b/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/CMakeLists.txt @@ -15,11 +15,10 @@ set( QT_USE_QTMAIN TRUE ) find_package(Qt5 QUIET COMPONENTS Widgets Script Svg) -include_directories (BEFORE ${CMAKE_CURRENT_BINARY_DIR}) include_directories (BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include ) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND CGAL_Core_FOUND ) - +set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) qt5_wrap_ui( CDT_UI_FILES boolean_operations_2.ui ) @@ -27,10 +26,10 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND CGAL_Core_FOUND ) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/boolean_operations_2.qrc ) # use the Qt MOC preprocessor on classes that derives from QObject - qt5_generate_moc( "boolean_operations_2.cpp" "${CMAKE_CURRENT_BINARY_DIR}/boolean_operations_2.moc" ) + # The executable itself. - add_executable ( boolean_operations_2 ${CMAKE_CURRENT_SOURCE_DIR}/boolean_operations_2.cpp boolean_operations_2.moc ${CGAL_Qt5_MOC_FILES} ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ) + add_executable ( boolean_operations_2 ${CMAKE_CURRENT_SOURCE_DIR}/boolean_operations_2.cpp ${CGAL_Qt5_MOC_FILES} ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ) qt5_use_modules(boolean_operations_2 Widgets Script Svg) # Link with Qt libraries target_link_libraries( boolean_operations_2 ${QT_LIBRARIES} ) diff --git a/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/help/index.html b/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/help/index.html index 8f530e6a2fd..1d2af17bc30 100644 --- a/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/help/index.html +++ b/Boolean_set_operations_2/archive/demo/Boolean_set_operations_2_GraphicsView/help/index.html @@ -94,7 +94,7 @@ Close the current window

Press Ctrl+X combination keys or go to File menu and choose "Close". You may do it for any window other than the initial one, this operation will - close only the one you have choosen. If you do this for the initial parent + close only the one you have chosen. If you do this for the initial parent window, it will close the others too.

diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt index 7664fabfaa8..9e3884bed4b 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt @@ -21,7 +21,6 @@ namespace ArrDirectionalTraits {} \cgalPkgDependsOn{\ref PkgArrangementOnSurface2} \cgalPkgBib{cgal:fwzh-rbso2} \cgalPkgLicense{\ref licensesGPL "GPL"} -\cgalPkgDemo{Boolean operations,boolean_operations_2.zip} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_op.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_op.h index fbb71764dda..2d29616f8f7 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_op.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_op.h @@ -130,7 +130,7 @@ public: Edge_iterator itr = arr->edges_begin(); for(; itr != arr->edges_end(); ++itr) { - // take only relevant edges (which seperate between contained and + // take only relevant edges (which separate between contained and // non-contained faces. Halfedge_iterator he = itr; if(he->face()->contained() == he->twin()->face()->contained()) diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_on_surface_base_2.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_on_surface_base_2.h index 24435cb3c3b..a603269074d 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_on_surface_base_2.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_on_surface_base_2.h @@ -51,7 +51,7 @@ \file Gps_on_surface_base_2.h \brief A class that allows Boolean set operations. This class is the base class for General_polygon_set_on_surface_2 and - recieves extra template parameter which allows different validation + receives extra template parameter which allows different validation policies. If you do not want validation then use the default validation policy. A different validation policy example can be found in General_polygon_set_on_surface_2. @@ -75,7 +75,7 @@ namespace Boolean_set_operation_2_internal //! General_polygon_set_on_surface_2 /*! This class is the base class for General_polygon_set_on_surface_2 and - recieves extra template parameter which allows different validation + receives extra template parameter which allows different validation policies. If you do not want validation then use the default validation policy. A different validation policy example can be found in General_polygon_set_on_surface_2. diff --git a/Boolean_set_operations_2/test/Boolean_set_operations_2/test_polygon_validation.cpp b/Boolean_set_operations_2/test/Boolean_set_operations_2/test_polygon_validation.cpp index 7af2ffb9625..c613c2884fc 100644 --- a/Boolean_set_operations_2/test/Boolean_set_operations_2/test_polygon_validation.cpp +++ b/Boolean_set_operations_2/test/Boolean_set_operations_2/test_polygon_validation.cpp @@ -2,7 +2,6 @@ * defined at Gps_polygon_validation.h */ -#include #include #include diff --git a/Bounding_volumes/doc/Bounding_volumes/Bounding_volumes.txt b/Bounding_volumes/doc/Bounding_volumes/Bounding_volumes.txt index e187c78077f..5cb61190869 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Bounding_volumes.txt +++ b/Bounding_volumes/doc/Bounding_volumes/Bounding_volumes.txt @@ -70,7 +70,7 @@ allows to increase it easily. Bounding volumes also define geometric "center points" of objects. For example, if two objects are to be matched (approximately), one -approch is to first apply the translation that maps the centers of +approach is to first apply the translation that maps the centers of their smallest enclosing spheres onto each other. Simpler centers are possible, of course (center of gravity, center of bounding box), but more advanced bounding volumes might give better results in some diff --git a/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation_impl.h b/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation_impl.h index fdfd2763bc7..d925cacec31 100644 --- a/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation_impl.h +++ b/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation_impl.h @@ -183,7 +183,7 @@ namespace CGAL { // Since the transformations we apply do not change the solution // space of the intermediate systems, we can say: The system t x = // e_j has, for any i in {1,...,d}, the same solution space as I x - // = n_i (with n_i being the i-th colum of N); it follows that + // = n_i (with n_i being the i-th column of N); it follows that // x=n_i. // store the identity matrix in mi: diff --git a/Bounding_volumes/test/Bounding_volumes/interface_check.cpp b/Bounding_volumes/test/Bounding_volumes/interface_check.cpp index fefcf068f80..da89a420364 100644 --- a/Bounding_volumes/test/Bounding_volumes/interface_check.cpp +++ b/Bounding_volumes/test/Bounding_volumes/interface_check.cpp @@ -3,7 +3,6 @@ // // Compatibility: works with or without CGAL -#include #include #include diff --git a/Bounding_volumes/test/Bounding_volumes/lp-alg-double.cpp b/Bounding_volumes/test/Bounding_volumes/lp-alg-double.cpp index 2a859e6f5fe..e2d7e56fec6 100644 --- a/Bounding_volumes/test/Bounding_volumes/lp-alg-double.cpp +++ b/Bounding_volumes/test/Bounding_volumes/lp-alg-double.cpp @@ -11,7 +11,6 @@ // // Compatibility: works with or without CGAL -#include #include #include diff --git a/Bounding_volumes/test/Bounding_volumes/lp-alg-exact.cpp b/Bounding_volumes/test/Bounding_volumes/lp-alg-exact.cpp index 9afcda4e4bd..963a7a6d023 100644 --- a/Bounding_volumes/test/Bounding_volumes/lp-alg-exact.cpp +++ b/Bounding_volumes/test/Bounding_volumes/lp-alg-exact.cpp @@ -7,7 +7,6 @@ // // Compatibility: works with or without CGAL -#include #include #include #include diff --git a/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp b/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp index c7295dfd70a..a90021606cb 100644 --- a/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp +++ b/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp @@ -28,7 +28,6 @@ // hack to overcome external linkage conflict warning in MIPS #define __SGI_STL_INTERNAL_RELOPS -#include #include #include diff --git a/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_2_test.cpp b/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_2_test.cpp index 08e0df4fe09..0f137fd20ff 100644 --- a/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_2_test.cpp +++ b/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_2_test.cpp @@ -29,9 +29,6 @@ // hack to overcome external linkage conflict warning in MIPS #define __SGI_STL_INTERNAL_RELOPS -#include - - #include #include #include diff --git a/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_3_test.cpp b/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_3_test.cpp index 1c5aff7f33a..efb0bed98c8 100644 --- a/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_3_test.cpp +++ b/Bounding_volumes/test/Bounding_volumes/min_sphere_traits_3_test.cpp @@ -25,7 +25,6 @@ // implementation: dD Smallest Enclosing Sphere // ============================================================================ -#include #include #include #include diff --git a/Bounding_volumes/test/Bounding_volumes/test_Min_ellipse_2.cpp b/Bounding_volumes/test/Bounding_volumes/test_Min_ellipse_2.cpp index 5b8e2bcfa04..07c61f65efd 100644 --- a/Bounding_volumes/test/Bounding_volumes/test_Min_ellipse_2.cpp +++ b/Bounding_volumes/test/Bounding_volumes/test_Min_ellipse_2.cpp @@ -44,8 +44,8 @@ typedef CGAL::Quotient< Rt > Ft; -#ifdef CGAL_USE_CORE - #include +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) +#include #endif typedef CGAL::Cartesian< Ft > KerC; @@ -72,10 +72,10 @@ eps_equal (const Point& p, const Point& q) (CGAL::abs(p.y()-q.y()) < eps) ); } -#ifdef CGAL_USE_CORE -typedef CGAL::Cartesian KerCCore; -typedef CGAL::Homogeneous KerHCore; +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) +typedef CGAL::Cartesian KerCCore; +typedef CGAL::Homogeneous KerHCore; typedef CGAL::Min_ellipse_2_traits_2< KerCCore > TraitsCCore; typedef CGAL::Min_ellipse_2_traits_2< KerHCore > TraitsHCore; @@ -92,11 +92,11 @@ core_test_Min_ellipse_2( bool verbose, const Traits&) CGAL::Verbose_ostream verr( verbose); - verr << endl << "CORE tests..." << endl + verr << endl << "Algebraic tests..." << endl << " 3-point case, equilateral triangle..."; { std::vector P; - CORE::Expr sqrt_3(sqrt(CORE::Expr(3))); + CGAL::Exact_algebraic sqrt_3(sqrt(CGAL::Exact_algebraic(3))); P.push_back(Point(0,0)); P.push_back(Point(2,0)); P.push_back(Point(1,sqrt_3)); @@ -615,7 +615,7 @@ main( int argc, char* argv[]) --argc; ++argv; } -#ifdef CGAL_USE_CORE +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) // core test core_test_Min_ellipse_2( verbose, TraitsCCore()); core_test_Min_ellipse_2( verbose, TraitsHCore()); diff --git a/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h b/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h index bbc582fa808..ace587c3f7c 100644 --- a/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h +++ b/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h @@ -217,7 +217,7 @@ void read_base_number(std::istream& in, BigInt& m, long length, long maxBits) { core_io_error_handler("CoreIO::read_from_file()","bad big number format."); delete[] buffer; - // shift left if neccessary + // shift left if necessary if (offset > 0 && base != 10) { m <<= offset; } diff --git a/CGAL_Core/include/CGAL/CORE/MemoryPool.h b/CGAL_Core/include/CGAL/CORE/MemoryPool.h index 7d01dfae308..e7b87e5cc79 100644 --- a/CGAL_Core/include/CGAL/CORE/MemoryPool.h +++ b/CGAL_Core/include/CGAL/CORE/MemoryPool.h @@ -37,7 +37,8 @@ #include #include -#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS)&&__GNUC__) +#include +#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS) && BOOST_GCC) // Force the use of Boost.Thread with g++ and C++11, because of the PR66944 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66944 // See also CGAL PR #1888 @@ -91,7 +92,7 @@ public: // Access the corresponding static global allocator. static MemoryPool& global_allocator() { -#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS)&&__GNUC__) +#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS) && BOOST_GCC) if(memPool_ptr.get() == NULL) {memPool_ptr.reset(new Self());} Self& memPool = * memPool_ptr.get(); #endif @@ -102,7 +103,7 @@ private: Thunk* head; // next available block in the pool std::vector blocks; -#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS)&&__GNUC__) +#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS) && BOOST_GCC) static boost::thread_specific_ptr memPool_ptr; #elif defined(CGAL_HAS_THREADS) // use the C++11 implementation static thread_local Self memPool; @@ -111,7 +112,7 @@ private: #endif // not CGAL_HAS_THREADS }; -#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS)&&__GNUC__) +#if CGAL_STATIC_THREAD_LOCAL_USE_BOOST || (defined(CGAL_HAS_THREADS) && BOOST_GCC) template boost::thread_specific_ptr > MemoryPool::memPool_ptr; diff --git a/CGAL_Core/include/CGAL/CORE/poly/Sturm.h b/CGAL_Core/include/CGAL/CORE/poly/Sturm.h index dd0b328613d..90671fcd332 100644 --- a/CGAL_Core/include/CGAL/CORE/poly/Sturm.h +++ b/CGAL_Core/include/CGAL/CORE/poly/Sturm.h @@ -944,7 +944,7 @@ std::cout << "In newtonRefine, input J=" << J.first // Newton might bring x very close to one endpoint, but it can be // because the root is near there! In any case, // by setting x to the center of J, you only gain at most - // one bit of accuracy, but you stand to loose an + // one bit of accuracy, but you stand to lose an // arbitrary amount of bits of accuracy if you are unlucky! // So I will comment out the next line. --Chee (Aug 9, 2004). // diff --git a/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h b/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h index 9373f9feeda..52ff6916622 100644 --- a/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h +++ b/Cartesian_kernel/include/CGAL/constructions/kernel_ftC2.h @@ -64,7 +64,7 @@ circumcenter_translateC2(const FT &dqx, const FT &dqy, CGAL_kernel_assertion ( ! CGAL_NTS is_zero(den) ); // One possible optimization here is to precompute 1/den, to avoid one - // division. However, we loose precision, and it's maybe not worth it (?). + // division. However, we lose precision, and it's maybe not worth it (?). dcx = determinant (dry, dqy, r2, q2) / den; dcy = - determinant (drx, dqx, r2, q2) / den; } @@ -440,7 +440,7 @@ weighted_circumcenter_translateC2(const RT &dqx, const RT &dqy, const RT &dqw, CGAL_assertion ( den != RT(0) ); // One possible optimization here is to precompute 1/den, to avoid one - // division. However, we loose precision, and it's maybe not worth it (?). + // division. However, we lose precision, and it's maybe not worth it (?). dcx = determinant (dry, dqy, r2, q2) / den; dcy = - determinant (drx, dqx, r2, q2) / den; } diff --git a/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h b/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h index 9ba0d3c9522..fdef99c0247 100644 --- a/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h +++ b/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h @@ -177,7 +177,7 @@ class Bench texout << " & " < - +#include namespace CGAL { namespace SphericalFunctors { diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h index 4e4faeeb0a1..5c77101eab6 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h @@ -29,6 +29,7 @@ #include +#include #include #include @@ -140,10 +141,10 @@ namespace CGAL { { // Should we compare anyway even if they are degenerated? CGAL_kernel_assertion(!(p1.is_degenerate() || p2.is_degenerate())); - if(is_zero(p1.a())) { - if(!is_zero(p2.a())) return false; - if(is_zero(p1.b())) { - if(!is_zero(p2.b())) return false; + if(CGAL::is_zero(p1.a())) { + if(!CGAL::is_zero(p2.a())) return false; + if(CGAL::is_zero(p1.b())) { + if(!CGAL::is_zero(p2.b())) return false; return p1.c() * p2.d() == p1.d() * p2.c(); } return (p2.c() * p1.b() == p1.c() * p2.b()) && diff --git a/Circular_kernel_3/test/Circular_kernel_3/test_Spherical_kernel_with_core.cpp b/Circular_kernel_3/test/Circular_kernel_3/test_Spherical_kernel_with_core.cpp index 880ba8416be..1b26f40807f 100644 --- a/Circular_kernel_3/test/Circular_kernel_3/test_Spherical_kernel_with_core.cpp +++ b/Circular_kernel_3/test/Circular_kernel_3/test_Spherical_kernel_with_core.cpp @@ -22,9 +22,9 @@ // STREP (FET Open) Project under Contract No IST-006413 // (ACS -- Algorithms for Complex Shapes) -#ifdef CGAL_USE_CORE +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) #include -#include +#include #include #include #include @@ -35,8 +35,8 @@ int main() { -#ifdef CGAL_USE_CORE - typedef CORE::Expr FT; +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) + typedef CGAL::Exact_algebraic FT; typedef CGAL::Cartesian Linear_k1; typedef CGAL::Algebraic_kernel_for_spheres_2_3 Algebraic_k1; typedef CGAL::Spherical_kernel_3 SK1; diff --git a/Circulator/include/CGAL/circulator.h b/Circulator/include/CGAL/circulator.h index a90474aef4c..aa70e9785ed 100644 --- a/Circulator/include/CGAL/circulator.h +++ b/Circulator/include/CGAL/circulator.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include diff --git a/Circulator/package_info/Circulator/dependencies b/Circulator/package_info/Circulator/dependencies index 0e9ae985590..570e3cdf474 100644 --- a/Circulator/package_info/Circulator/dependencies +++ b/Circulator/package_info/Circulator/dependencies @@ -3,3 +3,4 @@ Installation Kernel_23 Profiling_tools STL_Extension +Stream_support diff --git a/Circulator/test/Circulator/test_circ1.cpp b/Circulator/test/Circulator/test_circ1.cpp index 6f9bdb26b06..894bb4d4fc2 100644 --- a/Circulator/test/Circulator/test_circ1.cpp +++ b/Circulator/test/Circulator/test_circ1.cpp @@ -25,7 +25,6 @@ // ============================================================================ -#include #include #include #include diff --git a/Circulator/test/Circulator/test_circ2.cpp b/Circulator/test/Circulator/test_circ2.cpp index 5be80c44cb3..6e4ae25caa7 100644 --- a/Circulator/test/Circulator/test_circ2.cpp +++ b/Circulator/test/Circulator/test_circ2.cpp @@ -25,7 +25,6 @@ // ============================================================================ -#include #include #include #include diff --git a/Classification/examples/Classification/CMakeLists.txt b/Classification/examples/Classification/CMakeLists.txt index 931521bbbb6..73e009c7868 100644 --- a/Classification/examples/Classification/CMakeLists.txt +++ b/Classification/examples/Classification/CMakeLists.txt @@ -29,6 +29,8 @@ if( WIN32 ) set(_Boost_BZIP2_HEADERS "boost/iostreams/filter/bzip2.hpp") set(_Boost_ZLIB_HEADERS "boost/iostreams/filter/zlib.hpp") find_package( Boost OPTIONAL_COMPONENTS bzip2 zlib) +else() + find_package(ZLIB QUIET) endif() find_package(TBB QUIET) @@ -66,9 +68,13 @@ set(classification_compile_definitions) if (Boost_SERIALIZATION_FOUND AND Boost_IOSTREAMS_FOUND) - set(classification_linked_libraries ${classification_linked_libraries} - ${Boost_SERIALIZATION_LIBRARY} - ${Boost_IOSTREAMS_LIBRARY}) + if(TARGET Boost::serialization AND TARGET Boost::iostreams) + set(classification_linked_libraries Boost::serialization Boost::iostreams) + else() + set(classification_linked_libraries ${classification_linked_libraries} + ${Boost_SERIALIZATION_LIBRARY} + ${Boost_IOSTREAMS_LIBRARY}) + endif() else() if (NOT Boost_SERIALIZATION_FOUND) message(STATUS "NOTICE: This project requires Boost Serialization, and will not be compiled.") @@ -87,6 +93,13 @@ if( WIN32 ) message(STATUS "NOTICE: This project requires Boost ZLIB and Boost BZIP2, and will not be compiled.") return() endif() +else() + if(ZLIB_FOUND) + set(classification_linked_libraries ${classification_linked_libraries} ZLIB::ZLIB) + else() + message(STATUS "NOTICE: This project requires ZLIB, and will not be compiled.") + return() + endif() endif() if (OpenCV_FOUND) diff --git a/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp b/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp index 02d326f8c76..db51011e714 100644 --- a/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp +++ b/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp @@ -45,6 +45,8 @@ #include #endif +#include + #include #ifdef CGAL_LINKED_WITH_TBB diff --git a/Classification/include/CGAL/Classification/Feature/Vertical_dispersion.h b/Classification/include/CGAL/Classification/Feature/Vertical_dispersion.h index 2c23f4046f1..13713b414dc 100644 --- a/Classification/include/CGAL/Classification/Feature/Vertical_dispersion.h +++ b/Classification/include/CGAL/Classification/Feature/Vertical_dispersion.h @@ -32,6 +32,7 @@ #include #include #include +#include #include namespace CGAL { diff --git a/Classification/test/Classification/CMakeLists.txt b/Classification/test/Classification/CMakeLists.txt index f6967a11db1..ba75c6ae11f 100644 --- a/Classification/test/Classification/CMakeLists.txt +++ b/Classification/test/Classification/CMakeLists.txt @@ -10,10 +10,8 @@ cmake_minimum_required(VERSION 3.1) find_package( CGAL QUIET COMPONENTS ) if ( NOT CGAL_FOUND ) - message(STATUS "This project requires the CGAL library, and will not be compiled.") return() - endif() # Boost and its components @@ -24,13 +22,15 @@ if ( NOT Boost_FOUND ) return() endif() -find_package( Boost OPTIONAL_COMPONENTS serialization iostreams) +find_package( Boost OPTIONAL_COMPONENTS serialization iostreams ) if( WIN32 ) # to avoid a warning with old cmake set(_Boost_BZIP2_HEADERS "boost/iostreams/filter/bzip2.hpp") set(_Boost_ZLIB_HEADERS "boost/iostreams/filter/zlib.hpp") find_package( Boost OPTIONAL_COMPONENTS bzip2 zlib) +else() + find_package(ZLIB QUIET) endif() # Use Eigen @@ -58,9 +58,13 @@ set(needed_cxx_features cxx_rvalue_references cxx_variadic_templates) set(classification_linked_libraries) if (Boost_SERIALIZATION_FOUND AND Boost_IOSTREAMS_FOUND) - set(classification_linked_libraries ${classification_linked_libraries} - ${Boost_SERIALIZATION_LIBRARY} - ${Boost_IOSTREAMS_LIBRARY}) + if(TARGET Boost::serialization AND TARGET Boost::iostreams) + set(classification_linked_libraries Boost::serialization Boost::iostreams) + else() + set(classification_linked_libraries ${classification_linked_libraries} + ${Boost_SERIALIZATION_LIBRARY} + ${Boost_IOSTREAMS_LIBRARY}) + endif() else() if (NOT Boost_SERIALIZATION_FOUND) message(STATUS "NOTICE: This project requires Boost Serialization, and will not be compiled.") @@ -79,6 +83,13 @@ if( WIN32 ) message(STATUS "NOTICE: This project requires Boost ZLIB and Boost BZIP2, and will not be compiled.") return() endif() +else() + if(ZLIB_FOUND) + set(classification_linked_libraries ${classification_linked_libraries} ZLIB::ZLIB) + else() + message(STATUS "NOTICE: This project requires ZLIB, and will not be compiled.") + return() + endif() endif() create_single_source_cgal_program( "test_classification_point_set.cpp" CXX_FEATURES ${needed_cxx_features} ) diff --git a/Combinatorial_map/examples/Combinatorial_map/map_3_foreach.cpp b/Combinatorial_map/examples/Combinatorial_map/map_3_foreach.cpp index 3d99c3d8eac..347c2b0d9bd 100644 --- a/Combinatorial_map/examples/Combinatorial_map/map_3_foreach.cpp +++ b/Combinatorial_map/examples/Combinatorial_map/map_3_foreach.cpp @@ -60,7 +60,7 @@ private: // Functor allowing to transform a variable into its address. template -struct Take_adress : public CGAL::cpp98::unary_function +struct Take_address : public CGAL::cpp98::unary_function { T* operator() (T& t) const { return &t; } @@ -97,14 +97,14 @@ int main() std::vector toremove; // Copy in vector toremove one dart per face - std::copy(boost::transform_iterator, + std::copy(boost::transform_iterator, CMap_3::One_dart_per_cell_range<2>::iterator> (cmap.one_dart_per_cell<2>().begin(), - Take_adress()), - boost::transform_iterator, + Take_address()), + boost::transform_iterator, CMap_3::One_dart_per_cell_range<2>::iterator> (cmap.one_dart_per_cell<2>().end(), - Take_adress()), + Take_address()), back_inserter(toremove)); // Remove each face sequentially. diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index c951257df00..7b594d2ad16 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -4194,7 +4194,7 @@ namespace CGAL { /** Test if a 2-cell can be inserted onto a given 3-cell along * a path of edges. - * @param afirst iterator on the begining of the path. + * @param afirst iterator on the beginning of the path. * @param alast iterator on the end of the path. * @return true iff a 2-cell can be inserted along the path. */ @@ -4239,7 +4239,7 @@ namespace CGAL { } /** Insert a 2-cell in a given 3-cell along a path of darts. - * @param afirst iterator on the begining of the path. + * @param afirst iterator on the beginning of the path. * @param alast iterator on the end of the path. * @param update_attributes a boolean to update the enabled attributes * @return a dart of the new 2-cell. diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h b/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h index be01902792e..32a2fb8973e 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h @@ -121,7 +121,7 @@ insert_cell_1_in_cell_2(CMap& amap, /** Test if a 2-cell can be inserted onto a given 3-cell along * a path of edges. * @param amap the used combinatorial map. - * @param afirst iterator on the begining of the path. + * @param afirst iterator on the beginning of the path. * @param alast iterator on the end of the path. * @return true iff a 2-cell can be inserted along the path. */ @@ -134,7 +134,7 @@ CGAL_DEPRECATED bool is_insertable_cell_2_in_cell_3 /** Insert a 2-cell in a given 3-cell along a path of darts. * @param amap the used combinatorial map. - * @param afirst iterator on the begining of the path. + * @param afirst iterator on the beginning of the path. * @param alast iterator on the end of the path. * @param update_attributes a boolean to update the enabled attributes * (deprecated, now we use are_attributes_automatically_managed()) diff --git a/Cone_spanners_2/examples/Cone_spanners_2/CMakeLists.txt b/Cone_spanners_2/examples/Cone_spanners_2/CMakeLists.txt index 12ba2f77826..720ae284d4c 100644 --- a/Cone_spanners_2/examples/Cone_spanners_2/CMakeLists.txt +++ b/Cone_spanners_2/examples/Cone_spanners_2/CMakeLists.txt @@ -1,15 +1,12 @@ -# Created by the script cgal_create_cmake_script -# This is the CMake script for compiling a CGAL application. - +cmake_minimum_required(VERSION 3.1...3.13) project( Cone_spanners_2_Examples ) -cmake_minimum_required(VERSION 3.1) +find_package(CGAL REQUIRED QUIET OPTIONAL_COMPONENTS Core) +include(${CGAL_USE_FILE}) +find_package(LEDA QUIET) -find_package(CGAL QUIET COMPONENTS Core) - -if ( CGAL_FOUND AND CGAL_Core_FOUND) - include(${CGAL_USE_FILE}) +if ( CGAL_Core_FOUND OR LEDA_FOUND ) if (MSVC) # Turn off a boost related warning that appears with VC2015 # boost_1_65_1\boost\graph\named_function_params.hpp(240) : @@ -25,7 +22,7 @@ if ( CGAL_FOUND AND CGAL_Core_FOUND) else() - message(STATUS "This program requires the CGAL and CGAL_Core libraries, and will not be compiled.") + message(STATUS "This program requires the CGAL_Core library (or LEDA), and will not be compiled.") endif() diff --git a/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h b/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h index 699155f983d..e243afcae86 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h @@ -159,7 +159,12 @@ struct GT3_for_CH3 { - template + template ::type::value && + R_::Has_filtered_predicates_tag::value + > > class Convex_hull_traits_3 { public: diff --git a/Convex_hull_d/test/Convex_hull_d/chull_d-test.cpp b/Convex_hull_d/test/Convex_hull_d/chull_d-test.cpp index 16efa8310b1..1b88e25ab76 100644 --- a/Convex_hull_d/test/Convex_hull_d/chull_d-test.cpp +++ b/Convex_hull_d/test/Convex_hull_d/chull_d-test.cpp @@ -1,6 +1,5 @@ #include -#include #include #include #include diff --git a/Convex_hull_d/test/Convex_hull_d/delaunay_d-test.cpp b/Convex_hull_d/test/Convex_hull_d/delaunay_d-test.cpp index 72bfb288c6c..5815e5affc5 100644 --- a/Convex_hull_d/test/Convex_hull_d/delaunay_d-test.cpp +++ b/Convex_hull_d/test/Convex_hull_d/delaunay_d-test.cpp @@ -1,6 +1,5 @@ #include -#include #include #include #include diff --git a/Convex_hull_d/test/Convex_hull_d/include/CGAL/test_macros.h b/Convex_hull_d/test/Convex_hull_d/include/CGAL/test_macros.h index 7cede2731f8..7c20753f5ea 100644 --- a/Convex_hull_d/test/Convex_hull_d/include/CGAL/test_macros.h +++ b/Convex_hull_d/test/Convex_hull_d/include/CGAL/test_macros.h @@ -1,7 +1,7 @@ #ifndef CGAL_TEST_MACROS_H #define CGAL_TEST_MACROS_H -#include +#include #include #include #include diff --git a/Documentation/doc/Documentation/Installation.txt b/Documentation/doc/Documentation/Installation.txt index 00cbbc4bfaa..8ab3a95afe5 100644 --- a/Documentation/doc/Documentation/Installation.txt +++ b/Documentation/doc/Documentation/Installation.txt @@ -468,7 +468,7 @@ The exhaustive list of \sc{Qt}5 components used in demos is: `Core`, `Gui`, `Help`, `OpenGL`, `Script`, `ScriptTools`, `Svg`, `Widgets`, `qcollectiongenerator` (with `sqlite` driver plugin) and `Xml`. -Having \sc{Qt}5 version 5.3.0 is recommended. +\sc{Qt} version 5.9.0 or later is required. \section installation_examples CGAL Examples and Demos diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index d4bf473db7f..ffacc230cfe 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -1645,7 +1645,7 @@ cell neighborhood in $O(m)$ time." , succeeds = "aaas-lpmpc-97" , precedes = "aas-lpocp-98" , update = "01.04 icking, 98.11 bibrelex, 98.03 agarwal" -, annote = "Corrects and supercedes parts of \cite{aaas-lpmpc-97}" +, annote = "Corrects and supersedes parts of \cite{aaas-lpmpc-97}" } @article{aas-mpcpp-99 diff --git a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h index 86a9a6ca97b..2acab99affd 100644 --- a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h +++ b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h @@ -830,7 +830,7 @@ _merge_two_intervals(Edge_const_handle e1, bool is_leftmost1, Vertex_handle new_v = _append_vertex(out_d, p_right, e1); new_v->left()->add_curves(e2->curves_begin(), e2->curves_end()); - // We are not at v becuase p_right is smaller than v. + // We are not at v because p_right is smaller than v. // The special case that we are at v is handled in the next // condition. // If we were at v, then this was a special case that is handled diff --git a/Envelope_2/test/Envelope_2/test_envelope_segments.cpp b/Envelope_2/test/Envelope_2/test_envelope_segments.cpp index ba607181e80..b2ceb918ba2 100644 --- a/Envelope_2/test/Envelope_2/test_envelope_segments.cpp +++ b/Envelope_2/test/Envelope_2/test_envelope_segments.cpp @@ -92,7 +92,7 @@ bool read_segments (const char* filename, /*! * Check if a $x$-monotone curve with the same associated data as the input * curve is in the given range. - * \param begin The begining of the range. + * \param begin The beginning of the range. * \param end Passed-the-end iterator. * \param c The curve, the data of which we are searching. * \return True if we found an $x$-monotone curve with the same data. diff --git a/Envelope_3/doc/Envelope_3/Envelope_3.txt b/Envelope_3/doc/Envelope_3/Envelope_3.txt index ceeba66eb74..d5a7d6aa4e3 100644 --- a/Envelope_3/doc/Envelope_3/Envelope_3.txt +++ b/Envelope_3/doc/Envelope_3/Envelope_3.txt @@ -252,7 +252,7 @@ printing the diagrams, we just output the labels of the triangles: The next example demonstrates how to instantiate and use the envelope-traits class for spheres, based on the -`Arr_conic_traits_2` class that handles the projected intersecion +`Arr_conic_traits_2` class that handles the projected intersection curves. The program reads a set of spheres from an input file and constructs their lower envelope: diff --git a/Envelope_3/doc/Envelope_3/PackageDescription.txt b/Envelope_3/doc/Envelope_3/PackageDescription.txt index 43a072da27f..44979adbf10 100644 --- a/Envelope_3/doc/Envelope_3/PackageDescription.txt +++ b/Envelope_3/doc/Envelope_3/PackageDescription.txt @@ -16,7 +16,6 @@ \cgalPkgDependsOn{\ref PkgArrangementOnSurface2} \cgalPkgBib{cgal:mwz-e3} \cgalPkgLicense{\ref licensesGPL "GPL"} -\cgalPkgDemo{3D Envelopes,envelope_3.zip,L1 Voronoi Diagram,l1_voronoi_diagram_2.zip} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd diff --git a/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h b/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h index 0bc094544f1..025d8d4b4ad 100644 --- a/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h +++ b/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h @@ -65,7 +65,7 @@ // - remove edges between faces with the same envelope data, which do not // contribute to the shape of the envelope (i.e. have the same envelope data // as their adjacent faces) -// - remove unneccessary vertices of two kinds: +// - remove unnecessary vertices of two kinds: // a. vertices which have degree 2, the 2 incident edges can be geometrically // merged, and has the same envelope data as both these edges // b. isolated vertices which have the same envelope data as their incident @@ -641,16 +641,16 @@ public: // make sure the aux flags are correctly after all resolvings //CGAL_assertion(verify_aux_flags(result)); - // finally, remove unneccessary edges, between faces with the same surface + // finally, remove unnecessary edges, between faces with the same surface // (and which are not degenerate) - remove_unneccessary_edges(result); + remove_unnecessary_edges(result); CGAL_expensive_assertion_msg(result.is_valid(), "after remove edges result is not valid"); - // also remove unneccessary vertices (that were created in the process of + // also remove unnecessary vertices (that were created in the process of // vertical decomposition but the vertical edge was removed) - remove_unneccessary_vertices(result); + remove_unnecessary_vertices(result); CGAL_expensive_assertion_msg(result.is_valid(), "after remove vertices result is not valid"); @@ -728,9 +728,9 @@ protected: return has_eq; } - // Remove unneccessary edges, between faces with the same surface + // Remove unnecessary edges, between faces with the same surface // (and which are not degenerate) - void remove_unneccessary_edges(Minimization_diagram_2& result) + void remove_unnecessary_edges(Minimization_diagram_2& result) { // collect all those edges in this list, and remove them all at the end // (thus, not destroying the iterator) @@ -1009,18 +1009,18 @@ protected: return (equal_first && equal_second); } - // Remove unneccessary vertices, which have degree 2, and the 2 curves + // Remove unnecessary vertices, which have degree 2, and the 2 curves // can be merged // (and which are not degenerate) - void remove_unneccessary_vertices(Minimization_diagram_2& result) + void remove_unnecessary_vertices(Minimization_diagram_2& result) { - // we have 2 types of unneccessary vertices: those with degree 2 (that + // we have 2 types of unnecessary vertices: those with degree 2 (that // satisfy all the conditions below), and isolated vertices that have the // same envelope information as the face they're contained in. // all the vertices that don't have their data set, are those vertices // on vertical edges, created in the decomposition process, - // and are not neccessary + // and are not necessary // also those vertices with degree 2, that can merge their 2 edges and // with same data as both these edges, can be removed diff --git a/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h b/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h index d3c3663b70d..d9b979dd2a9 100644 --- a/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h +++ b/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h @@ -654,7 +654,7 @@ public: // remember the envelope decision over the first & last parts, to // be able to copy it to the original endpoints // TODO: the initial value is only needed to shut up the compiler - // TODO: is this realy needed, or we can use the decision made on "edge" + // TODO: is this really needed, or we can use the decision made on "edge" // (is "edge" always the first part? ) Comparison_result first_part_res = EQUAL; diff --git a/Envelope_3/test/Envelope_3/spheres_test.cpp b/Envelope_3/test/Envelope_3/spheres_test.cpp index bb7d91d54a1..e015b0e71db 100644 --- a/Envelope_3/test/Envelope_3/spheres_test.cpp +++ b/Envelope_3/test/Envelope_3/spheres_test.cpp @@ -1,4 +1,4 @@ -#include +#include #include #if !defined(CGAL_USE_CORE) diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index cfd6b756803..7ab7f4eadda 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -3322,7 +3322,7 @@ namespace CGAL { /** Test if a 2-cell can be inserted onto a given 3-cell along * a path of edges. - * @param afirst iterator on the begining of the path. + * @param afirst iterator on the beginning of the path. * @param alast iterator on the end of the path. * @return true iff a 2-cell can be inserted along the path. * the path is a sequence of dartd, one per edge @@ -3365,7 +3365,7 @@ namespace CGAL { /** Insert a 2-cell in a given 3-cell along a path of darts. * @param amap the used generalized map. - * @param afirst iterator on the begining of the path. + * @param afirst iterator on the beginning of the path. * @param alast iterator on the end of the path. * the path is a sequence of darts, one per edge * where the face will be inserted. diff --git a/Generator/include/CGAL/Random_polygon_2_sweep.h b/Generator/include/CGAL/Random_polygon_2_sweep.h index f2c2519e596..5f16d3cd8da 100644 --- a/Generator/include/CGAL/Random_polygon_2_sweep.h +++ b/Generator/include/CGAL/Random_polygon_2_sweep.h @@ -1,4 +1,4 @@ -// Copyright (c) 2001 +// Copyright (c) 2001 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), @@ -19,7 +19,7 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// +// // // Author(s) : Geert-Jan Giezeman // : Susan Hert @@ -146,7 +146,12 @@ template bool Less_segments:: operator()(Vertex_index i, Vertex_index j) const { - if (m_vertex_data->edges[j.as_int()].is_in_tree) { + if (i.as_int() == j.as_int()) { + // Some STL implementations may call comparator(x, x) + // to verify irreflexivity. Don't violate less_than_in_tree's + // preconditions in such an environment. + return false; + } else if (m_vertex_data->edges[j.as_int()].is_in_tree) { return less_than_in_tree(i,j); } else { return !less_than_in_tree(j,i); diff --git a/Generator/include/CGAL/point_generators_3.h b/Generator/include/CGAL/point_generators_3.h index 7e83b1dab3c..0f0bfa943ce 100644 --- a/Generator/include/CGAL/point_generators_3.h +++ b/Generator/include/CGAL/point_generators_3.h @@ -65,7 +65,7 @@ template < class P, class Creator > void Random_points_in_sphere_3:: generate_point() { - // A strip between z and z+dz has an area independant of z + // A strip between z and z+dz has an area independent of z typedef typename Creator::argument_type T; double alpha = this->_rnd.get_double() * 2.0 * CGAL_PI; double z = 2 * this->_rnd.get_double() - 1.0; @@ -104,7 +104,7 @@ template < class P, class Creator > void Random_points_on_sphere_3:: generate_point() { - // A strip between z and z+dz has an area independant of z + // A strip between z and z+dz has an area independent of z typedef typename Creator::argument_type T; double alpha = this->_rnd.get_double() * 2.0 * CGAL_PI; double z = 2 * this->_rnd.get_double() - 1.0; diff --git a/Generator/include/CGAL/point_generators_d.h b/Generator/include/CGAL/point_generators_d.h index c7f40cbf5a7..2016eacc4dd 100644 --- a/Generator/include/CGAL/point_generators_d.h +++ b/Generator/include/CGAL/point_generators_d.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace CGAL { diff --git a/Geomview/test/Geomview/kernel_objects.cpp b/Geomview/test/Geomview/kernel_objects.cpp index a73a3962164..13adb554f65 100644 --- a/Geomview/test/Geomview/kernel_objects.cpp +++ b/Geomview/test/Geomview/kernel_objects.cpp @@ -3,7 +3,7 @@ // // Sylvain Pion, 2000. -#include +#include #ifndef CGAL_USE_GEOMVIEW #include diff --git a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt index 37dde3bd982..f7a8bc079d6 100644 --- a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt +++ b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt @@ -21,7 +21,7 @@ include_directories (BEFORE ./include) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) - +set(CMAKE_AUTOMOC ON) #-------------------------------- # The "Delaunay" demo: Alpha_shapes_2 #-------------------------------- @@ -31,11 +31,8 @@ qt5_wrap_ui( DT_UI_FILES Alpha_shapes_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Alpha_shapes_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( Alpha_shapes_2.cpp Alpha_shapes_2.moc ) - # The executable itself. -add_executable ( Alpha_shapes_2 Alpha_shapes_2.cpp Alpha_shapes_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) +add_executable ( Alpha_shapes_2 Alpha_shapes_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Alpha_shapes_2 ) diff --git a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt index 81032979285..275cbce4285 100644 --- a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt @@ -20,7 +20,7 @@ find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) - +set(CMAKE_AUTOMOC ON) #-------------------------------- # UI files (Qt Designer files) qt5_wrap_ui( DT_UI_FILES Apollonius_graph_2.ui ) @@ -29,10 +29,9 @@ qt5_wrap_ui( DT_UI_FILES Apollonius_graph_2.ui ) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Apollonius_graph_2.qrc ) # use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( Apollonius_graph_2.cpp Apollonius_graph_2.moc ) # The executable itself. -add_executable ( Apollonius_graph_2 Apollonius_graph_2.cpp Apollonius_graph_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) +add_executable ( Apollonius_graph_2 Apollonius_graph_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Apollonius_graph_2 ) diff --git a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt index 3226cd34f12..b05e83971bd 100644 --- a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt +++ b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt @@ -17,13 +17,13 @@ find_package(CGAL COMPONENTS Qt5) find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) include_directories (BEFORE ./include) -include_directories (BEFORE ../../../Matrix_search/include) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) set(CMAKE_INCLUDE_CURRENT_DIR ON) add_definitions(-DQT_NO_KEYWORDS) +set(CMAKE_AUTOMOC ON) #---------------------------------------------- # The "Bounding volumes" demo: Bounding_volumes @@ -35,10 +35,9 @@ qt5_wrap_ui( DT_UI_FILES Bounding_volumes.ui ) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Bounding_volumes.qrc ) # use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( "Bounding_volumes.cpp" "${CMAKE_CURRENT_BINARY_DIR}/Bounding_volumes.moc" ) # The executable itself. -add_executable ( Bounding_volumes Bounding_volumes.cpp Bounding_volumes.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) +add_executable ( Bounding_volumes Bounding_volumes.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Bounding_volumes ) diff --git a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt index 42b93286ba8..fcbf3c053aa 100644 --- a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt +++ b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt @@ -21,7 +21,8 @@ find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) - + set(CMAKE_AUTOMOC ON) + #-------------------------------- # The demo: Circular_kernel_2 #-------------------------------- @@ -32,10 +33,10 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Circular_kernel_2.qrc ) # use the Qt MOC preprocessor on classes that derives from QObject - qt5_generate_moc( "Circular_kernel_2.cpp" "${CMAKE_CURRENT_BINARY_DIR}/Circular_kernel_2.moc" ) + # The executable itself. - add_executable ( Circular_kernel_2 Circular_kernel_2.cpp Circular_kernel_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + add_executable ( Circular_kernel_2 Circular_kernel_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Circular_kernel_2 ) diff --git a/GraphicsView/demo/Generator/CMakeLists.txt b/GraphicsView/demo/Generator/CMakeLists.txt index bd373d9f2f8..b4087d159f3 100644 --- a/GraphicsView/demo/Generator/CMakeLists.txt +++ b/GraphicsView/demo/Generator/CMakeLists.txt @@ -20,6 +20,7 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) + set(CMAKE_AUTOMOC ON) #-------------------------------- # Demo: Generator_2 @@ -31,10 +32,9 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Generator_2.qrc ) # use the Qt MOC preprocessor on classes that derives from QObject - qt5_generate_moc( "Generator_2.cpp" "${CMAKE_CURRENT_BINARY_DIR}/Generator_2.moc" ) - + # The executable itself. - add_executable ( Generator_2 Generator_2.cpp Generator_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) + add_executable ( Generator_2 Generator_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Generator_2 ) diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt index 1b901707799..87cc95e584f 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt @@ -23,6 +23,7 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) #-------------------------------- # The "L1 Voronoi diagram" demo: L1_voronoi_diagram_2 @@ -33,11 +34,8 @@ qt5_wrap_ui( DT_UI_FILES L1_voronoi_diagram_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./L1_voronoi_diagram_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( L1_voronoi_diagram_2.cpp L1_voronoi_diagram_2.moc ) - # The executable itself. -add_executable ( L1_voronoi_diagram_2 L1_voronoi_diagram_2.cpp L1_voronoi_diagram_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) +add_executable ( L1_voronoi_diagram_2 L1_voronoi_diagram_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) add_to_cached_list( CGAL_EXECUTABLE_TARGETS L1_voronoi_diagram_2 ) diff --git a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt index 13abece7acf..66a9c615dc7 100644 --- a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt +++ b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt @@ -21,6 +21,7 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) + set(CMAKE_AUTOMOC ON) #-------------------------------- # Demo: Largest_empty_rectangle_2 @@ -31,11 +32,8 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Largest_empty_rectangle_2.qrc ) - # use the Qt MOC preprocessor on classes that derives from QObject - qt5_generate_moc( Largest_empty_rectangle_2.cpp Largest_empty_rectangle_2.moc ) - # The executable itself. - add_executable ( Largest_empty_rectangle_2 Largest_empty_rectangle_2.cpp Largest_empty_rectangle_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) + add_executable ( Largest_empty_rectangle_2 Largest_empty_rectangle_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Largest_empty_rectangle_2 ) diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt index 7e1d94d806e..8f4739f959c 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt @@ -20,6 +20,7 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) #-------------------------------- # The "2D Periodic triangulation" demo: Periodic_2_triangulation_2 @@ -30,8 +31,6 @@ qt5_wrap_ui( DT_UI_FILES Periodic_2_triangulation_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Periodic_2_triangulation_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( Periodic_2_Delaunay_triangulation_2.cpp Periodic_2_triangulation_2.moc ) # find header files for projects that can show them file(GLOB headers "*.h") @@ -42,8 +41,7 @@ SOURCE_GROUP("QT" FILES ${QT_headers}) # The executable itself. add_executable ( Periodic_2_Delaunay_triangulation_2 - Periodic_2_Delaunay_triangulation_2.cpp - Periodic_2_triangulation_2.moc + Periodic_2_Delaunay_triangulation_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ${headers} ${QT_headers} ${P2T2_headers}) diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp b/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp index b5fbe3ece09..1974a0fcc16 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp +++ b/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp @@ -475,7 +475,7 @@ void MainWindow::on_actionStoredCoverDomainSimplicesEmphasized_triggered(bool) } -#include "Periodic_2_triangulation_2.moc" +#include "Periodic_2_Delaunay_triangulation_2.moc" #include int main(int argc, char **argv) diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index 33e16c25117..bceee253d9a 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -28,6 +28,7 @@ find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) + set(CMAKE_AUTOMOC ON) if( CGAL_Core_FOUND) add_definitions(-DCGAL_USE_CORE) @@ -42,14 +43,11 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Polygon_2.qrc ) - # use the Qt MOC preprocessor on classes that derives from QObject - qt5_generate_moc( Polygon_2.cpp "${CMAKE_CURRENT_BINARY_DIR}/Polygon_2.moc" ) - # add_library( CGAL SHARED IMPORTED ) # SET_PROPERTY(TARGET CGAL PROPERTY IMPORTED_LOCATION ${CGAL_LIBRARY} ) # The executable itself. - add_executable ( Polygon_2 Polygon_2.cpp Polygon_2.moc ${DT_UI_FILES} ${DT_RESOURCE_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) + add_executable ( Polygon_2 Polygon_2.cpp ${DT_UI_FILES} ${DT_RESOURCE_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Polygon_2 ) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt index 97af016cffd..aa0672531f5 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt @@ -26,6 +26,7 @@ include_directories (BEFORE ./include) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) +set(CMAKE_AUTOMOC ON) include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) @@ -39,11 +40,8 @@ qt5_wrap_ui( CDT_UI_FILES Segment_voronoi_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Segment_voronoi_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( "Segment_voronoi_2.cpp" "${CMAKE_CURRENT_BINARY_DIR}/Segment_voronoi_2.moc" ) - # The executable itself. -add_executable ( Segment_voronoi_2 Segment_voronoi_2.cpp Segment_voronoi_2.moc ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) +add_executable ( Segment_voronoi_2 Segment_voronoi_2.cpp ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Segment_voronoi_2 ) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt index 556e8577984..978a1c71b40 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt @@ -26,7 +26,7 @@ include_directories (BEFORE ./include) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) - +set(CMAKE_AUTOMOC ON) include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) @@ -39,11 +39,8 @@ qt5_wrap_ui( CDT_UI_FILES Segment_voronoi_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Segment_voronoi_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( "Segment_voronoi_linf_2.cpp" "${CMAKE_CURRENT_BINARY_DIR}/Segment_voronoi_linf_2.moc" ) - # The executable itself. -add_executable ( Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp Segment_voronoi_linf_2.moc ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) +add_executable ( Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Segment_voronoi_linf_2 ) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp index cb0564ffba8..ee5ee603726 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp @@ -78,7 +78,6 @@ private: if(p != q){ wh = svd.insert(*it); svd.insert(vh,wh); - std::cout << "s " << p << " " << q << std::endl; vh = wh; p = q; } else { @@ -206,7 +205,6 @@ MainWindow::processInput(CGAL::Object o) if(CGAL::assign(points, o)){ if(points.size() == 1) { svd.insert(points.front()); - std::cout << "p " << points.front() << std::endl; } else { /* diff --git a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt index 2d0631da561..c7adc44e8dd 100644 --- a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt +++ b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt @@ -16,11 +16,10 @@ endif() find_package(CGAL COMPONENTS Qt5) find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) -include_directories (BEFORE ../../../Snap_rounding_2/include) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) - +set(CMAKE_AUTOMOC ON) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -31,11 +30,8 @@ qt5_wrap_ui( DT_UI_FILES Snap_rounding_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Snap_rounding_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( Snap_rounding_2.cpp Snap_rounding_2.moc ) - # The executable itself. -add_executable ( Snap_rounding_2 Snap_rounding_2.cpp Snap_rounding_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) +add_executable ( Snap_rounding_2 Snap_rounding_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Snap_rounding_2 ) diff --git a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt index 63f2a37ffe5..47cb364fa44 100644 --- a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt +++ b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt @@ -17,12 +17,12 @@ find_package(CGAL COMPONENTS Qt5) find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg) -include_directories (BEFORE ../../../Spatial_searching/include) if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) + set(CMAKE_AUTOMOC ON) #-------------------------------- # Demo: Spatial_searching_2 @@ -33,11 +33,8 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Spatial_searching_2.qrc ) - # use the Qt MOC preprocessor on classes that derives from QObject - qt5_generate_moc( Spatial_searching_2.cpp Spatial_searching_2.moc ) - # The executable itself. - add_executable ( Spatial_searching_2 Spatial_searching_2.cpp Spatial_searching_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) + add_executable ( Spatial_searching_2 Spatial_searching_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Spatial_searching_2 ) diff --git a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt index a9bf93ac1fe..1ed1cb9be2a 100644 --- a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt +++ b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt @@ -22,6 +22,7 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) #-------------------------------- # UI files (Qt Designer files) @@ -30,11 +31,8 @@ qt5_wrap_ui( DT_UI_FILES Stream_lines_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ./Stream_lines_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( Stream_lines_2.cpp Stream_lines_2.moc ) - # The executable itself. -add_executable ( Stream_lines_2 Stream_lines_2.cpp Stream_lines_2.moc ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) +add_executable ( Stream_lines_2 Stream_lines_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES} ) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Stream_lines_2 ) diff --git a/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp b/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp index c5b3825cd7a..d0913c95d1c 100644 --- a/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp +++ b/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp @@ -282,7 +282,6 @@ MainWindow::on_actionRecenter_triggered() } -#include "Stream_lines_2.moc" #include int main(int argc, char **argv) @@ -302,3 +301,5 @@ int main(int argc, char **argv) mainWindow.show(); return app.exec(); } + +#include "Stream_lines_2.moc" diff --git a/GraphicsView/include/CGAL/Qt/GraphicsViewNavigation_impl.h b/GraphicsView/include/CGAL/Qt/GraphicsViewNavigation_impl.h index 78a01f7d735..1d3bcef0287 100644 --- a/GraphicsView/include/CGAL/Qt/GraphicsViewNavigation_impl.h +++ b/GraphicsView/include/CGAL/Qt/GraphicsViewNavigation_impl.h @@ -302,7 +302,7 @@ namespace Qt { v->centerOn(new_center); // QGraphicsView::centerOn makes rounding errors. - // The following two "if" make them unnoticable when dx==0 or dy==0. + // The following two "if" make them unnoticeable when dx==0 or dy==0. if(dx == 0) { v->horizontalScrollBar()->setValue(horizontalScrollBarValue); } diff --git a/GraphicsView/include/CGAL/Qt/camera.h b/GraphicsView/include/CGAL/Qt/camera.h index 5d621bd5d0e..293c1abb52c 100644 --- a/GraphicsView/include/CGAL/Qt/camera.h +++ b/GraphicsView/include/CGAL/Qt/camera.h @@ -230,7 +230,7 @@ public: The near (resp. far) clipping plane is positioned at a distance equal to zClippingCoefficient() * sceneRadius() in front of (resp. behind) the - sceneCenter(). This garantees an optimal use of the z-buffer range and + sceneCenter(). This guarantees an optimal use of the z-buffer range and minimizes aliasing. See the zNear() and zFar() documentations. Default value is square root of 3.0 (so that a cube of size sceneRadius() is diff --git a/GraphicsView/include/CGAL/Qt/camera_impl.h b/GraphicsView/include/CGAL/Qt/camera_impl.h index 2241ca9a40e..0352d541744 100644 --- a/GraphicsView/include/CGAL/Qt/camera_impl.h +++ b/GraphicsView/include/CGAL/Qt/camera_impl.h @@ -162,7 +162,7 @@ Camera &Camera::operator=(const Camera &camera) { You should not call this method when the Camera is associated with a CGAL::QGLViewer, since the latter automatically updates these values when it is resized (hence -overwritting your values). +overwriting your values). Non-positive dimension are silently replaced by a 1 pixel value to ensure frustrum coherence. @@ -260,7 +260,7 @@ void Camera::setFieldOfView(qreal fov) { /*! Defines the Camera type(). Changing the camera Type alters the viewport and the objects' sizes can be -changed. This method garantees that the two frustum match in a plane normal to +changed. This method guarantees that the two frustum match in a plane normal to viewDirection(), passing through the pivotPoint(). Prefix the type with \c Camera if needed, as in: diff --git a/HalfedgeDS/include/CGAL/HalfedgeDS_list.h b/HalfedgeDS/include/CGAL/HalfedgeDS_list.h index 03dbb6ae8c5..c0672e25a8a 100644 --- a/HalfedgeDS/include/CGAL/HalfedgeDS_list.h +++ b/HalfedgeDS/include/CGAL/HalfedgeDS_list.h @@ -646,7 +646,7 @@ public: // number of border halfedges. An edge with no incident face // counts as two border halfedges. Precondition: `normalize_border()' // has been called and no halfedge insertion or removal and no - // change in border status of the halfedges have occured since + // change in border status of the halfedges have occurred since // then. size_type size_of_border_edges() const { return nb_border_edges;} @@ -655,7 +655,7 @@ public: // face on one side and to a hole on the other side. // Precondition: `normalize_border()' has been called and no // halfedge insertion or removal and no change in border status of - // the halfedges have occured since then. + // the halfedges have occurred since then. Halfedge_iterator border_halfedges_begin() { // halfedge iterator starting with the border edges. The range [ @@ -664,7 +664,7 @@ public: // halfedges_end()') denotes all border edges. Precondition: // `normalize_border()' has been called and no halfedge insertion // or removal and no change in border status of the halfedges have - // occured since then. + // occurred since then. return border_halfedges; } diff --git a/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h b/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h index 4ba4261741a..337e5ac8e02 100644 --- a/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h +++ b/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h @@ -490,7 +490,7 @@ public: // number of border halfedges. An edge with no incident face // counts as two border halfedges. Precondition: `normalize_border()' // has been called and no halfedge insertion or removal and no - // change in border status of the halfedges have occured since + // change in border status of the halfedges have occurred since // then. size_type size_of_border_edges() const { return nb_border_edges;} @@ -499,7 +499,7 @@ public: // face on one side and to a hole on the other side. // Precondition: `normalize_border()' has been called and no // halfedge insertion or removal and no change in border status of - // the halfedges have occured since then. + // the halfedges have occurred since then. Halfedge_iterator border_halfedges_begin() { // halfedge iterator starting with the border edges. The range [ @@ -508,7 +508,7 @@ public: // halfedges_end()') denotes all border edges. Precondition: // `normalize_border()' has been called and no halfedge insertion // or removal and no change in border status of the halfedges have - // occured since then. + // occurred since then. return border_halfedges; } diff --git a/Hash_map/test/Hash_map/include/CGAL/test_macros.h b/Hash_map/test/Hash_map/include/CGAL/test_macros.h index 7cede2731f8..7c20753f5ea 100644 --- a/Hash_map/test/Hash_map/include/CGAL/test_macros.h +++ b/Hash_map/test/Hash_map/include/CGAL/test_macros.h @@ -1,7 +1,7 @@ #ifndef CGAL_TEST_MACROS_H #define CGAL_TEST_MACROS_H -#include +#include #include #include #include diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt index 21160f9701d..2a5cc5b55a4 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt @@ -1,3 +1,5 @@ +cmake_minimum_required(VERSION 3.1...3.13) + project (Hyperbolic_triangulation_2_Demo) # Find includes in corresponding build directories @@ -6,19 +8,18 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -cmake_minimum_required(VERSION 3.1...3.13) - if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL QUIET COMPONENTS Core Qt5) +find_package(CGAL REQUIRED QUIET OPTIONAL_COMPONENTS Core Qt5) +find_package(LEDA QUIET) find_package(Qt5 QUIET COMPONENTS Widgets) include_directories (BEFORE include) -if(CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND CGAL_Core_FOUND) +if(CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND)) # ui files, created with Qt Designer qt5_wrap_ui( UIS HDT2.ui ) @@ -29,5 +30,5 @@ if(CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND CGAL_Core_FOUND) add_executable ( HDT2 HDT2.cpp ${CGAL_Qt5_RESOURCE_FILES} ${RESOURCE_FILES} ${UIS}) target_link_libraries ( HDT2 CGAL::CGAL CGAL::CGAL_Qt5 CGAL::CGAL_Core Qt5::Widgets) else() - message(STATUS "NOTICE: This demo requires CGAL, CGAL_Core, and Qt5 and will not be compiled.") + message(STATUS "NOTICE: This demo requires CGAL, CGAL_Core (or LEDA), and Qt5 and will not be compiled.") endif() diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp index b2c5c9e40d2..74019796910 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp @@ -10,7 +10,6 @@ #include #else #include - #include #include #include #endif diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h index df10e70a3ba..e5fe38fbe83 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h @@ -463,7 +463,6 @@ private: } // end namespace internal -//template > template class Hyperbolic_Delaunay_triangulation_traits_2 diff --git a/INSTALL.md b/INSTALL.md index 3ac7e62e3a4..ca09f887112 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -13,7 +13,7 @@ Branch Build of CGAL The cmake script at the root of the repository is the one to use to build the CGAL library from a branch. It will collect the list of packages of the branch and will append their include folder to the include path. -This is main noticable difference with a build using a regular *flat* release. +This is main noticeable difference with a build using a regular *flat* release. Here is an example of how to build the library in Debug: ``` {.bash} diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 508db3bba54..699531a55c5 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -6,7 +6,31 @@ Release 5.0 Release date: September 2019 -### Polygon Mesh Processing package +### 2D Triangulations + +- **Breaking change**: Removed the functions `CGAL::Constrained_triangulation_plus_2:: + vertices_in_constraint_{begin/end}(Vertex_handle va, Vertex_handle vb) const;`, + and `CGAL::Constrained_triangulation_plus_2::remove_constraint((Vertex_handle va, Vertex_handle vb)`, + that is a pair of vertex handles is no longer a key for a polyline constraint. + Users must use a version prior to 5.0 if they need this functionality. +- **Breaking change**: Removed the deprecated classes `CGAL::Regular_triangulation_euclidean_traits_2`, `CGAL::Regular_triangulation_filtered_traits_2`. Users must use a version prior to 5.0 if they need these classes. + +### Surface Mesh + - New functions to read and write using the PLY format, + `CGAL::read_ply()` and `CGAL::write_ply()`, allowing to save and + load additional property maps of the surface mesh. + +### 3D Point Set + - The PLY IO functions now take an additional optional parameter to + read/write comments from/in the PLY header. + +### Point Set Processing + - **Breaking change**: the old API using iterators and overloads + for optional parameters is now removed (it was deprecated since + CGAL 4.12). The current (and now only) API uses ranges and Named + Parameters. + +### Polygon Mesh Processing - Added the function `CGAL::Polygon_mesh_processing::centroid()` which computes the centroid of a closed triangle mesh. @@ -16,6 +40,8 @@ Release date: September 2019 ### Shape Detection - Added a new generic implementation of region growing. - New region growing can be launched on points in 2D and 3D and on a face graph. + - **Breaking change:** ShapeDetectionTraits is renamed to EfficientRANSACTraits. + - **Breaking change:** Shape_detection_3 namespace is renamed to Shape_detection. ### 3D Boolean Operations on Nef Polyhedra - Added a function to convert a Nef_polyhedron_3 to a polygon soup: `CGAL::convert_nef_to_polygon_soup()` @@ -29,11 +55,11 @@ Release date: September 2019 ### IO Streams - Added new functions to support some parts of the WKT file format: - `CGAL::read_point_WKT()` - - `GCAL::read_multi_point_WKT()` - - `GCAL::read_linestring_WKT()` - - `GCAL::read_multi_linestring_WKT()` - - `GCAL::read_polygon_WKT()` - - `GCAL::read_multi_polygon_WKT()` + - `CGAL::read_multi_point_WKT()` + - `CGAL::read_linestring_WKT()` + - `CGAL::read_multi_linestring_WKT()` + - `CGAL::read_polygon_WKT()` + - `CGAL::read_multi_polygon_WKT()` - `CGAL::write_point_WKT()` - `CGAL::write_polygon_WKT()` - `CGAL::write_linestring_WKT()` @@ -3776,7 +3802,7 @@ static runtime (/ML). algorithm for placing streamlines in 2D vector fields. It generates a list of streamlines corresponding to an input flow using a specified separating distance. The algorithm uses a Delaunay - triangulation to model objects and adress different queries, and + triangulation to model objects and address different queries, and relies on choosing the centers of the biggest empty circles to start the integration of the streamlines. - Kinetic Data Structures (new package) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 7084d430d83..67c02505d4e 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -570,8 +570,8 @@ message("== Detect external libraries ==") # Remarks: # External libs configured when Qt5 lib of cgal are required # Coin is used in KDS, but no FindCoin or FindCOIN exists -# There exists FindF2C, FindIPE, FindMKL, but they are only used to support supporting libs -list (INSERT CGAL_SUPPORTING_3RD_PARTY_LIBRARIES 0 GMP MPFR ZLIB OpenGL LEDA MPFI RS RS3 OpenNL Eigen3 BLAS LAPACK ESBTL Coin3D NTL IPE) +# There exists FindIPE, FindMKL, but they are only used to support supporting libs +list (INSERT CGAL_SUPPORTING_3RD_PARTY_LIBRARIES 0 GMP MPFR ZLIB OpenGL LEDA MPFI RS RS3 OpenNL Eigen3 ESBTL Coin3D NTL IPE) if (NOT WIN32) # GMPXX is not supported on WIN32 machines list (INSERT CGAL_SUPPORTING_3RD_PARTY_LIBRARIES 1 GMPXX) @@ -613,6 +613,8 @@ if(CGAL_DISABLE_GMP) unset(WITH_CGAL_Core CACHE) unset(WITH_GMP) unset(WITH_GMP CACHE) + unset(CGAL_USE_GMP) + unset(CGAL_USE_GMP CACHE) unset(WITH_GMPXX) unset(WITH_GMPXX CACHE) unset(WITH_MPFR) diff --git a/Installation/INSTALL.md b/Installation/INSTALL.md index 58557c70614..c14c6ec5493 100644 --- a/Installation/INSTALL.md +++ b/Installation/INSTALL.md @@ -60,7 +60,7 @@ CGAL packages, some are only needed for demos. * Visualization Required for most demos - - Qt5 (>= 5.3) + - Qt5 (>= 5.9) http://qt-project.org/ - Geomview @@ -76,14 +76,6 @@ CGAL packages, some are only needed for demos. * Surface Reconstruction from Point Sets http://eigen.tuxfamily.org/index.php?title=Main_Page - - BLAS, LAPACK, ATLAS - Required by the packages (if EIGEN is not available): - * Estimation of Local Differential Properties of Point-Sampled Surfaces - * Approximation of Ridges and Umbilics on Triangulated Surface Meshes - * Planar Parameterization of Triangulated Surface Meshes - http://www.netlib.org/blas/, http://www.netlib.org/lapack/ - or precompiled version that can be downloaded with CGAL-x.y-Setup.exe - - MPFI Required by the package: * Algebraic Kernel diff --git a/Installation/cmake/modules/CGALConfig_binary.cmake.in b/Installation/cmake/modules/CGALConfig_binary.cmake.in index c02461bed86..23a6399923e 100644 --- a/Installation/cmake/modules/CGALConfig_binary.cmake.in +++ b/Installation/cmake/modules/CGALConfig_binary.cmake.in @@ -188,6 +188,7 @@ set(CGAL_DISABLE_GMP "@CGAL_DISABLE_GMP@") include(${CGAL_MODULES_DIR}/CGAL_CreateSingleSourceCGALProgram.cmake) include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) include(${CGAL_MODULES_DIR}/CGAL_Common.cmake) +include(${CGAL_MODULES_DIR}/CGAL_TweakFindBoost.cmake) # Temporary? Change the CMAKE module path cgal_setup_module_path() diff --git a/Installation/cmake/modules/CGALConfig_install.cmake.in b/Installation/cmake/modules/CGALConfig_install.cmake.in index 228c58c6aae..a97e23a1a8b 100644 --- a/Installation/cmake/modules/CGALConfig_install.cmake.in +++ b/Installation/cmake/modules/CGALConfig_install.cmake.in @@ -163,6 +163,7 @@ set(CGAL_DISABLE_GMP "@CGAL_DISABLE_GMP@") include(${CGAL_MODULES_DIR}/CGAL_CreateSingleSourceCGALProgram.cmake) include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) include(${CGAL_MODULES_DIR}/CGAL_Common.cmake) +include(${CGAL_MODULES_DIR}/CGAL_TweakFindBoost.cmake) # Temporary? Change the CMAKE module path cgal_setup_module_path() diff --git a/Installation/cmake/modules/CGAL_Locate_CGAL_TAUCS.cmake b/Installation/cmake/modules/CGAL_Locate_CGAL_TAUCS.cmake deleted file mode 100644 index ca4470a2124..00000000000 --- a/Installation/cmake/modules/CGAL_Locate_CGAL_TAUCS.cmake +++ /dev/null @@ -1,121 +0,0 @@ -# Find TAUCS library shipped with CGAL -# -# This module searches for TAUCS in CGAL "auxiliary" folder -# and in in $CGAL_TAUCS_DIR environment variable. -# -# This module sets the following variables: -# CGAL_TAUCS_FOUND - set to true if TAUCS library shipped with CGAL -# is found -# CGAL_TAUCS_PLATFORM - name of TAUCS subfolder corresponding to the current compiler -# CGAL_TAUCS_INCLUDE_DIR - list of folders (using full path name) containing -# TAUCS (and optionaly BLAS and LAPACK) headers -# CGAL_TAUCS_LIBRARIES_DIR -list of folders (using full path name) containing -# TAUCS (and optionaly BLAS and LAPACK) libraries - -include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Macros.cmake) - -if ( NOT CGAL_TAUCS_FOUND ) - - # - # Find out TAUCS name for the current platform. - # This code is a translation of TAUCS "configure" script. - # - - # The first task is to figure out CMAKE_SYSTEM_NAME - # (on unix this is uname -s, for windows it is Windows). - #message("DEBUG: CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}") - #message("DEBUG: CMAKE_SYSTEM_PROCESSOR = ${CMAKE_SYSTEM_PROCESSOR}") - set( CGAL_TAUCS_PLATFORM "${CMAKE_SYSTEM_NAME}" ) - - # Convert to lower case - STRING(TOLOWER "${CGAL_TAUCS_PLATFORM}" CGAL_TAUCS_PLATFORM) - - # Sometimes uname returns a value that is - # inconsistent with the way CGAL_TAUCS_PLATFORM is set. For example, on - # Solaris, CGAL_TAUCS_PLATFORM=solaris but uname returns SunOS. - if ( ${CGAL_TAUCS_PLATFORM} STREQUAL "sunos" ) - set( CGAL_TAUCS_PLATFORM "solaris" ) - endif() - if ( ${CGAL_TAUCS_PLATFORM} STREQUAL "windows" ) - set( CGAL_TAUCS_PLATFORM "win32" ) - endif() - - # LS 2007: added "darwin_intel" for Intel Macs. - # "darwin" = original Darwin platform = PowerPC architecture. - if ( ${CGAL_TAUCS_PLATFORM} STREQUAL "darwin" ) - # CMAKE_SYSTEM_PROCESSOR=uname -p - if ( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386" ) - set( CGAL_TAUCS_PLATFORM "darwin_intel" ) - endif() - endif() - - # LS 2007: append "64" if 64 bits processor (tested on Linux only) - - if ( ${CGAL_TAUCS_PLATFORM} STREQUAL "linux" ) - # CMAKE_SYSTEM_PROCESSOR=uname -p - if ( ${CMAKE_SYSTEM_PROCESSOR} MATCHES ".*64.*" ) - set( CGAL_TAUCS_PLATFORM "${CGAL_TAUCS_PLATFORM}64" ) - endif() - endif() - - #message("DEBUG: CGAL_TAUCS_PLATFORM = ${CGAL_TAUCS_PLATFORM}") - - - # - # Search for TAUCS folder. - # - - #message("DEBUG: CGAL_INSTALLATION_PACKAGE_DIR = ${CGAL_INSTALLATION_PACKAGE_DIR}") - - # VC++ uses auto-link, thus we search for a folder containing the output of - # build_taucs_win32_for_CGAL.bat/build_taucs_win64_for_CGAL.bat, - # ie TAUCS libraries compiled for all Windows runtimes. - if ( MSVC ) - - # Check $CGAL_TAUCS_DIR environment variable - fetch_env_var(CGAL_TAUCS_DIR) - #message("DEBUG: CGAL_TAUCS_DIR = ${CGAL_TAUCS_DIR}") - if (NOT "${CGAL_TAUCS_DIR}" STREQUAL "" AND EXISTS ${CGAL_TAUCS_DIR}) - - set( CGAL_TAUCS_INCLUDE_DIR "${CGAL_TAUCS_DIR}/include") - set( CGAL_TAUCS_LIBRARIES_DIR "${CGAL_TAUCS_DIR}/lib" ) - set( CGAL_TAUCS_FOUND TRUE ) - - # Else, search for TAUCS in CGAL "auxiliary" folder - elseif ( EXISTS "${CGAL_INSTALLATION_PACKAGE_DIR}/auxiliary/taucs/include/taucs.h" AND - EXISTS "${CGAL_INSTALLATION_PACKAGE_DIR}/auxiliary/taucs/lib" ) - - set( CGAL_TAUCS_INCLUDE_DIR "${CGAL_INSTALLATION_PACKAGE_DIR}/auxiliary/taucs/include") - set( CGAL_TAUCS_LIBRARIES_DIR "${CGAL_INSTALLATION_PACKAGE_DIR}/auxiliary/taucs/lib" ) - set( CGAL_TAUCS_FOUND TRUE ) - - endif() - - # On Unix, search for TAUCS "taucs_full" folder - else ( MSVC ) - - # Check $CGAL_TAUCS_DIR environment variable - fetch_env_var(CGAL_TAUCS_DIR) - #message("DEBUG: CGAL_TAUCS_DIR = ${CGAL_TAUCS_DIR}") - if (NOT "${CGAL_TAUCS_DIR}" STREQUAL "" AND EXISTS ${CGAL_TAUCS_DIR}) - - set( CGAL_TAUCS_INCLUDE_DIR "${CGAL_TAUCS_DIR}/build/${CGAL_TAUCS_PLATFORM}" - "${CGAL_TAUCS_DIR}/src" ) - set( CGAL_TAUCS_LIBRARIES_DIR "${CGAL_TAUCS_DIR}/external/lib/${CGAL_TAUCS_PLATFORM}" - "${CGAL_TAUCS_DIR}/lib/${CGAL_TAUCS_PLATFORM}" ) - set( CGAL_TAUCS_FOUND TRUE ) - - endif() - - endif ( MSVC ) - - # Add variables to cache - set( CGAL_TAUCS_DIR "${CGAL_TAUCS_DIR}" - CACHE PATH "Directory containing BLAS, LAPACK and TAUCS" ) - - #message("DEBUG: CGAL_TAUCS_INCLUDE_DIR = ${CGAL_TAUCS_INCLUDE_DIR}") - #message("DEBUG: CGAL_TAUCS_LIBRARIES_DIR = ${CGAL_TAUCS_LIBRARIES_DIR}") - #message("DEBUG: CGAL_TAUCS_FOUND = ${CGAL_TAUCS_FOUND}") - -endif ( NOT CGAL_TAUCS_FOUND ) - diff --git a/Installation/cmake/modules/CGAL_SetupBoost.cmake b/Installation/cmake/modules/CGAL_SetupBoost.cmake index 9adae23ebca..758736e3dd0 100644 --- a/Installation/cmake/modules/CGAL_SetupBoost.cmake +++ b/Installation/cmake/modules/CGAL_SetupBoost.cmake @@ -50,7 +50,7 @@ else() find_package( Boost 1.48 REQUIRED ) endif() -if(Boost_FOUND) +if(Boost_FOUND AND Boost_VERSION VERSION_LESS 1.70) if(DEFINED Boost_DIR AND NOT Boost_DIR) # Unset that cache variable that is set in the cache by FindBoost # (while it was searching for boost-cmake). @@ -92,6 +92,13 @@ function(use_CGAL_Boost_support target) if(NOT CGAL_Boost_USE_STATIC_LIBS AND CGAL_AUTO_LINK_ENABLED) target_compile_definitions(${target} ${keyword} BOOST_ALL_DYN_LINK=1) endif() - target_include_directories(${target} SYSTEM ${keyword} ${Boost_INCLUDE_DIRS}) - target_link_libraries(${target} ${keyword} ${Boost_LIBRARIES}) + if(TARGET Boost::boost) + target_link_libraries(${target} ${keyword} Boost::boost) + if (CGAL_requires_Boost_libs) + target_link_libraries(${target} ${keyword} Boost::thread) + endif() + else() + target_include_directories(${target} SYSTEM ${keyword} ${Boost_INCLUDE_DIRS}) + target_link_libraries(${target} ${keyword} ${Boost_LIBRARIES}) + endif() endfunction() diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake index 66e7007f3d1..6c0f2ad214d 100644 --- a/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake @@ -54,8 +54,9 @@ endif() # # See the release notes of CGAL-4.10: CGAL_Core now requires -# Boost.Thread, with all compilers but MSVC. -if (NOT MSVC) +# Boost.Thread, with GNU G++. +if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) + include(${CMAKE_CURRENT_LIST_DIR}/CGAL_TweakFindBoost.cmake) find_package( Boost 1.48 REQUIRED COMPONENTS thread system ) endif() @@ -71,8 +72,8 @@ function(CGAL_setup_CGAL_Core_dependencies target) target_link_libraries( CGAL_Core ${keyword} CGAL::CGAL ) # See the release notes of CGAL-4.10: CGAL_Core now requires - # Boost.Thread, with all compilers but MSVC. - if (NOT MSVC) + # Boost.Thread, with GNU G++. + if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) if(TARGET Boost::thread) target_link_libraries( CGAL_Core ${keyword} Boost::thread) else() diff --git a/Installation/cmake/modules/CGAL_TweakFindBoost.cmake b/Installation/cmake/modules/CGAL_TweakFindBoost.cmake index 408f7906e74..312e347f6dc 100644 --- a/Installation/cmake/modules/CGAL_TweakFindBoost.cmake +++ b/Installation/cmake/modules/CGAL_TweakFindBoost.cmake @@ -29,16 +29,19 @@ if( NOT CGAL_TweakFindBoost ) cmake_policy(SET CMP0077 NEW) endif() if(DEFINED CGAL_Boost_USE_STATIC_LIBS) - # If the option is loaded from CGALConfig.h, use its value as default + # If the option is loaded from CGALConfig.cmake, use its value as default # value. But the user will still have the choice to change the # value. That means that we can build the CGAL libraries using static # or shared Boost libraries, and after build programs using CGAL with a # different setting for Boost libraries. set(CGAL_Boost_USE_STATIC_LIBS_DEFAULT ${CGAL_Boost_USE_STATIC_LIBS}) else() - # Else the option is OFF by default. That means the use of shared Boost - # libraries is the default. - set(CGAL_Boost_USE_STATIC_LIBS_DEFAULT OFF) + # Else the option default is related to BUILD_SHARED_LIBS. + if(BUILD_SHARED_LIBS OR NOT DEFINED BUILD_SHARED_LIBS) + set(CGAL_Boost_USE_STATIC_LIBS_DEFAULT OFF) + else() + set(CGAL_Boost_USE_STATIC_LIBS_DEFAULT ON) + endif() endif() option(Boost_DEBUG "Activate the debug messages of the script FindBoost" OFF) @@ -62,6 +65,26 @@ if( NOT CGAL_TweakFindBoost ) endif() set(Boost_ADDITIONAL_VERSIONS + "1.89.1" "1.89.0" "1.89" + "1.88.1" "1.88.0" "1.88" + "1.87.1" "1.87.0" "1.87" + "1.86.1" "1.86.0" "1.86" + "1.85.1" "1.85.0" "1.85" + "1.84.1" "1.84.0" "1.84" + "1.83.1" "1.83.0" "1.83" + "1.82.1" "1.82.0" "1.82" + "1.81.1" "1.81.0" "1.81" + "1.80.1" "1.80.0" "1.80" + "1.79.1" "1.79.0" "1.79" + "1.78.1" "1.78.0" "1.78" + "1.77.1" "1.77.0" "1.77" + "1.76.1" "1.76.0" "1.76" + "1.75.1" "1.75.0" "1.75" + "1.74.1" "1.74.0" "1.74" + "1.73.1" "1.73.0" "1.73" + "1.72.1" "1.72.0" "1.72" + "1.71.1" "1.71.0" "1.71" + "1.70.1" "1.70.0" "1.70" "1.69.1" "1.69.0" "1.69" "1.68.1" "1.68.0" "1.68" "1.67.1" "1.67.0" "1.67" @@ -75,27 +98,8 @@ if( NOT CGAL_TweakFindBoost ) "1.59.1" "1.59.0" "1.59" "1.58.1" "1.58.0" "1.58" "1.57.1" "1.57.0" "1.57" - "1.56.1" "1.56.0" "1.56" - "1.55.1" "1.55.0" "1.55" - "1.54.1" "1.54.0" "1.54" - "1.53.1" "1.53.0" "1.53" - "1.52.1" "1.52.0" "1.52" - "1.51.1" "1.51.0" "1.51" - "1.50.1" "1.50.0" "1.50" - "1.49.1" "1.49.0" "1.49" - "1.48.1" "1.48.0" "1.48" - "1.47.1" "1.47.0" "1.47" - "1.46.1" "1.46.0" "1.46" - "1.45.1" "1.45.0" "1.45" - "1.44.1" "1.44.0" "1.44" - "1.43.1" "1.43.0" "1.43" - "1.42.1" "1.42.0" "1.42" - "1.41.1" "1.41.0" "1.41" - "1.40.1" "1.40.0" "1.40" - "1.39.1" "1.39.0" "1.39" - "1.38.1" "1.38.0" "1.38" - "1.37.1" "1.37.0" "1.37") + ) - set(CGAL_TweakFindBoost) + set(CGAL_TweakFindBoost ON) endif() diff --git a/Installation/cmake/modules/CGAL_UseBLAS.cmake b/Installation/cmake/modules/CGAL_UseBLAS.cmake deleted file mode 100644 index 941b795ba78..00000000000 --- a/Installation/cmake/modules/CGAL_UseBLAS.cmake +++ /dev/null @@ -1,36 +0,0 @@ -# This module setups the compiler for the BLAS libraries. -# It assumes that find_package(BLAS) was already called. - -if ( BLAS_FOUND AND NOT BLAS_SETUP ) - - message( STATUS "UseBLAS" ) - message( STATUS "BLAS include: ${BLAS_INCLUDE_DIR}" ) - include_directories ( SYSTEM ${BLAS_INCLUDE_DIR} ) - - message( STATUS "BLAS definitions: ${BLAS_DEFINITIONS}" ) - add_definitions( ${BLAS_DEFINITIONS} ) - if ( "${BLAS_DEFINITIONS}" MATCHES ".*BLAS_USE_F2C.*" ) - add_definitions( "-DCGAL_USE_F2C" ) - endif() - - if (BLAS_LIBRARIES_DIR) - message( STATUS "BLAS library directories: ${BLAS_LIBRARIES_DIR}" ) - link_directories( ${BLAS_LIBRARIES_DIR} ) - endif() - if (BLAS_LIBRARIES) - message( STATUS "BLAS libraries: ${BLAS_LIBRARIES}" ) - link_libraries( ${BLAS_LIBRARIES} ) - endif() - - message( STATUS "BLAS link flags: ${BLAS_LINKER_FLAGS}" ) - if ( BUILD_SHARED_LIBS ) - uniquely_add_flags( CMAKE_SHARED_LINKER_FLAGS ${BLAS_LINKER_FLAGS} ) - else() - uniquely_add_flags( CMAKE_MODULE_LINKER_FLAGS ${BLAS_LINKER_FLAGS} ) - endif() - - # Setup is done - set ( BLAS_SETUP TRUE ) - -endif() - diff --git a/Installation/cmake/modules/CGAL_UseLAPACK.cmake b/Installation/cmake/modules/CGAL_UseLAPACK.cmake deleted file mode 100644 index 89790863a72..00000000000 --- a/Installation/cmake/modules/CGAL_UseLAPACK.cmake +++ /dev/null @@ -1,41 +0,0 @@ -# This module setups the compiler for the LAPACK libraries. -# It assumes that find_package(LAPACK) was already called. - -if ( LAPACK_FOUND AND NOT LAPACK_SETUP ) - - message( STATUS "UseLAPACK" ) - message( STATUS "LAPACK include: ${LAPACK_INCLUDE_DIR}" ) - include_directories ( SYSTEM ${LAPACK_INCLUDE_DIR} ) - - message( STATUS "LAPACK definitions: ${LAPACK_DEFINITIONS}" ) - add_definitions( ${LAPACK_DEFINITIONS} ) - if ( "${LAPACK_DEFINITIONS}" MATCHES ".*LAPACK_USE_F2C.*" ) - add_definitions( "-DCGAL_USE_F2C" ) - endif() - - if (LAPACK_LIBRARIES_DIR) - message( STATUS "LAPACK library directories: ${LAPACK_LIBRARIES_DIR}" ) - link_directories( ${LAPACK_LIBRARIES_DIR} ) - endif() - if (LAPACK_LIBRARIES) - message( STATUS "LAPACK libraries: ${LAPACK_LIBRARIES}" ) - link_libraries( ${LAPACK_LIBRARIES} ) - endif() - - message( STATUS "LAPACK link flags: ${LAPACK_LINKER_FLAGS}" ) - if ( BUILD_SHARED_LIBS ) - uniquely_add_flags( CMAKE_SHARED_LINKER_FLAGS ${LAPACK_LINKER_FLAGS} ) - else() - uniquely_add_flags( CMAKE_MODULE_LINKER_FLAGS ${LAPACK_LINKER_FLAGS} ) - endif() - - # LAPACK requires BLAS - include( ${BLAS_USE_FILE} ) - - # Setup is done - set ( LAPACK_SETUP TRUE ) - - add_definitions(-DCGAL_LAPACK_ENABLED) - -endif() - diff --git a/Installation/cmake/modules/CGAL_UseTAUCS.cmake b/Installation/cmake/modules/CGAL_UseTAUCS.cmake deleted file mode 100644 index b980dee1d31..00000000000 --- a/Installation/cmake/modules/CGAL_UseTAUCS.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# This module setups the compiler for the TAUCS libraries. -# It assumes that find_package(TAUCS) was already called. - -if ( TAUCS_FOUND AND NOT TAUCS_SETUP ) - - message( STATUS "UseTAUCS" ) - message( STATUS "TAUCS include: ${TAUCS_INCLUDE_DIR}" ) - include_directories ( SYSTEM ${TAUCS_INCLUDE_DIR} ) - - message( STATUS "TAUCS definitions: ${TAUCS_DEFINITIONS}" ) - add_definitions( ${TAUCS_DEFINITIONS} "-DCGAL_USE_TAUCS" ) - - if (TAUCS_LIBRARIES_DIR) - message( STATUS "TAUCS library directories: ${TAUCS_LIBRARIES_DIR}" ) - link_directories( ${TAUCS_LIBRARIES_DIR} ) - endif() - if (TAUCS_LIBRARIES) - message( STATUS "TAUCS libraries: ${TAUCS_LIBRARIES}" ) - link_libraries( ${TAUCS_LIBRARIES} ) - endif() - - # TAUCS requires BLAS and LAPACK - include( ${LAPACK_USE_FILE} ) - - # Setup is done - set ( TAUCS_SETUP TRUE ) - - add_definitions(-DCGAL_TAUCS_ENABLED) - -endif() - diff --git a/Installation/cmake/modules/CGAL_add_test.cmake b/Installation/cmake/modules/CGAL_add_test.cmake index 1a2bc19f544..926b8bb9948 100644 --- a/Installation/cmake/modules/CGAL_add_test.cmake +++ b/Installation/cmake/modules/CGAL_add_test.cmake @@ -114,7 +114,12 @@ function(cgal_setup_test_properties test_name) APPEND PROPERTY DEPENDS "compilation_of__${exe_name}") endif() - if(POLICY CMP0066) # CMake 3.7 or later + get_filename_component(_source_dir_abs ${CMAKE_CURRENT_SOURCE_DIR} ABSOLUTE) + get_filename_component(_binary_dir_abs ${CMAKE_CURRENT_BINARY_DIR} ABSOLUTE) + string(FIND "${_binary_dir_abs}" "${_source_dir_abs}" _search_binary_in_source) + + if(_search_binary_in_source EQUAL "-1" + AND POLICY CMP0066) # CMake 3.7 or later if(NOT TEST ${PROJECT_NAME}_SetupFixture) if(ANDROID) add_test(NAME ${PROJECT_NAME}_SetupFixture diff --git a/Installation/cmake/modules/FindBLAS.cmake b/Installation/cmake/modules/FindBLAS.cmake deleted file mode 100644 index 34f5bb5fdf2..00000000000 --- a/Installation/cmake/modules/FindBLAS.cmake +++ /dev/null @@ -1,498 +0,0 @@ -# Find BLAS library -# -# This module finds an installed library that implements the BLAS -# linear-algebra interface (see http://www.netlib.org/blas/). -# The list of libraries searched for is mainly taken -# from the autoconf macro file, acx_blas.m4 (distributed at -# http://ac-archive.sourceforge.net/ac-archive/acx_blas.html). -# -# This module sets the following variables: -# BLAS_FOUND - set to true if a library implementing the BLAS interface -# is found -# BLAS_INCLUDE_DIR - Directories containing the BLAS header files -# BLAS_DEFINITIONS - Compilation options to use BLAS -# BLAS_LINKER_FLAGS - Linker flags to use BLAS (excluding -l -# and -L). -# BLAS_LIBRARIES_DIR - Directories containing the BLAS libraries. -# May be null if BLAS_LIBRARIES contains libraries name using full path. -# BLAS_LIBRARIES - List of libraries to link against BLAS interface. -# May be null if the compiler supports auto-link (e.g. VC++). -# BLAS_USE_FILE - The name of the cmake module to include to compile -# applications or libraries using BLAS. -# -# This module was modified by CGAL team: -# - find BLAS library shipped with TAUCS -# - find libraries for a C++ compiler, instead of Fortran -# - added BLAS_INCLUDE_DIR, BLAS_DEFINITIONS and BLAS_LIBRARIES_DIR -# - removed BLAS95_LIBRARIES -# -# TODO (CGAL): -# - find CBLAS (http://www.netlib.org/cblas) on Unix? - - -include(CheckFunctionExists) - -include(${CMAKE_CURRENT_LIST_DIR}/CGAL_GeneratorSpecificSettings.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Macros.cmake) - - -# This macro checks for the existence of the combination of fortran libraries -# given by _list. If the combination is found, this macro checks (using the -# check_function_exists macro) whether can link against that library -# combination using the name of a routine given by _name using the linker -# flags given by _flags. If the combination of libraries is found and passes -# the link test, LIBRARIES is set to the list of complete library paths that -# have been found and DEFINITIONS to the required definitions. -# Otherwise, LIBRARIES is set to FALSE. -# N.B. _prefix is the prefix applied to the names of all cached variables that -# are generated internally and marked advanced by this macro. -macro(check_fortran_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _path) - #message("DEBUG: check_fortran_libraries(${_list} in ${_path})") - - # Check for the existence of the libraries given by _list - set(_libraries_found TRUE) - set(_libraries_work FALSE) - set(${DEFINITIONS} "") - set(${LIBRARIES} "") - set(_combined_name) - foreach(_library ${_list}) - set(_combined_name ${_combined_name}_${_library}) - - if(_libraries_found) - # search first in ${_path} - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS ${_path} NO_DEFAULT_PATH - ) - # if not found, search in environment variables and system - if ( WIN32 ) - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS ENV LIB - ) - elseif ( APPLE ) - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH - ) - else () - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH - ) - endif() - #message("DEBUG: find_library(${_library}) = ${${_prefix}_${_library}_LIBRARY}") - mark_as_advanced(${_prefix}_${_library}_LIBRARY) - set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) - set(_libraries_found ${${_prefix}_${_library}_LIBRARY}) - endif(_libraries_found) - endforeach(_library ${_list}) - if(_libraries_found) - set(_libraries_found ${${LIBRARIES}}) - endif() - - # Test this combination of libraries with the Fortran/f2c interface. - # We test the Fortran interface first as it is well standardized. - if(_libraries_found AND NOT _libraries_work) - set(${DEFINITIONS} "-D${_prefix}_USE_F2C") - set(${LIBRARIES} ${_libraries_found}) - # Some C++ linkers require the f2c library to link with Fortran libraries. - # I do not know which ones, thus I just add the f2c library if it is available. - find_package( F2C QUIET ) - if ( F2C_FOUND ) - set(${DEFINITIONS} ${${DEFINITIONS}} ${F2C_DEFINITIONS}) - set(${LIBRARIES} ${${LIBRARIES}} ${F2C_LIBRARIES}) - endif() - set(CMAKE_REQUIRED_DEFINITIONS ${${DEFINITIONS}}) - set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}}) - #message("DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}") - #message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}") - # Check if function exists with f2c calling convention (ie a trailing underscore) - check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS) - #message("DEBUG: check_function_exists(${_name}_) = ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS}") - set(CMAKE_REQUIRED_DEFINITIONS} "") - set(CMAKE_REQUIRED_LIBRARIES "") - mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS) - set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS}) - endif(_libraries_found AND NOT _libraries_work) - - # If not found, test this combination of libraries with a C interface. - # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard. - if(_libraries_found AND NOT _libraries_work) - set(${DEFINITIONS} "") - set(${LIBRARIES} ${_libraries_found}) - set(CMAKE_REQUIRED_DEFINITIONS "") - set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}}) - #message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}") - check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS) - #message("DEBUG: check_function_exists(${_name}) = ${${_prefix}_${_name}${_combined_name}_WORKS}") - set(CMAKE_REQUIRED_LIBRARIES "") - mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS) - set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS}) - endif(_libraries_found AND NOT _libraries_work) - - # on failure - if(NOT _libraries_work) - set(${DEFINITIONS} "") - set(${LIBRARIES} FALSE) - endif() - #message("DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}") - #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}") -endmacro(check_fortran_libraries) - - -# -# main -# - -# Is it already configured? -if (BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES) - - set(BLAS_FOUND TRUE) - -else() - - # reset variables - set( BLAS_INCLUDE_DIR "" ) - set( BLAS_DEFINITIONS "" ) - set( BLAS_LINKER_FLAGS "" ) - set( BLAS_LIBRARIES "" ) - set( BLAS_LIBRARIES_DIR "" ) - - # Look first for the TAUCS library distributed with CGAL in auxiliary/taucs. - # Set CGAL_TAUCS_FOUND, CGAL_TAUCS_INCLUDE_DIR and CGAL_TAUCS_LIBRARIES_DIR. - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Locate_CGAL_TAUCS.cmake) - - # Search for BLAS in CGAL_TAUCS_INCLUDE_DIR/CGAL_TAUCS_LIBRARIES_DIR (TAUCS shipped with CGAL)... - if(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED) - - # if VC++: done - set( BLAS_INCLUDE_DIR "${CGAL_TAUCS_INCLUDE_DIR}" ) - set( BLAS_LIBRARIES_DIR "${CGAL_TAUCS_LIBRARIES_DIR}" ) - - # ...else search for BLAS in $BLAS_LIB_DIR environment variable - else(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED) - - # - # Search for BLAS in possible libraries - # in $BLAS_LIB_DIR environment variable and in usual places. - # - - # Read environment variables - fetch_env_var(BLAS_LIB_DIR) - fetch_env_var(MKL_LIB_DIR) - - # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "cblas;f77blas;atlas" - "${BLAS_LIB_DIR}" - ) - endif() - - # BLAS in PhiPACK libraries? (requires generic BLAS lib, too) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "sgemm;dgemm;blas" - "${BLAS_LIB_DIR}" - ) - endif() - - # BLAS in Alpha CXML library? - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "cxml" - "${BLAS_LIB_DIR}" - ) - endif() - - # BLAS in Alpha DXML library? (now called CXML, see above) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "dxml" - "${BLAS_LIB_DIR}" - ) - endif() - - # BLAS in Sun Performance library? - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "-xlic_lib=sunperf" - "sunperf;sunmath" - "${BLAS_LIB_DIR}" - ) - if(BLAS_LIBRARIES) - # Extra linker flag - set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf") - endif() - endif() - - # BLAS in SCSL library? (SGI/Cray Scientific Library) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "scsl" - "${BLAS_LIB_DIR}" - ) - endif() - - # BLAS in SGIMATH library? - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "complib.sgimath" - "${BLAS_LIB_DIR}" - ) - endif() - - # BLAS in IBM ESSL library? (requires generic BLAS lib, too) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "essl;blas" - "${BLAS_LIB_DIR}" - ) - endif() - - # intel mkl 10 library? - # TODO: add shared variants - if (WIN32) - # intel mkl library? (static, 32bit) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - SGEMM - "" - "mkl_intel_c;mkl_intel_thread;mkl_core;libiomp5md" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - - # intel mkl library? (static, ia64 and em64t 64 bit) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - SGEMM - "" - "mkl_intel_lp64;mkl_intel_thread_lp64;mkl_core;libiomp5md" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - else(WIN32) - # intel mkl library? (static, 32bit) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "mkl_intel;mkl_intel_thread;mkl_core;iomp5;pthread" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - - # intel mkl library? (static, ia64 and em64t 64 bit) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "mkl_intel_lp64;mkl_intel_thread_lp64;mkl_core;iomp5;pthread" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - endif (WIN32) - - # older versions of intel mkl libs - - # intel mkl library? (shared) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "mkl;guide;pthread" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - - # intel mkl library? (static, 32bit) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "mkl_ia32;guide;pthread" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - - # intel mkl library? (static, ia64 64bit) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "mkl_ipf;guide;pthread" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - - # intel mkl library? (static, em64t 64bit) - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "mkl_em64t;guide;pthread" - "${MKL_LIB_DIR} ${BLAS_LIB_DIR}" - ) - endif() - - #BLAS in acml library? - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "acml" - "${BLAS_LIB_DIR}" - ) - endif() - - # Apple BLAS library? - if(NOT BLAS_LIBRARIES) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "Accelerate" - "${BLAS_LIB_DIR}" - ) - endif() - - if ( NOT BLAS_LIBRARIES ) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "vecLib" - "${BLAS_LIB_DIR}" - ) - endif ( NOT BLAS_LIBRARIES ) - - # Generic BLAS library? - # This configuration *must* be the last try as this library is notably slow. - if ( NOT BLAS_LIBRARIES ) - check_fortran_libraries( - BLAS_DEFINITIONS - BLAS_LIBRARIES - BLAS - sgemm - "" - "blas" - "${BLAS_LIB_DIR}" - ) - endif() - - endif(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED) - - if(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES) - set(BLAS_FOUND TRUE) - else() - set(BLAS_FOUND FALSE) - endif() - - if(NOT BLAS_FIND_QUIETLY) - if(BLAS_FOUND) - message(STATUS "A library with BLAS API found.") - else(BLAS_FOUND) - if(BLAS_FIND_REQUIRED) - message(FATAL_ERROR "A required library with BLAS API not found. Please specify library location.") - else() - message(STATUS "A library with BLAS API not found. Please specify library location.") - endif() - endif(BLAS_FOUND) - endif(NOT BLAS_FIND_QUIETLY) - - # Add variables to cache - set( BLAS_INCLUDE_DIR "${BLAS_INCLUDE_DIR}" - CACHE PATH "Directories containing the BLAS header files" FORCE ) - set( BLAS_DEFINITIONS "${BLAS_DEFINITIONS}" - CACHE STRING "Compilation options to use BLAS" FORCE ) - set( BLAS_LINKER_FLAGS "${BLAS_LINKER_FLAGS}" - CACHE STRING "Linker flags to use BLAS" FORCE ) - set( BLAS_LIBRARIES "${BLAS_LIBRARIES}" - CACHE FILEPATH "BLAS libraries name" FORCE ) - set( BLAS_LIBRARIES_DIR "${BLAS_LIBRARIES_DIR}" - CACHE PATH "Directories containing the BLAS libraries" FORCE ) - - #message("DEBUG: BLAS_INCLUDE_DIR = ${BLAS_INCLUDE_DIR}") - #message("DEBUG: BLAS_DEFINITIONS = ${BLAS_DEFINITIONS}") - #message("DEBUG: BLAS_LINKER_FLAGS = ${BLAS_LINKER_FLAGS}") - #message("DEBUG: BLAS_LIBRARIES = ${BLAS_LIBRARIES}") - #message("DEBUG: BLAS_LIBRARIES_DIR = ${BLAS_LIBRARIES_DIR}") - #message("DEBUG: BLAS_FOUND = ${BLAS_FOUND}") - -endif(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES) - -if(BLAS_FOUND) - set(BLAS_USE_FILE "CGAL_UseBLAS") -endif(BLAS_FOUND) diff --git a/Installation/cmake/modules/FindF2C.cmake b/Installation/cmake/modules/FindF2C.cmake index 105a31632d2..c7fe3712365 100644 --- a/Installation/cmake/modules/FindF2C.cmake +++ b/Installation/cmake/modules/FindF2C.cmake @@ -13,12 +13,7 @@ else(F2C_LIBRARIES) set(F2C_DEFINITIONS) - # F2C shipped with CGAL (as part of TAUCS)? - # If found, we will search for f2c library in ${CGAL_TAUCS_LIBRARIES_DIR}. - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Locate_CGAL_TAUCS.cmake) - find_library(F2C_LIBRARIES NAMES f2c g2c vcf2c - PATHS ${CGAL_TAUCS_LIBRARIES_DIR} DOC "F2C library" ) diff --git a/Installation/cmake/modules/FindLAPACK.cmake b/Installation/cmake/modules/FindLAPACK.cmake deleted file mode 100644 index 8612095f14e..00000000000 --- a/Installation/cmake/modules/FindLAPACK.cmake +++ /dev/null @@ -1,324 +0,0 @@ -# Find LAPACK library -# -# This module finds an installed library that implements the LAPACK -# linear-algebra interface (see http://www.netlib.org/lapack/). -# The approach follows mostly that taken for the autoconf macro file, acx_lapack.m4 -# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html). -# -# This module sets the following variables: -# LAPACK_FOUND - set to true if a library implementing the LAPACK interface -# is found -# LAPACK_INCLUDE_DIR - Directories containing the LAPACK header files -# LAPACK_DEFINITIONS - Compilation options to use LAPACK -# LAPACK_LINKER_FLAGS - Linker flags to use LAPACK (excluding -l -# and -L). -# LAPACK_LIBRARIES_DIR - Directories containing the LAPACK libraries. -# May be null if LAPACK_LIBRARIES contains libraries name using full path. -# LAPACK_LIBRARIES - List of libraries to link against LAPACK interface. -# May be null if the compiler supports auto-link (e.g. VC++). -# LAPACK_USE_FILE - The name of the cmake module to include to compile -# applications or libraries using LAPACK. -# -# This module was modified by CGAL team: -# - find LAPACK library shipped with TAUCS -# - find libraries for a C++ compiler, instead of Fortran -# - added LAPACK_INCLUDE_DIR, LAPACK_DEFINITIONS and LAPACK_LIBRARIES_DIR -# - removed LAPACK95_LIBRARIES -# -# TODO (CGAL): -# - find CLAPACK (http://www.netlib.org/clapack) on Unix? - - -include(CheckFunctionExists) - -include(${CMAKE_CURRENT_LIST_DIR}/CGAL_GeneratorSpecificSettings.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Macros.cmake) - - -# This macro checks for the existence of the combination of fortran libraries -# given by _list. If the combination is found, this macro checks (using the -# check_function_exists macro) whether can link against that library -# combination using the name of a routine given by _name using the linker -# flags given by _flags. If the combination of libraries is found and passes -# the link test, LIBRARIES is set to the list of complete library paths that -# have been found and DEFINITIONS to the required definitions. -# Otherwise, LIBRARIES is set to FALSE. -# N.B. _prefix is the prefix applied to the names of all cached variables that -# are generated internally and marked advanced by this macro. -macro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _blas _path) - #message("DEBUG: check_lapack_libraries(${_list} in ${_path} with ${_blas})") - - # Check for the existence of the libraries given by _list - set(_libraries_found TRUE) - set(_libraries_work FALSE) - set(${DEFINITIONS} "") - set(${LIBRARIES} "") - set(_combined_name) - foreach(_library ${_list}) - set(_combined_name ${_combined_name}_${_library}) - - if(_libraries_found) - # search first in ${_path} - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS ${_path} NO_DEFAULT_PATH - ) - # if not found, search in environment variables and system - if ( WIN32 ) - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS ENV LIB - ) - elseif ( APPLE ) - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH - ) - else () - find_library(${_prefix}_${_library}_LIBRARY - NAMES ${_library} - PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH - ) - endif() - #message("DEBUG: find_library(${_library}) = ${${_prefix}_${_library}_LIBRARY}") - mark_as_advanced(${_prefix}_${_library}_LIBRARY) - set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) - set(_libraries_found ${${_prefix}_${_library}_LIBRARY}) - endif(_libraries_found) - endforeach(_library ${_list}) - if(_libraries_found) - set(_libraries_found ${${LIBRARIES}}) - endif() - - # Test this combination of libraries with the Fortran/f2c interface. - # We test the Fortran interface first as it is well standardized. - if(_libraries_found AND NOT _libraries_work) - set(${DEFINITIONS} "-D${_prefix}_USE_F2C") - set(${LIBRARIES} ${_libraries_found}) - # Some C++ linkers require the f2c library to link with Fortran libraries. - # I do not know which ones, thus I just add the f2c library if it is available. - find_package( F2C QUIET ) - if ( F2C_FOUND ) - set(${DEFINITIONS} ${${DEFINITIONS}} ${F2C_DEFINITIONS}) - set(${LIBRARIES} ${${LIBRARIES}} ${F2C_LIBRARIES}) - endif() - set(CMAKE_REQUIRED_DEFINITIONS ${${DEFINITIONS}}) - set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas}) - #message("DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}") - #message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}") - # Check if function exists with f2c calling convention (ie a trailing underscore) - check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS) - #message("DEBUG: check_function_exists(${_name}_) = ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS}") - set(CMAKE_REQUIRED_DEFINITIONS} "") - set(CMAKE_REQUIRED_LIBRARIES "") - mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS) - set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS}) - endif(_libraries_found AND NOT _libraries_work) - - # If not found, test this combination of libraries with a C interface. - # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard. - if(_libraries_found AND NOT _libraries_work) - set(${DEFINITIONS} "") - set(${LIBRARIES} ${_libraries_found}) - set(CMAKE_REQUIRED_DEFINITIONS "") - set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas}) - #message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}") - check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS) - #message("DEBUG: check_function_exists(${_name}) = ${${_prefix}_${_name}${_combined_name}_WORKS}") - set(CMAKE_REQUIRED_LIBRARIES "") - mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS) - set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS}) - endif(_libraries_found AND NOT _libraries_work) - - # on failure - if(NOT _libraries_work) - set(${DEFINITIONS} "") - set(${LIBRARIES} FALSE) - endif() - #message("DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}") - #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}") -endmacro(check_lapack_libraries) - - -# -# main -# - -# LAPACK requires BLAS -if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) - find_package(BLAS) -else() - find_package(BLAS REQUIRED) -endif() - -if (NOT BLAS_FOUND) - - message(STATUS "LAPACK requires BLAS.") - set(LAPACK_FOUND FALSE) - -# Is it already configured? -elseif (LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES) - - set(LAPACK_FOUND TRUE) - -else() - - # reset variables - set( LAPACK_INCLUDE_DIR "" ) - set( LAPACK_DEFINITIONS "" ) - set( LAPACK_LINKER_FLAGS "" ) # unused (yet) - set( LAPACK_LIBRARIES "" ) - set( LAPACK_LIBRARIES_DIR "" ) - - # Look first for the TAUCS library distributed with CGAL in auxiliary/taucs. - # Set CGAL_TAUCS_FOUND, CGAL_TAUCS_INCLUDE_DIR and CGAL_TAUCS_LIBRARIES_DIR. - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Locate_CGAL_TAUCS.cmake) - - # Search for LAPACK in CGAL_TAUCS_INCLUDE_DIR/CGAL_TAUCS_LIBRARIES_DIR (TAUCS shipped with CGAL)... - if(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED) - - # if VC++: done - set( LAPACK_INCLUDE_DIR "${CGAL_TAUCS_INCLUDE_DIR}" ) - set( LAPACK_LIBRARIES_DIR "${CGAL_TAUCS_LIBRARIES_DIR}" ) - - # ...else in $LAPACK_LIB_DIR environment variable - else(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED) - - # - # Search for LAPACK in possible libraries - # in $LAPACK_LIB_DIR environment variable and in usual places. - # - - # Read environment variables - fetch_env_var(LAPACK_LIB_DIR) - fetch_env_var(MKL_LIB_DIR) - - #intel mkl 10 lapack? - if(NOT LAPACK_LIBRARIES) - check_lapack_libraries( - LAPACK_DEFINITIONS - LAPACK_LIBRARIES - LAPACK - cheev - "" - "mkl_core" - "${BLAS_LIBRARIES}" - "${MKL_LIB_DIR} ${LAPACK_LIB_DIR}" - ) - endif() - - # older versions of intel mkl lapack? - if(NOT LAPACK_LIBRARIES) - check_lapack_libraries( - LAPACK_DEFINITIONS - LAPACK_LIBRARIES - LAPACK - cheev - "" - "mkl_lapack" - "${BLAS_LIBRARIES}" - "${MKL_LIB_DIR} ${LAPACK_LIB_DIR}" - ) - endif() - - - #acml lapack? - if(NOT LAPACK_LIBRARIES) - check_lapack_libraries( - LAPACK_DEFINITIONS - LAPACK_LIBRARIES - LAPACK - cheev - "" - "acml" - "${BLAS_LIBRARIES}" - "${LAPACK_LIB_DIR}" - ) - endif() - - # Apple LAPACK library? - if(NOT LAPACK_LIBRARIES) - check_lapack_libraries( - LAPACK_DEFINITIONS - LAPACK_LIBRARIES - LAPACK - cheev - "" - "Accelerate" - "${BLAS_LIBRARIES}" - "${LAPACK_LIB_DIR}" - ) - endif() - - if ( NOT LAPACK_LIBRARIES ) - check_lapack_libraries( - LAPACK_DEFINITIONS - LAPACK_LIBRARIES - LAPACK - cheev - "" - "vecLib" - "${BLAS_LIBRARIES}" - "${LAPACK_LIB_DIR}" - ) - endif ( NOT LAPACK_LIBRARIES ) - - # Generic LAPACK library? - # This configuration *must* be the last try as this library is notably slow. - if ( NOT LAPACK_LIBRARIES ) - check_lapack_libraries( - LAPACK_DEFINITIONS - LAPACK_LIBRARIES - LAPACK - cheev - "" - "lapack" - "${BLAS_LIBRARIES}" - "${LAPACK_LIB_DIR}" - ) - endif() - - endif(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED) - - if(LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES) - set(LAPACK_FOUND TRUE) - else() - set(LAPACK_FOUND FALSE) - endif() - - if(NOT LAPACK_FIND_QUIETLY) - if(LAPACK_FOUND) - message(STATUS "A library with LAPACK API found.") - else(LAPACK_FOUND) - if(LAPACK_FIND_REQUIRED) - message(FATAL_ERROR "A required library with LAPACK API not found. Please specify library location.") - else() - message(STATUS "A library with LAPACK API not found. Please specify library location.") - endif() - endif(LAPACK_FOUND) - endif(NOT LAPACK_FIND_QUIETLY) - - # Add variables to cache - set( LAPACK_INCLUDE_DIR "${LAPACK_INCLUDE_DIR}" - CACHE PATH "Directories containing the LAPACK header files" FORCE ) - set( LAPACK_DEFINITIONS "${LAPACK_DEFINITIONS}" - CACHE STRING "Compilation options to use LAPACK" FORCE ) - set( LAPACK_LINKER_FLAGS "${LAPACK_LINKER_FLAGS}" - CACHE STRING "Linker flags to use LAPACK" FORCE ) - set( LAPACK_LIBRARIES "${LAPACK_LIBRARIES}" - CACHE FILEPATH "LAPACK libraries name" FORCE ) - set( LAPACK_LIBRARIES_DIR "${LAPACK_LIBRARIES_DIR}" - CACHE PATH "Directories containing the LAPACK libraries" FORCE ) - - #message("DEBUG: LAPACK_INCLUDE_DIR = ${LAPACK_INCLUDE_DIR}") - #message("DEBUG: LAPACK_DEFINITIONS = ${LAPACK_DEFINITIONS}") - #message("DEBUG: LAPACK_LINKER_FLAGS = ${LAPACK_LINKER_FLAGS}") - #message("DEBUG: LAPACK_LIBRARIES = ${LAPACK_LIBRARIES}") - #message("DEBUG: LAPACK_LIBRARIES_DIR = ${LAPACK_LIBRARIES_DIR}") - #message("DEBUG: LAPACK_FOUND = ${LAPACK_FOUND}") - -endif(NOT BLAS_FOUND) - -if(LAPACK_FOUND) - set(LAPACK_USE_FILE "CGAL_UseLAPACK") -endif(LAPACK_FOUND) diff --git a/Installation/cmake/modules/FindTAUCS.cmake b/Installation/cmake/modules/FindTAUCS.cmake deleted file mode 100644 index f45c51dd9d6..00000000000 --- a/Installation/cmake/modules/FindTAUCS.cmake +++ /dev/null @@ -1,129 +0,0 @@ -# This module finds the TAUCS libraries. -# -# This module sets the following variables: -# TAUCS_FOUND - Set to true if headers and libraries are found -# TAUCS_INCLUDE_DIR - Directories containing the TAUCS header files -# TAUCS_DEFINITIONS - Compilation options to use TAUCS -# TAUCS_LIBRARIES_DIR - Directories containing the TAUCS libraries. -# May be null if TAUCS_LIBRARIES contains libraries name using full path. -# TAUCS_LIBRARIES - TAUCS libraries name. -# May be null if the compiler supports auto-link (e.g. VC++). -# TAUCS_USE_FILE - The name of the cmake module to include to compile -# applications or libraries using TAUCS. - -include(${CMAKE_CURRENT_LIST_DIR}/CGAL_GeneratorSpecificSettings.cmake) - -# TAUCS requires LAPACK -if(TAUCS_FIND_QUIETLY OR NOT TAUCS_FIND_REQUIRED) - find_package(LAPACK) -else() - find_package(LAPACK REQUIRED) -endif() - -if (NOT LAPACK_FOUND) - - message(STATUS "TAUCS requires LAPACK and BLAS.") - set(TAUCS_FOUND FALSE) - -# Is it already configured? -elseif (TAUCS_INCLUDE_DIR AND TAUCS_LIBRARIES_DIR) - - set(TAUCS_FOUND TRUE) - -elseif (TAUCS_INCLUDE_DIR AND TAUCS_LIBRARIES) - - set(TAUCS_FOUND TRUE) - -else() - - # reset variables - set( TAUCS_DEFINITIONS "" ) # unused (yet) - set( TAUCS_LIBRARIES "" ) - set( TAUCS_LIBRARIES_DIR "" ) - - # Look first for the TAUCS library distributed with CGAL in auxiliary/taucs. - # Set CGAL_TAUCS_FOUND, CGAL_TAUCS_INCLUDE_DIR and CGAL_TAUCS_LIBRARIES_DIR. - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Locate_CGAL_TAUCS.cmake) - - # Search for TAUCS headers in ${CGAL_TAUCS_INCLUDE_DIR} (TAUCS shipped with CGAL), - # else in $TAUCS_INC_DIR environment variable. - if( CGAL_TAUCS_FOUND ) - set( TAUCS_INCLUDE_DIR "${CGAL_TAUCS_INCLUDE_DIR}" ) - else() - find_path(TAUCS_INCLUDE_DIR - NAMES taucs.h - HINTS ${CGAL_TAUCS_INCLUDE_DIR} - ENV TAUCS_DIR - ENV TAUCS_INC_DIR - PATH_SUFFIXES taucs include - ) - endif() - - # Search for TAUCS libraries in ${CGAL_TAUCS_LIBRARIES_DIR} (TAUCS shipped with CGAL), - # else in $TAUCS_LIB_DIR environment variable. - if( CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED ) - # if VC++: done - set( TAUCS_LIBRARIES_DIR "${CGAL_TAUCS_LIBRARIES_DIR}" ) - else() - find_library(TAUCS_LIBRARY - NAMES "taucs" - PATHS ${CGAL_TAUCS_LIBRARIES_DIR} - ENV TAUCS_DIR - ENV TAUCS_LIB_DIR - PATH_SUFFIXES taucs lib - DOC "TAUCS library" - ) - find_library(METIS_LIBRARY - NAMES "metis" - PATHS ${CGAL_TAUCS_LIBRARIES_DIR} - ENV TAUCS - ENV TAUCS_LIB_DIR - PATH_SUFFIXES taucs lib - DOC "Metis library" - ) - if(TAUCS_LIBRARY AND METIS_LIBRARY) - set( TAUCS_LIBRARIES "${TAUCS_LIBRARY};${METIS_LIBRARY}" ) - endif() - endif() - - if (TAUCS_INCLUDE_DIR AND TAUCS_LIBRARIES_DIR) - set(TAUCS_FOUND TRUE) - elseif (TAUCS_INCLUDE_DIR AND TAUCS_LIBRARIES) - set(TAUCS_FOUND TRUE) - else() - set(TAUCS_FOUND FALSE) - endif() - - if(NOT TAUCS_FIND_QUIETLY) - if(TAUCS_FOUND) - message(STATUS "TAUCS libraries found.") - else(TAUCS_FOUND) - if(TAUCS_FIND_REQUIRED) - message(FATAL_ERROR "TAUCS libraries not found. Please specify libraries location.") - else() - message(STATUS "TAUCS libraries not found. Please specify libraries location.") - endif() - endif(TAUCS_FOUND) - endif(NOT TAUCS_FIND_QUIETLY) - - # Add variables to cache - set( TAUCS_INCLUDE_DIR "${TAUCS_INCLUDE_DIR}" - CACHE PATH "Directories containing the TAUCS header files" FORCE ) - set( TAUCS_DEFINITIONS "${TAUCS_DEFINITIONS}" - CACHE STRING "Compilation options to use TAUCS" FORCE ) - set( TAUCS_LIBRARIES "${TAUCS_LIBRARIES}" - CACHE FILEPATH "TAUCS libraries name" FORCE ) - set( TAUCS_LIBRARIES_DIR "${TAUCS_LIBRARIES_DIR}" - CACHE PATH "Directories containing the TAUCS libraries" FORCE ) - - #message("DEBUG: TAUCS_INCLUDE_DIR = ${TAUCS_INCLUDE_DIR}") - #message("DEBUG: TAUCS_DEFINITIONS = ${TAUCS_DEFINITIONS}") - #message("DEBUG: TAUCS_LIBRARIES = ${TAUCS_LIBRARIES}") - #message("DEBUG: TAUCS_LIBRARIES_DIR = ${TAUCS_LIBRARIES_DIR}") - #message("DEBUG: TAUCS_FOUND = ${TAUCS_FOUND}") - -endif(NOT LAPACK_FOUND) - -if(TAUCS_FOUND) - set(TAUCS_USE_FILE "CGAL_UseTAUCS") -endif(TAUCS_FOUND) diff --git a/Installation/cmake/modules/config/support/test_ATLAS.cpp b/Installation/cmake/modules/config/support/test_ATLAS.cpp deleted file mode 100644 index ab0a40ee9e1..00000000000 --- a/Installation/cmake/modules/config/support/test_ATLAS.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2007 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// Author(s) : Laurent Saboret - -// Test if the LAPACK subset in ATLAS is available - - -#include - -extern "C" { - // Fortran interface taken from ATLAS/interfaces/lapack/F77/src/dpotrf.f - extern void dpotrf_(char *uplo, int *n, double *a, int *lda, int *info); -} - - -int main() -{ - // Call dpotrf_() Lapack routine (Cholesky factorization) - int sn_size = 0; - int lda = 1; - int info; - dpotrf_((char*)"LOWER", - &sn_size, - NULL, - &lda, - &info); - - std::cout << "ok for ATLAS" << std::endl; - - return 0; -} diff --git a/Installation/cmake/modules/config/support/test_BLAS.cpp b/Installation/cmake/modules/config/support/test_BLAS.cpp deleted file mode 100644 index bd2d3739bb7..00000000000 --- a/Installation/cmake/modules/config/support/test_BLAS.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2007 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $ID$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// Author(s) : Laurent Saboret - -// Test if BLAS is available - -// blaswrap.h maps CBLAS function names to BLAS standard Fortran interface. -#ifdef CGAL_USE_CBLASWRAP - #ifndef CGAL_USE_F2C - #define CGAL_USE_F2C - #endif - #include -#endif - -#include - -extern "C" { - // Fortran interface (taken from www.netlib.org/clapack)... - void dgemm_(char* transa, char* transb, int* m, - int* n, int* k, - double* alpha, - double* a, int* lda, double* b, int* ldb, - double* beta, - double* c, int* ldc); - // ... or C interface (taken from AMD Core Math Library) - void dgemm (char transa, char transb, int m, - int n, int k, - double alpha, - double* a, int lda, double* b, int ldb, - double beta, - double* c, int ldc); -} - -namespace CGAL { namespace BLAS { - -inline -void dgemm (char* transa, char* transb, int* m, - int* n, int* k, - double* alpha, - double* a, int* lda, double* b, int* ldb, - double* beta, - double* c, int* ldc) -{ -#ifdef CGAL_USE_F2C - ::dgemm_(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc); -#else - ::dgemm (*transa, *transb, *m, *n, *k, *alpha, a, *lda, b, *ldb, *beta, c, *ldc); -#endif -} - -} } - -int main() -{ - char S[2] = "N"; - double A = 2.0; - double B = 3.0; - double C = 5.0; - double alpha = 7.0; - double beta = 11.0; - int n = 1; - int ld = 1; - - CGAL::BLAS::dgemm(S,S, &n,&n,&n, &alpha, &A,&ld, &B,&ld, &beta, &C,&ld); - if(C == 97.0) { - std::cout << "ok for BLAS" << std::endl; - return 0; - } - else { - return 1; - } -} diff --git a/Installation/cmake/modules/config/support/test_LAPACK.cpp b/Installation/cmake/modules/config/support/test_LAPACK.cpp deleted file mode 100644 index 2580e8eec4d..00000000000 --- a/Installation/cmake/modules/config/support/test_LAPACK.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2007 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// Author(s) : Marc Pouget - -// Test if LAPACK is available - -#include -#include - -extern "C" { - // taken from acml.h -void dgelss(int m, int n, int nrhs, - double *a, int lda, double *b, int ldb, double *sing, - double rcond, int *irank, int *info); - -void dgelss_(int *m, int *n, int *nrhs, - double *a, int *lda, double *b, int *ldb, double * - s, double *rcond, int *rank, double *work, int *lwork, - int *info); -} - -namespace CGAL { namespace LAPACK { - -inline -void dgelss(int *m, int *n, int *nrhs, - double *a, int *lda, double *b, int *ldb, double * - s, double *rcond, int *rank, double *work, int *lwork, - int *info) -{ -#ifdef CGAL_USE_F2C - ::dgelss_(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, lwork, info); -#else - ::dgelss(*m, *n, *nrhs, a, *lda, b, *ldb, s, *rcond, rank, info); -#endif -} - -} } - -int main() -{ - double M=1, B=1; - int m = 1, - n = 1, - nrhs = 1, - lda = m, - ldb = m, - rank, - lwork = 5*m, - info; - //c style - double * sing_values = new double[n]; // * sing_values = (double*) malloc(n*sizeof(double)); - double* work = new double[lwork]; // (double*) malloc(lwork*sizeof(double)); - - double rcond = -1; - - CGAL::LAPACK::dgelss(&m, &n, &nrhs, &M, &lda, &B, &ldb, sing_values, - &rcond, &rank, work, &lwork, &info); - assert(info==0); - assert(B==1.); - //clean up - delete sing_values; - delete work; - - std::cout << "ok for lapack" << std::endl; - - return 0; -} diff --git a/Installation/cmake/modules/config/testfiles/CGAL_CFG_FPU_ROUNDING_MODE_UNWINDING_VC_BUG.cpp b/Installation/cmake/modules/config/testfiles/CGAL_CFG_FPU_ROUNDING_MODE_UNWINDING_VC_BUG.cpp index 93b4e6040c0..03efd23fbe0 100644 --- a/Installation/cmake/modules/config/testfiles/CGAL_CFG_FPU_ROUNDING_MODE_UNWINDING_VC_BUG.cpp +++ b/Installation/cmake/modules/config/testfiles/CGAL_CFG_FPU_ROUNDING_MODE_UNWINDING_VC_BUG.cpp @@ -41,7 +41,7 @@ main() } catch ( ... ) { - // Sets the rounding mode to 0 and show that it's realy the case. + // Sets the rounding mode to 0 and show that it's really the case. _controlfp( 0, _MCW_RC ); } diff --git a/Installation/include/CGAL/auto_link/LAPACK.h b/Installation/include/CGAL/auto_link/LAPACK.h deleted file mode 100644 index d3214586555..00000000000 --- a/Installation/include/CGAL/auto_link/LAPACK.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) 1997-2004 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// Author(s) : Laurent Saboret - -#ifndef CGAL_AUTO_LINK_LAPACK_H -#define CGAL_AUTO_LINK_LAPACK_H - -#include - -// Skip the whole file if auto-link is off -#if !defined(CGAL_NO_AUTOLINK_LAPACK) && !defined(CGAL_NO_AUTOLINK) - - -#if defined(_WIN32) && !defined(_WIN64) // if Windows 32 bits - -// CGAL ships with ATLAS for Windows 32 bits, i.e this set of libraries (e.g. for VC++ 8 /MD): -// liblapack.lib libf77blas.lib libcblas.lib libatlas.lib vcf2c-vc80-mt.lib -// -// Notes: - Order matters. -// - Libraries with no "vc" toolset are compiled by gcc/g77. They are -// compatible with VC++ 7.1, 8.0 and 9.0, and with all VC++ runtimes. -// - Tested with 7.1, 8.0 and 9.0. - -#define CGAL_LIB_NAME liblapack -#define CGAL_AUTO_LINK_NOMANGLE -#include - -#define CGAL_LIB_NAME libf77blas -#define CGAL_AUTO_LINK_NOMANGLE -#include - -#define CGAL_LIB_NAME libcblas -#define CGAL_AUTO_LINK_NOMANGLE -#include - -#define CGAL_LIB_NAME libatlas -#define CGAL_AUTO_LINK_NOMANGLE -#include - -#define CGAL_LIB_NAME vcf2c -#define CGAL_AUTO_LINK_NOMANGLE -#include - -// ATLAS provides BLAS and LAPACK standard Fortran interface -#ifndef CGAL_USE_F2C - #define CGAL_USE_F2C -#endif - -#endif // Win32 - - -#ifdef _WIN64 // if Windows 64 bits - -// ATLAS is not compatible with Win64, thus CGAL ships with CLAPACK and CBLAS. -// VC++ >= 8.0 is compatible with Windows 64 bits. -// The set set of libraries is (e.g. for VC++ 8 /MD): -// clapack-vc80-mt.lib blas-vc80-mt.lib vcf2c-vc80-mt.lib -// -// Notes: - Order matters. -// - Tested with VC++ 8.0 and 9.0. - -#define CGAL_LIB_NAME clapack -#define CGAL_AUTO_LINK_NOMANGLE -#include - -#define CGAL_LIB_NAME blas -#define CGAL_AUTO_LINK_NOMANGLE -#include - -#define CGAL_LIB_NAME vcf2c -#define CGAL_AUTO_LINK_NOMANGLE -#include - -// CLAPACK provides LAPACK standard Fortran interface. -// blaswrap.h maps CBLAS function names to BLAS standard Fortran interface. -#ifndef CGAL_USE_F2C - #define CGAL_USE_F2C -#endif -#include - -#endif // _WIN64 - - -#endif // CGAL_NO_AUTOLINK_LAPACK && CGAL_NO_AUTOLINK - -#endif // CGAL_AUTO_LINK_LAPACK_H diff --git a/Installation/include/CGAL/auto_link/TAUCS.h b/Installation/include/CGAL/auto_link/TAUCS.h deleted file mode 100644 index 9896f412ef9..00000000000 --- a/Installation/include/CGAL/auto_link/TAUCS.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 1997-2004 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// Author(s) : Laurent Saboret - -#ifndef CGAL_AUTO_LINK_TAUCS_H -#define CGAL_AUTO_LINK_TAUCS_H - -#include - -// Skip the whole file if auto-link is off -#if !defined(CGAL_NO_AUTOLINK_TAUCS) && !defined(CGAL_NO_AUTOLINK) - -# if defined(_WIN32) || defined(_WIN64) - -# define CGAL_LIB_NAME libtaucs -# define CGAL_AUTO_LINK_NOMANGLE -# include - -# define CGAL_LIB_NAME libmetis -# define CGAL_AUTO_LINK_NOMANGLE -# include - -// Link with LAPACK, BLAS and F2C -# include - -# endif // Win32|Win64 - -#endif // CGAL_NO_AUTOLINK_TAUCS && CGAL_NO_AUTOLINK - -#endif // CGAL_AUTO_LINK_TAUCS_H diff --git a/Installation/include/CGAL/auto_link/auto_link.h b/Installation/include/CGAL/auto_link/auto_link.h index fdb428ec014..f09070d95a6 100644 --- a/Installation/include/CGAL/auto_link/auto_link.h +++ b/Installation/include/CGAL/auto_link/auto_link.h @@ -1,6 +1,6 @@ // This header file is a copy of "boost/config/auto_link.hpp" // from boost version 1.44.0 -// but slightly modified to accomodate CGAL libraries. +// but slightly modified to accommodate CGAL libraries. // Before CGAL-4.7-beta1, it has been synchronized with // libs/config/ version boost-1.58.0-39-g15d56c9, file diff --git a/Installation/lib/cmake/CGAL/CGALConfig.cmake b/Installation/lib/cmake/CGAL/CGALConfig.cmake index f3b6add50ce..9df648182d5 100644 --- a/Installation/lib/cmake/CGAL/CGALConfig.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfig.cmake @@ -72,6 +72,7 @@ endif() include(${CGAL_MODULES_DIR}/CGAL_CreateSingleSourceCGALProgram.cmake) include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) include(${CGAL_MODULES_DIR}/CGAL_Common.cmake) +include(${CGAL_MODULES_DIR}/CGAL_TweakFindBoost.cmake) set(CGAL_USE_FILE ${CGAL_MODULES_DIR}/UseCGAL.cmake) @@ -130,7 +131,11 @@ include(CGAL_setup_target_dependencies) foreach(cgal_lib ${CGAL_LIBRARIES}) set(WITH_${cgal_lib} TRUE) if(${cgal_lib}_FOUND AND NOT TARGET ${cgal_lib}) - add_library(${cgal_lib} INTERFACE) + if(CGAL_BUILDING_LIBS OR CMAKE_VERSION VERSION_LESS "3.11") + add_library(${cgal_lib} INTERFACE) + else() + add_library(${cgal_lib} INTERFACE IMPORTED GLOBAL) + endif() if(NOT TARGET CGAL::${cgal_lib}) add_library(CGAL::${cgal_lib} ALIAS ${cgal_lib}) endif() diff --git a/Interpolation/TODO b/Interpolation/TODO index 0d20a8aba13..b1cde04626a 100644 --- a/Interpolation/TODO +++ b/Interpolation/TODO @@ -1,4 +1,4 @@ -Here follows 3 reviews which have been recieved following the submission +Here follows 3 reviews which have been received following the submission of the Interpolation package to the editorial board. They have not been completely implemented or replied, so we keep them here in order for the next one who will work on the package to know @@ -96,7 +96,7 @@ method to use under which circumstance. The examples need explanation. The indentation needs work. At the end of the second example, there is a branch that warns if the -interpolation was not succesful due to missing function gradients. Can +interpolation was not successful due to missing function gradients. Can this really occur, given the rest of the program? If not, I would remove it. If it can occur, I would draw more attention to this fact. diff --git a/Interpolation/include/CGAL/constructions/constructions_for_voronoi_intersection_cartesian_2_3.h b/Interpolation/include/CGAL/constructions/constructions_for_voronoi_intersection_cartesian_2_3.h index 0248bcb6711..a9f1242b338 100644 --- a/Interpolation/include/CGAL/constructions/constructions_for_voronoi_intersection_cartesian_2_3.h +++ b/Interpolation/include/CGAL/constructions/constructions_for_voronoi_intersection_cartesian_2_3.h @@ -83,11 +83,11 @@ plane_centered_circumcenterC3(const RT &ax, const RT &ay, const RT &az, //precondition: p,q,r aren't collinear. //method: // - tranlation of p to the origin. - plane_centered_circumcenter_translateC3(ax-px, ay-py, az-pz, - nx, ny, nz, - qx-px, qy-py,qz-pz, - rx-px, ry-py,rz-pz, - x, y, z); + plane_centered_circumcenter_translateC3(ax-px, ay-py, az-pz, + nx, ny, nz, + qx-px, qy-py,qz-pz, + rx-px, ry-py,rz-pz, + x, y, z); x+=px; y+=py; z+=pz; diff --git a/Interpolation/include/CGAL/natural_neighbor_coordinates_2.h b/Interpolation/include/CGAL/natural_neighbor_coordinates_2.h index d2df19d72f0..11d9ea427e9 100644 --- a/Interpolation/include/CGAL/natural_neighbor_coordinates_2.h +++ b/Interpolation/include/CGAL/natural_neighbor_coordinates_2.h @@ -121,7 +121,7 @@ natural_neighbors_2(const Dt& dt, *out++ = std::make_pair(v1,coef1); *out++ = std::make_pair(v2,coef2); - return make_triple(out, coef1+coef2, true); + return { out, coef1+coef2, true }; } if (lt == Dt::VERTEX) diff --git a/Interpolation/include/CGAL/predicates/predicates_for_voronoi_intersection_cartesian_2_3.h b/Interpolation/include/CGAL/predicates/predicates_for_voronoi_intersection_cartesian_2_3.h index 8066eac9c22..80986a903c8 100644 --- a/Interpolation/include/CGAL/predicates/predicates_for_voronoi_intersection_cartesian_2_3.h +++ b/Interpolation/include/CGAL/predicates/predicates_for_voronoi_intersection_cartesian_2_3.h @@ -26,6 +26,7 @@ #include +#include namespace CGAL { @@ -76,13 +77,13 @@ side_of_plane_centered_sphereC3(const RT &ax, const RT &ay, const RT &az, // //method: // - tranlation of p to the origin. - // - seperate computation of det and norm of the expression + // - separate computation of det and norm of the expression - return side_of_plane_centered_sphere_translateC3(ax-px, ay-py, az-pz, - nx, ny, nz, - qx-px, qy-py,qz-pz, - rx-px, ry-py,rz-pz, - tx-px, ty-py,tz-pz); + return side_of_plane_centered_sphere_translateC3(ax-px, ay-py, az-pz, + nx, ny, nz, + qx-px, qy-py,qz-pz, + rx-px, ry-py,rz-pz, + tx-px, ty-py,tz-pz); } template < class RT> @@ -100,25 +101,25 @@ side_of_plane_centered_sphere_translateC3( RT na =nx*ax + ny*ay + nz*az; na *= RT(2.0); - Sign num = sign_of_determinant(qx, qy, qz, q2, - ny, -nx, RT(0), RT(0), - nx, ny, nz, na, - rx, ry, rz, r2); + Sign num = sign_of_determinant(qx, qy, qz, q2, + ny, -nx, 0, 0, + nx, ny, nz, na, + rx, ry, rz, r2); //denumerator: - Sign den = sign_of_determinant(nx,ny,nz, - ny,-nx, RT(0), - qx,qy,qz); + Sign den = sign_of_determinant(nx,ny,nz, + ny,-nx, 0, + qx,qy,qz); if (den==ZERO) { // bad choice: (ny,-nx,0) is coplanar with n,q. // by precondition: q and n may not be collinear // => the cross product q*n is orthogonal to q, n and not coplanar - num = sign_of_determinant(qx, qy, qz, q2, - ny*qz-nz*qy, nz*qx-nx*qz,nx*qy-ny*qx, RT(0), - nx, ny, nz, na, - rx, ry, rz, r2); - den = sign_of_determinant(nx,ny,nz, - ny*qz-nz*qy, nz*qx - nx*qz,nx*qy-ny*qx, - qx,qy,qz); + num = sign_of_determinant(qx, qy, qz, q2, + ny*qz-nz*qy, nz*qx-nx*qz,nx*qy-ny*qx, 0, + nx, ny, nz, na, + rx, ry, rz, r2); + den = sign_of_determinant(nx,ny,nz, + ny*qz-nz*qy, nz*qx - nx*qz,nx*qy-ny*qx, + qx,qy,qz); } CGAL_assertion(den != ZERO); return den * num; @@ -145,12 +146,12 @@ side_of_plane_centered_sphereC3(const RT &ax, const RT &ay, const RT &az, // //method: // - tranlation of p to the origin. - // - seperate computation of det and nom of the expression + // - separate computation of det and nom of the expression - return side_of_plane_centered_sphere_translateC3(ax-px, ay-py, az-pz, - nx, ny, nz, - qx-px, qy-py,qz-pz, - rx-px, ry-py,rz-pz); + return side_of_plane_centered_sphere_translateC3(ax-px, ay-py, az-pz, + nx, ny, nz, + qx-px, qy-py,qz-pz, + rx-px, ry-py,rz-pz); } } //namespace CGAL diff --git a/Interpolation/package_info/Interpolation/dependencies b/Interpolation/package_info/Interpolation/dependencies index 244b876a53c..eb6f82eb464 100644 --- a/Interpolation/package_info/Interpolation/dependencies +++ b/Interpolation/package_info/Interpolation/dependencies @@ -4,7 +4,9 @@ Filtered_kernel Hash_map Installation Interpolation +Interval_support Kernel_23 +Modular_arithmetic Number_types Polygon Profiling_tools diff --git a/Interpolation/test/Interpolation/test_regular_neighbors_2.cpp b/Interpolation/test/Interpolation/test_regular_neighbors_2.cpp index aea65b1b575..8d7464ec42d 100644 --- a/Interpolation/test/Interpolation/test_regular_neighbors_2.cpp +++ b/Interpolation/test/Interpolation/test_regular_neighbors_2.cpp @@ -20,7 +20,6 @@ #include -#include #include #include diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/intersection_3_1_impl.h b/Intersections_3/include/CGAL/Intersections_3/internal/intersection_3_1_impl.h index 1470af7487f..2112802e019 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/intersection_3_1_impl.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/intersection_3_1_impl.h @@ -33,6 +33,7 @@ #include #include #include +#include #include namespace CGAL { @@ -307,10 +308,13 @@ intersection(const typename K::Line_3 &l1, const Point_3 p4 = p2 + v2; if(!K().coplanar_3_object()(p1,p2,p3,p4)) return intersection_return(); const Vector_3 v3 = p3 - p1; - const Vector_3 v3v2 = cross_product(v3,v2); + const Vector_3 v3v2 = cross_product(v3,v2); const Vector_3 v1v2 = cross_product(v1,v2); - const FT t = ((v3v2.x()*v1v2.x()) + (v3v2.y()*v1v2.y()) + (v3v2.z()*v1v2.z())) / - (v1v2.squared_length()); + const FT sl = v1v2.squared_length(); + if(certainly(sl == FT(0))) + return intersection_return(); + const FT t = ((v3v2.x()*v1v2.x()) + (v3v2.y()*v1v2.y()) + (v3v2.z()*v1v2.z())) / sl; + return intersection_return(p1 + (v1 * t)); } diff --git a/Interval_skip_list/include/CGAL/Interval_skip_list.h b/Interval_skip_list/include/CGAL/Interval_skip_list.h index ae93d920fbf..ddc63f06b82 100644 --- a/Interval_skip_list/include/CGAL/Interval_skip_list.h +++ b/Interval_skip_list/include/CGAL/Interval_skip_list.h @@ -842,7 +842,7 @@ template update[i]->eqMarkers->insert(m->getInterval()); // Place markers on x for all intervals the cross x. - // (Since x is a new node, every marker comming into x must also leave x). + // (Since x is a new node, every marker coming into x must also leave x). for(i=0; ilevel(); i++) x->eqMarkers->copy(x->markers[i]); diff --git a/Interval_support/test/Interval_support/Bigfloat_interval_traits.cpp b/Interval_support/test/Interval_support/Bigfloat_interval_traits.cpp index f9aea1db714..8a356df0b86 100644 --- a/Interval_support/test/Interval_support/Bigfloat_interval_traits.cpp +++ b/Interval_support/test/Interval_support/Bigfloat_interval_traits.cpp @@ -1,5 +1,4 @@ -#include #include #include diff --git a/Interval_support/test/Interval_support/Interval_traits.cpp b/Interval_support/test/Interval_support/Interval_traits.cpp index a749bf68e9a..db8728c0bb7 100644 --- a/Interval_support/test/Interval_support/Interval_traits.cpp +++ b/Interval_support/test/Interval_support/Interval_traits.cpp @@ -1,5 +1,4 @@ -#include #include #include #include diff --git a/Interval_support/test/Interval_support/convert_to_bfi.cpp b/Interval_support/test/Interval_support/convert_to_bfi.cpp index f3b9040b156..d62f9b2207a 100644 --- a/Interval_support/test/Interval_support/convert_to_bfi.cpp +++ b/Interval_support/test/Interval_support/convert_to_bfi.cpp @@ -1,9 +1,7 @@ -#include -#include #include #include - +#include int main(){ diff --git a/Jet_fitting_3/doc/Jet_fitting_3/Jet_fitting_3.txt b/Jet_fitting_3/doc/Jet_fitting_3/Jet_fitting_3.txt index d89781711dc..00fe950e3a9 100644 --- a/Jet_fitting_3/doc/Jet_fitting_3/Jet_fitting_3.txt +++ b/Jet_fitting_3/doc/Jet_fitting_3/Jet_fitting_3.txt @@ -279,7 +279,7 @@ computed using rings on the triangulation. Results are twofold:

  • a human readable text file featuring the `::CGAL::Monge_via_jet_fitting::Monge_form` and numerical informations on the computation: condition number and the PCA basis; -
  • another text file that records raw data (better for a vizualization +
  • another text file that records raw data (better for a visualization post-processing). diff --git a/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt b/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt index 99d25985c62..51cf4c4b351 100644 --- a/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt +++ b/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt @@ -11,42 +11,35 @@ find_package(CGAL QUIET) if ( CGAL_FOUND ) - # use either Eigen or BLAS/LAPACK + # use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) - if (NOT EIGEN3_FOUND) - find_package(LAPACK) - if(LAPACK_FOUND) - include( ${LAPACK_USE_FILE} ) - endif(LAPACK_FOUND) - else() + if (EIGEN3_FOUND) include( ${EIGEN3_USE_FILE} ) - endif() - - if(EIGEN3_FOUND OR LAPACK_FOUND) # Link with Boost.ProgramOptions (optional) find_package(Boost QUIET COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) + if(TARGET Boost::program_options) + set(Boost_PROGRAM_OPTIONS_LIBRARY Boost::program_options) + endif() if( CGAL_AUTO_LINK_ENABLED ) message( STATUS "Boost.ProgramOptions library: found" ) else() message( STATUS "Boost.ProgramOptions library: ${Boost_PROGRAM_OPTIONS_LIBRARY}" ) endif() add_definitions( "-DCGAL_USE_BOOST_PROGRAM_OPTIONS" ) - list(APPEND CGAL_3RD_PARTY_LIBRARIES ${Boost_LIBRARIES}) + list(APPEND CGAL_3RD_PARTY_LIBRARIES ${Boost_PROGRAM_OPTIONS_LIBRARY}) endif() create_single_source_cgal_program( "Mesh_estimation.cpp" ) create_single_source_cgal_program( "Single_estimation.cpp" ) - - else(EIGEN3_FOUND OR LAPACK_FOUND) - - message(STATUS "NOTICE: This program requires either Eigen 3.1 (or greater) or LAPACK, and will not be compiled.") - - endif(EIGEN3_FOUND OR LAPACK_FOUND) + + else() + message(STATUS "NOTICE: This program requires Eigen 3.1 (or greater) and will not be compiled.") + endif() else() - message(STATUS "NOTICE: This program requires the CGAL library, and will not be compiled.") + message(STATUS "NOTICE: This program requires the CGAL library, and will not be compiled.") endif() diff --git a/Jet_fitting_3/examples/Jet_fitting_3/README b/Jet_fitting_3/examples/Jet_fitting_3/README index 3ef5043842a..fc4df02d7b6 100644 --- a/Jet_fitting_3/examples/Jet_fitting_3/README +++ b/Jet_fitting_3/examples/Jet_fitting_3/README @@ -1,4 +1,4 @@ -To compile, you need support for lapack +To compile, you need support for Eigen Program Single_estimation --------------------- diff --git a/Jet_fitting_3/include/CGAL/Monge_via_jet_fitting.h b/Jet_fitting_3/include/CGAL/Monge_via_jet_fitting.h index f3afa77c1d3..f427cce6584 100644 --- a/Jet_fitting_3/include/CGAL/Monge_via_jet_fitting.h +++ b/Jet_fitting_3/include/CGAL/Monge_via_jet_fitting.h @@ -32,10 +32,6 @@ #include #ifdef CGAL_EIGEN3_ENABLED #include -#else -#ifdef CGAL_LAPACK_ENABLED -#include -#endif #endif namespace CGAL { @@ -51,11 +47,7 @@ unsigned int fact(unsigned int n){ #ifdef CGAL_EIGEN3_ENABLED template < class DataKernel, class LocalKernel = Simple_cartesian, class SvdTraits = Eigen_svd > #else -#ifdef CGAL_LAPACK_ENABLED -template < class DataKernel, class LocalKernel = Simple_cartesian, class SvdTraits = Lapack_svd> -#else template < class DataKernel, class LocalKernel, class SvdTraits > -#endif #endif class Monge_via_jet_fitting { public: diff --git a/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt b/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt index e1f65cb1884..14e3e10e01b 100644 --- a/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt +++ b/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt @@ -11,27 +11,14 @@ find_package(CGAL QUIET) if ( CGAL_FOUND ) - # use either Eigen or BLAS/LAPACK + # use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) - if (NOT EIGEN3_FOUND) - find_package(LAPACK) - if(LAPACK_FOUND) - include( ${LAPACK_USE_FILE} ) - endif(LAPACK_FOUND) - else() + if (EIGEN3_FOUND) include( ${EIGEN3_USE_FILE} ) - endif() - - - if(EIGEN3_FOUND OR LAPACK_FOUND) - create_single_source_cgal_program( "blind_1pt.cpp" ) - - else(EIGEN3_FOUND OR LAPACK_FOUND) - - message(STATUS "NOTICE: This program requires either Eigen 3.1 (or greater) or LAPACK, and will not be compiled.") - - endif(EIGEN3_FOUND OR LAPACK_FOUND) + else() + message(STATUS "NOTICE: This program requires Eigen 3.1 (or greater) and will not be compiled.") + endif() else() diff --git a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h index 6a408bacab3..8685468fbdb 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h @@ -85,7 +85,7 @@ Vector_2(const Kernel::FT &x, const Kernel::FT &y); /// There are two sets of coordinate access functions, namely to the /// homogeneous and to the %Cartesian coordinates. They can be used /// independently from the chosen kernel model. Note that you do not -/// loose information with the homogeneous representation, because the +/// lose information with the homogeneous representation, because the /// `FieldNumberType` is a quotient. /// @{ diff --git a/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h b/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h index f6bf36679c4..2dec956a656 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h @@ -87,7 +87,7 @@ Vector_3(const Kernel::FT &x, const Kernel::FT &y, const Kernel::FT &z); /// There are two sets of coordinate access functions, namely to the /// homogeneous and to the %Cartesian coordinates. They can be used /// independently from the chosen kernel model. Note that you do not -/// loose information with the homogeneous representation, because the +/// lose information with the homogeneous representation, because the /// `FieldNumberType` is a quotient. /// @{ diff --git a/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h b/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h index ce9133544be..7b733fe2f87 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h @@ -96,7 +96,7 @@ double weight() const; class Construct_circumcenter_d { public: /*! returns the center of the sphere defined by `A=tuple[first,last)`. The sphere is centered in the affine hull of A and passes through all the points of A. The order of the points of A does not matter. - \pre A is affinely independant. + \pre A is affinely independent. \tparam ForwardIterator has `Epick_d::Point_d` as value type. */ template @@ -105,7 +105,7 @@ Point_d operator()(ForwardIterator first, ForwardIterator last); class Compute_squared_radius_d { public: /*! returns the radius of the sphere defined by `A=tuple[first,last)`. The sphere is centered in the affine hull of A and passes through all the points of A. The order of the points of A does not matter. - \pre A is affinely independant. + \pre A is affinely independent. \tparam ForwardIterator has `Epick_d::Point_d` as value type. */ template @@ -116,7 +116,7 @@ Point_d operator()(ForwardIterator first, ForwardIterator last); class Side_of_bounded_sphere_d { public: /*! returns the relative position of point p to the sphere defined by `A=tuple[first,last)`. The sphere is centered in the affine hull of A and passes through all the points of A. The order of the points of A does not matter. - \pre A is affinely independant. + \pre A is affinely independent. \tparam ForwardIterator has `Epick_d::Point_d` as value type. */ template diff --git a/Kernel_d/include/CGAL/Kernel_d/function_objectsCd.h b/Kernel_d/include/CGAL/Kernel_d/function_objectsCd.h index fe13b716697..c54058d4123 100644 --- a/Kernel_d/include/CGAL/Kernel_d/function_objectsCd.h +++ b/Kernel_d/include/CGAL/Kernel_d/function_objectsCd.h @@ -412,7 +412,7 @@ public: /* This predicates takes k+1 points defining a k-sphere in d-dim space, and a * point |x| (assumed to lie in the same affine subspace spanned by the - * k-sphere). It tests wether the point |x| lies in the positive or negative + * k-sphere). It tests whether the point |x| lies in the positive or negative * side of the k-sphere. * The parameter |axis| contains the indices of k axis of the canonical base of * R^d, on which the affine subspace projects homeomorphically. We can thus diff --git a/Kernel_d/test/Kernel_d/Linear_algebra-test.cpp b/Kernel_d/test/Kernel_d/Linear_algebra-test.cpp index af5a3cad1be..543de175b53 100644 --- a/Kernel_d/test/Kernel_d/Linear_algebra-test.cpp +++ b/Kernel_d/test/Kernel_d/Linear_algebra-test.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Kernel_d/test/Kernel_d/afftrafo-test.cpp b/Kernel_d/test/Kernel_d/afftrafo-test.cpp index b4d67772542..3680fa81a69 100644 --- a/Kernel_d/test/Kernel_d/afftrafo-test.cpp +++ b/Kernel_d/test/Kernel_d/afftrafo-test.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Kernel_d/test/Kernel_d/include/CGAL/test_macros.h b/Kernel_d/test/Kernel_d/include/CGAL/test_macros.h index 981dd9e5c1c..d675fe6ff5a 100644 --- a/Kernel_d/test/Kernel_d/include/CGAL/test_macros.h +++ b/Kernel_d/test/Kernel_d/include/CGAL/test_macros.h @@ -1,7 +1,6 @@ #ifndef CGAL_TEST_MACROS_H #define CGAL_TEST_MACROS_H -#include #include #include #include diff --git a/Kernel_d/test/Kernel_d/interface-test.cpp b/Kernel_d/test/Kernel_d/interface-test.cpp index f1ecab8c178..7c609afba2a 100644 --- a/Kernel_d/test/Kernel_d/interface-test.cpp +++ b/Kernel_d/test/Kernel_d/interface-test.cpp @@ -1,10 +1,3 @@ -//--------------------------------------------------------------------- -// file generated by notangle from noweb/Kernel_d-tests.lw -// please debug or modify noweb file -// coding: M. Seel -//--------------------------------------------------------------------- - -#include #include #include #include diff --git a/Kernel_d/test/Kernel_d/intersection-test.cpp b/Kernel_d/test/Kernel_d/intersection-test.cpp index e5af6c223b8..c54c275f588 100644 --- a/Kernel_d/test/Kernel_d/intersection-test.cpp +++ b/Kernel_d/test/Kernel_d/intersection-test.cpp @@ -1,10 +1,3 @@ -//--------------------------------------------------------------------- -// file generated by notangle from noweb/Kernel_d-tests.lw -// please debug or modify noweb file -// coding: M. Seel -//--------------------------------------------------------------------- - -#include #include #include #include diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h index 84ff459693c..aee2132dc85 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h @@ -243,7 +243,7 @@ namespace CGAL { std::cerr << " " << std::endl; std::cerr << "Polyhedron_scan_OFF::" << std::endl; std::cerr << "operator()(): input error: cannot " - "succesfully remove isolated vertices." + "successfully remove isolated vertices." << std::endl; } B.rollback(); diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab index be5f993a8b3..48aab3ac248 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab @@ -25,11 +25,11 @@ LC_CTYPE=en_US.UTF-8 # "master" alone 0 21 * * Sun cd $HOME/CGAL/create_internal_release && /usr/bin/time $HOME/bin/create_release $HOME/CGAL/branches/master.git --public --do-it || echo ERROR # "integration" -0 21 * * Mon,Tue,Wed,Thu,Fri cd $HOME/CGAL/create_internal_release && /usr/bin/time $HOME/bin/create_release $HOME/CGAL/branches/integration.git $HOME/CGAL/branches/empty-dir --do-it || echo ERROR +0 21 * * Mon,Tue,Thu,Fri cd $HOME/CGAL/create_internal_release && /usr/bin/time $HOME/bin/create_release $HOME/CGAL/branches/integration.git $HOME/CGAL/branches/empty-dir --do-it || echo ERROR # from branch 4.14 0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.14-branch && /usr/bin/time $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.14-branch.git --public --do-it || echo ERROR # from branch 4.13 -#0 21 * * Fri cd $HOME/CGAL/create_internal_release-4.13-branch && /usr/bin/time $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.13-branch.git --public --do-it || echo ERROR +0 21 * * Wed cd $HOME/CGAL/create_internal_release-4.13-branch && /usr/bin/time $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.13-branch.git --public --do-it || echo ERROR # from branch 4.12 #0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.12-branch && /usr/bin/time $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.12-branch.git --public --do-it || echo ERROR # from branch 4.11 diff --git a/Maintenance/infrastructure/gauguin.geometryfactory.com/autocgalrc b/Maintenance/infrastructure/gauguin.geometryfactory.com/autocgalrc index 4f36b785634..3723ec7f8b2 100755 --- a/Maintenance/infrastructure/gauguin.geometryfactory.com/autocgalrc +++ b/Maintenance/infrastructure/gauguin.geometryfactory.com/autocgalrc @@ -15,7 +15,7 @@ CGAL_TESTER_ADDRESS="andreas.fabri@geometryfactory.com" COMPILERS_localhost="" #COMPILERS_localhost="$COMPILERS_localhost x64_Cygwin-Windows10_MSVC2013-Release-64bits" -[ $(date +%a) = Sat ] || COMPILERS_localhost="$COMPILERS_localhost x64_Cygwin-Windows10_MSVC2013-Debug-64bits" +[ $(date +%a) = Sat ] && COMPILERS_localhost="$COMPILERS_localhost x64_Cygwin-Windows10_MSVC2013-Debug-64bits" COMPILERS_localhost="$COMPILERS_localhost x64_Cygwin-Windows10_MSVC2017-Release-64bits" #COMPILERS_localhost="$COMPILERS_localhost x64_Cygwin-Windows10_MSVC2017-Release-64bits-extra_flags" COMPILERS_localhost="$COMPILERS_localhost x64_Cygwin-Windows10_MSVC2017-Debug-64bits" diff --git a/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2015-Debug-64bits/setup b/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2015-Debug-64bits/setup index efd30025a2d..0cd0d4441cf 100644 --- a/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2015-Debug-64bits/setup +++ b/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2015-Debug-64bits/setup @@ -1,5 +1,5 @@ export CGAL_DIR="/cygdrive/c/CGAL/CGAL-4.9/build_vs2015" -export VC_VERSION="14" +export VC_VERSION="14.0" export VC_VERSION_YEAR="2015" export ARCH="64" export QT_VERSION="5.9.1" diff --git a/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Debug-64bits/CMakeCache.txt b/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Debug-64bits/CMakeCache.txt index 52b7b8ea248..d21e9b70bb9 100644 --- a/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Debug-64bits/CMakeCache.txt +++ b/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Debug-64bits/CMakeCache.txt @@ -206,7 +206,7 @@ CMAKE_INSTALL_SHAREDSTATEDIR:PATH=com CMAKE_INSTALL_SYSCONFDIR:PATH=etc //Path to a program. -CMAKE_LINKER:FILEPATH=C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/HostX86/x64/link.exe +CMAKE_LINKER:FILEPATH=C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.11.25503/bin/HostX86/x64/link.exe //Flags used by the linker during the creation of modules. CMAKE_MODULE_LINKER_FLAGS:STRING=/machine:x64 /DEBUG:NONE /INCREMENTAL:NO diff --git a/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Release-64bits/setup b/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Release-64bits/setup index 2a8e2065c88..eccdd32702c 100644 --- a/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Release-64bits/setup +++ b/Maintenance/infrastructure/gauguin.geometryfactory.com/reference_platforms/x64_Cygwin-Windows10_MSVC2017-Release-64bits/setup @@ -4,11 +4,9 @@ export VC_VERSION_YEAR="2017" export ARCH="64" export QT_VERSION="5.9.1" export PLATFORM_REFERENCE="/cygdrive/c/CGAL/reference_platforms" -export BOOST_VERSION="1_65_1" export TBB_ARCH_PLATFORM="intel64/vc14" export EIGEN3_DIR="C:/3rdPartyLibs/eigen-master" export INIT_FILE="C:\\CGAL\\reference_platforms\\x64_Cygwin-Windows10_MSVC2017-Release-64bits\\init.cmake" source "${PLATFORM_REFERENCE}/setup_common" - COLLECT_DEMOS_BINARIES=y export COLLECT_DEMOS_BINARIES diff --git a/Maintenance/infrastructure/gauguin.geometryfactory.com/update.sh b/Maintenance/infrastructure/gauguin.geometryfactory.com/update.sh index 827532b3485..aa32f886fa1 100755 --- a/Maintenance/infrastructure/gauguin.geometryfactory.com/update.sh +++ b/Maintenance/infrastructure/gauguin.geometryfactory.com/update.sh @@ -1,6 +1,6 @@ #! /bin/sh rsync -av --chmod=u+rwX gauguin:.autocgalrc autocgalrc -rsync -av --chmod=u+rwX gauguin:cgal/launch_testsuite.bat . +rsync gauguin:cgal/launch_testsuite.bat :cgal/update_eigen.sh . rsync -Cvr --chmod=u+rwX --exclude .vs --exclude '*.cpp' --exclude '*vcxproj*' --exclude '*.sln' --exclude '*.sdf' --exclude include --exclude Makefile --exclude \*.cmake --exclude bin --exclude lib --exclude config --exclude CMakeFiles --exclude src gauguin:cgal/reference_platforms . chmod -R u=rwX . diff --git a/Maintenance/infrastructure/gauguin.geometryfactory.com/update_eigen.sh b/Maintenance/infrastructure/gauguin.geometryfactory.com/update_eigen.sh new file mode 100755 index 00000000000..89262bc6ec9 --- /dev/null +++ b/Maintenance/infrastructure/gauguin.geometryfactory.com/update_eigen.sh @@ -0,0 +1,6 @@ +#!/bin/bash +cd /cygdrive/c/3rdPartyLibs/eigen-master +git pull origin master +cd ../boost_master +git submodule update --init --recursive +./b2 -j8 --toolset=msvc-14.1 address-model=64 architecture=x86 link=static --prefix="C:\3rdPartyLibs\boost_master\install_dir" install \ No newline at end of file diff --git a/Maintenance/public_release/scripts/precompiled_demos_zips b/Maintenance/public_release/scripts/precompiled_demos_zips index 65d82b3b5c8..e733ac3b64d 100755 --- a/Maintenance/public_release/scripts/precompiled_demos_zips +++ b/Maintenance/public_release/scripts/precompiled_demos_zips @@ -64,6 +64,8 @@ pushd Optimal_transportation_reconstruction_2_Demo; zip ../otr2.zip *; #missing demos pushd Polygon_Demo; zip ../polygon.zip *; popd pushd Principal_component_analysis_Demo; zip ../pca.zip *; popd +pushd Hyperbolic_triangulation_2_Demo; zip ../Hyperbolic_Delaunay_triangulation_2.zip *; popd +pushd Periodic_4_hyperbolic_triangulation_2_Demo; zip ../Periodic_4_hyperbolic_Delaunay_triangulation_2.zip *; popd # check echo CHECK now. The following lines should be empty. diff --git a/Mesh_2/demo/Mesh_2/CMakeLists.txt b/Mesh_2/demo/Mesh_2/CMakeLists.txt index ea268eec3f0..f50101e391a 100644 --- a/Mesh_2/demo/Mesh_2/CMakeLists.txt +++ b/Mesh_2/demo/Mesh_2/CMakeLists.txt @@ -11,8 +11,6 @@ endif() find_package(CGAL QUIET) -include_directories(BEFORE ../../../Triangulation_2/include) - if ( CGAL_FOUND ) include(${CGAL_USE_FILE}) diff --git a/Mesh_2/include/CGAL/Delaunay_mesher_2.h b/Mesh_2/include/CGAL/Delaunay_mesher_2.h index 583c1b52e82..c50c0327fa6 100644 --- a/Mesh_2/include/CGAL/Delaunay_mesher_2.h +++ b/Mesh_2/include/CGAL/Delaunay_mesher_2.h @@ -15,7 +15,7 @@ // $URL$ // $Id$ // SPDX-License-Identifier: GPL-3.0+ -// +// // // Author(s) : Laurent RINEAU @@ -85,6 +85,7 @@ public: edges_level(tr, clusters_, null_level), faces_level(tr, criteria, edges_level), visitor(faces_level, edges_level, null_visitor), + seeds_mark(false), initialized(false) { } @@ -99,6 +100,7 @@ public: edges_level(edges_level_), faces_level(tr, criteria, edges_level), visitor(faces_level, null_visitor), + seeds_mark(false), initialized(false) { } diff --git a/Mesh_2/test/Mesh_2/test_double_map.cpp b/Mesh_2/test/Mesh_2/test_double_map.cpp index 7d05a3f7cfc..9dd086b2e30 100644 --- a/Mesh_2/test/Mesh_2/test_double_map.cpp +++ b/Mesh_2/test/Mesh_2/test_double_map.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Mesh_2/test/Mesh_2/test_filtred_container.cpp b/Mesh_2/test/Mesh_2/test_filtred_container.cpp index 3d8a199beba..fed5c3c2967 100644 --- a/Mesh_2/test/Mesh_2/test_filtred_container.cpp +++ b/Mesh_2/test/Mesh_2/test_filtred_container.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Mesh_3/archive/applications/thread_queue.h b/Mesh_3/archive/applications/thread_queue.h index 9fd01f88a37..258ecf4ab72 100644 --- a/Mesh_3/archive/applications/thread_queue.h +++ b/Mesh_3/archive/applications/thread_queue.h @@ -143,7 +143,7 @@ std::string format(std::string input, bool remove_template) if ( input.at(input.size()-1) != '\n' ) input.push_back('\n'); - // Add " ! " at the begining of each line + // Add " ! " at the beginning of each line size_t prev = 0; pos = input.find("\n"); while ( pos != std::string::npos ) diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 1ecba32cce2..629102a8891 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -67,7 +67,6 @@ if ( CGAL_FOUND ) endif() - if ( Boost_FOUND AND Boost_VERSION GREATER 103400 ) # Compilable examples create_single_source_cgal_program( "mesh_hybrid_mesh_domain.cpp" ) create_single_source_cgal_program( "mesh_implicit_sphere.cpp" ) @@ -136,10 +135,6 @@ if ( CGAL_FOUND ) endif() endforeach() - else() - message(STATUS "NOTICE: This program requires Boost >= 1.34.1, and will not be compiled.") - endif() - else() message(STATUS "This program requires the CGAL library, and will not be compiled.") endif() diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_custom_initialization.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_custom_initialization.cpp index 9bd06e32ae4..7a326ee1b2f 100644 --- a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_custom_initialization.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_custom_initialization.cpp @@ -54,7 +54,7 @@ int main() image, criteria, (unsigned char)0); - CGAL::refine_mesh_3(c3t3, domain, criteria); + CGAL::refine_mesh_3(c3t3, domain, criteria); /// [Meshing] // Output diff --git a/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h b/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h index 014b0672808..5116be3239e 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h +++ b/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h @@ -204,8 +204,8 @@ private: { const Vertex_handle& v1 = (*cit)->vertex((k+i)&3); - std::pair is_insert_succesful = treated_vertices.insert(v1); - if ( ! is_insert_succesful.second ) // vertex has already been treated + std::pair is_insert_successful = treated_vertices.insert(v1); + if ( ! is_insert_successful.second ) // vertex has already been treated continue; // Vertex has not been treated: turn around edge(v,v1) diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 2f23191b16b..01a3643937c 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -44,6 +44,7 @@ #include #include #include +#include #if CGAL_MESH_3_PROTECTION_DEBUG # include #endif @@ -55,6 +56,7 @@ #include #include #include +#include #include @@ -148,7 +150,13 @@ public: Protect_edges_sizing_field(C3T3& c3t3, const MeshDomain& domain, SizingFunction size=SizingFunction(), - const FT minimal_size = FT()); + const FT minimal_size = FT(), + std::size_t maximal_number_of_vertices = 0, + Mesh_error_code* error_code = 0 +#ifndef CGAL_NO_ATOMIC + , CGAL::cpp11::atomic* stop_ptr = 0 +#endif + ); void operator()(const bool refine = true); @@ -156,6 +164,27 @@ public: nonlinear_growth_of_balls = b; } + bool forced_stop() const { +#ifndef CGAL_NO_ATOMIC + if(stop_ptr_ != 0 && + stop_ptr_->load(CGAL::cpp11::memory_order_acquire) == true) + { + if(error_code_ != 0) *error_code_ = CGAL_MESH_3_STOPPED; + return true; + } +#endif // not defined CGAL_NO_ATOMIC + if(maximal_number_of_vertices_ != 0 && + c3t3_.triangulation().number_of_vertices() >= + maximal_number_of_vertices_) + { + if(error_code_ != 0) { + *error_code_ = CGAL_MESH_3_MAXIMAL_NUMBER_OF_VERTICES_REACHED; + } + return true; + } + return false; + } + private: typedef std::vector > Incident_edges; typedef std::vector Vertex_vector; @@ -281,7 +310,7 @@ private: Curve_index curve_index) const; /// Walk along the edge from \c start, following the direction \c start to - /// \c next, and fills \c out with the vertices which do not fullfill + /// \c next, and fills \c out with the vertices which do not fulfill /// the sampling conditions. /// /// \param orientation Orientation of the curve segment between \c v1 and @@ -440,13 +469,25 @@ private: Vertex_set unchecked_vertices_; int refine_balls_iteration_nb; bool nonlinear_growth_of_balls; + std::size_t maximal_number_of_vertices_; + Mesh_error_code* const error_code_; +#ifndef CGAL_NO_ATOMIC + /// Pointer to the atomic Boolean that can stop the process + CGAL::cpp11::atomic* const stop_ptr_; +#endif }; template Protect_edges_sizing_field:: Protect_edges_sizing_field(C3T3& c3t3, const MD& domain, - Sf size, const FT minimal_size) + Sf size, const FT minimal_size, + std::size_t maximal_number_of_vertices, + Mesh_error_code* error_code +#ifndef CGAL_NO_ATOMIC + , CGAL::cpp11::atomic* stop_ptr +#endif + ) : c3t3_(c3t3) , domain_(domain) , size_(size) @@ -454,6 +495,11 @@ Protect_edges_sizing_field(C3T3& c3t3, const MD& domain, , minimal_weight_(CGAL::square(minimal_size)) , refine_balls_iteration_nb(0) , nonlinear_growth_of_balls(false) + , maximal_number_of_vertices_(maximal_number_of_vertices) + , error_code_(error_code) +#ifndef CGAL_NO_ATOMIC + , stop_ptr_(stop_ptr) +#endif { #ifndef CGAL_MESH_3_NO_PROTECTION_NON_LINEAR set_nonlinear_growth_of_balls(); @@ -491,7 +537,7 @@ operator()(const bool refine) #endif // Solve problems - if ( refine ) + if ( refine && !forced_stop()) { refine_balls(); #ifdef CGAL_MESH_3_VERBOSE @@ -523,6 +569,7 @@ insert_corners() for ( typename Initial_corners::iterator it = corners.begin(), end = corners.end() ; it != end ; ++it ) { + if(forced_stop()) break; const Bare_point& p = it->second; dt.insert(p); } @@ -530,6 +577,7 @@ insert_corners() for ( typename Initial_corners::iterator cit = corners.begin(), end = corners.end() ; cit != end ; ++cit ) { + if(forced_stop()) break; const Bare_point& p = cit->second; Index p_index = domain_.index_from_corner_index(cit->first); @@ -907,6 +955,7 @@ insert_balls_on_edges() for ( typename Input_features::iterator fit = input_features.begin(), end = input_features.end() ; fit != end ; ++fit ) { + if(forced_stop()) break; const Curve_index& curve_index = std::get<0>(*fit); if ( ! is_treated(curve_index) ) { @@ -1148,6 +1197,7 @@ insert_balls(const Vertex_handle& vp, dim, index, out); + if(forced_stop()) return out; const Vertex_handle new_vertex = pair.first; out = pair.second; const FT sn = get_radius(new_vertex); @@ -1277,6 +1327,7 @@ refine_balls() while ( (!unchecked_vertices_.empty() || restart) && this->refine_balls_iteration_nb < refine_balls_max_nb_of_loops) { + if(forced_stop()) break; #ifdef CGAL_MESH_3_DUMP_FEATURES_PROTECTION_ITERATIONS std::ostringstream oss; oss << "dump_protecting_balls_" << refine_balls_iteration_nb << ".cgal"; @@ -1296,6 +1347,7 @@ refine_balls() for(typename Tr::Finite_edges_iterator eit = tr.finite_edges_begin(), end = tr.finite_edges_end(); eit != end; ++eit) { + if(forced_stop()) break; const Vertex_handle& va = eit->first->vertex(eit->second); const Vertex_handle& vb = eit->first->vertex(eit->third); @@ -1342,6 +1394,7 @@ refine_balls() } } } + if(forced_stop()) new_sizes.clear(); // The std::map with Vertex_handle as the key is not robust, because // the time stamp of vertices can change during the following loop. The @@ -1356,6 +1409,7 @@ refine_balls() end = new_sizes_copy.end(); it != end ; ++it ) { + if(forced_stop()) break; const Vertex_handle v = it->first; const FT new_size = it->second; // Set size of the ball to new value @@ -1379,7 +1433,9 @@ refine_balls() dump_c3t3_edges(c3t3_, "dump-before-check_and_repopulate_edges"); #endif // Check edges - check_and_repopulate_edges(); + if(!forced_stop()) { + check_and_repopulate_edges(); + } } if(this->refine_balls_iteration_nb == refine_balls_max_nb_of_loops) @@ -1553,6 +1609,7 @@ check_and_repopulate_edges() // Fix edges while ( !vertices.empty() ) { + if(forced_stop()) break; Vertex_handle v = *vertices.begin(); vertices.erase(vertices.begin()); @@ -1779,6 +1836,7 @@ walk_along_edge(const Vertex_handle& start, const Vertex_handle& next, // and current intersects enough while ( ! is_sampling_dense_enough(previous, current, curve_index, orientation) ) { + if(forced_stop()) return out; *out++ = current; // Don't go through corners @@ -1887,6 +1945,7 @@ repopulate(InputIterator begin, InputIterator last, #endif // CGAL_MESH_3_PROTECTION_DEBUG *out++ = *current; c3t3_.triangulation().remove(*current); + if(forced_stop()) return out; } // Repopulate edge diff --git a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h index 18f90d9f115..bea16f4fa07 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h @@ -509,8 +509,8 @@ get_sq_distance_to_closest_vertex(const Tr& tr, tr.is_infinite(vn)) continue; - std::pair is_insert_succesful = treated_vertices.insert(vn); - if(! is_insert_succesful.second) // vertex has already been treated + std::pair is_insert_successful = treated_vertices.insert(vn); + if(! is_insert_successful.second) // vertex has already been treated continue; const Point& wpvn = tr.point(c, n); diff --git a/Mesh_3/include/CGAL/Mesh_criteria_3.h b/Mesh_3/include/CGAL/Mesh_criteria_3.h index 57854afdeb5..de8a22cf5e4 100644 --- a/Mesh_3/include/CGAL/Mesh_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_criteria_3.h @@ -83,17 +83,17 @@ public: typedef CellCriteria Cell_criteria; // Constructor - Mesh_criteria_3_impl(const Facet_criteria& facet_criteria, - const Cell_criteria& cell_criteria) + Mesh_criteria_3_impl(Facet_criteria facet_criteria, + Cell_criteria cell_criteria) : edge_criteria_(0) , facet_criteria_(facet_criteria) , cell_criteria_(cell_criteria) { } // Constructor - Mesh_criteria_3_impl(const Edge_criteria& edge_criteria, - const Facet_criteria& facet_criteria, - const Cell_criteria& cell_criteria) + Mesh_criteria_3_impl(Edge_criteria edge_criteria, + Facet_criteria facet_criteria, + Cell_criteria cell_criteria) : edge_criteria_(edge_criteria) , facet_criteria_(facet_criteria) , cell_criteria_(cell_criteria) @@ -182,15 +182,15 @@ public: typedef typename Base::Cell_criteria Cell_criteria; // Constructor - Mesh_criteria_3(const Facet_criteria& facet_criteria, - const Cell_criteria& cell_criteria) + Mesh_criteria_3(Facet_criteria facet_criteria, + Cell_criteria cell_criteria) : Base(facet_criteria, cell_criteria) {} // Constructor - Mesh_criteria_3(const Edge_criteria& edge_criteria, - const Facet_criteria& facet_criteria, - const Cell_criteria& cell_criteria) + Mesh_criteria_3(Edge_criteria edge_criteria, + Facet_criteria facet_criteria, + Cell_criteria cell_criteria) : Base(edge_criteria, facet_criteria, cell_criteria) {} diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 5f0289db43a..4f30d41f279 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -198,7 +198,11 @@ public: @param end past the end iterator on the input polyhedral surfaces @param indices_begin first iterator on the pairs of subdomain indices (two subdomain indices per input polyhedral surface), - corresponding to the first input polyhedral surface + corresponding to the first input polyhedral surface. + Each pair should be ordered as follows : the first (resp. second) + element is the index of the subdomain that lies on the + positively oriented (resp. negatively oriented) side of the + corresponding input polyhedral surface. @param indices_end past the end iterator on the pairs of subdomain indices @tparam InputPolyhedraIterator model of `InputIterator`, holding `Polyhedron`'s diff --git a/Mesh_3/include/CGAL/make_mesh_3.h b/Mesh_3/include/CGAL/make_mesh_3.h index d55ed2075a8..abd460b1468 100644 --- a/Mesh_3/include/CGAL/make_mesh_3.h +++ b/Mesh_3/include/CGAL/make_mesh_3.h @@ -197,13 +197,28 @@ template < typename C3T3, typename MeshDomain, typename MeshCriteria> void init_c3t3_with_features(C3T3& c3t3, const MeshDomain& domain, const MeshCriteria& criteria, - bool nonlinear = false) + bool nonlinear = false, + std::size_t maximal_number_of_vertices = 0, + Mesh_error_code* pointer_to_error_code = 0 +#ifndef CGAL_NO_ATOMIC + , CGAL::cpp11::atomic* pointer_to_stop = 0 +#endif + ) { typedef typename MeshCriteria::Edge_criteria Edge_criteria; typedef Edge_criteria_sizing_field_wrapper Sizing_field; CGAL::Mesh_3::Protect_edges_sizing_field - protect_edges(c3t3, domain, Sizing_field(criteria.edge_criteria_object())); + protect_edges(c3t3, + domain, + Sizing_field(criteria.edge_criteria_object()), + typename Edge_criteria::FT(), + maximal_number_of_vertices, + pointer_to_error_code +#ifndef CGAL_NO_ATOMIC + , pointer_to_stop +#endif + ); protect_edges.set_nonlinear_growth_of_balls(nonlinear); protect_edges(true); @@ -222,12 +237,21 @@ struct C3t3_initializer_base // Not calling 'init_c3t3_with_features' directly to leave it as a free function // outside of the C3T3_initializer class - virtual void initialize_features(C3T3& c3t3, - const MeshDomain& domain, - const MeshCriteria& criteria, - bool nonlinear = false) + virtual void + initialize_features(C3T3& c3t3, + const MeshDomain& domain, + const MeshCriteria& criteria, + const parameters::internal::Mesh_3_options& mesh_options) { - return Mesh_3::internal::init_c3t3_with_features(c3t3, domain, criteria, nonlinear); + return Mesh_3::internal::init_c3t3_with_features + (c3t3, domain, criteria, + mesh_options.nonlinear_growth_of_balls, + mesh_options.maximal_number_of_vertices, + mesh_options.pointer_to_error_code +#ifndef CGAL_NO_ATOMIC + , mesh_options.pointer_to_stop_atomic_boolean +#endif + ); } }; @@ -244,12 +268,12 @@ struct C3t3_initializer { }; template < typename C3T3, typename MD, typename MC, typename HasFeatures > struct C3t3_initializer < C3T3, MD, MC, false, HasFeatures > { + typedef parameters::internal::Mesh_3_options Mesh_3_options; void operator()(C3T3& c3t3, const MD& domain, const MC& criteria, bool with_features, - bool /* nonlinear */= false, - const int nb_initial_points = -1) + Mesh_3_options mesh_options = Mesh_3_options()) { if ( with_features ) { @@ -257,7 +281,8 @@ struct C3t3_initializer < C3T3, MD, MC, false, HasFeatures > << " without features !" << std::endl; } - init_c3t3(c3t3,domain,criteria,nb_initial_points); + init_c3t3(c3t3,domain,criteria, + mesh_options.number_of_initial_points); } }; @@ -266,15 +291,15 @@ struct C3t3_initializer < C3T3, MD, MC, false, HasFeatures > template < typename C3T3, typename MD, typename MC, typename HasFeatures > struct C3t3_initializer < C3T3, MD, MC, true, HasFeatures > { + typedef parameters::internal::Mesh_3_options Mesh_3_options; void operator()(C3T3& c3t3, const MD& domain, const MC& criteria, bool with_features, - bool nonlinear = false, - const int nb_initial_points = -1) + Mesh_3_options mesh_options = Mesh_3_options()) { C3t3_initializer < C3T3, MD, MC, true, typename MD::Has_features >() - (c3t3,domain,criteria,with_features,nonlinear,nb_initial_points); + (c3t3,domain,criteria,with_features,mesh_options); } }; @@ -287,15 +312,15 @@ struct C3t3_initializer < C3T3, MD, MC, true, CGAL::Tag_true > { virtual ~C3t3_initializer() { } + typedef parameters::internal::Mesh_3_options Mesh_3_options; void operator()(C3T3& c3t3, const MD& domain, const MC& criteria, bool with_features, - bool nonlinear = false, - const int nb_initial_points = -1) + Mesh_3_options mesh_options = Mesh_3_options()) { if ( with_features ) { - this->initialize_features(c3t3, domain, criteria, nonlinear); + this->initialize_features(c3t3, domain, criteria,mesh_options); // If c3t3 initialization is not sufficient (may happen if there is only // a planar curve as feature for example), add some surface points @@ -310,10 +335,12 @@ struct C3t3_initializer < C3T3, MD, MC, true, CGAL::Tag_true > } } if(need_more_init) { - init_c3t3(c3t3, domain, criteria, nb_initial_points); + init_c3t3(c3t3, domain, criteria, + mesh_options.number_of_initial_points); } } - else { init_c3t3(c3t3,domain,criteria,nb_initial_points); } + else { init_c3t3(c3t3,domain,criteria, + mesh_options.number_of_initial_points); } } }; @@ -323,12 +350,12 @@ struct C3t3_initializer < C3T3, MD, MC, true, CGAL::Tag_true > template < typename C3T3, typename MD, typename MC > struct C3t3_initializer < C3T3, MD, MC, true, CGAL::Tag_false > { + typedef parameters::internal::Mesh_3_options Mesh_3_options; void operator()(C3T3& c3t3, const MD& domain, const MC& criteria, bool with_features, - bool /* nonlinear */ = false, - const int nb_initial_points = -1) + Mesh_3_options mesh_options = Mesh_3_options()) { if ( with_features ) { @@ -336,7 +363,8 @@ struct C3t3_initializer < C3T3, MD, MC, true, CGAL::Tag_false > << " without features !" << std::endl; } - init_c3t3(c3t3,domain,criteria,nb_initial_points); + init_c3t3(c3t3,domain,criteria, + mesh_options.number_of_initial_points); } }; @@ -438,8 +466,7 @@ void make_mesh_3_impl(C3T3& c3t3, domain, criteria, with_features, - mesh_options.nonlinear_growth_of_balls, - mesh_options.number_of_initial_points); + mesh_options); CGAL_assertion( c3t3.triangulation().dimension() == 3 ); diff --git a/Mesh_3/include/CGAL/refine_mesh_3.h b/Mesh_3/include/CGAL/refine_mesh_3.h index 4f1196af40d..c8820c610ed 100644 --- a/Mesh_3/include/CGAL/refine_mesh_3.h +++ b/Mesh_3/include/CGAL/refine_mesh_3.h @@ -209,7 +209,10 @@ struct Mesh_3_options { #else typedef bool* Pointer_to_stop_atomic_boolean_t; #endif - Mesh_3_options() + Mesh_3_options(bool nonlinear = false) + // This parameter `nonlinear` adds a compatibility with previous + // API of the constructor of `C3t3_initializer`. + // -- Laurent Rineau, 2019/05/03 : dump_after_init_prefix() , dump_after_refine_surface_prefix() , dump_after_refine_prefix() @@ -217,7 +220,7 @@ struct Mesh_3_options { , dump_after_perturb_prefix() , dump_after_exude_prefix() , number_of_initial_points(-1) - , nonlinear_growth_of_balls(false) + , nonlinear_growth_of_balls(nonlinear) , maximal_number_of_vertices(0) , pointer_to_error_code(0) #ifndef CGAL_NO_ATOMIC @@ -381,6 +384,7 @@ BOOST_PARAMETER_FUNCTION((internal::Mesh_3_options), mesh_3_options, tag, (dump_after_exude_prefix_, (std::string), "" ) (number_of_initial_points_, (int), -1) (maximal_number_of_vertices_, (std::size_t), 0) + (nonlinear_growth_of_balls_, (bool), false) (pointer_to_error_code_, (Mesh_error_code*), ((Mesh_error_code*)0)) (pointer_to_stop_atomic_boolean_, (internal::Mesh_3_options::Pointer_to_stop_atomic_boolean_t), ((internal::Mesh_3_options::Pointer_to_stop_atomic_boolean_t)0)) ) @@ -395,6 +399,7 @@ BOOST_PARAMETER_FUNCTION((internal::Mesh_3_options), mesh_3_options, tag, options.dump_after_perturb_prefix=dump_after_perturb_prefix_; options.dump_after_exude_prefix=dump_after_exude_prefix_; options.number_of_initial_points=number_of_initial_points_; + options.nonlinear_growth_of_balls = nonlinear_growth_of_balls_; options.maximal_number_of_vertices=maximal_number_of_vertices_; options.pointer_to_error_code=pointer_to_error_code_; #ifndef CGAL_NO_ATOMIC diff --git a/Mesh_3/test/Mesh_3/test_meshing_polyhedral_complex.cpp b/Mesh_3/test/Mesh_3/test_meshing_polyhedral_complex.cpp index 5ff4f6daff8..bee4a693508 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_polyhedral_complex.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_polyhedral_complex.cpp @@ -106,7 +106,7 @@ struct Polyhedral_complex_tester : public Tester true /*nonlinear_growth_of_balls*/); domain.add_vertices_to_c3t3_on_patch_without_feature_edges(c3t3); - CGAL::refine_mesh_3(c3t3, domain, criteria); + CGAL::refine_mesh_3(c3t3, domain, criteria); CGAL::remove_far_points_in_mesh_3(c3t3); diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt b/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt index 6aa716ec4ec..22388d7d7b6 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt @@ -363,9 +363,9 @@ Decomposition methods that handle polygons with holes are typically more costly than decomposition methods that handle only simple polygons. The hole filtration (see \ref mink_ssec_hole_filter) is applied before the actual construction starts (be it convolution -based or decomposition based). The filteration may result with a +based or decomposition based). The filtration may result with a polygon that does not have holes, or even a convex polygon, but this -is unkown at the time of the call. To this end, we introduce the +is unknown at the time of the call. To this end, we introduce the overloaded function template \link minkowski_sum_by_decomposition_2() `minkowski_sum_by_decomposition_2(P, Q, no_holes_decomp, with_holes_decomp)`\endlink, where `no_holes_decomp` and `with_holes_decomp` are objects that model @@ -478,7 +478,7 @@ rational number. Therefore, the line segments that compose the offset boundaries cannot be represented as segments of lines with rational coefficients. In Section \ref mink_ssec_exact_offset we use the line-pair representation -to construct the offset polygonin an exact manner using the traits class +to construct the offset polygon in an exact manner using the traits class for conic arcs. @@ -601,10 +601,10 @@ handles polygons with holes, such as the An operation closely related to the (outer) offset computation, is computing the inner offset of a polygon, or insetting it by a given radius. The inset of a polygon \f$ P\f$ with radius -\f$ r\f$ is the set of points iside \f$ P\f$ the distance of which +\f$ r\f$ is the set of points inside \f$ P\f$ the distance of which from the polygon boundary, denoted \f$ \partial P\f$, is at least \f$ r\f$, namely: \f$ \{ p \in P \;|\; {\rm dist}(p, \partial P) \geq r \}\f$. -Note that the resulting point set may be dicconnected when \f$ P\f$ is a +Note that the resulting point set may be disconnected when \f$ P\f$ is a non-convex polygon that has some narrow components. In such a case the resulting set is characterized by a (possibly empty) set of polygons the edges of which are line segments and circular arcs of radius \f$ r\f$. @@ -659,7 +659,7 @@ millennium with his research work about Minkowski sum construction using the decomposition approach. However, it was only a few years later when Ron Wein developed the first version of this package, which was introduced with release 3.3. The first version of the package contained functionality for -computeing the Minkowski sum of two polygons, computing the offset of +computing the Minkowski sum of two polygons, computing the offset of a polygon by a disk, and approximating the offset of a polygon by a disk. Release 3.4 contained an enhancement of the offset computation, which allowed for polygon with holes as operands. Release 3.4 also featured new functionality diff --git a/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h b/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h index 1d267473b13..f5ba38e184b 100644 --- a/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h +++ b/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h @@ -321,7 +321,7 @@ minkowski_sum_2(const Polygon_2& pgn1, * const typename Minkowski_sum_by_decomposition_2::Traits_2> - * are exchangable except for in one case, where there is an ambiguity. + * are exchangeable except for in one case, where there is an ambiguity. * Thus, we use the former, even though it is less generic, as change to the * traits type in Minkowski_sum_by_decomposition_2 would require a similar * change here. diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/test_exact_offset.cpp b/Minkowski_sum_2/test/Minkowski_sum_2/test_exact_offset.cpp index b2eef25b687..9675a95ff54 100644 --- a/Minkowski_sum_2/test/Minkowski_sum_2/test_exact_offset.cpp +++ b/Minkowski_sum_2/test/Minkowski_sum_2/test_exact_offset.cpp @@ -1,4 +1,4 @@ -#include +#include #ifndef CGAL_USE_CORE diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum.cpp b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum.cpp index 5792752dabb..09c0ad4b089 100644 --- a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum.cpp +++ b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum.cpp @@ -1,5 +1,3 @@ -#include - #include #include #include diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp index c887fef70e5..6a3fe2917b1 100644 --- a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp +++ b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cpp @@ -1,5 +1,3 @@ -#include - #include #include #include diff --git a/Modifier/test/Modifier/test_modifier.cpp b/Modifier/test/Modifier/test_modifier.cpp index a1ce5e2b616..b247c524476 100644 --- a/Modifier/test/Modifier/test_modifier.cpp +++ b/Modifier/test/Modifier/test_modifier.cpp @@ -11,7 +11,7 @@ // release : $CGAL_Revision: $ // release_date : $CGAL_Date: $ // -// file : test_modifier.C +// file : test_modifier.cpp // chapter : $CGAL_Chapter: Protected access to the internal repr.$ // package : $CGAL_Package: Modifier 1.2 (07 Apr 1999) $ // source : modifier.fw @@ -24,8 +24,7 @@ // Protected access to the internal representation. // ============================================================================ - -#include +#include #include #include diff --git a/Modular_arithmetic/include/CGAL/Modular_arithmetic/Residue_type.h b/Modular_arithmetic/include/CGAL/Modular_arithmetic/Residue_type.h index d2ddb6a8dcc..ebf593071a9 100644 --- a/Modular_arithmetic/include/CGAL/Modular_arithmetic/Residue_type.h +++ b/Modular_arithmetic/include/CGAL/Modular_arithmetic/Residue_type.h @@ -22,10 +22,14 @@ #ifndef CGAL_RESIDUE_TYPE_H #define CGAL_RESIDUE_TYPE_H -#include #include +#include +#include +#include +#include #include +#include #include diff --git a/Modular_arithmetic/include/CGAL/Modular_traits.h b/Modular_arithmetic/include/CGAL/Modular_traits.h index 6eca13370e1..a663e6daaa9 100644 --- a/Modular_arithmetic/include/CGAL/Modular_traits.h +++ b/Modular_arithmetic/include/CGAL/Modular_traits.h @@ -21,11 +21,7 @@ #ifndef CGAL_MODULAR_TRAITS_H #define CGAL_MODULAR_TRAITS_H 1 -#include -#include -#include -#include - +#include namespace CGAL { diff --git a/Modular_arithmetic/include/CGAL/Residue.h b/Modular_arithmetic/include/CGAL/Residue.h index 549b6c14886..234d4bdd7e9 100644 --- a/Modular_arithmetic/include/CGAL/Residue.h +++ b/Modular_arithmetic/include/CGAL/Residue.h @@ -28,9 +28,10 @@ #ifndef CGAL_RESIDUE_H #define CGAL_RESIDUE_H 1 -#include #include #include +#include +#include namespace CGAL { diff --git a/Modular_arithmetic/test/Modular_arithmetic/Modular_traits.cpp b/Modular_arithmetic/test/Modular_arithmetic/Modular_traits.cpp index 93367ed86ff..c71c486da0f 100644 --- a/Modular_arithmetic/test/Modular_arithmetic/Modular_traits.cpp +++ b/Modular_arithmetic/test/Modular_arithmetic/Modular_traits.cpp @@ -6,7 +6,7 @@ test for number type modul */ -#include +#include #include #include #include diff --git a/Modular_arithmetic/test/Modular_arithmetic/Residue.cpp b/Modular_arithmetic/test/Modular_arithmetic/Residue.cpp index 1fdadfd0888..ca8b865e4cd 100644 --- a/Modular_arithmetic/test/Modular_arithmetic/Residue.cpp +++ b/Modular_arithmetic/test/Modular_arithmetic/Residue.cpp @@ -4,10 +4,11 @@ test for number type modul */ -#include +#include #include #include #include +#include #include #include diff --git a/Modular_arithmetic/test/Modular_arithmetic/multi_threads.cpp b/Modular_arithmetic/test/Modular_arithmetic/multi_threads.cpp index 0da6638a4b8..d742ca365bb 100644 --- a/Modular_arithmetic/test/Modular_arithmetic/multi_threads.cpp +++ b/Modular_arithmetic/test/Modular_arithmetic/multi_threads.cpp @@ -1,6 +1,6 @@ // Author(s) : Michael Hemmer -#include + #include #include #include diff --git a/Nef_2/doc/Nef_2/Nef_2.txt b/Nef_2/doc/Nef_2/Nef_2.txt index 6ef4527417a..a153fe9dad2 100644 --- a/Nef_2/doc/Nef_2/Nef_2.txt +++ b/Nef_2/doc/Nef_2/Nef_2.txt @@ -21,7 +21,7 @@ of a nonempty finite set of points. Convex polytopes are compact closed and manifold sets.
  • elementary polyhedra normally defined as the union of a finite number of convex polytopes. -
  • polyhedral sets nomally defined as the intersection +
  • polyhedral sets normally defined as the intersection of a finite number of closed halfspaces. Such sets are closed and convex but need not to be compact.
  • linear polyhedra normally defined as the set of all @@ -61,7 +61,7 @@ the corresponding reference pages. \cgalExample{Nef_2/nef_2_construction.cpp} -Planar halfspaces (as used in the definition) are modelled by oriented +Planar halfspaces (as used in the definition) are modeled by oriented lines. In the previous example `N1` is the Nef polyhedron representing the full plane, `N2` is the closed halfspace left of the oriented line with equation \f$ 2x + 4y + 2 = 0\f$ including the line, diff --git a/Nef_2/doc/Nef_2/PackageDescription.txt b/Nef_2/doc/Nef_2/PackageDescription.txt index 66c43295b0d..431ae610e7c 100644 --- a/Nef_2/doc/Nef_2/PackageDescription.txt +++ b/Nef_2/doc/Nef_2/PackageDescription.txt @@ -15,7 +15,6 @@ \cgalPkgSince{2.3} \cgalPkgBib{cgal:s-bonp2} \cgalPkgLicense{\ref licensesGPL "GPL"} -\cgalPkgDemo{2D Nef Polygons,nef_2.zip} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd diff --git a/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h b/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h index 5f4b92ef5d2..281de8a22ae 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h @@ -40,6 +40,8 @@ #include #endif +#include + namespace CGAL { template @@ -492,6 +494,9 @@ check_integrity_and_topological_planarity(bool faces) const std::size_t e_num = number_of_edges(); std::size_t c_num = number_of_connected_components() - iso_vert_num; std::size_t f_num = number_of_face_cycles() - c_num + 1; + CGAL_USE(v_num); + CGAL_USE(e_num); + CGAL_USE(f_num); CGAL_NEF_TRACEV(fc_num);CGAL_NEF_TRACEV(iv_num);CGAL_NEF_TRACEV(iso_vert_num); CGAL_NEF_TRACEV(v_num);CGAL_NEF_TRACEV(e_num);CGAL_NEF_TRACEV(c_num);CGAL_NEF_TRACEV(f_num); // CGAL_assertion(fc_num == f_num && iv_num == iso_vert_num); diff --git a/Nef_2/include/CGAL/Nef_2/gen_point_location.h b/Nef_2/include/CGAL/Nef_2/gen_point_location.h index 1915a8e0bf0..355327a786c 100644 --- a/Nef_2/include/CGAL/Nef_2/gen_point_location.h +++ b/Nef_2/include/CGAL/Nef_2/gen_point_location.h @@ -332,7 +332,7 @@ class PointLocator { |PLocTraits| which widely controls its behaviour. The traits may even change the return type of a query and its semantics. There are predined traits classes for the LEDA graph types, which are - described below in a seperate section. + described below in a separate section. }*/ public: // copied types from PLocTraits diff --git a/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp b/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp index 17f80e626af..ce11dcb479a 100644 --- a/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp +++ b/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Nef_2/test/Nef_2/Polynomial-test.cpp b/Nef_2/test/Nef_2/Polynomial-test.cpp index 72ea8e7f00e..7beae66f4af 100644 --- a/Nef_2/test/Nef_2/Polynomial-test.cpp +++ b/Nef_2/test/Nef_2/Polynomial-test.cpp @@ -1,4 +1,4 @@ -#include +#include #include diff --git a/Nef_2/test/Nef_2/include/CGAL/test_macros.h b/Nef_2/test/Nef_2/include/CGAL/test_macros.h index 5feb9974b52..d7e437f47e7 100644 --- a/Nef_2/test/Nef_2/include/CGAL/test_macros.h +++ b/Nef_2/test/Nef_2/include/CGAL/test_macros.h @@ -1,7 +1,6 @@ #ifndef CGAL_TEST_MACROS_H #define CGAL_TEST_MACROS_H -#include #include #include #include diff --git a/Nef_3/doc/Nef_3/Nef_3.txt b/Nef_3/doc/Nef_3/Nef_3.txt index 8fff20623fe..b1bd50533b8 100644 --- a/Nef_3/doc/Nef_3/Nef_3.txt +++ b/Nef_3/doc/Nef_3/Nef_3.txt @@ -57,7 +57,7 @@ generality. Starting from halfspaces (and also directly from oriented 2-manifolds), we can work with set union, set intersection, set difference, set complement, interior, exterior, boundary, closure, and regularization operations (see Section \ref sectoinRegularized -for an explaination of regularized +for an explanation of regularized set operations). In essence, we can evaluate a CSG-tree with halfspaces as primitives and convert it into a B-rep representation. diff --git a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h index 909b46148be..e9de9ef3884 100644 --- a/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h +++ b/Nef_3/include/CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h @@ -154,8 +154,8 @@ struct Shell_polygons_visitor polygons.back().push_back(vertex_indices[v[1]]); polygons.back().push_back(vertex_indices[v[2]]); polygons.push_back( Polygon() ); - polygons.back().push_back(vertex_indices[v[2]]); polygons.back().push_back(vertex_indices[v[0]]); + polygons.back().push_back(vertex_indices[v[2]]); polygons.back().push_back(vertex_indices[v[3]]); } else @@ -165,8 +165,8 @@ struct Shell_polygons_visitor polygons.back().push_back(vertex_indices[v[0]]); polygons.back().push_back(vertex_indices[v[2]]); polygons.push_back( Polygon() ); - polygons.back().push_back(vertex_indices[v[0]]); polygons.back().push_back(vertex_indices[v[2]]); + polygons.back().push_back(vertex_indices[v[0]]); polygons.back().push_back(vertex_indices[v[3]]); } } diff --git a/Nef_S2/doc/Nef_S2/Nef_S2.txt b/Nef_S2/doc/Nef_S2/Nef_S2.txt index ac85f5915bd..0f08b31eb02 100644 --- a/Nef_S2/doc/Nef_S2/Nef_S2.txt +++ b/Nef_S2/doc/Nef_S2/Nef_S2.txt @@ -129,7 +129,7 @@ Afterwards the iterator can be casted to the proper handle type. \subsection Nef_S2PointLocation Point Location -Using the `locate` function, it is possible to retrive an item at a +Using the `locate` function, it is possible to retrieve an item at a certain location on the sphere. In the following example, the item at location `Sphere_point(1,0,0)` in a random `Nef_polyhedron_S2` is retrieved. `locate` returns an instance of type `Nef_polyhedron_S2::Object_handle`, which diff --git a/Nef_S2/test/Nef_S2/include/CGAL/test_macros.h b/Nef_S2/test/Nef_S2/include/CGAL/test_macros.h index ed43a0684b0..f1c827c5636 100644 --- a/Nef_S2/test/Nef_S2/include/CGAL/test_macros.h +++ b/Nef_S2/test/Nef_S2/include/CGAL/test_macros.h @@ -1,7 +1,6 @@ #ifndef CGAL_TEST_MACROS_H #define CGAL_TEST_MACROS_H -#include #include #include #include diff --git a/Number_types/include/CGAL/Exact_algebraic.h b/Number_types/include/CGAL/Exact_algebraic.h new file mode 100644 index 00000000000..f3b40d64f12 --- /dev/null +++ b/Number_types/include/CGAL/Exact_algebraic.h @@ -0,0 +1,71 @@ +// Copyright (c) 2019 +// Utrecht University (The Netherlands), +// ETH Zurich (Switzerland), +// INRIA Sophia-Antipolis (France), +// Max-Planck-Institute Saarbruecken (Germany), +// and Tel-Aviv University (Israel). All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Andreas Fabri + +#include + +#ifdef CGAL_USE_LEDA +# include +# include +# include +#endif +#ifdef CGAL_USE_CORE +# include +#endif + + +namespace CGAL { + +/*! +\ingroup nt_cgal + +`Exact_algebraic` is an exact algebraic number type, constructible from `double`. + +It is a typedef of another number type. Its exact definition depends on +the availability the third-party libraries %CORE, and %LEDA. %CGAL must +be configured with at least one of those libraries. + +\cgalModels `FieldWithSqrt` +\cgalModels `RealEmbeddable` +\cgalModels `Fraction` +\cgalModels `FromDoubleConstructible` + +*/ +#if DOXYGEN_RUNNING + +typedef unspecified_type Exact_algebraic; + +#else // not DOXYGEN_RUNNING + +#ifdef CGAL_USE_CORE + typedef CORE::Expr Exact_algebraic; +#endif + +#ifdef CGAL_USE_LEDA +typedef leda_real Exact_algebraic; +#endif + +#endif + +} /* end namespace CGAL */ diff --git a/Number_types/include/CGAL/FPU.h b/Number_types/include/CGAL/FPU.h index 929687eec74..caa4ae75984 100644 --- a/Number_types/include/CGAL/FPU.h +++ b/Number_types/include/CGAL/FPU.h @@ -1,4 +1,4 @@ -// Copyright (c) 1998-2008 +// Copyright (c) 1998-2019 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), @@ -21,13 +21,14 @@ // SPDX-License-Identifier: LGPL-3.0+ // // -// Author(s) : Sylvain Pion +// Author(s) : Sylvain Pion, Marc Glisse #ifndef CGAL_FPU_H #define CGAL_FPU_H #include #include +#include // std::memcpy #ifndef __INTEL_COMPILER #include // for HUGE_VAL @@ -108,6 +109,15 @@ extern "C" { || (defined(_M_IX86_FP) && _M_IX86_FP >= 2) \ || defined(_M_X64) # include +# if defined __SSE3__ +# include +# endif +# if defined __SSE4_1__ +# include +# endif +# if defined __AVX__ +# include +# endif # define CGAL_HAS_SSE2 1 #endif @@ -230,6 +240,58 @@ inline double IA_force_to_double(double x) #endif } +#ifdef CGAL_USE_SSE2 +// Vector version of IA_opacify +inline __m128d IA_opacify128(__m128d x) +{ +# ifdef __GNUG__ +# ifdef __llvm__ + asm volatile ("":"+x"(x)); +# else + asm volatile ("":"+xm"(x)); +# endif + return x; +# else + volatile __m128d e = x; +# ifdef _MSC_VER + // With VS, __m128d is a union, where volatile doesn't disappear automatically + // However, this version generates wrong code with clang, check before enabling it for more compilers. + std::memcpy(&x, (void*)&e, 16); + return x; +# else + return e; +# endif +# endif +} + +// Weaker version. It still blocks transformations like -(a-b) to b-a, but does not prevent migrating across fesetround. When an operation has 2 arguments and one uses IA_opacify128, the other one can stick to IA_opacify128_weak +inline __m128d IA_opacify128_weak(__m128d x) +{ +# ifdef __GNUG__ +# ifdef __llvm__ + asm ("":"+x"(x)); +# else + asm ("":"+xm"(x)); +# endif + return x; +# else + return IA_opacify128(x); +# endif +} + +// _mm_shuffle_pd would work everywhere, but it is too opaque for some optimizations (yes, this is a thin line) +inline __m128d swap_m128d(__m128d x){ +# ifdef __llvm__ + return __builtin_shufflevector(x, x, 1, 0); +# elif defined __GNUC__ && !defined __INTEL_COMPILER \ + && __GNUC__ * 100 + __GNUC_MINOR__ >= 407 + return __builtin_shuffle(x, (__m128i){ 1, 0 }); +# else + return _mm_shuffle_pd(x, x, 1); +# endif +} +#endif + // Interval arithmetic needs to protect against double-rounding effects // caused by excess FPU precision, even if it forces the 53bit mantissa // precision, because there is no way to fix the problem for the exponent @@ -296,9 +358,12 @@ inline double IA_bug_sqrt(double d) // Use inline functions instead ? #define CGAL_IA_ADD(a,b) CGAL_IA_FORCE_TO_DOUBLE((a)+CGAL_IA_STOP_CPROP(b)) #define CGAL_IA_SUB(a,b) CGAL_IA_FORCE_TO_DOUBLE(CGAL_IA_STOP_CPROP(a)-(b)) -#define CGAL_IA_MUL(a,b) CGAL_IA_FORCE_TO_DOUBLE((a)*CGAL_IA_STOP_CPROP(b)) -#define CGAL_IA_DIV(a,b) CGAL_IA_FORCE_TO_DOUBLE((a)/CGAL_IA_STOP_CPROP(b)) -#define CGAL_IA_SQUARE(a) CGAL_IA_MUL(a,a) +#define CGAL_IA_MUL(a,b) CGAL_IA_FORCE_TO_DOUBLE(CGAL_IA_STOP_CPROP(a)*CGAL_IA_STOP_CPROP(b)) +#define CGAL_IA_DIV(a,b) CGAL_IA_FORCE_TO_DOUBLE(CGAL_IA_STOP_CPROP(a)/CGAL_IA_STOP_CPROP(b)) +inline double CGAL_IA_SQUARE(double a){ + double b = CGAL_IA_STOP_CPROP(a); // only once + return CGAL_IA_FORCE_TO_DOUBLE(b*b); +} #define CGAL_IA_SQRT(a) \ CGAL_IA_FORCE_TO_DOUBLE(CGAL_BUG_SQRT(CGAL_IA_STOP_CPROP(a))) diff --git a/Number_types/include/CGAL/Interval_nt.h b/Number_types/include/CGAL/Interval_nt.h index a746ef86597..79a1ff4e88d 100644 --- a/Number_types/include/CGAL/Interval_nt.h +++ b/Number_types/include/CGAL/Interval_nt.h @@ -1,4 +1,4 @@ -// Copyright (c) 1998-2005,2007 +// Copyright (c) 1998-2019 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), @@ -21,7 +21,7 @@ // SPDX-License-Identifier: LGPL-3.0+ // // -// Author(s) : Sylvain Pion, Michael Hemmer +// Author(s) : Sylvain Pion, Michael Hemmer, Marc Glisse #ifndef CGAL_INTERVAL_NT_H #define CGAL_INTERVAL_NT_H @@ -54,6 +54,15 @@ #include #include +#ifdef __GNUC__ +// gcc's __builtin_constant_p does not like arguments with side effects. Be +// careful not to use this macro for something that the compiler will have +// trouble eliminating as dead code. +# define CGAL_CST_TRUE(X) ({ bool _ugly_ = (X); __builtin_constant_p(_ugly_) && _ugly_; }) +#else +# define CGAL_CST_TRUE(X) false +#endif + namespace CGAL { template @@ -72,36 +81,43 @@ public: Interval_nt() #ifndef CGAL_NO_ASSERTIONS - : _inf(1), _sup(0) +# ifdef CGAL_USE_SSE2 + : val(_mm_setr_pd(-1, 0)) +# else + : _inf(-1), _sup(0) +# endif // to early and deterministically detect use of uninitialized #endif {} Interval_nt(int i) - : _inf(i), _sup(i) {} + { *this = static_cast(i); } Interval_nt(unsigned i) - : _inf(i), _sup(i) {} + { *this = static_cast(i); } Interval_nt(long long i) - : _inf(static_cast(i)), _sup(static_cast(i)) { // gcc ignores -frounding-math when converting integers to floats. + // Is this safe against excess precision? -- Marc Glisse, Dec 2012 + double d = static_cast(i); + *this = d; #ifdef __GNUC__ long long safe = 1LL << 52; // Use numeric_limits? - bool exact = ((long long)_inf == i) || (i <= safe && i >= -safe); - if (!(__builtin_constant_p(exact) && exact)) + bool exact = ((long long)d == i) || (i <= safe && i >= -safe); + if (!CGAL_CST_TRUE(exact)) #endif *this += smallest(); } Interval_nt(unsigned long long i) - : _inf(static_cast(i)), _sup(static_cast(i)) { + double d = static_cast(i); + *this = d; #ifdef __GNUC__ unsigned long long safe = 1ULL << 52; // Use numeric_limits? - bool exact = ((unsigned long long)_inf == i) || (i <= safe); - if (!(__builtin_constant_p(exact) && exact)) + bool exact = ((unsigned long long)d == i) || (i <= safe); + if (!CGAL_CST_TRUE(exact)) #endif *this += smallest(); } @@ -121,7 +137,10 @@ public: } Interval_nt(double d) - : _inf(d), _sup(d) { CGAL_assertion(is_finite(d)); } + { + CGAL_assertion(is_finite(d)); + *this = Interval_nt(d, d); + } // The Intel compiler on Linux is aggressive with constant propagation and // it seems there is no flag to stop it, so disable this check for it. @@ -130,24 +149,41 @@ public: # define CGAL_DISABLE_ROUNDING_MATH_CHECK #endif +#ifdef CGAL_USE_SSE2 + // This constructor should really be private, like the simd() function, but + // that would mean a lot of new friends, so they are only undocumented. + explicit Interval_nt(__m128d v) : val(v) {} +#endif + Interval_nt(double i, double s) - : _inf(i), _sup(s) +#ifdef CGAL_USE_SSE2 + : val(_mm_setr_pd(-i, s)) +#else + : _inf(-i), _sup(s) +#endif { // Previously it was: // CGAL_assertion_msg(!(i>s); // But MSVC++ 2012 optimizes the test "!(i>s)" to "i<=s", even with // /fp:strict. If 'i' or 's' is a NaN, that makes a difference. CGAL_assertion_msg( (!is_valid(i)) || (!is_valid(s)) || (!(i>s)), - " Variable used before being initialized (or CGAL bug)"); + " Variable used before being initialized (or CGAL bug)"); #ifndef CGAL_DISABLE_ROUNDING_MATH_CHECK CGAL_assertion_code((void) tester;) // Necessary to trigger a runtime test of rounding modes. #endif } Interval_nt(const Pair & p) - : _inf(p.first), _sup(p.second) {} + { *this = Interval_nt(p.first, p.second); } - IA operator-() const { return IA (-sup(), -inf()); } + IA operator-() const + { +#ifdef CGAL_USE_SSE2 + return IA (swap_m128d(val)); +#else + return IA (-sup(), -inf()); +#endif + } IA & operator+= (const IA &d) { return *this = *this + d; } IA & operator-= (const IA &d) { return *this = *this - d; } @@ -161,16 +197,49 @@ public: bool is_same (const IA & d) const { +#ifdef CGAL_USE_SSE2 + // Faster to answer yes, but slower to answer no. + return _mm_movemask_pd (_mm_cmpneq_pd (val, d.val)) == 0; +#else return inf() == d.inf() && sup() == d.sup(); +#endif } bool do_overlap (const IA & d) const { +#ifdef CGAL_USE_SSE2 + __m128d m = _mm_set1_pd (-0.); + __m128d y = _mm_xor_pd ((-d).val, m); // {-ds,di} + __m128d c = _mm_cmplt_pd (val, y); // {i>ds,s sup() || d.sup() < inf()); +#endif } - const double & inf() const { return _inf; } - const double & sup() const { return _sup; } + double inf() const + { +#ifdef CGAL_USE_SSE2 + return -_mm_cvtsd_f64(val); +#else + return -_inf; +#endif + } + double sup() const + { +#ifdef CGAL_USE_SSE2 + return _mm_cvtsd_f64(swap_m128d(val)); + // The following is a bit more natural, but + // - it is too opaque + // - it is a less likely CSE candidate + // return _mm_cvtsd_f64(_mm_unpackhi_pd(val, val)); +#else + return _sup; +#endif + } +#ifdef CGAL_USE_SSE2 + __m128d simd() const { return val; } +#endif std::pair pair() const { @@ -197,7 +266,16 @@ public: private: // Pair inf_sup; + // The value stored in _inf is the negated lower bound. + // TODO: experiment with different orders of the values in the SSE2 register, + // for instance {sup, -inf}, or {inf, -sup}, and adapt users to query the low + // value in priority. {-inf, sup} has the drawback that neither inf nor sup + // is free to access. +#ifdef CGAL_USE_SSE2 + __m128d val; +#else double _inf, _sup; +#endif struct Test_runtime_rounding_modes { Test_runtime_rounding_modes() @@ -217,6 +295,537 @@ private: #ifndef CGAL_DISABLE_ROUNDING_MATH_CHECK static const Test_runtime_rounding_modes tester; #endif + + friend + Uncertain + operator<(const Interval_nt &a, const Interval_nt &b) + { + if (a.sup() < b.inf()) return true; + if (a.inf() >= b.sup()) return false; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator>(const Interval_nt &a, const Interval_nt &b) + { return b < a; } + + friend + Uncertain + operator<=(const Interval_nt &a, const Interval_nt &b) + { + if (a.sup() <= b.inf()) return true; + if (a.inf() > b.sup()) return false; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator>=(const Interval_nt &a, const Interval_nt &b) + { return b <= a; } + + friend + Uncertain + operator==(const Interval_nt &a, const Interval_nt &b) + { + if (b.inf() > a.sup() || b.sup() < a.inf()) return false; + if (b.inf() == a.sup() && b.sup() == a.inf()) return true; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator!=(const Interval_nt &a, const Interval_nt &b) + { return ! (a == b); } + + + // Mixed operators with double. + + friend + Uncertain + operator<(double a, const Interval_nt &b) + { + if (a < b.inf()) return true; + if (a >= b.sup()) return false; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator>(double a, const Interval_nt &b) + { return b < a; } + + friend + Uncertain + operator<=(double a, const Interval_nt &b) + { + if (a <= b.inf()) return true; + if (a > b.sup()) return false; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator>=(double a, const Interval_nt &b) + { return b <= a; } + + friend + Uncertain + operator==(double a, const Interval_nt &b) + { + if (b.inf() > a || b.sup() < a) return false; + if (b.is_point()) return true; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator!=(double a, const Interval_nt &b) + { return ! (a == b); } + + friend + Uncertain + operator<(const Interval_nt &a, double b) + { + if (a.sup() < b) return true; + if (a.inf() >= b) return false; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator>(const Interval_nt &a, double b) + { return b < a; } + + friend + Uncertain + operator<=(const Interval_nt &a, double b) + { + if (a.sup() <= b) return true; + if (a.inf() > b) return false; + return Uncertain::indeterminate(); + } + + friend + Uncertain + operator>=(const Interval_nt &a, double b) + { return b <= a; } + + friend + Uncertain + operator==(const Interval_nt &a, double b) + { + return b == a; + } + + friend + Uncertain + operator!=(const Interval_nt &a, double b) + { return b != a; } + + friend + std::ostream & operator<< (std::ostream &os, const Interval_nt & I ) + { + return os << "[" << I.inf() << ";" << I.sup() << "]"; + } + +#define CGAL_SWALLOW(IS,CHAR) \ + { \ + char c; \ + do is.get(c); while (isspace(c)); \ + if (c != CHAR) { \ + is.setstate(std::ios_base::failbit); \ + } \ + } \ + + friend + std::istream & operator>> (std::istream &is, Interval_nt & I) + { + char c; + do is.get(c); while (isspace(c)); + is.putback(c); + if(c == '['){ // read original output from operator << + double inf,sup; + CGAL_SWALLOW(is, '[');// read the "[" + is >> iformat(inf); + CGAL_SWALLOW(is, ';');// read the ";" + is >> iformat(sup); + CGAL_SWALLOW(is, ']');// read the "]" + I = Interval_nt(inf,sup); + }else{ //read double (backward compatibility) + double d; + is >> d; + I = d; + } + return is; + } +#undef CGAL_SWALLOW + + friend + Interval_nt + operator+ (const Interval_nt &a, const Interval_nt & b) + { + Internal_protector P; +#ifdef CGAL_USE_SSE2 + __m128d aa = IA_opacify128(a.simd()); + __m128d bb = IA_opacify128_weak(b.simd()); + __m128d r = _mm_add_pd(aa, bb); + return Interval_nt(IA_opacify128(r)); +#else + return Interval_nt (-CGAL_IA_ADD(-a.inf(), -b.inf()), + CGAL_IA_ADD(a.sup(), b.sup())); +#endif + } + + // MSVC does not define __SSE3__ +#if defined CGAL_USE_SSE2 && (defined __SSE3__ || defined __AVX__) + friend + Interval_nt + operator+ (double a, const Interval_nt & b) + { + Internal_protector P; + __m128d aa = _mm_set1_pd(IA_opacify(a)); + __m128d bb = IA_opacify128_weak(b.simd()); + __m128d r = _mm_addsub_pd(bb, aa); + return Interval_nt(IA_opacify128(r)); + } + + friend + Interval_nt + operator+ (const Interval_nt & a, double b) + { + return b + a; + } +#endif + + friend + Interval_nt + operator+( const Interval_nt& a ) { + return a; + } + + friend + Interval_nt + operator- (const Interval_nt &a, const Interval_nt & b) + { +#ifdef CGAL_USE_SSE2 + return a+-b; +#else + Internal_protector P; + return Interval_nt(-CGAL_IA_ADD(b.sup(), -a.inf()), + CGAL_IA_ADD(a.sup(), -b.inf())); +#endif + } + +#ifdef CGAL_USE_SSE2 + friend + Interval_nt + operator- (double a, const Interval_nt & b) + { + return a+-b; + } +#endif + + friend + Interval_nt + operator* (const Interval_nt &a, const Interval_nt & b) + { +#if 0 + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88626 + if(CGAL_CST_TRUE(a.is_point())) + return a.inf() * b; + else if(CGAL_CST_TRUE(b.is_point())) + return a * b.inf(); +#endif + Internal_protector P; +#ifdef CGAL_USE_SSE2 +# if 1 + // Brutal, compute all products in all directions. + // The actual winner (by a hair) on recent hardware + __m128d aa = IA_opacify128_weak(a.simd()); // {-ai,as} + __m128d bb = b.simd(); // {-bi,bs} + __m128d m = _mm_set_sd(-0.); // {-0,+0} + __m128d m1 = _mm_set1_pd(-0.); // {-0,-0} + __m128d ax = swap_m128d (aa); // {as,-ai} + __m128d ap = _mm_xor_pd (ax, m1); // {-as,ai} + __m128d bz = _mm_xor_pd(bb, m); // {bi,bs} + bz = IA_opacify128(bz); + __m128d c = swap_m128d (bz); // {bs,bi} + __m128d x1 = _mm_mul_pd(aa,bz); // {-ai*bi,as*bs} + __m128d x2 = _mm_mul_pd(aa,c); // {-ai*bs,as*bi} + __m128d x3 = _mm_mul_pd(ap,bz); // {-as*bi,ai*bs} + __m128d x4 = _mm_mul_pd(ap,c); // {-as*bs,ai*bi} + __m128d y1 = _mm_max_pd(x1,x2); + __m128d y2 = _mm_max_pd(x3,x4); + __m128d r = _mm_max_pd (y1, y2); + return IA (IA_opacify128(r)); +# elif 0 + // we want to multiply ai,as with {ai<0?-bs:-bi,as<0?bi:bs} + // we want to multiply as,ai with {as<0?-bs:-bi,ai<0?bi:bs} + // requires SSE4 (otherwise use _mm_cmplt_pd, _mm_and_pd, _mm_andnot_pd and _mm_or_pd to avoid blendv) + // probably faster on older hardware + __m128d m = _mm_set_sd(-0.); // {-0,+0} + __m128d m1 = _mm_set1_pd(-0.); // {-0,-0} + __m128d aa = a.simd(); // {-ai,as} + __m128d az = _mm_xor_pd(aa, m); // {ai,as} + az = IA_opacify128_weak(az); + __m128d azp = swap_m128d (az); // {as,ai} + __m128d bb = IA_opacify128(b.simd()); // {-bi,bs} + __m128d bx = swap_m128d (bb); // {bs,-bi} + __m128d bp = _mm_xor_pd(bx, m1); // {-bs,bi} + __m128d x = _mm_blendv_pd (bb, bp, az); // {ai<0?-bs:-bi,as<0?bi:bs} + __m128d y = _mm_blendv_pd (bb, bp, azp); // {as<0?-bs:-bi,ai<0?bi:bs} + __m128d p1 = _mm_mul_pd (az, x); + __m128d p2 = _mm_mul_pd (azp, y); + __m128d r = _mm_max_pd (p1, p2); + return IA (IA_opacify128(r)); +# elif 0 + // we want to multiply -ai,as with {ai>0?bi:bs,as<0?bi:bs} + // we want to multiply -as,ai with {as<0?bs:bi,ai>0?bs:bi} + // slightly worse than the previous one + __m128d m1 = _mm_set1_pd(-0.); // {-0,-0} + __m128d aa = IA_opacify128_weak(a.simd()); // {-ai,as} + __m128d ax = swap_m128d (aa); // {as,-ai} + __m128d ap = _mm_xor_pd (ax, m1); // {-as,ai} + __m128d bb = IA_opacify128(b.simd()); // {-bi,bs} + double bi = -_mm_cvtsd_f64(bb); + double bs = _mm_cvtsd_f64(_mm_unpackhi_pd(bb,bb)); + __m128d bbi = _mm_set1_pd(bi); // {bi,bi} + __m128d bbs = _mm_set1_pd(bs); // {bs,bs} + __m128d x = _mm_blendv_pd (bbs, bbi, aa); // {ai>0?bi:bs,as<0?bi:bs} + __m128d y = _mm_blendv_pd (bbi, bbs, ax); // {as<0?bs:bi,ai>0?bs:bi} + __m128d p1 = _mm_mul_pd (aa, x); + __m128d p2 = _mm_mul_pd (ap, y); + __m128d r = _mm_max_pd (p1, p2); + return IA (IA_opacify128(r)); +# else + // AVX version of the brutal method, same running time or slower + __m128d aa = IA_opacify128_weak(a.simd()); // {-ai,as} + __m128d bb = b.simd(); // {-bi,bs} + __m128d m = _mm_set_sd(-0.); // {-0,+0} + __m128d m1 = _mm_set1_pd(-0.); // {-0,-0} + __m128d ax = swap_m128d (aa); // {as,-ai} + __m128d ap = _mm_xor_pd (ax, m1); // {-as,ai} + __m128d bz = _mm_xor_pd(bb, m); // {bi,bs} + bz = IA_opacify128(bz); + __m256d X = _mm256_set_m128d(ap,aa); // {-ai,as,-as,ai} + __m256d Y1 = _mm256_set_m128d(bz,bz); // {bi,bs,bi,bs} + __m256d Y2 = _mm256_permute_pd(Y1,5); // {bs,bi,bs,bi} + __m256d Z1 = _mm256_mul_pd(X,Y1); + __m256d Z2 = _mm256_mul_pd(X,Y2); + __m256d Z = _mm256_max_pd(Z1,Z2); + __m128d z1 = _mm256_castpd256_pd128(Z); + __m128d z2 = _mm256_extractf128_pd(Z,1); + __m128d r = _mm_max_pd (z1, z2); + return IA (IA_opacify128(r)); +# endif +#else + if (a.inf() >= 0.0) // a>=0 + { + // b>=0 [a.inf()*b.inf(); a.sup()*b.sup()] + // b<=0 [a.sup()*b.inf(); a.inf()*b.sup()] + // b~=0 [a.sup()*b.inf(); a.sup()*b.sup()] + double aa = a.inf(), bb = a.sup(); + if (b.inf() < 0.0) + { + aa = bb; + if (b.sup() < 0.0) + bb = a.inf(); + } + return IA(-CGAL_IA_MUL(aa, -b.inf()), CGAL_IA_MUL(bb, b.sup())); + } + else if (a.sup()<=0.0) // a<=0 + { + // b>=0 [a.inf()*b.sup(); a.sup()*b.inf()] + // b<=0 [a.sup()*b.sup(); a.inf()*b.inf()] + // b~=0 [a.inf()*b.sup(); a.inf()*b.inf()] + double aa = a.sup(), bb = a.inf(); + if (b.inf() < 0.0) + { + aa=bb; + if (b.sup() < 0.0) + bb=a.sup(); + } + return IA(-CGAL_IA_MUL(-bb, b.sup()), CGAL_IA_MUL(-aa, -b.inf())); + } + else // 0 \in a + { + if (b.inf()>=0.0) // b>=0 + return IA(-CGAL_IA_MUL(-a.inf(), b.sup()), + CGAL_IA_MUL( a.sup(), b.sup())); + if (b.sup()<=0.0) // b<=0 + return IA(-CGAL_IA_MUL( a.sup(), -b.inf()), + CGAL_IA_MUL(-a.inf(), -b.inf())); + // 0 \in b + double tmp1 = CGAL_IA_MUL(-a.inf(), b.sup()); + double tmp2 = CGAL_IA_MUL( a.sup(), -b.inf()); + double tmp3 = CGAL_IA_MUL(-a.inf(), -b.inf()); + double tmp4 = CGAL_IA_MUL( a.sup(), b.sup()); + return IA(-(std::max)(tmp1,tmp2), (std::max)(tmp3,tmp4)); + } +#endif + } + + friend + Interval_nt + operator* (double a, Interval_nt b) + { + // return Interval_nt(a)*b; + Internal_protector P; + if (a < 0) { a = -a; b = -b; } + // Now a >= 0 +#ifdef CGAL_USE_SSE2 + // TODO: try/benchmark a branchless version + __m128d bb = IA_opacify128_weak(b.simd()); + __m128d aa = _mm_set1_pd(IA_opacify(a)); + __m128d r = _mm_mul_pd(aa, bb); + return IA(IA_opacify128(r)); +#else + return IA(-CGAL_IA_MUL(a, -b.inf()), CGAL_IA_MUL(a, b.sup())); +#endif + } + + friend + Interval_nt + operator* (const Interval_nt & a, double b) + { + return b * a; + } + + friend + Interval_nt + operator/ (const Interval_nt &a, const Interval_nt & b) + { +#if 0 + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88626 + if(CGAL_CST_TRUE(a.is_point())) + return a.inf() / b; + else if(CGAL_CST_TRUE(b.is_point())) + return a / b.inf(); +#endif + Internal_protector P; +#if defined CGAL_USE_SSE2 && (defined __SSE4_1__ || defined __AVX__) + //// not a tight bound, but easy: + // return CGAL::inverse(b)*a; +# if 1 + // Current fastest + // if b>0 we want [ai/(ai>0?bs:bi),as/(as>0?bi:bs)] + // if b<0 we want [as/(as>0?bs:bi),ai/(ai>0?bi:bs)] + __m128d m = _mm_set_sd(-0.); + __m128d aa = a.simd(); + __m128d bb = b.simd(); + int i = _mm_movemask_pd(_mm_cmpge_pd(bb, _mm_set1_pd(0.))); + if(i==3) return largest(); // bi<=0 && bs>=0 + __m128d ap = _mm_xor_pd(aa, m); // {ai, as} + __m128d ax = swap_m128d(ap); // {as, ai} + __m128d bp = _mm_xor_pd(bb, m); // {bi, bs} + __m128d bx = swap_m128d(bp); // {bs, bi} + __m128d num = _mm_blendv_pd(ap, ax, bp); // {(b>0)?ai:as, (b>0)?as:ai} + __m128d d = _mm_blendv_pd(bx, bp, num); + // Can we rearrange things so we need fewer xor? + __m128d den = _mm_xor_pd(d, m); + num = IA_opacify128_weak(num); + den = IA_opacify128(den); + __m128d r = _mm_div_pd(num, den); + return IA (IA_opacify128(r)); +# else + // Similar to the multiplication, but slow, because divisions are slow + // if b>0 we want [-max(-ai/bi,-ai/bs),max(as/bi,as/bs)] {-ai,as}/{bi,bs} {-ai,as}/{bs,bi} + // if b<0 we want [-max(-as/bi,-as/bs),max(ai/bi,ai/bs)] {-as,ai}/{bi,bs} {-as,ai}/{bs,bi} + __m128d m = _mm_set_sd(-0.); + __m128d m1 = _mm_set1_pd(-0.); + __m128d aa = a.simd(); // {-ai, as} + __m128d bb = b.simd(); // {-bi, bs} + int i = _mm_movemask_pd(_mm_cmpge_pd(bb, _mm_set1_pd(0.))); + if(i==3) return largest(); // bi<=0 && bs>=0 + __m128d ap = _mm_xor_pd(aa, m1); // {ai, -as} + __m128d ax = swap_m128d(ap); // {-as, ai} + __m128d bp = _mm_xor_pd(bb, m); // {bi, bs} + __m128d num = _mm_blendv_pd(aa, ax, bp); + num = IA_opacify128_weak(num); + bp = IA_opacify128(bp); + __m128d bx = swap_m128d(bp); // {bs, bi} + __m128d d1 = _mm_div_pd(num, bp); + __m128d d2 = _mm_div_pd(num, bx); + __m128d r = _mm_max_pd(d1, d2); + return IA (IA_opacify128(r)); +# endif +#else + if (b.inf() > 0.0) // b>0 + { + // e>=0 [a.inf()/b.sup(); a.sup()/b.inf()] + // e<=0 [a.inf()/b.inf(); a.sup()/b.sup()] + // e~=0 [a.inf()/b.inf(); a.sup()/b.inf()] + double aa = b.sup(), bb = b.inf(); + if (a.inf() < 0.0) + { + aa = bb; + if (a.sup() < 0.0) + bb = b.sup(); + } + return IA(-CGAL_IA_DIV(-a.inf(), aa), CGAL_IA_DIV(a.sup(), bb)); + } + else if (b.sup()<0.0) // b<0 + { + // e>=0 [a.sup()/b.sup(); a.inf()/b.inf()] + // e<=0 [a.sup()/b.inf(); a.inf()/b.sup()] + // e~=0 [a.sup()/b.sup(); a.inf()/b.sup()] + double aa = b.sup(), bb = b.inf(); + if (a.inf() < 0.0) + { + bb = aa; + if (a.sup() < 0.0) + aa = b.inf(); + } + return IA(-CGAL_IA_DIV(a.sup(), -aa), CGAL_IA_DIV(a.inf(), bb)); + } + else // b~0 + return largest(); + // We could do slightly better -> [0;infinity] when b.sup()==0, + // but is this worth ? +#endif + } + + // Without SSE2, let it use the function above. +#ifdef CGAL_USE_SSE2 + friend + Interval_nt + operator/ (double a, const Interval_nt & b) + { + int i = _mm_movemask_pd(_mm_cmpge_pd(b.simd(), _mm_set1_pd(0.))); + if(i==3) return largest(); // bi<=0 && bs>=0 + __m128d aa, xx; + if(a>0){ + aa = _mm_set1_pd(-a); + xx = (-b).simd(); + } else if(a<0){ + aa = _mm_set1_pd(a); + xx = b.simd(); + } else return 0.; + Internal_protector P; + __m128d r = _mm_div_pd(IA_opacify128_weak(aa), IA_opacify128(xx)); + return Interval_nt(IA_opacify128(r)); + } + + friend + Interval_nt + operator/ (Interval_nt a, double b) + { + if(b<0){ a = -a; b = -b; } + else if(b==0) return largest(); + // Now b > 0 + Internal_protector P; +# ifdef __GNUC__ + // Paradoxically, constants should be safe, and this lets the compiler optimize x/2 to x*.5 + if (!__builtin_constant_p(b)) +# endif + b = IA_opacify(b); + __m128d bb = _mm_set1_pd(b); + __m128d aa = IA_opacify128(a.simd()); + __m128d r = _mm_div_pd(aa, bb); + return Interval_nt(IA_opacify128(r)); + } +#endif }; #ifndef CGAL_DISABLE_ROUNDING_MATH_CHECK @@ -225,153 +834,6 @@ const typename Interval_nt::Test_runtime_rounding_modes Interval_nt::tester; #endif -template -inline -Uncertain -operator<(const Interval_nt &a, const Interval_nt &b) -{ - if (a.sup() < b.inf()) return true; - if (a.inf() >= b.sup()) return false; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator>(const Interval_nt &a, const Interval_nt &b) -{ return b < a; } - -template -inline -Uncertain -operator<=(const Interval_nt &a, const Interval_nt &b) -{ - if (a.sup() <= b.inf()) return true; - if (a.inf() > b.sup()) return false; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator>=(const Interval_nt &a, const Interval_nt &b) -{ return b <= a; } - -template -inline -Uncertain -operator==(const Interval_nt &a, const Interval_nt &b) -{ - if (b.inf() > a.sup() || b.sup() < a.inf()) return false; - if (b.inf() == a.sup() && b.sup() == a.inf()) return true; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator!=(const Interval_nt &a, const Interval_nt &b) -{ return ! (a == b); } - - -// Mixed operators with double. - -template -inline -Uncertain -operator<(double a, const Interval_nt &b) -{ - if (a < b.inf()) return true; - if (a >= b.sup()) return false; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator>(double a, const Interval_nt &b) -{ return b < a; } - -template -inline -Uncertain -operator<=(double a, const Interval_nt &b) -{ - if (a <= b.inf()) return true; - if (a > b.sup()) return false; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator>=(double a, const Interval_nt &b) -{ return b <= a; } - -template -inline -Uncertain -operator==(double a, const Interval_nt &b) -{ - if (b.inf() > a || b.sup() < a) return false; - if (b.inf() == a && b.sup() == a) return true; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator!=(double a, const Interval_nt &b) -{ return ! (a == b); } - -template -inline -Uncertain -operator<(const Interval_nt &a, double b) -{ - if (a.sup() < b) return true; - if (a.inf() >= b) return false; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator>(const Interval_nt &a, double b) -{ return b < a; } - -template -inline -Uncertain -operator<=(const Interval_nt &a, double b) -{ - if (a.sup() <= b) return true; - if (a.inf() > b) return false; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator>=(const Interval_nt &a, double b) -{ return b <= a; } - -template -inline -Uncertain -operator==(const Interval_nt &a, double b) -{ - if (b > a.sup() || b < a.inf()) return false; - if (b == a.sup() && b == a.inf()) return true; - return Uncertain::indeterminate(); -} - -template -inline -Uncertain -operator!=(const Interval_nt &a, double b) -{ return ! (a == b); } - // Non-documented @@ -402,7 +864,14 @@ inline double magnitude (const Interval_nt & d) { +#ifdef CGAL_USE_SSE2 + const __m128d m = _mm_castsi128_pd (_mm_set1_epi64x (0x7fffffffffffffff)); + __m128d x = _mm_and_pd (d.simd(), m); // { abs(inf), abs(sup) } + __m128d y = _mm_unpackhi_pd (x, x); + return _mm_cvtsd_f64 (_mm_max_sd (x, y)); +#else return (std::max)(CGAL::abs(d.inf()), CGAL::abs(d.sup())); +#endif } // Non-documented @@ -450,237 +919,16 @@ class Is_valid< Interval_nt > : public CGAL::cpp98::unary_function< Interval_nt, bool > { public : bool operator()( const Interval_nt& x ) const { - return is_valid(x.inf()) && + return is_valid(-x.inf()) && is_valid(x.sup()) && x.inf() <= x.sup(); } }; -template -std::ostream & operator<< (std::ostream &os, const Interval_nt & I ) -{ - return os << "[" << I.inf() << ";" << I.sup() << "]"; -} - -#define CGAL_SWALLOW(IS,CHAR) \ - { \ - char c; \ - do is.get(c); while (isspace(c)); \ - if (c != CHAR) { \ - is.setstate(std::ios_base::failbit); \ - } \ - } \ - -template -std::istream & operator>> (std::istream &is, Interval_nt & I) -{ - char c; - do is.get(c); while (isspace(c)); - is.putback(c); - if(c == '['){ // read original output from operator << - double inf,sup; - CGAL_SWALLOW(is, '[');// read the "[" - is >> iformat(inf); - CGAL_SWALLOW(is, ';');// read the ";" - is >> iformat(sup); - CGAL_SWALLOW(is, ']');// read the "]" - I = Interval_nt(inf,sup); - }else{ //read double (backward compatibility) - double d; - is >> d; - I = d; - } - return is; -} -#undef CGAL_SWALLOW typedef Interval_nt Interval_nt_advanced; // for backward-compatibility -template -inline -Interval_nt -operator+ (const Interval_nt &a, const Interval_nt & b) -{ - typename Interval_nt::Internal_protector P; - return Interval_nt (-CGAL_IA_SUB(-a.inf(), b.inf()), - CGAL_IA_ADD(a.sup(), b.sup())); -} - -template -inline -Interval_nt -operator+ (double a, const Interval_nt & b) -{ - return Interval_nt(a)+b; -} - -template -inline -Interval_nt -operator+ (const Interval_nt & a, double b) -{ - return a+Interval_nt(b); -} - -template< bool Protected > -inline -Interval_nt -operator+( const Interval_nt& a ) { - return a; -} - -template -inline -Interval_nt -operator- (const Interval_nt &a, const Interval_nt & b) -{ - typename Interval_nt::Internal_protector P; - return Interval_nt(-CGAL_IA_SUB(b.sup(), a.inf()), - CGAL_IA_SUB(a.sup(), b.inf())); -} - -template -inline -Interval_nt -operator- (double a, const Interval_nt & b) -{ - return Interval_nt(a)-b; -} - -template -inline -Interval_nt -operator- (const Interval_nt & a, double b) -{ - return a-Interval_nt(b); -} - -template -inline -Interval_nt -operator* (const Interval_nt &a, const Interval_nt & b) -{ - typedef Interval_nt IA; - typename Interval_nt::Internal_protector P; - if (a.inf() >= 0.0) // a>=0 - { - // b>=0 [a.inf()*b.inf(); a.sup()*b.sup()] - // b<=0 [a.sup()*b.inf(); a.inf()*b.sup()] - // b~=0 [a.sup()*b.inf(); a.sup()*b.sup()] - double aa = a.inf(), bb = a.sup(); - if (b.inf() < 0.0) - { - aa = bb; - if (b.sup() < 0.0) - bb = a.inf(); - } - return IA(-CGAL_IA_MUL(aa, -b.inf()), CGAL_IA_MUL(bb, b.sup())); - } - else if (a.sup()<=0.0) // a<=0 - { - // b>=0 [a.inf()*b.sup(); a.sup()*b.inf()] - // b<=0 [a.sup()*b.sup(); a.inf()*b.inf()] - // b~=0 [a.inf()*b.sup(); a.inf()*b.inf()] - double aa = a.sup(), bb = a.inf(); - if (b.inf() < 0.0) - { - aa=bb; - if (b.sup() < 0.0) - bb=a.sup(); - } - return IA(-CGAL_IA_MUL(bb, -b.sup()), CGAL_IA_MUL(aa, b.inf())); - } - else // 0 \in a - { - if (b.inf()>=0.0) // b>=0 - return IA(-CGAL_IA_MUL(a.inf(), -b.sup()), - CGAL_IA_MUL(a.sup(), b.sup())); - if (b.sup()<=0.0) // b<=0 - return IA(-CGAL_IA_MUL(a.sup(), -b.inf()), - CGAL_IA_MUL(a.inf(), b.inf())); - // 0 \in b - double tmp1 = CGAL_IA_MUL(a.inf(), -b.sup()); - double tmp2 = CGAL_IA_MUL(a.sup(), -b.inf()); - double tmp3 = CGAL_IA_MUL(a.inf(), b.inf()); - double tmp4 = CGAL_IA_MUL(a.sup(), b.sup()); - return IA(-(std::max)(tmp1,tmp2), (std::max)(tmp3,tmp4)); - } -} - -template -inline -Interval_nt -operator* (double a, const Interval_nt & b) -{ - return Interval_nt(a)*b; -} - -template -inline -Interval_nt -operator* (const Interval_nt & a, double b) -{ - return a*Interval_nt(b); -} - -template -inline -Interval_nt -operator/ (const Interval_nt &a, const Interval_nt & b) -{ - typedef Interval_nt IA; - typename Interval_nt::Internal_protector P; - if (b.inf() > 0.0) // b>0 - { - // e>=0 [a.inf()/b.sup(); a.sup()/b.inf()] - // e<=0 [a.inf()/b.inf(); a.sup()/b.sup()] - // e~=0 [a.inf()/b.inf(); a.sup()/b.inf()] - double aa = b.sup(), bb = b.inf(); - if (a.inf() < 0.0) - { - aa = bb; - if (a.sup() < 0.0) - bb = b.sup(); - } - return IA(-CGAL_IA_DIV(a.inf(), -aa), CGAL_IA_DIV(a.sup(), bb)); - } - else if (b.sup()<0.0) // b<0 - { - // e>=0 [a.sup()/b.sup(); a.inf()/b.inf()] - // e<=0 [a.sup()/b.inf(); a.inf()/b.sup()] - // e~=0 [a.sup()/b.sup(); a.inf()/b.sup()] - double aa = b.sup(), bb = b.inf(); - if (a.inf() < 0.0) - { - bb = aa; - if (a.sup() < 0.0) - aa = b.inf(); - } - return IA(-CGAL_IA_DIV(a.sup(), -aa), CGAL_IA_DIV(a.inf(), bb)); - } - else // b~0 - return IA::largest(); - // We could do slightly better -> [0;infinity] when b.sup()==0, - // but is this worth ? -} - -template -inline -Interval_nt -operator/ (double a, const Interval_nt & b) -{ - return Interval_nt(a)/b; -} - -template -inline -Interval_nt -operator/ (const Interval_nt & a, double b) -{ - return a/Interval_nt(b); -} - // TODO: What about these two guys? Where do they belong to? template struct Min > @@ -691,9 +939,16 @@ struct Min > Interval_nt operator()( const Interval_nt& d, const Interval_nt& e) const { +#ifdef CGAL_USE_SSE2 + __m128d x = _mm_min_pd (d.simd(), e.simd()); + // Use _mm_max_sd instead? + __m128d y = _mm_max_pd (d.simd(), e.simd()); + return Interval_nt (_mm_move_sd (x, y)); +#else return Interval_nt( - (std::min)(d.inf(), e.inf()), - (std::min)(d.sup(), e.sup())); + -(std::max)(-d.inf(), -e.inf()), + (std::min)( d.sup(), e.sup())); +#endif } }; @@ -706,9 +961,16 @@ struct Max > Interval_nt operator()( const Interval_nt& d, const Interval_nt& e) const { +#ifdef CGAL_USE_SSE2 + // Use _mm_min_sd instead? + __m128d x = _mm_min_pd (d.simd(), e.simd()); + __m128d y = _mm_max_pd (d.simd(), e.simd()); + return Interval_nt (_mm_move_sd (y, x)); +#else return Interval_nt( - (std::max)(d.inf(), e.inf()), - (std::max)(d.sup(), e.sup())); + -(std::min)(-d.inf(), -e.inf()), + (std::max)( d.sup(), e.sup())); +#endif } }; @@ -836,9 +1098,33 @@ namespace INTERN_INTERVAL_NT { // sqrt([+a,+b]) => [sqrt(+a);sqrt(+b)] // sqrt([-a,+b]) => [0;sqrt(+b)] => assumes roundoff error. // sqrt([-a,-b]) => [0;sqrt(-b)] => assumes user bug (unspecified result). +#ifdef __AVX512F__ + double i = 0; + if(d.inf() > 0){ + __m128d x = d.simd(); + __m128d m = _mm_set_sd(-0.); + __m128d y = _mm_xor_pd(x, m); + // We don't opacify because hopefully a rounded operation is explicit + // enough that compilers won't mess with it, and it does not care about + // fesetround. + __m128d vr = _mm_sqrt_round_sd(y, y, _MM_FROUND_TO_NEG_INF|_MM_FROUND_NO_EXC); + i = _mm_cvtsd_f64(vr); + // We could compute the sqrt of d.sup() using _mm_sqrt_pd (same speed as + // _sd except on broadwell) so it is already in the high part and we can + // call _mm_sqrt_round_sd(y, x, ...) to merge them directly, but I doubt + // it helps significantly, it might even hurt by introducing a + // dependency. + } +#else + // TODO: Alternative for computing CGAL_IA_SQRT_DOWN(d.inf()) exactly + // without changing the rounding mode: + // - compute x = CGAL_IA_SQRT(d.inf()) + // - compute y = CGAL_IA_SQUARE(x) + // - if y==d.inf() use x, else use -CGAL_IA_SUB(CGAL_IA_MIN_DOUBLE,x) FPU_set_cw(CGAL_FE_DOWNWARD); double i = (d.inf() > 0.0) ? CGAL_IA_SQRT(d.inf()) : 0.0; FPU_set_cw(CGAL_FE_UPWARD); +#endif return Interval_nt(i, CGAL_IA_SQRT(d.sup())); } @@ -847,13 +1133,14 @@ namespace INTERN_INTERVAL_NT { Interval_nt square (const Interval_nt & d) { + //TODO: SSE version, possibly using abs typename Interval_nt::Internal_protector P; if (d.inf()>=0.0) - return Interval_nt(-CGAL_IA_MUL(d.inf(), -d.inf()), - CGAL_IA_MUL(d.sup(), d.sup())); + return Interval_nt(-CGAL_IA_MUL(-d.inf(), d.inf()), + CGAL_IA_SQUARE(d.sup())); if (d.sup()<=0.0) return Interval_nt(-CGAL_IA_MUL(d.sup(), -d.sup()), - CGAL_IA_MUL(d.inf(), d.inf())); + CGAL_IA_SQUARE(-d.inf())); return Interval_nt(0.0, CGAL_IA_SQUARE((std::max)(-d.inf(), d.sup()))); } @@ -863,9 +1150,20 @@ namespace INTERN_INTERVAL_NT { Interval_nt abs (const Interval_nt & d) { +#ifdef CGAL_USE_SSE2 + __m128d a = d.simd(); + __m128d b = (-d).simd(); + __m128d x = _mm_min_pd (a, b); + __m128d y = _mm_max_pd (a, b); + __m128d t = _mm_move_sd (y, x); + __m128d z = _mm_set1_pd(-0.); // +0. would be valid, but I'd rather end up with interval [+0, sup] + __m128d r = _mm_min_sd(t, z); + return Interval_nt (r); +#else if (d.inf() >= 0.0) return d; if (d.sup() <= 0.0) return -d; return Interval_nt(0.0, (std::max)(-d.inf(), d.sup())); +#endif } template @@ -901,17 +1199,6 @@ namespace INTERN_INTERVAL_NT { return Uncertain::indeterminate(); } - template - inline - Uncertain - is_one (const Interval_nt & d) - { - if (d.inf() > 1) return false; - if (d.sup() < 1) return false; - if (d.inf() == d.sup()) return true; - return Uncertain::indeterminate(); - } - template inline Uncertain @@ -1030,11 +1317,12 @@ class Algebraic_structure_traits< Interval_nt > } }; + // Specialized just to specify the result type class Is_one : public CGAL::cpp98::unary_function< Type, Boolean > { public: Boolean operator()( const Type& x ) const { - return INTERN_INTERVAL_NT::is_one( x ); + return x == 1; } }; @@ -1090,7 +1378,6 @@ class Algebraic_structure_traits< Interval_nt > return Boolean(true); } }; - }; @@ -1178,7 +1465,7 @@ public: struct Singleton :public CGAL::cpp98::unary_function{ bool operator()( const Interval& a ) const { - return Lower()(a) == Upper()(a); + return a.is_point(); } }; @@ -1220,12 +1507,15 @@ public: struct Hull :public CGAL::cpp98::binary_function{ Interval operator()( const Interval& a, const Interval& b ) const { +#ifdef CGAL_USE_SSE2 + return Interval(_mm_max_pd(a.simd(), b.simd())); +#else BOOST_USING_STD_MAX(); BOOST_USING_STD_MIN(); return Interval( - std::make_pair( - min BOOST_PREVENT_MACRO_SUBSTITUTION (Lower()(a),b.inf()), - max BOOST_PREVENT_MACRO_SUBSTITUTION (Upper()(a),b.sup()))); + -max BOOST_PREVENT_MACRO_SUBSTITUTION (-a.inf(),-b.inf()), + max BOOST_PREVENT_MACRO_SUBSTITUTION ( a.sup(), b.sup())); +#endif } }; @@ -1326,4 +1616,6 @@ namespace Eigen { } } +#undef CGAL_CST_TRUE + #endif // CGAL_INTERVAL_NT_H diff --git a/Number_types/include/CGAL/Lazy_exact_nt.h b/Number_types/include/CGAL/Lazy_exact_nt.h index 44aed45d06d..2444d8e12a1 100644 --- a/Number_types/include/CGAL/Lazy_exact_nt.h +++ b/Number_types/include/CGAL/Lazy_exact_nt.h @@ -22,11 +22,6 @@ #ifndef CGAL_LAZY_EXACT_NT_H #define CGAL_LAZY_EXACT_NT_H -#define CGAL_int(T) typename First_if_different::Type -#define CGAL_double(T) typename First_if_different::Type -#define CGAL_To_interval(T) To_interval - - #include #include @@ -53,6 +48,9 @@ #include +#define CGAL_int(T) typename First_if_different::Type +#define CGAL_double(T) typename First_if_different::Type +#define CGAL_To_interval(T) To_interval /* * This file contains the definition of the number type Lazy_exact_nt, diff --git a/Number_types/include/CGAL/Mpzf.h b/Number_types/include/CGAL/Mpzf.h index 73fe360be9f..568765e9828 100644 --- a/Number_types/include/CGAL/Mpzf.h +++ b/Number_types/include/CGAL/Mpzf.h @@ -145,7 +145,7 @@ template struct pool1 { template std::vector pool1::data; // Use an intrusive single-linked list instead (allocate one more limb and use -// it to store the pointer to next), the difference isn't that noticable (still +// it to store the pointer to next), the difference isn't that noticeable (still // the list wins). Neither is thread-safe (both can be with threadlocal, and // the list can be with an atomic compare-exchange (never tried)). With gcc, // TLS has a large effect on classes with constructor/destructor, but is free diff --git a/Number_types/include/CGAL/Quotient.h b/Number_types/include/CGAL/Quotient.h index 1a0bc36fd12..4e122fe7238 100644 --- a/Number_types/include/CGAL/Quotient.h +++ b/Number_types/include/CGAL/Quotient.h @@ -32,8 +32,6 @@ // The include is done before the protect macro on purpose, because // of a cyclic dependency. -#include - #ifndef CGAL_QUOTIENT_H #define CGAL_QUOTIENT_H diff --git a/Number_types/include/CGAL/Root_of_traits.h b/Number_types/include/CGAL/Root_of_traits.h index b80e9ccdb2d..36b5faedeff 100644 --- a/Number_types/include/CGAL/Root_of_traits.h +++ b/Number_types/include/CGAL/Root_of_traits.h @@ -33,11 +33,12 @@ namespace CGAL { template < typename NT > struct Root_of_traits; -template < class NT > +template < class NT1, class NT2, class NT3 > inline -typename Root_of_traits< NT >::Root_of_2 -make_root_of_2(const NT &a, const NT &b, const NT &c) +auto +make_root_of_2(const NT1 &a, const NT2 &b, const NT3 &c) { + using NT = std::common_type_t; typename Root_of_traits::Make_root_of_2 make_root_of_2; return make_root_of_2(a,b,c); } diff --git a/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h b/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h index 92c33de4a50..95078bb874a 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h +++ b/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h @@ -651,6 +651,37 @@ CGAL::Comparison_result return (EQUAL); } + + private: + template static bool + is_equal (const Sqrt_extension& p1, const Sqrt_extension& p2) + { return (p1-p2).is_zero(); } + template static bool + is_equal (const Sqrt_extension& p1, const Sqrt_extension& p2) + { return ( p1.compare(p2) == CGAL::ZERO ); } + + public: + // BINARY operators + friend bool operator == (const Sqrt_extension& p1, const Sqrt_extension& p2) + { return Sqrt_extension::is_equal(p1, p2); } // if constexpr (ACDE_TAG::value) ... + friend bool operator < (const Sqrt_extension& p1, const Sqrt_extension& p2) + { return ( p1.compare(p2) == CGAL::SMALLER ); } + + // NT + friend bool operator == (const Sqrt_extension& p, const NT& num) + { return (p-num).is_zero();} + friend bool operator < (const Sqrt_extension& p, const NT& num) + { return ( p.compare(num) == CGAL::SMALLER ); } + friend bool operator > (const Sqrt_extension& p, const NT& num) + { return ( p.compare(num) == CGAL::LARGER ); } + + //CGAL_int(NT) + friend bool operator == (const Sqrt_extension& p, CGAL_int(NT) num) + { return (p-num).is_zero();} + friend bool operator < (const Sqrt_extension& p, CGAL_int(NT) num) + { return ( p.compare(num) == CGAL::SMALLER ); } + friend bool operator > (const Sqrt_extension& p, CGAL_int(NT) num) + { return ( p.compare(num) == CGAL::LARGER ); } }; /*! @@ -727,61 +758,6 @@ operator - (const Sqrt_extension& p){ // BINARY -template bool -operator == (const Sqrt_extension& p1, const Sqrt_extension& p2) -{ return (p1-p2).is_zero(); } -template bool -operator == (const Sqrt_extension& p1, const Sqrt_extension& p2) -{ return ( p1.compare(p2) == CGAL::ZERO ); } -template bool -operator < (const Sqrt_extension& p1, const Sqrt_extension& p2) -{ return ( p1.compare(p2) == CGAL::SMALLER ); } - - -// NT -// righthand side -template bool operator == -(const Sqrt_extension& p, const NT& num) -{ return (p-num).is_zero();} -template bool operator < -(const Sqrt_extension& p, const NT& num) -{ return ( p.compare(num) == CGAL::SMALLER ); } -template bool operator > -(const Sqrt_extension& p, const NT& num) -{ return ( p.compare(num) == CGAL::LARGER ); } - -// lefthand side -template bool operator == -(const NT& num, const Sqrt_extension& p) -{ return ( p == num );} -template bool operator < -(const NT& num, const Sqrt_extension& p) -{ return ( p.compare(num) == CGAL::LARGER ); } -template bool operator > -(const NT& num, const Sqrt_extension& p) -{ return ( p.compare(num) == CGAL::SMALLER ); } - - -//CGAL_int(NT) -template bool operator == -(const Sqrt_extension& p, CGAL_int(NT) num) -{ return (p-num).is_zero();} -template bool operator < -(const Sqrt_extension& p, CGAL_int(NT) num) -{ return ( p.compare(num) == CGAL::SMALLER ); } -template bool operator > -(const Sqrt_extension& p, CGAL_int(NT) num) -{ return ( p.compare(num) == CGAL::LARGER ); } - -template bool operator == -(CGAL_int(NT) num, const Sqrt_extension& p) -{ return ( p == num );} -template bool operator < -(CGAL_int(NT) num, const Sqrt_extension& p) -{ return ( p.compare(num) == CGAL::LARGER ); } -template bool operator > -(CGAL_int(NT) num, const Sqrt_extension& p) -{ return ( p.compare(num) == CGAL::SMALLER ); } template inline Sqrt_extension min BOOST_PREVENT_MACRO_SUBSTITUTION( diff --git a/Number_types/include/CGAL/boost_mp.h b/Number_types/include/CGAL/boost_mp.h index edaa005a8e7..c1b0a82040a 100644 --- a/Number_types/include/CGAL/boost_mp.h +++ b/Number_types/include/CGAL/boost_mp.h @@ -29,7 +29,7 @@ // easy solution. // TODO: MSVC has trouble with versions <= 1.69, reenable once 1.70 has been // tested. https://github.com/boostorg/multiprecision/issues/98 -#if !defined CGAL_DO_NOT_USE_BOOST_MP && BOOST_VERSION >= 106300 && !defined _MSC_VER +#if !defined CGAL_DISABLE_GMP && !defined CGAL_DO_NOT_USE_BOOST_MP && BOOST_VERSION >= 106300 && !defined _MSC_VER #define CGAL_USE_BOOST_MP 1 #include // *ary_function diff --git a/Number_types/include/CGAL/gmpxx.h b/Number_types/include/CGAL/gmpxx.h index 8dda7655099..09cde667238 100644 --- a/Number_types/include/CGAL/gmpxx.h +++ b/Number_types/include/CGAL/gmpxx.h @@ -39,8 +39,6 @@ #ifndef CGAL_GMPXX_H #define CGAL_GMPXX_H -#include - #include // needed by GMP 4.1.4 since misses it. #include #include diff --git a/Number_types/include/CGAL/gmpxx_coercion_traits.h b/Number_types/include/CGAL/gmpxx_coercion_traits.h index 82790ff8d93..dc60e0e4232 100644 --- a/Number_types/include/CGAL/gmpxx_coercion_traits.h +++ b/Number_types/include/CGAL/gmpxx_coercion_traits.h @@ -28,7 +28,6 @@ #ifndef CGAL_GMPXX_COERCION_TRAITS_H #define CGAL_GMPXX_COERCION_TRAITS_H 1 -#include #include #include // needed by GMP 4.1.4 since misses it. diff --git a/Number_types/include/CGAL/int.h b/Number_types/include/CGAL/int.h index 9b9e905926c..7dcb6aea34d 100644 --- a/Number_types/include/CGAL/int.h +++ b/Number_types/include/CGAL/int.h @@ -27,7 +27,7 @@ #ifndef CGAL_INT_H #define CGAL_INT_H -#include +#include #include #include diff --git a/Number_types/include/CGAL/long_double.h b/Number_types/include/CGAL/long_double.h index 0a19a1fb270..9e64a9fc1d0 100644 --- a/Number_types/include/CGAL/long_double.h +++ b/Number_types/include/CGAL/long_double.h @@ -26,8 +26,6 @@ #ifndef CGAL_LONG_DOUBLE_H #define CGAL_LONG_DOUBLE_H -#include - #include #include #ifdef CGAL_CFG_IEEE_754_BUG @@ -36,6 +34,8 @@ // #include #include +#include +#include namespace CGAL { diff --git a/Number_types/include/CGAL/mpq_class.h b/Number_types/include/CGAL/mpq_class.h index ec3dbc9cdfd..f3d214892a6 100644 --- a/Number_types/include/CGAL/mpq_class.h +++ b/Number_types/include/CGAL/mpq_class.h @@ -26,10 +26,13 @@ #ifndef CGAL_MPQ_CLASS_H #define CGAL_MPQ_CLASS_H -#include -#include -#include // for GCD in Type traits +#include +#include +#include +#include #include +#include +#include // This file gathers the necessary adaptors so that the following // C++ number types that come with GMP can be used by CGAL : @@ -40,7 +43,7 @@ // Reading gmpxx.h shows that ::__gmp_expr is the mp[zqf]_class proper, // while ::__gmp_expr is the others "expressions". -#define CGAL_CHECK_GMP_EXPR \ +#define CGAL_CHECK_GMP_EXPR_MPQ_CLASS \ CGAL_static_assertion( \ (::boost::is_same< ::__gmp_expr< T , T >,Type>::value )); @@ -60,7 +63,7 @@ class Algebraic_structure_traits< mpq_class > struct Is_zero: public CGAL::cpp98::unary_function< mpq_class , bool > { template bool operator()( const ::__gmp_expr< T , U >& x) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return ::sgn(x) == 0; } }; @@ -68,7 +71,7 @@ class Algebraic_structure_traits< mpq_class > struct Is_one: public CGAL::cpp98::unary_function< mpq_class , bool > { template bool operator()( const ::__gmp_expr< T , U >& x) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return x == 1; } }; @@ -98,7 +101,7 @@ class Algebraic_structure_traits< mpq_class > mpq_class operator()( const ::__gmp_expr< T , U1 >& x, const ::__gmp_expr< T , U2 > & y) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; mpq_class result = x / y; CGAL_precondition_msg( result * y == x, "'x' must be divisible by 'y' in " @@ -134,14 +137,14 @@ class Real_embeddable_traits< mpq_class > struct Is_zero: public CGAL::cpp98::unary_function< mpq_class , bool > { template bool operator()( const ::__gmp_expr< T , U >& x) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return ::sgn(x) == 0; } }; struct Is_finite: public CGAL::cpp98::unary_function { template bool operator()( const ::__gmp_expr< T , U >&) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return true; } }; @@ -149,7 +152,7 @@ class Real_embeddable_traits< mpq_class > struct Is_positive: public CGAL::cpp98::unary_function< mpq_class , bool > { template bool operator()( const ::__gmp_expr< T , U >& x) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return ::sgn(x) > 0; } }; @@ -157,7 +160,7 @@ class Real_embeddable_traits< mpq_class > struct Is_negative: public CGAL::cpp98::unary_function< mpq_class , bool > { template bool operator()( const ::__gmp_expr< T , U >& x) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return ::sgn(x) < 0; } }; @@ -165,7 +168,7 @@ class Real_embeddable_traits< mpq_class > struct Abs: public CGAL::cpp98::unary_function< mpq_class , mpq_class > { template mpq_class operator()( const ::__gmp_expr< T , U >& x) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return ::abs(x); } }; @@ -176,7 +179,7 @@ class Real_embeddable_traits< mpq_class > template ::CGAL::Sign operator()( const ::__gmp_expr< T , U >& x ) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; return (::CGAL::Sign) ::sgn( x ); } }; @@ -188,7 +191,7 @@ class Real_embeddable_traits< mpq_class > Comparison_result operator()( const ::__gmp_expr< T , U1 >& x, const ::__gmp_expr< T , U2 >& y ) const { - CGAL_CHECK_GMP_EXPR; + CGAL_CHECK_GMP_EXPR_MPQ_CLASS; // cmp returns any int value, not just -1/0/1... return (Comparison_result) CGAL_NTS sign( ::cmp(x, y) ); } @@ -241,6 +244,14 @@ class Real_embeddable_traits< mpq_class > }; }; +} // namespace CGAL + +#include +#include // for GCD in Type traits +#include + +namespace CGAL { + /*! \ingroup NiX_Fraction_traits_spec * \brief Specialization of Fraction_traits for mpq_class */ @@ -310,6 +321,6 @@ namespace internal { } //namespace CGAL -#undef CGAL_CHECK_GMP_EXPR +#undef CGAL_CHECK_GMP_EXPR_MPQ_CLASS #endif // CGAL_MPQ_CLASS_H diff --git a/Number_types/include/CGAL/mpz_class.h b/Number_types/include/CGAL/mpz_class.h index 21aa543903a..dc229c02f50 100644 --- a/Number_types/include/CGAL/mpz_class.h +++ b/Number_types/include/CGAL/mpz_class.h @@ -26,11 +26,6 @@ #ifndef CGAL_MPZ_CLASS_H #define CGAL_MPZ_CLASS_H -#include -#include -#include - - // This file gathers the necessary adaptors so that the following // C++ number types that come with GMP can be used by CGAL : // - mpz_class @@ -40,6 +35,15 @@ // Reading gmpxx.h shows that ::__gmp_expr is the mp[zqf]_class proper, // while ::__gmp_expr is the others "expressions". +#include +#include +#include +#include +#include +#include +#include +#include +#include #define CGAL_CHECK_GMP_EXPR \ CGAL_static_assertion( \ @@ -52,6 +56,7 @@ namespace CGAL { template<> class Algebraic_structure_traits< mpz_class > :public Algebraic_structure_traits_base< mpz_class , Euclidean_ring_tag > { + public: typedef mpz_class Type; typedef Euclidean_ring_tag Algebraic_category; @@ -191,6 +196,12 @@ public: };*/ }; +} //namespace CGAL + +#include // for `sign( ::cmp(x, y) )`, below + +namespace CGAL { + // RET for mpz_class template<> class Real_embeddable_traits< mpz_class > @@ -300,10 +311,20 @@ public: }; }; +} //namespace CGAL + +#include +#include +#include +#include + +namespace CGAL { + /*! \ingroup NiX_Modular_traits_spec * \brief a model of concept ModularTraits, * specialization of NiX::Modular_traits. */ + template<> class Modular_traits< mpz_class > { public: @@ -323,8 +344,11 @@ public: } }; }; +} //namespace CGAL +#include +namespace CGAL { template <> struct Split_double { diff --git a/Number_types/include/CGAL/test_FPU_rounding_mode_impl.h b/Number_types/include/CGAL/test_FPU_rounding_mode_impl.h index a04053327ed..5f2e50bef48 100644 --- a/Number_types/include/CGAL/test_FPU_rounding_mode_impl.h +++ b/Number_types/include/CGAL/test_FPU_rounding_mode_impl.h @@ -27,7 +27,6 @@ #ifndef CGAL_NDEBUG -#include #include namespace CGAL { diff --git a/Number_types/test/Number_types/CORE_BigFloat.cpp b/Number_types/test/Number_types/CORE_BigFloat.cpp index 74b17b06807..884422805d1 100644 --- a/Number_types/test/Number_types/CORE_BigFloat.cpp +++ b/Number_types/test/Number_types/CORE_BigFloat.cpp @@ -1,6 +1,6 @@ #include -#include +#include #ifdef CGAL_USE_CORE #include diff --git a/Number_types/test/Number_types/CORE_BigInt.cpp b/Number_types/test/Number_types/CORE_BigInt.cpp index 52ee9bf9577..08f64a2b106 100644 --- a/Number_types/test/Number_types/CORE_BigInt.cpp +++ b/Number_types/test/Number_types/CORE_BigInt.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #ifdef CGAL_USE_CORE diff --git a/Number_types/test/Number_types/CORE_BigRat.cpp b/Number_types/test/Number_types/CORE_BigRat.cpp index 175100d3d6a..5125adb7e29 100644 --- a/Number_types/test/Number_types/CORE_BigRat.cpp +++ b/Number_types/test/Number_types/CORE_BigRat.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include #ifdef CGAL_USE_CORE diff --git a/Number_types/test/Number_types/CORE_Expr.cpp b/Number_types/test/Number_types/CORE_Expr.cpp index 2c5668df68b..046c66a582a 100644 --- a/Number_types/test/Number_types/CORE_Expr.cpp +++ b/Number_types/test/Number_types/CORE_Expr.cpp @@ -1,5 +1,5 @@ #include -#include +#include #ifdef CGAL_USE_CORE #include #include @@ -140,8 +140,6 @@ int main() { #if 0 -#include - #include #include diff --git a/Number_types/test/Number_types/Counted_number.cpp b/Number_types/test/Number_types/Counted_number.cpp index c825cd0d06c..fdbd62b3e42 100644 --- a/Number_types/test/Number_types/Counted_number.cpp +++ b/Number_types/test/Number_types/Counted_number.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/Number_types/test/Number_types/Gmpfr.cpp b/Number_types/test/Number_types/Gmpfr.cpp index 1e5928edccc..c9dfe1ec7b4 100644 --- a/Number_types/test/Number_types/Gmpfr.cpp +++ b/Number_types/test/Number_types/Gmpfr.cpp @@ -17,7 +17,7 @@ // // Author: Luis Peñaranda -#include +#include #ifdef CGAL_USE_GMP #include diff --git a/Number_types/test/Number_types/Gmpfr_bug.cpp b/Number_types/test/Number_types/Gmpfr_bug.cpp index 8b7d320327d..8fb6ddbb7d6 100644 --- a/Number_types/test/Number_types/Gmpfr_bug.cpp +++ b/Number_types/test/Number_types/Gmpfr_bug.cpp @@ -14,7 +14,7 @@ // It seems that this does not matter. However, I keep it for further testing // #define CGAL_GMPFR_NO_REFCOUNT -#include +#include #ifdef CGAL_USE_MPFI diff --git a/Number_types/test/Number_types/Gmpq.cpp b/Number_types/test/Number_types/Gmpq.cpp index f4d84e490d7..52d7d3cca68 100644 --- a/Number_types/test/Number_types/Gmpq.cpp +++ b/Number_types/test/Number_types/Gmpq.cpp @@ -1,4 +1,4 @@ -#include +#include #ifdef CGAL_USE_GMP diff --git a/Number_types/test/Number_types/Gmpq_new.cpp b/Number_types/test/Number_types/Gmpq_new.cpp index 8010415c8b7..7e911b4a4ad 100644 --- a/Number_types/test/Number_types/Gmpq_new.cpp +++ b/Number_types/test/Number_types/Gmpq_new.cpp @@ -1,5 +1,5 @@ -#include +#include #ifdef CGAL_USE_GMP #include diff --git a/Number_types/test/Number_types/Interval_nt.cpp b/Number_types/test/Number_types/Interval_nt.cpp index 9d6ff105124..bd335ad2638 100644 --- a/Number_types/test/Number_types/Interval_nt.cpp +++ b/Number_types/test/Number_types/Interval_nt.cpp @@ -1,7 +1,7 @@ // Test file for the Interval_nt class. // Sylvain Pion, 1997-2005. -#include +#include #include #include diff --git a/Number_types/test/Number_types/Interval_nt_new.cpp b/Number_types/test/Number_types/Interval_nt_new.cpp index 2d25aea2f33..eee594ce126 100644 --- a/Number_types/test/Number_types/Interval_nt_new.cpp +++ b/Number_types/test/Number_types/Interval_nt_new.cpp @@ -1,5 +1,6 @@ #include -#include +#include +#include #include #include #include diff --git a/Number_types/test/Number_types/Lazy_exact_nt_new.cpp b/Number_types/test/Number_types/Lazy_exact_nt_new.cpp index 9d8649b7a4e..1a4f3b284ed 100644 --- a/Number_types/test/Number_types/Lazy_exact_nt_new.cpp +++ b/Number_types/test/Number_types/Lazy_exact_nt_new.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include #include diff --git a/Number_types/test/Number_types/MP_Float.cpp b/Number_types/test/Number_types/MP_Float.cpp index a32503e5e48..4468d7d2619 100644 --- a/Number_types/test/Number_types/MP_Float.cpp +++ b/Number_types/test/Number_types/MP_Float.cpp @@ -1,7 +1,7 @@ // Test program for the MP_Float class. // Sylvain Pion. -#include +#include #include #include #include diff --git a/Number_types/test/Number_types/MP_Float_exact.cpp b/Number_types/test/Number_types/MP_Float_exact.cpp index 51cfc72488b..58650ac00eb 100644 --- a/Number_types/test/Number_types/MP_Float_exact.cpp +++ b/Number_types/test/Number_types/MP_Float_exact.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/Number_types/test/Number_types/Mpzf.cpp b/Number_types/test/Number_types/Mpzf.cpp index c0e10795751..04a56ec39e7 100644 --- a/Number_types/test/Number_types/Mpzf.cpp +++ b/Number_types/test/Number_types/Mpzf.cpp @@ -1,4 +1,4 @@ -#include +#include #ifdef CGAL_USE_GMP #include #endif diff --git a/Number_types/test/Number_types/Nef_polynomial.cpp b/Number_types/test/Number_types/Nef_polynomial.cpp index 02b158bb166..2e3e52419bf 100644 --- a/Number_types/test/Number_types/Nef_polynomial.cpp +++ b/Number_types/test/Number_types/Nef_polynomial.cpp @@ -1,6 +1,6 @@ #include -#include +#include #ifdef CGAL_USE_LEDA #include #include diff --git a/Number_types/test/Number_types/Quotient_new.cpp b/Number_types/test/Number_types/Quotient_new.cpp index 37bd1afa40d..6831353a207 100644 --- a/Number_types/test/Number_types/Quotient_new.cpp +++ b/Number_types/test/Number_types/Quotient_new.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/Number_types/test/Number_types/Root_of_traits.cpp b/Number_types/test/Number_types/Root_of_traits.cpp index a9cb2f5c2a2..5c10f1ea88f 100644 --- a/Number_types/test/Number_types/Root_of_traits.cpp +++ b/Number_types/test/Number_types/Root_of_traits.cpp @@ -9,7 +9,7 @@ -#include +#include #include #include #include diff --git a/Number_types/test/Number_types/_test_valid_finite_double.cpp b/Number_types/test/Number_types/_test_valid_finite_double.cpp index ce9fbc1b1d8..e8dfe431555 100644 --- a/Number_types/test/Number_types/_test_valid_finite_double.cpp +++ b/Number_types/test/Number_types/_test_valid_finite_double.cpp @@ -21,7 +21,9 @@ // Author(s) : Stefan Schirra -#include +#include +#include +#include #include #include #include diff --git a/Number_types/test/Number_types/_test_valid_finite_float.cpp b/Number_types/test/Number_types/_test_valid_finite_float.cpp index a2d6222de32..f17ac2e0f8a 100644 --- a/Number_types/test/Number_types/_test_valid_finite_float.cpp +++ b/Number_types/test/Number_types/_test_valid_finite_float.cpp @@ -21,7 +21,9 @@ // Author(s) : Stefan Schirra -#include +#include +#include +#include #include #include #include diff --git a/Number_types/test/Number_types/bench_interval.cpp b/Number_types/test/Number_types/bench_interval.cpp index 3c76f3c06a2..4c6d06e2e03 100644 --- a/Number_types/test/Number_types/bench_interval.cpp +++ b/Number_types/test/Number_types/bench_interval.cpp @@ -1,7 +1,6 @@ // Generic bench file for the IA package. // Sylvain Pion, 1997-2005. -#include #include #include #include diff --git a/Number_types/test/Number_types/checked_NT.h b/Number_types/test/Number_types/checked_NT.h index fd00a2da0f3..4de367c19d2 100644 --- a/Number_types/test/Number_types/checked_NT.h +++ b/Number_types/test/Number_types/checked_NT.h @@ -1,4 +1,13 @@ #include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace CGAL { template diff --git a/Number_types/test/Number_types/double.cpp b/Number_types/test/Number_types/double.cpp index dc0510083c8..c35a9578624 100644 --- a/Number_types/test/Number_types/double.cpp +++ b/Number_types/test/Number_types/double.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include diff --git a/Number_types/test/Number_types/doubletst.cpp b/Number_types/test/Number_types/doubletst.cpp index d5082d9393b..4a4261e2db2 100644 --- a/Number_types/test/Number_types/doubletst.cpp +++ b/Number_types/test/Number_types/doubletst.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/Number_types/test/Number_types/eigen.cpp b/Number_types/test/Number_types/eigen.cpp index 07c61cd53c3..91f620b0b3b 100644 --- a/Number_types/test/Number_types/eigen.cpp +++ b/Number_types/test/Number_types/eigen.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #ifdef CGAL_USE_GMP diff --git a/Number_types/test/Number_types/floattst.cpp b/Number_types/test/Number_types/floattst.cpp index e929cd227a9..e2566b03950 100644 --- a/Number_types/test/Number_types/floattst.cpp +++ b/Number_types/test/Number_types/floattst.cpp @@ -1,4 +1,6 @@ -#include +#include +#include +#include #if defined(BOOST_MSVC) # pragma warning(disable:4723) diff --git a/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h b/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h index 6936429d8d7..d073f3aba46 100644 --- a/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h +++ b/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h @@ -1,4 +1,4 @@ -#include +#include template void test_root_of_traits(){ diff --git a/Number_types/test/Number_types/include/CGAL/_test_io.h b/Number_types/test/Number_types/include/CGAL/_test_io.h index bfa3b7d0f9a..915918e68b0 100644 --- a/Number_types/test/Number_types/include/CGAL/_test_io.h +++ b/Number_types/test/Number_types/include/CGAL/_test_io.h @@ -20,7 +20,7 @@ #ifndef CGAL_TEST_IO_H #define CGAL_TEST_IO_H -#include +#include #ifdef NDEBUG # undef NDEBUG # include diff --git a/Number_types/test/Number_types/include/CGAL/_test_utilities.h b/Number_types/test/Number_types/include/CGAL/_test_utilities.h index 4ad18c4e01f..3ca7442f2bf 100644 --- a/Number_types/test/Number_types/include/CGAL/_test_utilities.h +++ b/Number_types/test/Number_types/include/CGAL/_test_utilities.h @@ -23,7 +23,6 @@ #ifndef CGAL_TEST_UTILITIES_H #define CGAL_TEST_UTILITIES_H -#include #include #include #include diff --git a/Number_types/test/Number_types/ioformat.cpp b/Number_types/test/Number_types/ioformat.cpp index 5b43dce5545..a483d2f5971 100644 --- a/Number_types/test/Number_types/ioformat.cpp +++ b/Number_types/test/Number_types/ioformat.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/Number_types/test/Number_types/leda_bigfloat.cpp b/Number_types/test/Number_types/leda_bigfloat.cpp index ff66f2775be..56fc8dda216 100644 --- a/Number_types/test/Number_types/leda_bigfloat.cpp +++ b/Number_types/test/Number_types/leda_bigfloat.cpp @@ -1,5 +1,5 @@ #include -#include +#include #ifdef CGAL_USE_LEDA #include #include diff --git a/Number_types/test/Number_types/leda_bigfloat_interval.cpp b/Number_types/test/Number_types/leda_bigfloat_interval.cpp index a89078d8227..55ddd1a8a77 100644 --- a/Number_types/test/Number_types/leda_bigfloat_interval.cpp +++ b/Number_types/test/Number_types/leda_bigfloat_interval.cpp @@ -1,5 +1,5 @@ #include -#include +#include #ifdef CGAL_USE_LEDA #include #include diff --git a/Number_types/test/Number_types/leda_integer.cpp b/Number_types/test/Number_types/leda_integer.cpp index 27446c09661..aa906df6cf4 100644 --- a/Number_types/test/Number_types/leda_integer.cpp +++ b/Number_types/test/Number_types/leda_integer.cpp @@ -1,6 +1,6 @@ #include -#include +#include #ifdef CGAL_USE_LEDA #include #include diff --git a/Number_types/test/Number_types/leda_rational.cpp b/Number_types/test/Number_types/leda_rational.cpp index a863690a1a1..f048edee83c 100644 --- a/Number_types/test/Number_types/leda_rational.cpp +++ b/Number_types/test/Number_types/leda_rational.cpp @@ -1,6 +1,6 @@ #include -#include +#include #ifdef CGAL_USE_LEDA #include #include diff --git a/Number_types/test/Number_types/leda_real.cpp b/Number_types/test/Number_types/leda_real.cpp index 429229fec62..ff5a7c6dfb4 100644 --- a/Number_types/test/Number_types/leda_real.cpp +++ b/Number_types/test/Number_types/leda_real.cpp @@ -1,6 +1,6 @@ #include -#include +#include #ifdef CGAL_USE_LEDA #include #include diff --git a/Number_types/test/Number_types/long_doubletst.cpp b/Number_types/test/Number_types/long_doubletst.cpp index f8f764f50e2..82e27130196 100644 --- a/Number_types/test/Number_types/long_doubletst.cpp +++ b/Number_types/test/Number_types/long_doubletst.cpp @@ -1,4 +1,6 @@ -#include +#include +#include +#include #include #include diff --git a/Number_types/test/Number_types/mpq_class.cpp b/Number_types/test/Number_types/mpq_class.cpp index 31b46847615..05df94e5786 100644 --- a/Number_types/test/Number_types/mpq_class.cpp +++ b/Number_types/test/Number_types/mpq_class.cpp @@ -1,4 +1,4 @@ -#include +#include #ifdef CGAL_USE_GMPXX diff --git a/Number_types/test/Number_types/mpz_class.cpp b/Number_types/test/Number_types/mpz_class.cpp index ce8f4b8d0d2..2f74da584a6 100644 --- a/Number_types/test/Number_types/mpz_class.cpp +++ b/Number_types/test/Number_types/mpz_class.cpp @@ -1,5 +1,5 @@ -#include - +#include +#include #ifdef CGAL_USE_GMPXX #include diff --git a/Number_types/test/Number_types/quotient_io.cpp b/Number_types/test/Number_types/quotient_io.cpp index 554eb1cf013..a788dc294b1 100644 --- a/Number_types/test/Number_types/quotient_io.cpp +++ b/Number_types/test/Number_types/quotient_io.cpp @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/Number_types/test/Number_types/rounding_modes.cpp b/Number_types/test/Number_types/rounding_modes.cpp index a401dfeb005..87aaa9e8600 100644 --- a/Number_types/test/Number_types/rounding_modes.cpp +++ b/Number_types/test/Number_types/rounding_modes.cpp @@ -1,6 +1,6 @@ // This tests the rounding mode functions. -#include +#include #include #include #include diff --git a/Number_types/test/Number_types/test_nt_Coercion_traits.cpp b/Number_types/test/Number_types/test_nt_Coercion_traits.cpp index 2abf8d11a9c..f80cbb34f2f 100644 --- a/Number_types/test/Number_types/test_nt_Coercion_traits.cpp +++ b/Number_types/test/Number_types/test_nt_Coercion_traits.cpp @@ -12,7 +12,6 @@ // ============================================================================ -#include #include #include #include @@ -23,12 +22,6 @@ #include #include -//#include -//#include -//#include -//#include // TODO: Is this available in CGAL? CGAL/Vector_d? -//#include - #include typedef CGAL::Interval_nt Interval; diff --git a/Number_types/test/Number_types/to_interval_test.cpp b/Number_types/test/Number_types/to_interval_test.cpp index b4897757d87..acb43306b50 100644 --- a/Number_types/test/Number_types/to_interval_test.cpp +++ b/Number_types/test/Number_types/to_interval_test.cpp @@ -1,5 +1,5 @@ -#include +#include #include // That one should not be needed in the long term: diff --git a/Number_types/test/Number_types/unsigned.cpp b/Number_types/test/Number_types/unsigned.cpp index 66a85682e6b..b91bfa6a1d8 100644 --- a/Number_types/test/Number_types/unsigned.cpp +++ b/Number_types/test/Number_types/unsigned.cpp @@ -17,7 +17,8 @@ // // Author: Marc Glisse -#include +#include +#include int main(){ unsigned int a = 42; diff --git a/Number_types/test/Number_types/utilities.cpp b/Number_types/test/Number_types/utilities.cpp index 53a132e5b16..cfb5d7ccfe5 100644 --- a/Number_types/test/Number_types/utilities.cpp +++ b/Number_types/test/Number_types/utilities.cpp @@ -1,4 +1,4 @@ -#include +#include // TODO: solve conflict of CORE with GMPXX #ifdef CGAL_USE_CORE diff --git a/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h b/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h index 61d777c50d8..fa5f1bc30e6 100644 --- a/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h +++ b/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h @@ -1075,7 +1075,7 @@ public: return false; } - FT value = Dbc <= 0 ? 1 : 2*Dbc; // value used if Dbd or Dac are +infinity + FT value = Dbc <= 0 ? FT(1) : 2*Dbc; // value used if Dbd or Dac are +infinity if ( !is_infinity(Dac) ) { if ( !is_infinity(Dbd)) diff --git a/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h b/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h index 7b3e633be32..4ef7e163a56 100644 --- a/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h +++ b/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h @@ -686,7 +686,7 @@ public: { if (m_tolerance == (FT)(-1.)) return false; - FT cost = CGAL::approximate_sqrt (pedge.after() / pedge.total_weight()); + FT cost = CGAL::approximate_sqrt (FT(pedge.after() / pedge.total_weight())); return cost > m_tolerance; } diff --git a/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h b/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h index 5677ddd2732..13708f4dd68 100644 --- a/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h +++ b/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h @@ -4,15 +4,17 @@ namespace CGAL { \ingroup PkgPartition2Ref Traits class that can be used with all the -2-dimensional polygon partitioning algorithms. It is parameterized by -a representation class `R`. +2-dimensional polygon partitioning algorithms. + + +\tparam R a representation class +\tparam PointPropertyMap a property map that maps to points of type `R::Point_2` \cgalModels `ConvexPartitionIsValidTraits_2` \cgalModels `IsYMonotoneTraits_2` \cgalModels `OptimalConvexPartitionTraits_2` \cgalModels `PartitionTraits_2` \cgalModels `YMonotonePartitionIsValidTraits_2` -\cgalModels `YMonotonePartitionTraits_2` \sa `CGAL::approx_convex_partition_2()` \sa `CGAL::convex_partition_is_valid_2()` @@ -24,112 +26,17 @@ a representation class `R`. \sa `CGAL::y_monotone_partition_is_valid_2()` */ -template< typename R > + template< typename R, typename PointPropertyMap = Identity_property_map > class Partition_traits_2 { public: /// \name Types /// @{ - + /*! */ -typedef R::Line_2 Line_2; - -/*! - -*/ -typedef R::Segment_2 Segment_2; - -/*! - -*/ -typedef R::Ray_2 Ray_2; - -/*! - -*/ -typedef R::Less_yx_2 Less_yx_2; - -/*! - -*/ -typedef R::Less_xy_2 Less_xy_2; - -/*! - -*/ -typedef R::Left_turn_2 Left_turn_2; - -/*! - -*/ -typedef R::Orientation_2 Orientation_2; - -/*! - -*/ -typedef R::Compare_y_2 Compare_y_2; - -/*! - -*/ -typedef R::Compare_x_2 Compare_x_2; - -/*! - -*/ -typedef R::Construct_line_2 Construct_line_2; - -/*! - -*/ -typedef R::Construct_ray_2 Construct_ray_2; - -/*! - -*/ -typedef R::Construct_segment_2 Construct_segment_2; - -/*! - -*/ -typedef R::Collinear_are_ordered_along_line_2 Collinear_are_ordered_along_line_2; - -/*! - -*/ -typedef R::Are_strictly_ordered_along_line_2 Are_strictly_ordered_along_line_2; - -/*! - -*/ -typedef CGAL::Polygon_traits_2 Poly_Traits; - -/*! - -*/ -typedef Poly_Traits::Point_2 Point_2; - -/*! - -*/ -typedef std::list Container; - -/*! - -*/ -typedef CGAL::Polygon_2 Polygon_2; - -/*! - -*/ -typedef R::Less_xy_2 Less_xy; - -/*! - -*/ -typedef Poly_Traits::Vector_2 Vector_2; + typedef Partition_traits_2 Self; /*! @@ -139,10 +46,65 @@ typedef R::FT FT; /*! */ -typedef Partition_traits_2 Self; +typedef boost::property_traits::key_type Point_2; + + +/*! + +*/ +typedef std::list Container; /*! +*/ +typedef CGAL::Polygon_2 Polygon_2; + + + +/*! +A functor with an operator which first obtains points of type `R::Point_2` +with the function `get()` applied on the point property map, and +then applies the functor of `R::Less_yx_2` to these points. +*/ +typedef unspecified_type Less_yx_2; + +/*! + +*/ +typedef unspecified_type Less_xy_2; + +/*! + +*/ +typedef unspecified_type Left_turn_2; + +/*! + +*/ +typedef unspecified_type Orientation_2; + +/*! + +*/ +typedef unspecified_type Compare_y_2; + +/*! + +*/ +typedef unspecified_type Compare_x_2; + + +/*! + +*/ +typedef unspecified_type Collinear_are_ordered_along_line_2; + +/*! + +*/ + typedef unspecified_type Are_strictly_ordered_along_line_2; + +/*! */ typedef CGAL::Is_convex_2 Is_convex_2; @@ -165,15 +127,24 @@ Partition_traits_2(); /*! */ -Partition_traits_2(Partition_traits_2& tr); +Partition_traits_2(Partition_traits_2& tr); + +/*! +*/ +Partition_traits_2(const R& rep); + +/*! + +*/ +Partition_traits_2(const R& rep, PointPropertyMap pmap); + /// @} /// \name Operations /// For each predicate object type `Pred_object_type` listed above /// (i.e., `Less_yx_2`, `Less_xy_2`, `Left_turn_2`, -/// `Orientation_2`, `Compare_y_2`, `Compare_x_2`, `Construct_line_2`, -/// `Construct_ray_2`, `Construct_segment_2`, +/// `Orientation_2`, `Compare_y_2`, `Compare_x_2`, /// `Collinear_are_ordered_along_line_2`, /// `Are_strictly_ordered_along_line_2`, `Is_convex_2`, /// `Is_y_monotone_2`) there is a corresponding function of the diff --git a/Partition_2/doc/Partition_2/CGAL/partition_2.h b/Partition_2/doc/Partition_2/CGAL/partition_2.h index d09b2bff7c7..22b3d66299b 100644 --- a/Partition_2/doc/Partition_2/CGAL/partition_2.h +++ b/Partition_2/doc/Partition_2/CGAL/partition_2.h @@ -88,8 +88,7 @@ the resulting sequence of polygons is returned. \cgalHeading{Requirements}
      -
    1. `Traits` is a model of the concepts `PartitionTraits_2` -and `YMonotonePartitionTraits_2`. +
    2. `Traits` is a model of the concepts `PartitionTraits_2`. For the purpose of checking the validity of the \f$ y\f$-monotone partition produced as a preprocessing step for the convex partitioning, it must also @@ -232,8 +231,7 @@ the resulting sequence of polygons is returned. \cgalHeading{Requirements}
        -
      1. `Traits` is a model of the concept -`YMonotonePartitionTraits_2` +
      2. `Traits` is a model of the concept `PartitionTraits_2` and, for the purposes of checking the postcondition that the partition is valid, it should also be a model of `YMonotonePartitionIsValidTraits_2`. diff --git a/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h b/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h index ca42719bf12..bac23840b1c 100644 --- a/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h +++ b/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h @@ -35,7 +35,7 @@ with the representation type determined by `std::iterator_traits: \sa `CGAL::greene_approx_convex_partition_2()` \sa `CGAL::optimal_convex_partition_2()` \sa `CGAL::partition_is_valid_2()` -\sa `CGAL::is_convex_2()` +\sa `CGAL::Is_convex_2` \cgalHeading{Implementation} @@ -76,7 +76,7 @@ same as the original polygon. Each polygon must also satisfy the property tested by `Traits::Is_valid()`. -\pre Points in the range [`point_first`, `point_beyond`) define a simple, counterclockwise-oriented polygon. +\pre The points in the range [`point_first`, `point_beyond`) define a simple, counterclockwise-oriented polygon. \cgalHeading{Requires} @@ -99,7 +99,7 @@ with the representation type determined by `std::iterator_traits: \sa `CGAL::optimal_convex_partition_2()` \sa `CGAL::Partition_is_valid_traits_2` \sa `CGAL::y_monotone_partition_2()` -\sa `CGAL::is_convex_2()` +\sa `CGAL::Is_convex_2` \cgalHeading{Implementation} @@ -134,9 +134,8 @@ A valid partition is one in which the polygons are nonoverlapping and the union of the polygons is the same as the original polygon and each polygon is \f$ y\f$-monotone -\pre P The function returns `true` iff the partition is valid and otherwise -returns false. +returns ` false`. diff --git a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h index 75b8650c179..6dc4a84528e 100644 --- a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h @@ -23,34 +23,6 @@ public: /// `PartitionTraits_2`, the following types are required: /// @{ -/*! -A segment type -*/ -typedef unspecified_type Segment_2; - -/*! -A ray type -*/ -typedef unspecified_type Ray_2; - -/*! -A general object type that can be either a point or a segment -*/ -typedef unspecified_type Object_2; - -/*! -Function object type that provides -`Segment_2 operator()(Point_2 p, Point_2 q)`, which constructs and -returns the segment defined by the points \f$ p\f$ and \f$ q\f$. -*/ -typedef unspecified_type Construct_segment_2; - -/*! -Function object type that provides -`Ray_2 operator()(Point_2 p, Point_2 q)`, which constructs and returns -the ray from point \f$ p\f$ through point \f$ q\f$. -*/ -typedef unspecified_type Construct_ray_2; /*! Predicate object type that @@ -73,21 +45,6 @@ and `r`. Note that `false` should be returned if */ typedef unspecified_type Are_stritcly_ordered_along_line_2; -/*! -Function object type that provides -`Object_2 operator()(Segment_2 s1, Segment_2 s2)` that returns -the intersection of two segments (which may be either a segment or -a point). -*/ -typedef unspecified_type Intersect_2; - -/*! -Function object type that provides -`bool operator()(Segment_2 s1, Object_2 o)` that returns -`true` if `o` is a segment and assigns the value of `o` -to `s1`; returns `false` otherwise. -*/ -typedef unspecified_type Assign_2; /// @} @@ -113,15 +70,6 @@ OptimalConvexPartitionTraits_2(OptimalConvexPartitionTraits_2 tr); */ Collinear_are_ordered_along_line_2 collinear_are_ordered_along_line_2_object() const; -/*! - -*/ -Construct_segment_2 construct_segment_2_object() const; - -/*! - -*/ -Construct_ray_2 construct_ray_2_object() const; /*! diff --git a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h index 21504a9e40d..52a639beaf4 100644 --- a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h @@ -3,14 +3,14 @@ \cgalConcept Requirements of a traits class that is used -by `partition_is_valid_2`, `convex_partition_is_valid_2`, -and `y_monotone_partition_is_valid_2` for testing if a given set of +by `CGAL::partition_is_valid_2()`, `CGAL::convex_partition_is_valid_2()`, +and `CGAL::y_monotone_partition_is_valid_2()` for testing if a given set of polygons are nonoverlapping and if their union is a polygon that is the same as a polygon represented by a given sequence of points. Note that the -traits class for `partition_is_valid_2` may have to satisfy additional +traits class for `CGAL::partition_is_valid_2()` may have to satisfy additional requirements if each partition polygon is to be tested for having a particular property; see, for example, the descriptions of the -function `is_convex_2()` +function `CGAL::is_convex_2()` and the concept `YMonotonePartitionTraits_2` for the additional requirements for testing for convexity and \f$ y\f$-monotonicity, respectively. diff --git a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionTraits_2.h deleted file mode 100644 index cc4fb20a81c..00000000000 --- a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionTraits_2.h +++ /dev/null @@ -1,89 +0,0 @@ -/*! -\ingroup PkgPartition2Concepts -\cgalConcept - -Requirements of a traits class to be -used with the function `y_monotone_partition_2()`. - -\cgalRefines `PartitionTraits_2` - -\cgalHasModel `CGAL::Partition_traits_2` - -*/ - -class YMonotonePartitionTraits_2 { -public: - -/// \name Types -/// In addition to the types defined for the concept `PartitionTraits_2`, the following types are also required: -/// @{ - -/*! - -*/ -typedef unspecified_type Line_2; - -/*! -Predicate object type that provides -`CGAL::Comparision_result operator()(Point_2 p, Line_2 h)` to compare -the \f$ x\f$ coordinate of `p` and the horizontal projection of `p` -on `h`. -*/ -typedef unspecified_type Compare_x_at_y_2; - -/*! -Function object type that provides -`Line_2 operator()(Point_2 p, Point_2 q)`, which constructs and -returns the line defined by the points \f$ p\f$ and \f$ q\f$. -*/ -typedef unspecified_type Construct_line_2; - -/*! -Function object type that provides -`bool operator()(Line_2 l)`, which returns `true` iff the -line `l` is horizontal. -*/ -typedef unspecified_type Is_horizontal_2; - -/// @} - -/// \name Creation -/// A copy constructor and default constructor are required. -/// @{ - -/*! - -*/ -YMonotonePartitionTraits(); - -/*! - -*/ -YMonotonePartitionTraits(const YMonotonePartitionTraits tr); - -/// @} - -/// \name Operations -/// In addition to the functions required for the concept -/// `PartitionTraits_2`, the following functions that create instances -/// of the above function object types must exist. -/// @{ - -/*! - -*/ -Construct_line_2 construct_line_2_object(); - -/*! - -*/ -Compare_x_at_y_2 compare_x_at_y_2_object(); - -/*! - -*/ -Is_horizontal_2 is_horizontal_2_object(); - -/// @} - -}; /* end YMonotonePartitionTraits_2 */ diff --git a/Partition_2/doc/Partition_2/PackageDescription.txt b/Partition_2/doc/Partition_2/PackageDescription.txt index bab7865d609..0a095f39c27 100644 --- a/Partition_2/doc/Partition_2/PackageDescription.txt +++ b/Partition_2/doc/Partition_2/PackageDescription.txt @@ -19,7 +19,6 @@ \cgalPkgSince{2.3} \cgalPkgBib{cgal:h-pp2} \cgalPkgLicense{\ref licensesGPL "GPL"} -\cgalPkgDemo{2D Polygon Partition,partition_2.zip,Operations on Polygons,polygon.zip} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd @@ -75,14 +74,13 @@ original polygon). - `PartitionTraits_2` - `PartitionIsValidTraits_2` - `YMonotonePartitionIsValidTraits_2` -- `YMonotonePartitionTraits_2` \cgalCRPSection{Function Object Concepts} - `PolygonIsValid` \cgalCRPSection{Classes} - `CGAL::Partition_is_valid_traits_2` -- `CGAL::Partition_traits_2` +- `CGAL::Partition_traits_2` \cgalCRPSection{Function Object Classes} diff --git a/Partition_2/doc/Partition_2/Partition_2.txt b/Partition_2/doc/Partition_2/Partition_2.txt index b0dd03a44ba..27b225f94c1 100644 --- a/Partition_2/doc/Partition_2/Partition_2.txt +++ b/Partition_2/doc/Partition_2/Partition_2.txt @@ -95,9 +95,32 @@ as the algorithm of Hertel and Mehlhorn implemented with `approx_convex_partition_2()` but can sometimes produce better results (i.e., convex partitions with fewer pieces). -Examples of the uses of all of these functions are provided with the +\section secpartition_2_examples Examples + +Examples of the uses of all of the above partition functions are provided with the corresponding reference pages. -*/ +In the following we illustrate how to use a property map to enable the trais class to +deal with polygons where the vertices are not points. In the example the points +are in a vector and the polygons are sequences of indices. + +The class `Partition_2` has two template parameters, namely +a geometric traits class, and a property map to obtain points, in the example by accessing `points[i]` for +the polygon vertex `i`, and it then performs the predicates required by +the concept `PartitionTraits_2` on these points. + +\cgalExample{Partition_2/y_monotone_partition_indices_2.cpp} + +In a similar way, the use of an appropriate property map enables to partition faces of a polygonal mesh, +or to access points which are a component of a `std::tuple`. + +\section secpartition_2_history Implementation History + +This package has originally been written by Susan Hert while working at the Max-Planck Institute for Infomatics in Germany. +The algorithms have been made free of constructions, and the property map has been added by GeometryFactory +for \cgal 5.0. + +*/ + } /* namespace CGAL */ diff --git a/Partition_2/doc/Partition_2/examples.txt b/Partition_2/doc/Partition_2/examples.txt index a1839d51c05..95364e4c6ab 100644 --- a/Partition_2/doc/Partition_2/examples.txt +++ b/Partition_2/doc/Partition_2/examples.txt @@ -3,4 +3,5 @@ \example Partition_2/greene_approx_convex_partition_2.cpp \example Partition_2/optimal_convex_partition_2.cpp \example Partition_2/y_monotone_partition_2.cpp +\example Partition_2/y_monotone_partition_indices_2.cpp */ diff --git a/Partition_2/examples/Partition_2/approx_convex_partition_2.cpp b/Partition_2/examples/Partition_2/approx_convex_partition_2.cpp index 6a851d4e3b1..e1148e59037 100644 --- a/Partition_2/examples/Partition_2/approx_convex_partition_2.cpp +++ b/Partition_2/examples/Partition_2/approx_convex_partition_2.cpp @@ -1,8 +1,6 @@ #include #include #include -#include -#include #include #include @@ -11,10 +9,7 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Partition_traits_2 Traits; typedef Traits::Point_2 Point_2; typedef Traits::Polygon_2 Polygon_2; -typedef Polygon_2::Vertex_iterator Vertex_iterator; typedef std::list Polygon_list; -typedef CGAL::Creator_uniform_2 Creator; -typedef CGAL::Random_points_in_square_2 Point_generator; void make_polygon(Polygon_2& polygon) { @@ -40,11 +35,8 @@ int main() Polygon_2 polygon; Polygon_list partition_polys; -/* - CGAL::random_polygon_2(50, std::back_inserter(polygon), - Point_generator(100)); -*/ make_polygon(polygon); + CGAL::approx_convex_partition_2(polygon.vertices_begin(), polygon.vertices_end(), std::back_inserter(partition_polys)); diff --git a/Partition_2/examples/Partition_2/greene_approx_convex_partition_2.cpp b/Partition_2/examples/Partition_2/greene_approx_convex_partition_2.cpp index 4b58cfb3fd3..1a07512462b 100644 --- a/Partition_2/examples/Partition_2/greene_approx_convex_partition_2.cpp +++ b/Partition_2/examples/Partition_2/greene_approx_convex_partition_2.cpp @@ -1,8 +1,6 @@ #include #include #include -#include -#include #include #include @@ -10,10 +8,7 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Partition_traits_2 Traits; typedef Traits::Point_2 Point_2; typedef Traits::Polygon_2 Polygon_2; -typedef Polygon_2::Vertex_iterator Vertex_iterator; typedef std::list Polygon_list; -typedef CGAL::Creator_uniform_2 Creator; -typedef CGAL::Random_points_in_square_2< Point_2, Creator > Point_generator; void make_polygon(Polygon_2& polygon) { @@ -38,21 +33,14 @@ int main() { Polygon_2 polygon; Polygon_list partition_polys; - Traits partition_traits; -/* - CGAL::random_polygon_2(50, std::back_inserter(polygon), - Point_generator(100)); -*/ make_polygon(polygon); CGAL::greene_approx_convex_partition_2(polygon.vertices_begin(), polygon.vertices_end(), - std::back_inserter(partition_polys), - partition_traits); + std::back_inserter(partition_polys)); assert(CGAL::convex_partition_is_valid_2(polygon.vertices_begin(), polygon.vertices_end(), partition_polys.begin(), - partition_polys.end(), - partition_traits)); + partition_polys.end())); return 0; } diff --git a/Partition_2/examples/Partition_2/optimal_convex_partition_2.cpp b/Partition_2/examples/Partition_2/optimal_convex_partition_2.cpp index 40dc60433e9..1a4d63c68bd 100644 --- a/Partition_2/examples/Partition_2/optimal_convex_partition_2.cpp +++ b/Partition_2/examples/Partition_2/optimal_convex_partition_2.cpp @@ -1,25 +1,15 @@ #include #include -#include -#include #include -#include -#include #include #include typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Partition_traits_2 Traits; -typedef CGAL::Is_convex_2 Is_convex_2; typedef Traits::Polygon_2 Polygon_2; typedef Traits::Point_2 Point_2; -typedef Polygon_2::Vertex_const_iterator Vertex_iterator; typedef std::list Polygon_list; -typedef CGAL::Partition_is_valid_traits_2 - Validity_traits; -typedef CGAL::Creator_uniform_2 Creator; -typedef CGAL::Random_points_in_square_2 Point_generator; void make_polygon(Polygon_2& polygon) { @@ -43,22 +33,16 @@ int main() { Polygon_2 polygon; Polygon_list partition_polys; - Traits partition_traits; - Validity_traits validity_traits; - -/* - CGAL::random_polygon_2(50, std::back_inserter(polygon), - Point_generator(100)); -*/ + make_polygon(polygon); CGAL::optimal_convex_partition_2(polygon.vertices_begin(), polygon.vertices_end(), - std::back_inserter(partition_polys), - partition_traits); + std::back_inserter(partition_polys)); + assert(CGAL::partition_is_valid_2(polygon.vertices_begin(), polygon.vertices_end(), partition_polys.begin(), - partition_polys.end(), - validity_traits)); + partition_polys.end())); + return 0; } diff --git a/Partition_2/examples/Partition_2/y_monotone_partition_2.cpp b/Partition_2/examples/Partition_2/y_monotone_partition_2.cpp index 190bb513aae..5384989c2fd 100644 --- a/Partition_2/examples/Partition_2/y_monotone_partition_2.cpp +++ b/Partition_2/examples/Partition_2/y_monotone_partition_2.cpp @@ -1,8 +1,6 @@ #include #include #include -#include -#include #include #include @@ -12,8 +10,6 @@ typedef CGAL::Partition_traits_2 Traits; typedef Traits::Point_2 Point_2; typedef Traits::Polygon_2 Polygon_2; typedef std::list Polygon_list; -typedef CGAL::Creator_uniform_2 Creator; -typedef CGAL::Random_points_in_square_2 Point_generator; void make_polygon(Polygon_2& polygon) { @@ -39,10 +35,6 @@ int main( ) Polygon_2 polygon; Polygon_list partition_polys; -/* - CGAL::random_polygon_2(50, std::back_inserter(polygon), - Point_generator(100)); -*/ make_polygon(polygon); CGAL::y_monotone_partition_2(polygon.vertices_begin(), polygon.vertices_end(), @@ -55,10 +47,11 @@ int main( ) assert(CGAL::is_y_monotone_2((*poly_it).vertices_begin(), (*poly_it).vertices_end())); } - + assert(CGAL::partition_is_valid_2(polygon.vertices_begin(), polygon.vertices_end(), partition_polys.begin(), partition_polys.end())); + return 0; } diff --git a/Partition_2/examples/Partition_2/y_monotone_partition_indices_2.cpp b/Partition_2/examples/Partition_2/y_monotone_partition_indices_2.cpp new file mode 100644 index 00000000000..a4cbdf580a1 --- /dev/null +++ b/Partition_2/examples/Partition_2/y_monotone_partition_indices_2.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include +#include + + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; + +typedef CGAL::Partition_traits_2::type > Partition_traits_2; + +typedef Partition_traits_2::Point_2 Point_2; + +typedef Partition_traits_2::Polygon_2 Polygon_2; // a polygon of indices +typedef std::list Polygon_list; + +/* + + v4 v2 + | \ /| + | \ / | + | v3 | + | | + v0-----v1 + + */ + +int main( ) +{ + std::vector points = { K::Point_2(0,0), K::Point_2(2,0), K::Point_2(2,2), K::Point_2(1,1), K::Point_2(0,2) }; + Partition_traits_2 traits(CGAL::make_property_map(points)); + + + Polygon_2 polygon; + polygon.push_back(0); + polygon.push_back(1); + polygon.push_back(2); + polygon.push_back(3); + polygon.push_back(4); + + Polygon_list partition_polys; + + CGAL::y_monotone_partition_2(polygon.vertices_begin(), + polygon.vertices_end(), + std::back_inserter(partition_polys), + traits); + + for (const Polygon_2& poly : partition_polys){ + for(Point_2 p : poly.container()){ + std::cout << "points[" << p << "] = " << points[p] << ", "; + } + std::cout << std::endl; + } + + assert(CGAL::partition_is_valid_2(polygon.vertices_begin(), + polygon.vertices_end(), + partition_polys.begin(), + partition_polys.end(), + traits)); + + return 0; +} diff --git a/Partition_2/include/CGAL/Partition_2/Indirect_edge_compare.h b/Partition_2/include/CGAL/Partition_2/Indirect_edge_compare.h index e1289bdf360..1441a86f133 100644 --- a/Partition_2/include/CGAL/Partition_2/Indirect_edge_compare.h +++ b/Partition_2/include/CGAL/Partition_2/Indirect_edge_compare.h @@ -37,20 +37,15 @@ template class Indirect_edge_compare { public: + typedef typename Traits::Orientation_2 Orientation_2; typedef typename Traits::Compare_y_2 Compare_y_2; typedef typename Traits::Compare_x_2 Compare_x_2; - typedef typename Traits::Construct_line_2 Construct_line_2; - typedef typename Traits::Compare_x_at_y_2 Compare_x_at_y_2; - typedef typename Traits::Is_horizontal_2 Is_horizontal_2; - typedef typename Traits::Line_2 Line_2; typedef typename Traits::Point_2 Point_2; - Indirect_edge_compare() : - _compare_y_2(Traits().compare_y_2_object()), - _compare_x_2(Traits().compare_x_2_object()), - _construct_line_2(Traits().construct_line_2_object()), - _compare_x_at_y_2(Traits().compare_x_at_y_2_object()), - _is_horizontal_2(Traits().is_horizontal_2_object()) + Indirect_edge_compare(const Traits& traits) : + _orientation_2(traits.orientation_2_object()), + _compare_y_2(traits.compare_y_2_object()), + _compare_x_2(traits.compare_x_2_object()) { } // determines if the edge (edge_vtx_1, edge_vtx_1++) has a larger @@ -73,11 +68,24 @@ class Indirect_edge_compare else { // construct supporting line for edge - Line_2 line = _construct_line_2(*edge_vtx_1, *edge_vtx_2); - return _compare_x_at_y_2(Point_2(*vertex), line) == SMALLER; + return compare_x_at_y(Point_2(*vertex), Point_2(*edge_vtx_1), Point_2(*edge_vtx_2)) == SMALLER; } } + Comparison_result compare_x_at_y(const Point_2& p, const Point_2& a, const Point_2& b) const + { + Orientation ori = _orientation_2(a, b, p); + if(ori == COLLINEAR){ + return EQUAL; + } + + if(_compare_y_2(a, b) == SMALLER){ // a below b + return (ori == RIGHT_TURN) ? LARGER : SMALLER; + }else { // a above b + return (ori == LEFT_TURN) ? LARGER : SMALLER; + } + } + bool operator()(ForwardCirculator p, ForwardCirculator q) const { @@ -102,12 +110,9 @@ class Indirect_edge_compare // else neither endpoint is shared // construct supporting line - Line_2 l_p = _construct_line_2(*p, *after_p); - if (_is_horizontal_2(l_p)) + if(_compare_y_2(Point_2(*p), Point_2(*after_p)) == EQUAL) { - Line_2 l_q = _construct_line_2(*q, *after_q); - - if (_is_horizontal_2(l_q)) + if(_compare_y_2(Point_2(*q), Point_2(*after_q)) == EQUAL) { Point_2 p_max; Point_2 q_max; @@ -123,31 +128,29 @@ class Indirect_edge_compare } else // p and after_p must both be on same side of l_q { - return (_compare_x_at_y_2(Point_2(*p), l_q) == LARGER); + return (compare_x_at_y(Point_2(*p), Point_2(*q), Point_2(*after_q)) == LARGER); } } - bool q_larger_x =_compare_x_at_y_2(Point_2(*q), l_p) == SMALLER; - bool after_q_larger_x = _compare_x_at_y_2(Point_2(*after_q), l_p) == SMALLER; + // lp is not horizontal + bool q_larger_x = compare_x_at_y(Point_2(*q), Point_2(*p), Point_2(*after_p)) == SMALLER; + bool after_q_larger_x = compare_x_at_y(Point_2(*after_q), Point_2(*p), Point_2(*after_p)) == SMALLER; if (q_larger_x == after_q_larger_x) return q_larger_x; // else one smaller and one larger // construct the other line - Line_2 l_q = _construct_line_2(*q, *after_q); - if (_is_horizontal_2(l_q)) // p is not horizontal + if(_compare_y_2(Point_2(*q), Point_2(*after_q)) == EQUAL) { - return _compare_x_at_y_2(Point_2(*q), l_p) == LARGER; + return compare_x_at_y(Point_2(*q), Point_2(*p), Point_2(*after_p)) == LARGER; } - return _compare_x_at_y_2(Point_2(*p), l_q) != SMALLER; + return compare_x_at_y(Point_2(*p), Point_2(*q), Point_2(*after_q)) != SMALLER; } private: + Orientation_2 _orientation_2; Compare_y_2 _compare_y_2; Compare_x_2 _compare_x_2; - Construct_line_2 _construct_line_2; - Compare_x_at_y_2 _compare_x_at_y_2; - Is_horizontal_2 _is_horizontal_2; }; } diff --git a/Partition_2/include/CGAL/Partition_2/Indirect_less_xy_2.h b/Partition_2/include/CGAL/Partition_2/Indirect_less_xy_2.h index 196075092ca..58666c99d11 100644 --- a/Partition_2/include/CGAL/Partition_2/Indirect_less_xy_2.h +++ b/Partition_2/include/CGAL/Partition_2/Indirect_less_xy_2.h @@ -33,7 +33,7 @@ class Indirect_less_xy_2 public: typedef typename Traits::Less_xy_2 Less_xy_2; - Indirect_less_xy_2() : _less_xy_2(Traits().less_xy_2_object()) + Indirect_less_xy_2(const Traits& traits) : _less_xy_2(traits.less_xy_2_object()) { } template diff --git a/Partition_2/include/CGAL/Partition_2/Matrix.h b/Partition_2/include/CGAL/Partition_2/Matrix.h index ccb98099e07..73b538b0dbd 100644 --- a/Partition_2/include/CGAL/Partition_2/Matrix.h +++ b/Partition_2/include/CGAL/Partition_2/Matrix.h @@ -19,8 +19,8 @@ // // Author(s) : Susan Hert -#ifndef CGAL_MATRIX_H -#define CGAL_MATRIX_H +#ifndef CGAL_PARTITION_MATRIX_H +#define CGAL_PARTITION_MATRIX_H #include @@ -67,4 +67,4 @@ std::ostream& operator<<(std::ostream& os, const Matrix& m) } -#endif // CGAL_MATRIX_H +#endif // CGAL_PARTITION_MATRIX_H diff --git a/Partition_2/include/CGAL/Partition_2/Partition_vertex_map.h b/Partition_2/include/CGAL/Partition_2/Partition_vertex_map.h index e27c0057031..7990b51b94b 100644 --- a/Partition_2/include/CGAL/Partition_2/Partition_vertex_map.h +++ b/Partition_2/include/CGAL/Partition_2/Partition_vertex_map.h @@ -62,10 +62,6 @@ public: friend bool operator != ( Vertex_info const& a, Vertex_info const& b ) { return !(a==b); } - friend bool operator < ( Vertex_info const& a, Vertex_info const& b ) - { - return Traits().less_xy_2_object()(*a.vertex_it(), *b.vertex_it()); - } private: @@ -73,6 +69,24 @@ private: Polygon_2 const* m_poly_ptr ; } ; + +template +class Vertex_info_less +{ +public: + Vertex_info_less(const Traits_& traits) + : traits(traits) + {} + + bool operator()(Vertex_info const& a, Vertex_info const& b ) const + { + return traits.less_xy_2_object()(*a.vertex_it(), *b.vertex_it()); + } + +private: + const Traits_& traits; +}; + template class Edge_info { @@ -117,9 +131,9 @@ public: typedef typename Traits::Less_xy_2 Less_xy_2; typedef typename Traits::Point_2 Point_2; - CW_indirect_edge_info_compare (Vertex_const_iterator v_info) : vertex_it(v_info), - left_turn(Traits().left_turn_2_object()), - less_xy(Traits().less_xy_2_object()) + CW_indirect_edge_info_compare (Vertex_const_iterator v_info, const Traits& traits) : vertex_it(v_info), + left_turn(traits.left_turn_2_object()), + less_xy(traits.less_xy_2_object()) {} bool operator()(Edge_info e1, Edge_info e2) @@ -185,6 +199,12 @@ public: Edge_info const& back() const { return m_list.back() ; } Edge_info & back() { return m_list.back() ; } + + Edge_list(const Traits& traits) + : traits(traits) + {} + + template void sort ( Compare c ) { m_list.sort(c); } void insert_next(Vertex_info endpoint_ref, int num) @@ -242,7 +262,7 @@ public: // polygon. if (m_list.size() > 2) { - m_list.sort(CW_indirect_edge_info_compare(vertex_it)); + m_list.sort(CW_indirect_edge_info_compare(vertex_it,traits)); } #ifdef CGAL_PARTITION_CHECK_DEBUG @@ -301,7 +321,7 @@ public: } private : - + const Traits& traits; List m_list ; }; @@ -335,7 +355,8 @@ public: typedef Partition_vertex_map Self; - typedef std::map Map ; + typedef Vertex_info_less Less; + typedef std::map Map ; typedef typename Map::const_iterator Self_const_iterator; typedef typename Map::iterator Self_iterator; @@ -348,7 +369,9 @@ public: Partition_vertex_map() {} template - Partition_vertex_map(InputIterator first_poly, InputIterator last_poly) + Partition_vertex_map(InputIterator first_poly, InputIterator last_poly, const Traits& traits) + : traits(traits) + , m_map(traits) { _build(first_poly, last_poly); } Self_const_iterator begin() const { return m_map.begin() ; } @@ -419,7 +442,7 @@ public: if ((*m_it).second.size() > 2) { (*m_it).second.sort( - CW_indirect_edge_info_compare((*m_it).first.vertex_it())); + CW_indirect_edge_info_compare((*m_it).first.vertex_it(),traits)); } // find the previous vertex in this vertex's list @@ -474,7 +497,7 @@ private : vtx_begin = (*poly_first).vertices_begin(); vtx_end = (*poly_first).vertices_end(); - begin_v_loc_pair = m_map.insert(P_Vertex( Vertex_info(vtx_begin,poly_ptr), Edge_list())); + begin_v_loc_pair = m_map.insert(P_Vertex( Vertex_info(vtx_begin,poly_ptr), Edge_list(traits))); prev_v_loc_pair = begin_v_loc_pair; v_it = vtx_begin; @@ -482,7 +505,7 @@ private : for (v_it++; v_it != vtx_end; v_it++) { - v_loc_pair = m_map.insert(P_Vertex( Vertex_info(v_it,poly_ptr), Edge_list())); + v_loc_pair = m_map.insert(P_Vertex( Vertex_info(v_it,poly_ptr), Edge_list(traits))); insert_next_edge(prev_v_loc_pair.first, v_loc_pair.first, poly_num); @@ -509,7 +532,7 @@ private : } private : - + const Traits& traits; Map m_map ; }; diff --git a/Partition_2/include/CGAL/Partition_2/Partitioned_polygon_2.h b/Partition_2/include/CGAL/Partition_2/Partitioned_polygon_2.h index 49e14b459ce..50e21dd30e9 100644 --- a/Partition_2/include/CGAL/Partition_2/Partitioned_polygon_2.h +++ b/Partition_2/include/CGAL/Partition_2/Partitioned_polygon_2.h @@ -43,8 +43,9 @@ public: Indirect_CW_diag_compare(){} Indirect_CW_diag_compare(Point_2 vertex, Iterator prev_ref, - Iterator next_ref) : - _orientation(Traits().orientation_2_object()), + Iterator next_ref, + const Traits& traits) : + _orientation(traits.orientation_2_object()), _vertex(vertex), _prev_v_ref(prev_ref) { @@ -99,8 +100,8 @@ class Partition_vertex; // template -class Partitioned_polygon_2 : - public std::vector< Partition_vertex< Traits_ > > +class Partitioned_polygon_2 + : public std::vector< Partition_vertex< Traits_ > > { public: typedef Traits_ Traits; @@ -114,12 +115,13 @@ public: typedef typename Diagonal_list::iterator Diagonal_iterator; - Partitioned_polygon_2() : _left_turn(Traits().left_turn_2_object()) - { } + Partitioned_polygon_2(const Traits& traits) + : _left_turn(traits.left_turn_2_object()), traits(traits) + {} template - Partitioned_polygon_2(InputIterator first, InputIterator beyond) : - _left_turn(Traits().left_turn_2_object()) + Partitioned_polygon_2(InputIterator first, InputIterator beyond, const Traits& traits) : + _left_turn(traits.left_turn_2_object()), traits(traits) { for (; first != beyond; first++) { this->push_back(Vertex(*first)); @@ -180,7 +182,7 @@ public: { next = c; next++; - (*c).sort_diagonals(prev, next); + (*c).sort_diagonals(prev, next, traits); #ifdef CGAL_PARTITIONED_POLY_DEBUG (*c).print_diagonals(); #endif @@ -287,12 +289,14 @@ private: cuts_reflex_angle(diag_ref2, diag_ref1)); } - Left_turn_2 _left_turn; + Left_turn_2 _left_turn; + const Traits& traits; }; template -class Partition_vertex : public Traits_::Point_2 -{ +class Partition_vertex { +private: + typename Traits_::Point_2 point; public: typedef Traits_ Traits; typedef typename Traits::Point_2 Base_point; @@ -310,25 +314,31 @@ class Partition_vertex : public Traits_::Point_2 typedef typename Diagonal_list::iterator Diagonal_iterator; //default constructor added for EPECK - Partition_vertex(): Base_point() + Partition_vertex() { current_diag = diag_endpoint_refs.end() ; } Partition_vertex(Base_point p) - : Base_point(p) + : point(p) { current_diag = diag_endpoint_refs.end() ; } Partition_vertex(const Partition_vertex& other) - : Base_point(other) + : point(other.point) { // No need to deep copy. // We initialize in order to avoid problem with g++ safe STL current_diag = diag_endpoint_refs.end() ; } + operator Base_point() const + { + return point; + } + + Partition_vertex& operator=(const Partition_vertex&)=default; void insert_diagonal(Circulator v_ref) @@ -367,9 +377,9 @@ class Partition_vertex : public Traits_::Point_2 // sort the diagonals ccw around the point they have in common // and remove any duplicate diagonals - void sort_diagonals(const Circulator& prev, const Circulator& next) + void sort_diagonals(const Circulator& prev, const Circulator& next, const Traits& traits) { - diag_endpoint_refs.sort(Indirect_CW_diag_compare(*this, prev, next)); + diag_endpoint_refs.sort(Indirect_CW_diag_compare(*this, prev, next, traits)); diag_endpoint_refs.unique(); current_diag = diag_endpoint_refs.begin(); diff --git a/Partition_2/include/CGAL/Partition_2/Point_pair_less_xy_2.h b/Partition_2/include/CGAL/Partition_2/Point_pair_less_xy_2.h index 8673787384e..2f849c3e26c 100644 --- a/Partition_2/include/CGAL/Partition_2/Point_pair_less_xy_2.h +++ b/Partition_2/include/CGAL/Partition_2/Point_pair_less_xy_2.h @@ -42,7 +42,7 @@ class Point_pair_less_xy_2 typedef typename Traits::Less_xy_2 Less_xy_2; public: - Point_pair_less_xy_2() : _less_xy_2(Traits().less_xy_2_object()) + Point_pair_less_xy_2(const Traits& traits) : _less_xy_2(traits.less_xy_2_object()) { } diff --git a/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h b/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h index a149a137f06..de1d27a0ae2 100644 --- a/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h +++ b/Partition_2/include/CGAL/Partition_2/Rotation_tree_2.h @@ -57,6 +57,7 @@ public: typedef typename Traits::Point_2 Point_2; using internal::vector< Rotation_tree_node_2 >::push_back; + using internal::vector< Rotation_tree_node_2 >::back; class Greater { typename Traits::Less_xy_2 less; @@ -70,24 +71,33 @@ public: } }; + struct Equal { + bool operator()(const Point_2& p, const Point_2& q) const + { + return p == q; + } + }; + // constructor template - Rotation_tree_2(ForwardIterator first, ForwardIterator beyond) + Rotation_tree_2(ForwardIterator first, ForwardIterator beyond, const Traits& traits) { for (ForwardIterator it = first; it != beyond; it++) push_back(*it); - Greater greater (Traits().less_xy_2_object()); + Greater greater (traits.less_xy_2_object()); + Equal equal; std::sort(this->begin(), this->end(), greater); - std::unique(this->begin(), this->end()); + std::unique(this->begin(), this->end(),equal); // front() is the point with the largest x coordinate - + + // Add two auxiliary points that have a special role and whose coordinates are not used // push the point p_minus_infinity; the coordinates should never be used - push_back(Point_2( 1, -1)); + push_back(back()); // push the point p_infinity; the coordinates should never be used - push_back(Point_2(1, 1)); + push_back(back()); _p_inf = this->end(); // record the iterators to these extreme points _p_inf--; diff --git a/Partition_2/include/CGAL/Partition_2/Rotation_tree_node_2.h b/Partition_2/include/CGAL/Partition_2/Rotation_tree_node_2.h index a4c538465b1..ec84dfeefcb 100644 --- a/Partition_2/include/CGAL/Partition_2/Rotation_tree_node_2.h +++ b/Partition_2/include/CGAL/Partition_2/Rotation_tree_node_2.h @@ -45,8 +45,9 @@ namespace CGAL { template class Rotation_tree_2; template -class Rotation_tree_node_2 : public Traits::Point_2 +class Rotation_tree_node_2 { + typename Traits::Point_2 point; public: typedef typename Traits::Point_2 Base_point; @@ -56,7 +57,7 @@ public: typedef std::pair Node_ref; - Rotation_tree_node_2(Base_point p) : Base_point(p) + Rotation_tree_node_2(Base_point p) : point(p) { _parent.second = false; _left_sibling.second = false; @@ -64,6 +65,9 @@ public: _rightmost_child.second = false; } + operator Base_point() const + { return point;} + bool has_left_sibling() const { return _left_sibling.second; } diff --git a/Partition_2/include/CGAL/Partition_2/Segment_less_yx_2.h b/Partition_2/include/CGAL/Partition_2/Segment_less_yx_2.h index e53e2897b15..4e3e6c15dec 100644 --- a/Partition_2/include/CGAL/Partition_2/Segment_less_yx_2.h +++ b/Partition_2/include/CGAL/Partition_2/Segment_less_yx_2.h @@ -50,11 +50,11 @@ class Segment_less_yx_2 typedef Turn_reverser Right_turn_2; public: - Segment_less_yx_2() : - _less_xy_2(Traits().less_xy_2_object()), - _compare_x_2(Traits().compare_x_2_object()), - _compare_y_2(Traits().compare_y_2_object()), - _left_turn_2(Traits().left_turn_2_object()), + Segment_less_yx_2(const Traits& traits) : + _less_xy_2(traits.less_xy_2_object()), + _compare_x_2(traits.compare_x_2_object()), + _compare_y_2(traits.compare_y_2_object()), + _left_turn_2(traits.left_turn_2_object()), _right_turn_2(Right_turn_2(_left_turn_2)) { } diff --git a/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h b/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h index f38034fff5e..c04757505b6 100644 --- a/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h +++ b/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h @@ -61,14 +61,11 @@ #include - -#include #include #include #include #include #include -#include #include #include #include @@ -86,9 +83,6 @@ class Vertex_visibility_graph_2 private: typedef Vertex_visibility_graph_2 Self; typedef typename Traits::Point_2 Point_2; - typedef typename Traits::Segment_2 Segment_2; - typedef typename Traits::Ray_2 Ray_2; - typedef typename Traits::Object_2 Object_2; typedef typename Traits::Left_turn_2 Left_turn_2; typedef typename Traits::Less_xy_2 Less_xy_2; typedef typename Traits::Orientation_2 Orientation_2; @@ -96,11 +90,6 @@ private: Collinear_are_ordered_along_line_2; typedef typename Traits::Are_strictly_ordered_along_line_2 Are_strictly_ordered_along_line_2; - typedef typename Traits::Construct_segment_2 - Construct_segment_2; - typedef typename Traits::Construct_ray_2 Construct_ray_2; - typedef typename Traits::Intersect_2 Intersect_2; - typedef typename Traits::Assign_2 Assign_2; typedef CGAL::Segment_less_yx_2 Segment_less_yx_2; typedef Rotation_tree_2 Tree; @@ -133,30 +122,27 @@ public: // first and beyond should be iterators over vertices of a polygon // template - Vertex_visibility_graph_2(ForwardIterator first, ForwardIterator beyond): - left_turn_2(Traits().left_turn_2_object()), - orientation_2(Traits().orientation_2_object()), - collinear_ordered_2(Traits().collinear_are_ordered_along_line_2_object()), + Vertex_visibility_graph_2(ForwardIterator first, ForwardIterator beyond, const Traits& traits): + left_turn_2(traits.left_turn_2_object()), + orientation_2(traits.orientation_2_object()), + collinear_ordered_2(traits.collinear_are_ordered_along_line_2_object()), are_strictly_ordered_along_line_2( - Traits().are_strictly_ordered_along_line_2_object()), - less_xy_2(Traits().less_xy_2_object()), - construct_segment_2(Traits().construct_segment_2_object()), - construct_ray_2(Traits().construct_ray_2_object()), - intersect_2(Traits().intersect_2_object()), - assign_2(Traits().assign_2_object()) + traits.are_strictly_ordered_along_line_2_object()), + less_xy_2(traits.less_xy_2_object()), + edges(Point_pair_compare(traits)) { - build(first, beyond); + build(first, beyond, traits); } // Pre: ccw order of points; no repeated points template - void build(ForwardIterator first, ForwardIterator beyond) + void build(ForwardIterator first, ForwardIterator beyond, const Traits& traits) { Polygon polygon(first,beyond); - Tree tree(polygon.begin(), polygon.end()); - - Vertex_map vertex_map; - initialize_vertex_map(polygon, vertex_map); + Tree tree(polygon.begin(), polygon.end(),traits); + + Vertex_map vertex_map(less_xy_2); + initialize_vertex_map(polygon, vertex_map, traits); // NOTE: use the std::list as the basis here because otherwise the basis // is a deque, which is buggy under MSVC++ @@ -353,7 +339,8 @@ private: // immediately below it. For vertical edges, the segment below is not the // one that begins at the other endpoint of the edge. void initialize_vertex_map(const Polygon& polygon, - Vertex_map& vertex_map); + Vertex_map& vertex_map, + const Traits& traits); // determines if one makes a left turn going from p to q to q's parent. // if q's parent is p_infinity, then a left turn is made when p's x value @@ -419,10 +406,6 @@ private: Collinear_are_ordered_along_line_2 collinear_ordered_2; Are_strictly_ordered_along_line_2 are_strictly_ordered_along_line_2; Less_xy_2 less_xy_2; - Construct_segment_2 construct_segment_2; - Construct_ray_2 construct_ray_2; - Intersect_2 intersect_2; - Assign_2 assign_2; Edge_set edges; }; diff --git a/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2_impl.h b/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2_impl.h index f0f364c5636..0050ebc2eb9 100644 --- a/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2_impl.h +++ b/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2_impl.h @@ -56,8 +56,9 @@ Vertex_visibility_graph_2::is_valid(ForwardIterator first, // one that begins at the other endpoint of the edge. template void -Vertex_visibility_graph_2::initialize_vertex_map( - const Polygon& polygon, Vertex_map& vertex_map) +Vertex_visibility_graph_2::initialize_vertex_map(const Polygon& polygon, + Vertex_map& vertex_map, + const Traits& traits) { typedef typename Vertex_map::value_type Map_pair; @@ -67,12 +68,12 @@ Vertex_visibility_graph_2::initialize_vertex_map( // Sort the event list (iterators to points) from left to right // (using less_xy) - iterator_list.sort(Indirect_less_xy_2()); + iterator_list.sort(Indirect_less_xy_2(traits)); // Create an ordered list of edge endpoints (iterators), initially empty typedef std::set< Point_pair, Segment_less_yx_2 > Ordered_edge_set; typedef typename Ordered_edge_set::iterator Ordered_edge_set_iterator; - - Ordered_edge_set ordered_edges; + Segment_less_yx_2 less_xy(traits); + Ordered_edge_set ordered_edges(less_xy); Ordered_edge_set_iterator edge_it; Vertex_map_iterator vm_it; Vertex_map_iterator vis_it; @@ -521,58 +522,49 @@ void Vertex_visibility_graph_2::update_visibility( // don't need to do this for the previous visibility point since // if it were closer to p than q when looking from p to q, q would // not be visible. - Segment_2 next_seg = construct_segment_2(*(*p_it).second.second, - *next_v_p); - Ray_2 ray = construct_ray_2((*p_it).first, (*q_it).first); - Segment_2 i_seg; - Point_2 i_point; - - Object_2 next_result = intersect_2(next_seg, ray); - - if (assign_2(i_point, next_result)) - { - if (collinear_ordered_2((*p_it).first, (*q_it).first, i_point)) - { - (*p_it).second.second = (*q_it).second.first; -#ifdef CGAL_VISIBILITY_GRAPH_DEBUG - std::cout << "p sees something in direction of q, but q is closer;" - << " p sees q" << std::endl; -#endif - } -#ifdef CGAL_VISIBILITY_GRAPH_DEBUG - else - { - std::cout << "p sees something in direction of q that's closer " - << "than q; p doesn't see q" << std::endl; - } -#endif + + // Segment ab and Ray pq + Point_2 a = *(*p_it).second.second; + Point_2 b = *next_v_p; + Point_2 p = (*p_it).first; + Point_2 q = (*q_it).first; + Orientation pqa = orientation_2(p,q,a); + Orientation pqb = orientation_2(p,q,b); + Orientation abp = orientation_2(a,b,p); + Orientation abq = orientation_2(a,b,q); + bool change = false; + if((pqa == COLLINEAR)&& (pqb == COLLINEAR)){ + // the segment lies on the supporting line of the ray + if(collinear_ordered_2(p,q,a) && collinear_ordered_2(p,q,b)){ + change = true; + } + } else if (pqa == COLLINEAR){ + if (collinear_ordered_2(p,q,a)){ // forget about b as it is not collinear + change = true; + } + } else if (pqb == COLLINEAR){ + if (collinear_ordered_2(p,q,b)){ // forget about a + change = true; + } + }else if(pqa == pqb){ + // no intersection as the segment is completely to the left or to the right of the ray + change = true; + }else if((abp == COLLINEAR) || (abq == COLLINEAR) ){ + // do nothing because when a ray point lies on the segment collinear_ordered_2 will be false + } else if (abp != abq){ + // do nothing as i between p and q + } else if(pqb == RIGHT_TURN){ + if(abp == RIGHT_TURN){ + change = true; + } + } else { + CGAL_assertion(pqa == RIGHT_TURN); + if(abp == LEFT_TURN){ + change = true; + } } - else if (assign_2(i_seg, next_result)) - { - if (collinear_ordered_2((*p_it).first,(*q_it).first,i_seg.source()) && - collinear_ordered_2((*p_it).first,(*q_it).first,i_seg.target())) - { - (*p_it).second.second = (*q_it).second.first; -#ifdef CGAL_VISIBILITY_GRAPH_DEBUG - std::cout << "p sees something in direction of q, but q is closer;" - << " p sees q" << std::endl; -#endif - } -#ifdef CGAL_VISIBILITY_GRAPH_DEBUG - else - { - std::cout << "p sees something in direction of q that's closer " - << " than q; p doesn't see q" << std::endl; - } -#endif - } - else - { - (*p_it).second.second = (*q_it).second.first; -#ifdef CGAL_VISIBILITY_GRAPH_DEBUG - std::cout << "p doesn't see something in direction of q; p sees q" - << std::endl; -#endif + if(change){ + (*p_it).second.second = (*q_it).second.first; } } else // p sees what q sees diff --git a/Partition_2/include/CGAL/Partition_2/partition_approx_convex_2.h b/Partition_2/include/CGAL/Partition_2/partition_approx_convex_2.h index 9af431ec077..4bbbaecb227 100644 --- a/Partition_2/include/CGAL/Partition_2/partition_approx_convex_2.h +++ b/Partition_2/include/CGAL/Partition_2/partition_approx_convex_2.h @@ -145,7 +145,7 @@ OutputIterator partition_approx_convex_2(InputIterator first, typedef typename Constrained_tri_2::Vertex_handle Vertex_handle; typedef typename Gt::Segment_2 Segment_2; - P_Polygon_2 polygon(first, beyond); + P_Polygon_2 polygon(first, beyond,traits); CGAL_partition_precondition( orientation_2(polygon.begin(), polygon.end(), traits) == COUNTERCLOCKWISE); @@ -163,8 +163,6 @@ OutputIterator partition_approx_convex_2(InputIterator first, triangles.insert(c, next); } while (++c != first_c); - Segment_2 edge; - #ifdef CGAL_PARTITION_APPROX_CONVEX_DEBUG std::cout << "Inserting diagonals: " << std::endl; #endif @@ -189,8 +187,8 @@ OutputIterator partition_approx_convex_2(InputIterator first, { if ((*e_circ).first->is_constrained((*e_circ).second)) { - edge = triangles.segment((*e_circ).first, (*e_circ).second); #ifdef CGAL_PARTITION_APPROX_CONVEX_DEBUG + Segment_2 edge = triangles.segment((*e_circ).first, (*e_circ).second); std::cout << "edge " << *edge.source() << " " << *edge.target() << " is constrained " << std::endl; #endif @@ -199,11 +197,11 @@ OutputIterator partition_approx_convex_2(InputIterator first, { if (!triangles.is_infinite(*e_circ)) { - edge = triangles.segment((*e_circ).first, (*e_circ).second); + Segment_2 edge = triangles.segment((*e_circ).first, (*e_circ).second); Circulator source = edge.source(); Circulator target = edge.target(); - Circulator before_s = source; before_s--; - Circulator after_s = source; after_s++; + Circulator before_s = edge.source(); before_s--; + Circulator after_s = edge.source(); after_s++; #ifdef CGAL_PARTITION_APPROX_CONVEX_DEBUG std::cout << "considering " << *source << " " << *target << "..."; diff --git a/Partition_2/include/CGAL/Partition_2/partition_optimal_convex_2.h b/Partition_2/include/CGAL/Partition_2/partition_optimal_convex_2.h index 32697264193..e93e704c9bf 100644 --- a/Partition_2/include/CGAL/Partition_2/partition_optimal_convex_2.h +++ b/Partition_2/include/CGAL/Partition_2/partition_optimal_convex_2.h @@ -457,7 +457,7 @@ void partition_opt_cvx_preprocessing(Polygon& polygon, typedef typename Traits::Point_2 Point_2; typedef std::pair Point_pair; - Vis_graph graph(polygon.begin(), polygon.end()); + Vis_graph graph(polygon.begin(), polygon.end(), traits); size_type prev_i, i, next_i, next_next_i; size_type prev_j, j, next_j; @@ -528,7 +528,7 @@ OutputIterator partition_optimal_convex_2(InputIterator first, Tee_for_output_iterator res(result); #endif // no postconditions - P_Polygon_2 polygon(first, beyond); + P_Polygon_2 polygon(first, beyond,traits); CGAL_partition_precondition( orientation_2(polygon.begin(), polygon.end(), traits) == COUNTERCLOCKWISE); diff --git a/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h b/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h index 1b36ff04416..324c152b42b 100644 --- a/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h +++ b/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h @@ -45,8 +45,6 @@ #include #include -#include -#include #include #include #include @@ -436,7 +434,7 @@ OutputIterator partition_y_monotone_2(InputIterator first, Tee_for_output_iterator res(result); #endif // no postcondition - P_Polygon_2 polygon(first, beyond); + P_Polygon_2 polygon(first, beyond, traits); CGAL_partition_precondition( orientation_2(polygon.begin(), polygon.end(), traits) == COUNTERCLOCKWISE); @@ -457,9 +455,10 @@ OutputIterator partition_y_monotone_2(InputIterator first, std::cout << std::endl; #endif - typedef std::map > Tree; - Tree tree; + typedef Indirect_edge_compare Cmp; + typedef std::map Tree; + Cmp cmp(traits); + Tree tree(cmp); typename std::vector::iterator it = circulators.begin(); for (; it != circulators.end(); it++) { diff --git a/Partition_2/include/CGAL/Partition_is_valid_traits_2.h b/Partition_2/include/CGAL/Partition_is_valid_traits_2.h index b4673126dfa..5d33a116b03 100644 --- a/Partition_2/include/CGAL/Partition_is_valid_traits_2.h +++ b/Partition_2/include/CGAL/Partition_is_valid_traits_2.h @@ -38,7 +38,14 @@ public: typedef typename Traits::Orientation_2 Orientation_2; typedef PolygonIsValid Is_valid; - + + Partition_is_valid_traits_2() + {} + + Partition_is_valid_traits_2(const Traits& traits) + : Traits(traits) + {} +public: Is_valid is_valid_object(const Traits& traits) const { return Is_valid(traits); } diff --git a/Partition_2/include/CGAL/Partition_traits_2.h b/Partition_2/include/CGAL/Partition_traits_2.h index a74b1e15dec..45516501bc5 100644 --- a/Partition_2/include/CGAL/Partition_traits_2.h +++ b/Partition_2/include/CGAL/Partition_traits_2.h @@ -25,101 +25,142 @@ #include -#include -#include +#include + +#include #include +#include #include namespace CGAL { -template -class Partition_traits_2 : public Partition_traits_2_base + template > +class Partition_traits_2; + + template + struct Polygon_traits_getter{ + typedef Partition_traits_2 type; + }; + + template + struct Polygon_traits_getter > { + typedef BT type; + }; + +template +class Partition_traits_2 : public Base_traits { - private: - typedef Kernel_ Kernel; - typedef Partition_traits_2 Self; - public: - typedef typename Kernel::Point_2 Point_2; - typedef ::std::list Container; - typedef CGAL::Polygon_2 Polygon_2; - typedef typename Kernel::Less_yx_2 Less_yx_2; - typedef typename Kernel::Less_xy_2 Less_xy_2; - typedef typename Kernel::Left_turn_2 Left_turn_2; - typedef typename Kernel::Orientation_2 Orientation_2; - typedef typename Kernel::Compare_y_2 Compare_y_2; - typedef typename Kernel::Compare_x_2 Compare_x_2; - typedef CGAL::Is_convex_2 Is_convex_2; - typedef CGAL::Is_y_monotone_2 Is_y_monotone_2; +private: + typedef Base_traits Kernel; + typedef Partition_traits_2 Self; + + PointPropertyMap ppmap; + +public: - // needed by Indirect_edge_compare, used in y_monotone and greene_approx - typedef typename Kernel::Line_2 Line_2; - typedef typename Kernel::Construct_line_2 Construct_line_2; - typedef typename Kernel::Compare_x_at_y_2 Compare_x_at_y_2; - typedef typename Kernel::Is_horizontal_2 Is_horizontal_2; + Partition_traits_2(const Base_traits& base=Base_traits()) + : Base_traits(base) + {} + + Partition_traits_2(const PointPropertyMap& ppmap, + const Base_traits& base=Base_traits()) + : Base_traits(base),ppmap(ppmap) + {} + + typedef typename Kernel::FT FT; + typedef typename boost::property_traits::key_type Point_2; + typedef typename boost::call_traits::param_type Arg_type; - // needed by visibility graph and thus by optimal convex - typedef typename Kernel::Ray_2 Ray_2; - typedef typename Kernel::Collinear_are_ordered_along_line_2 - Collinear_are_ordered_along_line_2; - typedef typename Kernel::Are_strictly_ordered_along_line_2 - Are_strictly_ordered_along_line_2; - typedef typename Kernel::Intersect_2 Intersect_2; - typedef typename Kernel::Assign_2 Assign_2; - typedef typename Kernel::Object_2 Object_2; + typedef ::std::list Container; + typedef typename Polygon_traits_getter::type PolygonTraits; + typedef CGAL::Polygon_2 Polygon_2; + + template + struct Pmap_fct : public BaseFct { + Pmap_fct(const PointPropertyMap& ppmap, const BaseFct& base) + : BaseFct(base),ppmap(ppmap) + {} + + const PointPropertyMap& ppmap; - // needed by approx_convex (for constrained triangulation) - // and optimal convex (for vis. graph) - typedef typename Kernel::Segment_2 Segment_2; - // needed by optimal convex (for vis. graph) - typedef typename Kernel::Construct_segment_2 Construct_segment_2; - typedef typename Kernel::Construct_ray_2 Construct_ray_2; + typename BaseFct::result_type operator()(const Arg_type& p, const Arg_type& q) const { + return static_cast(this)->operator()(get(ppmap,p),get(ppmap,q)); + } + + typename BaseFct::result_type operator()(const Arg_type& p, const Arg_type& q, const Arg_type& r) const { + return static_cast(this)->operator()(get(ppmap,p),get(ppmap,q),get(ppmap,r)); + } + }; - Construct_line_2 - construct_line_2_object() const - { return Construct_line_2(); } + typedef Pmap_fct Equal_2; + typedef Pmap_fct Less_yx_2; + typedef Pmap_fct Less_xy_2; + typedef Pmap_fct Left_turn_2; + typedef Pmap_fct Orientation_2; + typedef Pmap_fct Compare_y_2; + typedef Pmap_fct Compare_x_2; + typedef CGAL::Is_convex_2 Is_convex_2; + typedef CGAL::Is_y_monotone_2 Is_y_monotone_2; - Compare_x_at_y_2 - compare_x_at_y_2_object() const - { return Compare_x_at_y_2(); } + + // needed by visibility graph and thus by optimal convex + typedef Pmap_fct Collinear_are_ordered_along_line_2; + typedef Pmap_fct + Are_strictly_ordered_along_line_2; - Construct_segment_2 - construct_segment_2_object() const - { return Construct_segment_2(); } + + Equal_2 + equal_2_object() const + { return Equal_2(ppmap,static_cast(this)->equal_2_object()); } - Construct_ray_2 - construct_ray_2_object() const - { return Construct_ray_2(); } + Orientation_2 + orientation_2_object() const + { return Orientation_2(ppmap,static_cast(this)->orientation_2_object()); } - Collinear_are_ordered_along_line_2 - collinear_are_ordered_along_line_2_object() const - { return Collinear_are_ordered_along_line_2(); } + Less_yx_2 + less_yx_2_object() const + { return Less_yx_2(ppmap,static_cast(this)->less_yx_2_object()); } + + Less_xy_2 + less_xy_2_object() const + { return Less_xy_2(ppmap,static_cast(this)->less_xy_2_object()); } + + Left_turn_2 + left_turn_2_object() const + { return Left_turn_2(ppmap,static_cast(this)->left_turn_2_object()); } + + Compare_y_2 + compare_y_2_object() const + { return Compare_y_2(ppmap,static_cast(this)->compare_y_2_object()); } + + Compare_x_2 + compare_x_2_object() const + { return Compare_x_2(ppmap,static_cast(this)->compare_x_2_object()); } + + + Collinear_are_ordered_along_line_2 + collinear_are_ordered_along_line_2_object() const + { return Collinear_are_ordered_along_line_2(ppmap,static_cast(this)->collinear_are_ordered_along_line_2_object()); } - Are_strictly_ordered_along_line_2 - are_strictly_ordered_along_line_2_object() const - { return Are_strictly_ordered_along_line_2(); } + Are_strictly_ordered_along_line_2 + are_strictly_ordered_along_line_2_object() const + { return Are_strictly_ordered_along_line_2(ppmap,static_cast(this)->are_strictly_ordered_along_line_2_object()); } - Is_horizontal_2 - is_horizontal_2_object() const - { return Is_horizontal_2(); } + + Is_convex_2 + is_convex_2_object(const Self& traits) const + { return Is_convex_2(traits); } - Is_convex_2 - is_convex_2_object(const Self& traits) const - { return Is_convex_2(traits); } + Is_y_monotone_2 + is_y_monotone_2_object(const Self& traits) const + { return Is_y_monotone_2(traits); } - Is_y_monotone_2 - is_y_monotone_2_object(const Self& traits) const - { return Is_y_monotone_2(traits); } - Intersect_2 - intersect_2_object() const - { return Intersect_2(); } - Assign_2 - assign_2_object() const - { return Assign_2(); } }; } + #endif // CGAL_PARTITION_TRAITS_2_H diff --git a/Partition_2/include/CGAL/Partition_traits_adapter_2.h b/Partition_2/include/CGAL/Partition_traits_adapter_2.h new file mode 100644 index 00000000000..fead623a2e0 --- /dev/null +++ b/Partition_2/include/CGAL/Partition_traits_adapter_2.h @@ -0,0 +1,27 @@ +// Copyright (c) 2019 Max-Planck-Institute Saarbruecken (Germany). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0+ +// +// +// Author(s) : Andreas Fabri + +#ifndef CGAL_PARTITION_TRAITS_2_H +#define CGAL_PARTITION_TRAITS_2_H + +#include + +#endif // CGAL_PARTITION_TRAITS_2_H diff --git a/Partition_2/include/CGAL/partition_is_valid_2.h b/Partition_2/include/CGAL/partition_is_valid_2.h index 09380c5da17..8b627d2031d 100644 --- a/Partition_2/include/CGAL/partition_is_valid_2.h +++ b/Partition_2/include/CGAL/partition_is_valid_2.h @@ -132,6 +132,8 @@ polygons_are_equal(Circulator1 orig_first, Circulator2 new_first) } +namespace internal { + template bool partition_is_valid_2 (InputIterator point_first, InputIterator point_last, @@ -157,7 +159,7 @@ partition_is_valid_2 (InputIterator point_first, InputIterator point_last, CGAL_partition_precondition(orientation_2(orig_poly.begin(),orig_poly.end(), traits) == COUNTERCLOCKWISE); - P_Vertex_map output_vertex_set(poly_first, poly_last); + P_Vertex_map output_vertex_set(poly_first, poly_last, traits); if (output_vertex_set.polygons_overlap()) return false; @@ -206,7 +208,8 @@ partition_is_valid_2 (InputIterator point_first, InputIterator point_last, return polygons_w_steiner_are_equal(orig_poly_circ, union_poly_circ, traits); } - +} // namespace internal + template bool partition_is_valid_2 (InputIterator point_first, InputIterator point_last, @@ -219,9 +222,28 @@ partition_is_valid_2 (InputIterator point_first, InputIterator point_last, Partition_is_valid_traits_2 validity_traits; - return partition_is_valid_2(point_first, point_last, + return internal::partition_is_valid_2(point_first, point_last, + poly_first, poly_last, validity_traits); +} + + +template +bool +partition_is_valid_2 (InputIterator point_first, InputIterator point_last, + FowardIterator poly_first, FowardIterator poly_last, + const Traits& traits) +{ + //typedef typename std::iterator_traits::value_type Point_2; + //typedef typename Kernel_traits::Kernel K; + //typedef Partition_traits_2 Traits; + typedef Is_vacuously_valid Is_valid; + + Partition_is_valid_traits_2 validity_traits(traits); + + return internal::partition_is_valid_2(point_first, point_last, poly_first, poly_last, validity_traits); } + template @@ -230,13 +252,13 @@ convex_partition_is_valid_2(InputIterator point_first, InputIterator point_last, ForwardIterator poly_first, ForwardIterator poly_last, - const Traits& ) + const Traits& traits) { typedef typename Traits::Is_convex_2 Is_convex_2; - Partition_is_valid_traits_2 validity_traits; + Partition_is_valid_traits_2 validity_traits(traits); - return partition_is_valid_2(point_first, point_last, poly_first, poly_last, - validity_traits); + return internal::partition_is_valid_2(point_first, point_last, poly_first, poly_last, + validity_traits); } template @@ -260,14 +282,14 @@ y_monotone_partition_is_valid_2(InputIterator point_first, InputIterator point_last, ForwardIterator poly_first, ForwardIterator poly_last, - const Traits& ) + const Traits& traits) { typedef typename Traits::Is_y_monotone_2 Is_y_monotone_2; - Partition_is_valid_traits_2 validity_traits; + Partition_is_valid_traits_2 validity_traits(traits); - return partition_is_valid_2(point_first, point_last, poly_first, poly_last, - validity_traits); + return internal::partition_is_valid_2(point_first, point_last, poly_first, poly_last, + validity_traits); } template diff --git a/Partition_2/include/CGAL/polygon_function_objects.h b/Partition_2/include/CGAL/polygon_function_objects.h index 2de918623c6..b48ed8b70b2 100644 --- a/Partition_2/include/CGAL/polygon_function_objects.h +++ b/Partition_2/include/CGAL/polygon_function_objects.h @@ -47,28 +47,28 @@ template class Is_convex_2 { public: - Is_convex_2(Traits t): traits(t) {} + Is_convex_2(const Traits& t): traits(t) {} template bool operator()(ForwardIterator first, ForwardIterator last) { return is_convex_2(first, last, traits); } private: - Traits traits; + const Traits& traits; }; template class Is_y_monotone_2 { public: - Is_y_monotone_2(Traits t): traits(t) {} + Is_y_monotone_2(const Traits& t): traits(t) {} template bool operator()(ForwardIterator first, ForwardIterator last) { return is_y_monotone_2(first, last, traits); } private: - Traits traits; + const Traits& traits; }; } diff --git a/Partition_2/test/Partition_2/approx_convex_partition_2_test_C.cpp b/Partition_2/test/Partition_2/approx_convex_partition_2_test_C.cpp index 08c57d67600..60d005777e9 100644 --- a/Partition_2/test/Partition_2/approx_convex_partition_2_test_C.cpp +++ b/Partition_2/test/Partition_2/approx_convex_partition_2_test_C.cpp @@ -28,14 +28,14 @@ // implementation: Testing of convex partitioning functions // ============================================================================ -#include +#include #include #include #include #include typedef double NT; -typedef CGAL::Cartesian K; +typedef CGAL::Simple_cartesian K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/approx_convex_partition_2_test_H.cpp b/Partition_2/test/Partition_2/approx_convex_partition_2_test_H.cpp index 1d74394f71e..a99c0778f86 100644 --- a/Partition_2/test/Partition_2/approx_convex_partition_2_test_H.cpp +++ b/Partition_2/test/Partition_2/approx_convex_partition_2_test_H.cpp @@ -26,14 +26,14 @@ // implementation: Testing of convex partitioning functions // ============================================================================ -#include +#include #include #include #include #include typedef double NT; -typedef CGAL::Homogeneous K; +typedef CGAL::Simple_homogeneous K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_C.cpp b/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_C.cpp index 60a36c7c172..e022424c4b9 100644 --- a/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_C.cpp +++ b/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_C.cpp @@ -26,13 +26,13 @@ // implementation: Testing of convex partitioning functions // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Cartesian K; +typedef CGAL::Simple_cartesian K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_H.cpp b/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_H.cpp index a4c2ede5901..d354b997a82 100644 --- a/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_H.cpp +++ b/Partition_2/test/Partition_2/greene_approx_convex_partition_2_test_H.cpp @@ -26,13 +26,13 @@ // implementation: Testing of convex partitioning functions // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Homogeneous K; +typedef CGAL::Simple_homogeneous K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/is_y_monotone_2_test.cpp b/Partition_2/test/Partition_2/is_y_monotone_2_test.cpp index ca31d871099..f745c961b18 100644 --- a/Partition_2/test/Partition_2/is_y_monotone_2_test.cpp +++ b/Partition_2/test/Partition_2/is_y_monotone_2_test.cpp @@ -26,20 +26,20 @@ // implementation: testing of is_y_monotone_2 function // ============================================================================ -#include -#include +#include +#include #include #include #include #include #include -typedef CGAL::Cartesian CR; +typedef CGAL::Simple_cartesian CR; typedef CR::Point_2 CPoint_2; typedef std::list CContainer; typedef CGAL::Polygon_2 CPolygon_2; -typedef CGAL::Homogeneous HR; +typedef CGAL::Simple_homogeneous HR; typedef HR::Point_2 HPoint_2; typedef std::vector HContainer; typedef CGAL::Polygon_2 HPolygon_2; diff --git a/Partition_2/test/Partition_2/kernel_def.h b/Partition_2/test/Partition_2/kernel_def.h index e06415631cd..be07d4b18de 100644 --- a/Partition_2/test/Partition_2/kernel_def.h +++ b/Partition_2/test/Partition_2/kernel_def.h @@ -3,12 +3,12 @@ #if TESTR==1 typedef double NT; - typedef CGAL::Cartesian K; + typedef CGAL::Simple_cartesian K; #endif #if TESTR==2 typedef double NT; - typedef CGAL::Homogeneous K; + typedef CGAL::Simple_homogeneous K; #endif diff --git a/Partition_2/test/Partition_2/kernel_include.h b/Partition_2/test/Partition_2/kernel_include.h index 743250cda21..72f2e998f5f 100644 --- a/Partition_2/test/Partition_2/kernel_include.h +++ b/Partition_2/test/Partition_2/kernel_include.h @@ -1,7 +1,7 @@ #if TESTR == 1 -#include +#include #endif #if TESTR == 2 -#include +#include #endif diff --git a/Partition_2/test/Partition_2/optimal_convex_partition_2_test_C.cpp b/Partition_2/test/Partition_2/optimal_convex_partition_2_test_C.cpp index 70aa4923fec..ef1c6769ce8 100644 --- a/Partition_2/test/Partition_2/optimal_convex_partition_2_test_C.cpp +++ b/Partition_2/test/Partition_2/optimal_convex_partition_2_test_C.cpp @@ -26,13 +26,13 @@ // implementation: Testing of convex partitioning functions // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Cartesian K; +typedef CGAL::Simple_cartesian K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/optimal_convex_partition_2_test_H.cpp b/Partition_2/test/Partition_2/optimal_convex_partition_2_test_H.cpp index 88c44a3220f..cde71db7a20 100644 --- a/Partition_2/test/Partition_2/optimal_convex_partition_2_test_H.cpp +++ b/Partition_2/test/Partition_2/optimal_convex_partition_2_test_H.cpp @@ -26,13 +26,13 @@ // implementation: Testing of convex partitioning functions // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Homogeneous K; +typedef CGAL::Simple_homogeneous K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/partition_2_defaults_test_C.cpp b/Partition_2/test/Partition_2/partition_2_defaults_test_C.cpp index a686229697f..f8cc41a9471 100644 --- a/Partition_2/test/Partition_2/partition_2_defaults_test_C.cpp +++ b/Partition_2/test/Partition_2/partition_2_defaults_test_C.cpp @@ -26,13 +26,13 @@ // implementation: testing of use of default traits classes for partitioning // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Cartesian K; +typedef CGAL::Simple_cartesian K; typedef CGAL::Partition_traits_2 Traits; typedef Traits::Point_2 Point_2; typedef Traits::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/partition_2_defaults_test_H.cpp b/Partition_2/test/Partition_2/partition_2_defaults_test_H.cpp index c4e43ab982e..72213391e1d 100644 --- a/Partition_2/test/Partition_2/partition_2_defaults_test_H.cpp +++ b/Partition_2/test/Partition_2/partition_2_defaults_test_H.cpp @@ -26,13 +26,13 @@ // implementation: testing of use of default traits classes for partitioning // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Homogeneous K; +typedef CGAL::Simple_homogeneous K; typedef CGAL::Partition_traits_2 Traits; typedef Traits::Point_2 Point_2; typedef Traits::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/y_monotone_partition_2_test_C.cpp b/Partition_2/test/Partition_2/y_monotone_partition_2_test_C.cpp index f23090de67a..306bde31052 100644 --- a/Partition_2/test/Partition_2/y_monotone_partition_2_test_C.cpp +++ b/Partition_2/test/Partition_2/y_monotone_partition_2_test_C.cpp @@ -26,13 +26,13 @@ // implementation: Testing of y-monotone partitioning function // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Cartesian K; +typedef CGAL::Simple_cartesian K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Partition_2/test/Partition_2/y_monotone_partition_2_test_H.cpp b/Partition_2/test/Partition_2/y_monotone_partition_2_test_H.cpp index 835c3a9fa1f..42da2db7451 100644 --- a/Partition_2/test/Partition_2/y_monotone_partition_2_test_H.cpp +++ b/Partition_2/test/Partition_2/y_monotone_partition_2_test_H.cpp @@ -26,13 +26,13 @@ // implementation: Testing of y-monotone partitioning function // ============================================================================ -#include +#include #include #include #include #include -typedef CGAL::Homogeneous K; +typedef CGAL::Simple_homogeneous K; typedef K::Point_2 Point_2; typedef std::list Container; typedef CGAL::Polygon_2 Polygon_2; diff --git a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h index 73f85e6f82a..19b7cad9bd5 100644 --- a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h +++ b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h @@ -319,7 +319,7 @@ private: Curve_index curve_index) const; /// Walk along the edge from \c start, following the direction \c start to - /// \c next, and fills \c out with the vertices which do not fullfill + /// \c next, and fills \c out with the vertices which do not fulfill /// the sampling conditions. /// /// \param orientation Orientation of the curve segment between \c v1 and diff --git a/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h b/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h index d10d458824a..e753f9634ea 100644 --- a/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h +++ b/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h @@ -93,8 +93,7 @@ struct C3t3_initializer_base const MeshDomain& domain, const MeshCriteria& criteria, bool with_features, - bool nonlinear = false, - const int nb_initial_points = -1) + const parameters::internal::Mesh_3_options& mesh_options) { c3t3.triangulation().set_domain(domain.bounding_box()); c3t3.triangulation().insert_dummy_points(); @@ -102,8 +101,7 @@ struct C3t3_initializer_base // Call the basic initialization from c3t3, which handles features and // adds a bunch of points on the surface - Base::operator()(c3t3, domain, criteria, with_features, - nonlinear, nb_initial_points); + Base::operator()(c3t3, domain, criteria, with_features, mesh_options); } }; @@ -119,9 +117,10 @@ struct C3t3_initializer MeshDomainHasHasFeatures, HasFeatures> Base; void operator()(C3T3& c3t3, const MeshDomain& domain, const MeshCriteria& criteria, - bool with_features, bool nonlinear = false, const int nb_initial_points = -1) + bool with_features, + const parameters::internal::Mesh_3_options& mesh_options) { - return Base::operator()(c3t3, domain, criteria, with_features, nonlinear, nb_initial_points); + return Base::operator()(c3t3, domain, criteria, with_features, mesh_options); } }; @@ -133,10 +132,11 @@ template { void operator()(C3T3& c3t3, const MeshDomain& domain, const MeshCriteria& criteria, - bool with_features, bool nonlinear = false, const int nb_initial_points = -1) + bool with_features, + const parameters::internal::Mesh_3_options& mesh_options) { C3t3_initializer() - (c3t3, domain, criteria, with_features, nonlinear, nb_initial_points); + (c3t3, domain, criteria, with_features, mesh_options); } }; @@ -152,18 +152,21 @@ struct C3t3_initializer virtual ~C3t3_initializer() { } // this override will be used when initialize_features() is called, in make_mesh_3.h - virtual void initialize_features(C3T3& c3t3, - const MeshDomain& domain, - const MeshCriteria& criteria, - bool nonlinear = false) + virtual void + initialize_features(C3T3& c3t3, + const MeshDomain& domain, + const MeshCriteria& criteria, + const parameters::internal::Mesh_3_options& mesh_options) { - return Periodic_3_mesh_3::internal::init_c3t3_with_features(c3t3, domain, criteria, nonlinear); + return Periodic_3_mesh_3::internal::init_c3t3_with_features + (c3t3, domain, criteria, mesh_options.nonlinear_growth_of_balls); } void operator()(C3T3& c3t3, const MeshDomain& domain, const MeshCriteria& criteria, - bool with_features, bool nonlinear = false, const int nb_initial_points = -1) + bool with_features, + const parameters::internal::Mesh_3_options& mesh_options) { - return Base::operator()(c3t3, domain, criteria, with_features, nonlinear, nb_initial_points); + return Base::operator()(c3t3, domain, criteria, with_features, mesh_options); } }; @@ -257,8 +260,7 @@ void make_periodic_3_mesh_3_impl(C3T3& c3t3, domain, criteria, with_features, - mesh_options.nonlinear_growth_of_balls, - mesh_options.number_of_initial_points); + mesh_options); // Build mesher and launch refinement process refine_periodic_3_mesh_3(c3t3, domain, criteria, diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt index b71c45d5da3..43189c01d4a 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt @@ -53,10 +53,6 @@ if (CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET ${CGAL_QCOLLECTIONGEN -o ${CMAKE_CURRENT_BINARY_DIR}/Periodic_3_triangulation_3.qhc ) - # Make sure the compiler can find generated .moc files - include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) - include_directories( ${QT_INCLUDE_DIR} ) - # The executable itself add_executable ( periodic_3_triangulation_3_demo Scene.cpp moc_Scene.cpp diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h index e1be0bf137f..5c7e21ae5d5 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h @@ -107,7 +107,7 @@ public: // it will have been marked as already visited, and bugs appear... #ifdef CGAL_PERIODIC_TRIANGULATION_USE_VISITED_VERTEX_BOOLEAN // The typedef and the bool are used by Triangulation_data_structure::Vertex_extractor - // The names are choosen complicated so that we do not have to document them + // The names are chosen complicated so that we do not have to document them // (privacy by obfuscation) typedef bool Has_visited_for_vertex_extractor; bool visited_for_vertex_extractor; diff --git a/Periodic_3_triangulation_3/include/CGAL/internal/Periodic_3_triangulation_dummy_36.h b/Periodic_3_triangulation_3/include/CGAL/internal/Periodic_3_triangulation_dummy_36.h index 7df11065499..af214f77a64 100644 --- a/Periodic_3_triangulation_3/include/CGAL/internal/Periodic_3_triangulation_dummy_36.h +++ b/Periodic_3_triangulation_3/include/CGAL/internal/Periodic_3_triangulation_dummy_36.h @@ -697,8 +697,8 @@ static const int O[216][4] = { vertices[9*i+3*j+k] = _tds.create_vertex(); Point p(k*(1.0/3.0) + i*(1.0/6.0), j*(1.0/3.0) + i*(1.0/6.0), i*(1.0/4.0) ); - p = Point((p.x() > FT(0.9375) ? (std::max)( p.x()-1, FT(0) ) : p.x()), - (p.y() > FT(0.9375) ? (std::max)( p.y()-1, FT(0) ) : p.y()), p.z()); + p = Point((p.x() > FT(0.9375) ? CGAL::max( p.x()-1, 0 ) : p.x()), + (p.y() > FT(0.9375) ? CGAL::max( p.y()-1, 0 ) : p.y()), p.z()); p = Point((domain().xmax()-domain().xmin())*p.x(), (domain().xmax()-domain().xmin())*p.y(), (domain().xmax()-domain().xmin())*p.z()); diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index e0eb6720e8b..c5cdc06409a 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -19,11 +19,12 @@ endif() find_package(CGAL QUIET COMPONENTS Core Qt5) include(${CGAL_USE_FILE}) +find_package(LEDA QUIET) + find_package(Qt5 QUIET COMPONENTS Widgets) -if(CGAL_FOUND AND CGAL_Core_FOUND AND Qt5_FOUND AND CGAL_Qt5_FOUND) +if(CGAL_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND) AND Qt5_FOUND AND CGAL_Qt5_FOUND) find_package( Boost REQUIRED ) - include_directories(${Boost_INCLUDE_DIRS}) include_directories (BEFORE include ) diff --git a/Periodic_4_hyperbolic_triangulation_2/examples/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/examples/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index 9cdcb06874c..62dc88202d6 100644 --- a/Periodic_4_hyperbolic_triangulation_2/examples/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/examples/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -1,24 +1,20 @@ -# Created by the script cgal_create_cmake_script -# This is the CMake script for compiling a CGAL application. - +cmake_minimum_required(VERSION 3.1...3.13) project( Periodic_4_hyperbolic_triangulation_2_Examples ) -cmake_minimum_required(VERSION 3.1...3.13) +find_package(CGAL REQUIRED QUIET OPTIONAL_COMPONENTS Core ) +include( ${CGAL_USE_FILE} ) +find_package(LEDA QUIET) -find_package(CGAL QUIET COMPONENTS Core ) +if ( CGAL_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND) ) -if ( CGAL_FOUND AND CGAL_Core_FOUND) + include( CGAL_CreateSingleSourceCGALProgram ) - include( ${CGAL_USE_FILE} ) - - include( CGAL_CreateSingleSourceCGALProgram ) - - create_single_source_cgal_program( "p4ht2_example_insertion.cpp" ) + create_single_source_cgal_program( "p4ht2_example_insertion.cpp" ) else() - message(STATUS "This program requires the CGAL library, and will not be compiled.") + message(STATUS "This program requires the CGAL library, and will not be compiled.") endif() diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h index d5e2a3efdcb..36dde2fe321 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include @@ -34,7 +34,7 @@ namespace CGAL { -template +template class Hyperbolic_octagon_translation { public: diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h index a6f0fcf890e..f71c5a6b1a9 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h @@ -31,7 +31,6 @@ #include #include -#include #include #include diff --git a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index e005c227093..4a8d692d39a 100644 --- a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -1,31 +1,27 @@ -# Created by the script cgal_create_cmake_script -# This is the CMake script for compiling a CGAL application. - +cmake_minimum_required(VERSION 3.1...3.13) project( Periodic_4_hyperbolic_triangulation_2_Tests ) -cmake_minimum_required(VERSION 3.1...3.13) +find_package(CGAL REQUIRED QUIET OPTIONAL_COMPONENTS Core ) +include( ${CGAL_USE_FILE} ) +find_package(LEDA QUIET) -find_package(CGAL QUIET COMPONENTS Core ) +if ( CGAL_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND) ) -if ( CGAL_FOUND AND CGAL_Core_FOUND ) + include( CGAL_CreateSingleSourceCGALProgram ) - include( ${CGAL_USE_FILE} ) + create_single_source_cgal_program( "test_p4ht2_construct_point_2.cpp" ) + create_single_source_cgal_program( "test_p4ht2_exact_complex_numbers.cpp" ) + create_single_source_cgal_program( "test_p4ht2_intersections.cpp" ) + create_single_source_cgal_program( "test_p4ht2_locate.cpp" ) + create_single_source_cgal_program( "test_p4ht2_matrix.cpp" ) + create_single_source_cgal_program( "test_p4ht2_removal_iterator.cpp" ) + create_single_source_cgal_program( "test_p4ht2_removal.cpp" ) + create_single_source_cgal_program( "test_p4ht2_insert_degenerate.cpp" ) - include( CGAL_CreateSingleSourceCGALProgram ) - - create_single_source_cgal_program( "test_p4ht2_construct_point_2.cpp" ) - create_single_source_cgal_program( "test_p4ht2_exact_complex_numbers.cpp" ) - create_single_source_cgal_program( "test_p4ht2_intersections.cpp" ) - create_single_source_cgal_program( "test_p4ht2_locate.cpp" ) - create_single_source_cgal_program( "test_p4ht2_matrix.cpp" ) - create_single_source_cgal_program( "test_p4ht2_removal_iterator.cpp" ) - create_single_source_cgal_program( "test_p4ht2_removal.cpp" ) - create_single_source_cgal_program( "test_p4ht2_insert_degenerate.cpp" ) - else() - message(STATUS "This program requires the CGAL library and the GMP library, and will not be compiled.") + message(STATUS "This program requires the CGAL library and the GMP library, and will not be compiled.") endif() diff --git a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_exact_complex_numbers.cpp b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_exact_complex_numbers.cpp index 693b9878ff4..c78b46783b8 100644 --- a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_exact_complex_numbers.cpp +++ b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_exact_complex_numbers.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -6,7 +6,7 @@ int main(int, char**) { - typedef CORE::Expr NT; + typedef CGAL::Exact_algebraic NT; typedef CGAL::Cartesian Kernel; typedef CGAL::Exact_complex cplx; typedef Kernel::Point_2 Point; diff --git a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_matrix.cpp b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_matrix.cpp index 47acd335532..ed8e3b54309 100644 --- a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_matrix.cpp +++ b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_matrix.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -7,7 +7,7 @@ int main(int, char**) { - typedef CORE::Expr NT; + typedef CGAL::Exact_algebraic NT; typedef CGAL::Exact_complex ECplx; typedef CGAL::Hyperbolic_octagon_translation_matrix Matrix; diff --git a/Point_set_3/include/CGAL/Point_set_3/IO.h b/Point_set_3/include/CGAL/Point_set_3/IO.h index 04e11ec0ea3..b9e77aa4b4a 100644 --- a/Point_set_3/include/CGAL/Point_set_3/IO.h +++ b/Point_set_3/include/CGAL/Point_set_3/IO.h @@ -35,87 +35,12 @@ #include #include #endif // LAS -#include -#include +#include namespace CGAL { namespace internal { - - template - class Abstract_property_printer - { - public: - virtual ~Abstract_property_printer() { } - virtual void print (std::ostream& stream, const typename CGAL::Point_set_3::Index& index) = 0; - }; - - template - class Property_printer : public Abstract_property_printer - { - typedef typename CGAL::Point_set_3 Point_set; - typedef typename Point_set::template Property_map Pmap; - Pmap m_pmap; - public: - Property_printer (const Pmap& pmap) : m_pmap (pmap) - { - - } - - virtual void print(std::ostream& stream, const typename CGAL::Point_set_3::Index& index) - { - stream << get(m_pmap, index); - } - }; - - template - class Simple_property_printer : public Abstract_property_printer - { - typedef typename CGAL::Point_set_3 Point_set; - typedef typename Point_set::template Property_map Pmap; - Pmap m_pmap; - public: - Simple_property_printer (const Pmap& pmap) : m_pmap (pmap) - { - - } - - virtual void print(std::ostream& stream, const typename CGAL::Point_set_3::Index& index) - { - if (get_mode(stream) == IO::ASCII) - stream << get(m_pmap, index); - else - { - Type t = get (m_pmap, index); - stream.write (reinterpret_cast(&t), sizeof(t)); - } - } - }; - - template - class Char_property_printer : public Abstract_property_printer - { - typedef typename CGAL::Point_set_3 Point_set; - typedef typename Point_set::template Property_map Pmap; - Pmap m_pmap; - public: - Char_property_printer (const Pmap& pmap) : m_pmap (pmap) - { - - } - - virtual void print(std::ostream& stream, const typename CGAL::Point_set_3::Index& index) - { - if (get_mode(stream) == IO::ASCII) - stream << int(get(m_pmap, index)); - else - { - Type t = get (m_pmap, index); - stream.write (reinterpret_cast(&t), sizeof(t)); - } - } - }; namespace PLY { @@ -365,19 +290,42 @@ read_off_point_set( } +/// \cond SKIP_IN_MANUAL +template +bool +read_ply_point_set( + std::istream& stream, ///< input stream. + CGAL::Point_set_3& point_set) ///< point set +{ + std::string dummy; + return read_ply_point_set (stream, point_set, dummy); +} + +/// \endcond + /*! \ingroup PkgPointSet3IO + + Reads a point set with properties from an input stream in Ascii or + Binary PLY format. + + - the operator reads the vertex `point` property; + - if three PLY properties `nx`, `ny` and `nz` with type `float` + or `double` are found, the normal map is added; + - if any other PLY property is found, a "[name]" property map is + added, where `[name]` is the name of the PLY property. + + The `comments` parameter can be omitted. If provided, it will be + used to store the potential comments found in the PLY + header. Each line starting by "comment " in the header is + appended to the `comments` string (without the "comment " word). */ template bool read_ply_point_set( std::istream& stream, ///< input stream. -#ifdef DOXYGEN_RUNNING - CGAL::Point_set_3& point_set) ///< point set -#else CGAL::Point_set_3& point_set, ///< point set - std::string* comments = NULL) ///< recover PLY comments -#endif + std::string& comments) ///< PLY comments. { if(!stream) { @@ -394,14 +342,14 @@ read_ply_point_set( return false; } - if (comments != NULL) - *comments = reader.comments(); + comments = reader.comments(); for (std::size_t i = 0; i < reader.number_of_elements(); ++ i) { internal::PLY::PLY_element& element = reader.element(i); - if (element.name() == "vertex" || element.name() == "vertices") + bool is_vertex = (element.name() == "vertex" || element.name() == "vertices"); + if (is_vertex) { point_set.reserve (element.number_of_items()); filler.instantiate_properties (element); @@ -417,7 +365,7 @@ read_ply_point_set( return false; } - if (element.name() == "vertex" || element.name() == "vertices") + if (is_vertex) filler.process_line (element); } } @@ -427,27 +375,46 @@ read_ply_point_set( /*! \ingroup PkgPointSet3IO + + Writes a point set with properties in an output stream in PLY + format. + + If found, the normal map is inserted to the stream. All other + properties with simple types are inserted in the stream. + + If provided, the `comments` string is included line by line in + the header of the PLY stream (each line will be precedeed by + "comment "). */ template bool write_ply_point_set( std::ostream& stream, ///< output stream. -#ifdef DOXYGEN_RUNNING - const CGAL::Point_set_3& point_set) ///< point set -#else - const CGAL::Point_set_3& point_set, ///< point set - std::string* comments = NULL) ///< write PLY comments -#endif + const CGAL::Point_set_3& point_set, ///< point set. + const std::string& comments = std::string()) ///< PLY comments. { typedef CGAL::Point_set_3 Point_set; + typedef typename Point_set::Index Index; + typedef typename Point_set::Point_map Point_map; + typedef typename Point_set::Vector_map Vector_map; + typedef typename Point_set::template Property_map Int8_map; + typedef typename Point_set::template Property_map Uint8_map; + typedef typename Point_set::template Property_map Int16_map; + typedef typename Point_set::template Property_map Uint16_map; + typedef typename Point_set::template Property_map Int32_map; + typedef typename Point_set::template Property_map Uint32_map; + typedef typename Point_set::template Property_map Int64_map; + typedef typename Point_set::template Property_map Uint64_map; + typedef typename Point_set::template Property_map Float_map; + typedef typename Point_set::template Property_map Double_map; stream << "ply" << std::endl << ((get_mode(stream) == IO::BINARY) ? "format binary_little_endian 1.0" : "format ascii 1.0") << std::endl << "comment Generated by the CGAL library" << std::endl; - if (comments != NULL) + if (comments != std::string()) { - std::istringstream iss (*comments); + std::istringstream iss (comments); std::string line; while (getline(iss, line)) { @@ -459,7 +426,7 @@ write_ply_point_set( stream << "element vertex " << point_set.number_of_points() << std::endl; std::vector prop = point_set.base().properties(); - std::vector*> printers; + std::vector*> printers; for (std::size_t i = 0; i < prop.size(); ++ i) { @@ -468,7 +435,7 @@ write_ply_point_set( if (prop[i] == "point") { - if (boost::is_same::type, float>::value) + if (boost::is_same::type, float>::value) { stream << "property float x" << std::endl << "property float y" << std::endl @@ -480,86 +447,125 @@ write_ply_point_set( << "property double y" << std::endl << "property double z" << std::endl; } - printers.push_back (new internal::Property_printer(point_set.point_map())); + printers.push_back (new internal::PLY::Property_printer(point_set.point_map())); continue; } if (prop[i] == "normal") { - stream << "property double nx" << std::endl - << "property double ny" << std::endl - << "property double nz" << std::endl; - printers.push_back (new internal::Property_printer(point_set.normal_map())); + if (boost::is_same::type, float>::value) + { + stream << "property float nx" << std::endl + << "property float ny" << std::endl + << "property float nz" << std::endl; + } + else + { + stream << "property double nx" << std::endl + << "property double ny" << std::endl + << "property double nz" << std::endl; + } + printers.push_back (new internal::PLY::Property_printer(point_set.normal_map())); continue; } bool okay = false; { - typename Point_set::template Property_map pmap; + Int8_map pmap; boost::tie (pmap, okay) = point_set.template property_map(prop[i]); if (okay) { stream << "property char " << prop[i] << std::endl; - printers.push_back (new internal::Char_property_printer(pmap)); + printers.push_back (new internal::PLY::Char_property_printer(pmap)); continue; } } { - typename Point_set::template Property_map pmap; + Uint8_map pmap; boost::tie (pmap, okay) = point_set.template property_map(prop[i]); if (okay) { stream << "property uchar " << prop[i] << std::endl; - printers.push_back (new internal::Char_property_printer(pmap)); + printers.push_back (new internal::PLY::Char_property_printer(pmap)); continue; } } { - typename Point_set::template Property_map pmap; + Int16_map pmap; boost::tie (pmap, okay) = point_set.template property_map(prop[i]); if (okay) { stream << "property short " << prop[i] << std::endl; - printers.push_back (new internal::Simple_property_printer(pmap)); + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); continue; } } { - typename Point_set::template Property_map pmap; + Uint16_map pmap; boost::tie (pmap, okay) = point_set.template property_map(prop[i]); if (okay) { stream << "property ushort " << prop[i] << std::endl; - printers.push_back (new internal::Simple_property_printer(pmap)); + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); continue; } } { - typename Point_set::template Property_map pmap; + Int32_map pmap; boost::tie (pmap, okay) = point_set.template property_map(prop[i]); if (okay) { stream << "property int " << prop[i] << std::endl; - printers.push_back (new internal::Simple_property_printer(pmap)); + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); continue; } } { - typename Point_set::template Property_map pmap; + Uint32_map pmap; + boost::tie (pmap, okay) = point_set.template property_map(prop[i]); + if (okay) + { + stream << "property uint " << prop[i] << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Int64_map pmap; + boost::tie (pmap, okay) = point_set.template property_map(prop[i]); + if (okay) + { + stream << "property int " << prop[i] << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Uint64_map pmap; + boost::tie (pmap, okay) = point_set.template property_map(prop[i]); + if (okay) + { + stream << "property uint " << prop[i] << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Float_map pmap; boost::tie (pmap, okay) = point_set.template property_map(prop[i]); if (okay) { stream << "property float " << prop[i] << std::endl; - printers.push_back (new internal::Simple_property_printer(pmap)); + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); continue; } } { - typename Point_set::template Property_map pmap; + Double_map pmap; boost::tie (pmap, okay) = point_set.template property_map(prop[i]); if (okay) { stream << "property double " << prop[i] << std::endl; - printers.push_back (new internal::Simple_property_printer(pmap)); + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); continue; } } diff --git a/Point_set_processing_3/doc/Point_set_processing_3/NamedParameters.txt b/Point_set_processing_3/doc/Point_set_processing_3/NamedParameters.txt index 18916e87b3f..e2c64e40efb 100644 --- a/Point_set_processing_3/doc/Point_set_processing_3/NamedParameters.txt +++ b/Point_set_processing_3/doc/Point_set_processing_3/NamedParameters.txt @@ -93,7 +93,7 @@ along sharp features. The range of possible values is `[0, 1]`. \n \cgalNPBegin{neighbor_radius} \anchor PSP_neighbor_radius is the spherical neighborhood radius.\n \b Type: floating scalar value\n -Default value: `-1`, in which case the functions that use it will compute an adapted value automatically. +Default value: `-1`, in which case it is not used. \cgalNPEnd \cgalNPBegin{number_of_output_points} \anchor PSP_number_of_output_points diff --git a/Point_set_processing_3/doc/Point_set_processing_3/Point_set_processing_3.txt b/Point_set_processing_3/doc/Point_set_processing_3/Point_set_processing_3.txt index 9a6785f0531..275ecf450fb 100644 --- a/Point_set_processing_3/doc/Point_set_processing_3/Point_set_processing_3.txt +++ b/Point_set_processing_3/doc/Point_set_processing_3/Point_set_processing_3.txt @@ -61,8 +61,8 @@ CGAL::jet_estimate_normals \endcode This API was introduced in \cgal 4.12. Please refer to the -\ref Point_set_processing_3Deprecated "dedicated section" -on how to upgrade from the deprecated API. +\ref Point_set_processing_3Outdated "dedicated section" +on how to upgrade from the outdated API. \subsection Point_set_processing_3NamedParameters Named Parameters @@ -102,23 +102,20 @@ a property map. \cgalExample{Point_set_processing_3/grid_simplify_indices.cpp} -\subsection Point_set_processing_3Deprecated Upgrading from pre-CGAL 4.12 Deprecated API +\subsection Point_set_processing_3Outdated Upgrading from pre-CGAL 4.12 API The current API based on ranges and named parameters was introduced in \cgal 4.12. The old API that used pairs of iterators along with usual \cpp parameters (with some default values and overloads to handle -optional parameters) is deprecated. - -\warning The deprecated API will be removed in \cgal 4.14, so we -recommend to update your code. +optional parameters) has been removed in \cgal 5.0. Translating your pre-\cgal 4.12 code using Point Set Processing to the -new API is easy. For example, consider this code using the old API: +current API is easy. For example, consider this code using the old API: \code std::vector points; -// Old pre-CGAL 4.12 deprecated API +// Old pre-CGAL 4.12 API CGAL::jet_estimate_normals (points.begin(), points.end(), CGAL::First_of_pair_property_map(), @@ -129,7 +126,7 @@ CGAL::jet_estimate_normals The pair of iterators is replaced by a range and the optional parameters (than can be deduced automatically in simple cases) are moved to the end of the function in a single named parameter object -(see \ref BGLNamedParameters). The code translated to the new API +(see \ref BGLNamedParameters). The code translated to the current API becomes: \code @@ -281,11 +278,10 @@ points has the appearance of a curve in 2D or a surface in 3D - `estimate_global_k_neighbor_scale()` - `estimate_global_range_scale()` -Functions such as `jet_estimate_normals()` or -`remove_outliers()` require a K neighbor scale while others such as -`grid_simplify_point_set()` require a range -scale. `vcm_estimate_normals()` is an example of a function that -accepts both. +Functions such as `grid_simplify_point_set()` require a range scale +while `jet_estimate_normals()`, `remove_outliers()` or +`vcm_estimate_normals()` are examples of functions that accepts both a +K neighbor scale or a range scale. In some specific cases, the scale of a point set might not be homogeneous (for example if the point set contains variable @@ -325,7 +321,9 @@ points in the domain. Function `remove_outliers()` deletes a user-specified fraction of outliers from an input point set. More specifically, it sorts the input points in increasing order of average squared distances to their -`k` nearest neighbors and deletes the points with largest value. +nearest neighbors and deletes the points with largest value. The user +can either specify a fixed number of nearest neighbors or a fixed +spherical neighborhood radius. \subsection Point_set_processing_3Example_outlier_removal Example @@ -387,7 +385,7 @@ parameter: \f$10\f$, \f$100\f$ and \f$1000\f$. In the 3 cases, \subsubsection Point_set_processing_3Hierarchy_simplification_parameter_var_max Parameter: var_max In addition to the size parameter, a variation parameter allows to -increase simplification in monotoneous regions. For each cluster, a +increase simplification in monotonous regions. For each cluster, a surface variation measure is computed using the sorted eigenvalues of the covariance matrix: \f[ \sigma(p) = \frac{\lambda_0}{\lambda_0 + \lambda_1 + \lambda_2}. \f] @@ -446,13 +444,16 @@ Two smoothing functions are devised to smooth an input point set. Function `jet_smooth_point_set()` smooths the input point set by projecting each point onto a smooth parametric surface patch -(so-called jet surface) fitted over its `k` nearest neighbors. +(so-called jet surface) fitted over its nearest neighbors. Function `bilateral_smooth_point_set()` smooths the input point set by -iteratively projecting each point onto the implicit surface patch fitted over its `k` nearest neighbors. +iteratively projecting each point onto the implicit surface patch fitted over its nearest neighbors. Bilateral projection preserves sharp features according to the normal (gradient) information. Normals are thus required as input. For more details, see section 4 of \cgalCite{ear-2013}. +For both functions, the user can either specify a fixed number of +nearest neighbors or a fixed spherical neighborhood radius. + \subsection Point_set_processing_3Example_jet_smoothing Jet Smoothing Example The following example generates a set of 9 points close to the `xy` @@ -487,13 +488,13 @@ functions provide an estimate of the normal to \b S at each point. The result is an unoriented normal vector for each input point. Function `jet_estimate_normals()` estimates the normal direction -at each point from the input set by fitting a jet surface over its `k` +at each point from the input set by fitting a jet surface over its nearest neighbors. The default jet is a quadric surface. This algorithm is well suited to point sets scattered over curved surfaces. Function `pca_estimate_normals()` estimates the normal direction at each point from the set by linear least squares fitting of a plane -over its `k` nearest neighbors. This algorithm is simpler and +over its nearest neighbors. This algorithm is simpler and faster than `jet_estimate_normals()`. Function `vcm_estimate_normals()` estimates the normal direction @@ -502,13 +503,16 @@ of the point set. This algorithm is more complex and slower than the previous algorithms. It is based on the article \cgalCite{cgal:mog-vbcfe-11}. +For these three functions, the user can either specify a fixed number +of nearest neighbors or a fixed spherical neighborhood radius. + \section Point_set_processing_3NormalOrientation Normal Orientation Function `mst_orient_normals()` orients the normals of a set of points with unoriented normals using the method described by Hoppe et al. in Surface reconstruction from unorganized points \cgalCite{cgal:hddms-srup-92}. More specifically, this method constructs a -Riemannian graph over the input points (the graph of the `k` +Riemannian graph over the input points (the graph of the nearest neighbor points) and propagates a seed normal orientation within a minimum spanning tree computed over this graph. The result is an oriented normal vector for each input unoriented normal, except for @@ -521,8 +525,9 @@ Normal orientation of a sampled cube surface. Left: unoriented normals. Right: o \subsection Point_set_processing_3Example_normals Example The following example reads a point set from a file, estimates the -normals through PCA over the 6 nearest neighbors and orients the -normals: +normals through PCA (either over the 18 nearest neighbors or using a +spherical neighborhood radius of twice the average spacing) and +orients the normals: \cgalExample{Point_set_processing_3/normals_example.cpp} @@ -556,7 +561,7 @@ Upsampling for different sharpness_angle parameter values. The input containing \cgalFigureEnd \subsubsection Point_set_processing_3upsample_neighborhood_size Parameter: neighbor_radius -Usually, the neighborhood of sample points should include at least one ring of neighboring sample points. Using small neighborhood size may not be able to insert new points. Using big neighborhood size can fill small holes, but points inserted on the edges could be irregular. The function will use a neigbhorhood size estimation if this parameter value is set to default or smaller than zero. +Usually, the neighborhood of sample points should include at least one ring of neighboring sample points. Using small neighborhood size may not be able to insert new points. Using big neighborhood size can fill small holes, but points inserted on the edges could be irregular. The function will use a neighborhood size estimation if this parameter value is set to default or smaller than zero. \cgalFigureBegin{Point_set_processing_3figupsample_neighborhood_size, upsample_neighborhood_size.jpg} Comparison between different sizes of neighbor radius. @@ -656,7 +661,7 @@ Thanks to the carriage return character `\r`, the lines are overwritten and the Pierre Alliez and Laurent Saboret contributed the initial component. Nader Salman contributed the grid simplification. Started from GSoC'2013, three new algorithms were implemented by Shihao Wu and Clément Jamin: WLOP, bilateral smoothing and upsampling. -Started from GSoC'2014, Jocelyn Meyron with the help of Quentin Mérigot introduced the computation of the Voronoi covarience measure of a point set, +Started from GSoC'2014, Jocelyn Meyron with the help of Quentin Mérigot introduced the computation of the Voronoi covariance measure of a point set, as well as the normal and feature edge estimation functions based on it. Florent Lafarge with the help of Simon Giraudot contributed the point set structuring algorithm. diff --git a/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt b/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt index 5f0d4ac489b..cf741624daa 100644 --- a/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt +++ b/Point_set_processing_3/examples/Point_set_processing_3/CMakeLists.txt @@ -37,7 +37,7 @@ if ( CGAL_FOUND ) find_package( TBB REQUIRED ) endif() - # Executables that do *not* require EIGEN or LAPACK + # Executables that do *not* require EIGEN create_single_source_cgal_program( "average_spacing_example.cpp" ) create_single_source_cgal_program( "bilateral_smooth_point_set_example.cpp" ) create_single_source_cgal_program( "grid_simplification_example.cpp" ) @@ -70,27 +70,18 @@ if ( CGAL_FOUND ) message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() - # Use Eigen or BLAS and LAPACK (optional) + # Use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) - if (NOT EIGEN3_FOUND) - find_package(LAPACK) - if(LAPACK_FOUND) - include( ${LAPACK_USE_FILE} ) - endif(LAPACK_FOUND) - else() + if (EIGEN3_FOUND) include( ${EIGEN3_USE_FILE} ) - endif() - - if(EIGEN3_FOUND OR LAPACK_FOUND) - # Executables that require Eigen or BLAS and LAPACK + # Executables that require Eigen create_single_source_cgal_program( "jet_smoothing_example.cpp" ) create_single_source_cgal_program( "normal_estimation.cpp" ) create_single_source_cgal_program( "edges_example.cpp" ) - else(EIGEN3_FOUND OR LAPACK_FOUND) + else() - message(STATUS "NOTICE: Some of the executables in this directory need either Eigen 3.1 (or greater) or LAPACK, and will not be compiled.") - - endif(EIGEN3_FOUND OR LAPACK_FOUND) + message(STATUS "NOTICE: Some of the executables in this directory need Eigen 3.1 (or greater) and will not be compiled.") + endif() foreach(target scale_estimation_example diff --git a/Point_set_processing_3/examples/Point_set_processing_3/normals_example.cpp b/Point_set_processing_3/examples/Point_set_processing_3/normals_example.cpp index 85df999904d..25a28429661 100644 --- a/Point_set_processing_3/examples/Point_set_processing_3/normals_example.cpp +++ b/Point_set_processing_3/examples/Point_set_processing_3/normals_example.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -42,11 +43,31 @@ int main(int argc, char*argv[]) // Note: pca_estimate_normals() requiresa range of points // as well as property maps to access each point's position and normal. const int nb_neighbors = 18; // K-nearest neighbors = 3 rings - CGAL::pca_estimate_normals - (points, nb_neighbors, - CGAL::parameters::point_map(CGAL::First_of_pair_property_map()). - normal_map(CGAL::Second_of_pair_property_map())); + if (argc > 2 && std::strcmp(argv[2], "-r") == 0) // Use a fixed neighborhood radius + { + // First compute a spacing using the K parameter + double spacing + = CGAL::compute_average_spacing + (points, nb_neighbors, + CGAL::parameters::point_map(CGAL::First_of_pair_property_map())); + + // Then, estimate normals with a fixed radius + CGAL::pca_estimate_normals + (points, + 0, // when using a neighborhood radius, K=0 means no limit on the number of neighbors returns + CGAL::parameters::point_map(CGAL::First_of_pair_property_map()). + normal_map(CGAL::Second_of_pair_property_map()). + neighbor_radius(2. * spacing)); // use 2*spacing as neighborhood radius + } + else // Use a fixed number of neighbors + { + CGAL::pca_estimate_normals + (points, nb_neighbors, + CGAL::parameters::point_map(CGAL::First_of_pair_property_map()). + normal_map(CGAL::Second_of_pair_property_map())); + } + // Orients normals. // Note: mst_orient_normals() requires a range of points // as well as property maps to access each point's position and normal. diff --git a/Point_set_processing_3/include/CGAL/IO/read_ply_points.h b/Point_set_processing_3/include/CGAL/IO/read_ply_points.h index 988a69cc9bd..f993f17a766 100644 --- a/Point_set_processing_3/include/CGAL/IO/read_ply_points.h +++ b/Point_set_processing_3/include/CGAL/IO/read_ply_points.h @@ -27,6 +27,7 @@ #include +#include #include #include #include @@ -43,36 +44,9 @@ #include #include -#define TRY_TO_GENERATE_PROPERTY(STD_TYPE, T_TYPE, TYPE) \ - if (type == STD_TYPE || type == T_TYPE) \ - m_elements.back().add_property (new PLY_read_typed_number< TYPE > (name, format)) - -#define TRY_TO_GENERATE_SIZED_LIST_PROPERTY(STD_SIZE_TYPE, T_SIZE_TYPE, SIZE_TYPE, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) \ - if ((size_type == STD_SIZE_TYPE || size_type == T_SIZE_TYPE) && \ - (index_type == STD_INDEX_TYPE || index_type == T_INDEX_TYPE)) \ - m_elements.back().add_property (new PLY_read_typed_list_with_typed_size< SIZE_TYPE , INDEX_TYPE > (name, format)) - -#define TRY_TO_GENERATE_LIST_PROPERTY(STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) \ - TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uchar", "uint8", boost::uint8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ - else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("ushort", "uint16", boost::uint16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ - else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uint", "uint32", boost::uint32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) - - namespace CGAL { - -// PLY types: -// name type number of bytes -// --------------------------------------- -// char character 1 -// uchar unsigned character 1 -// short short integer 2 -// ushort unsigned short integer 2 -// int integer 4 -// uint unsigned integer 4 -// float single-precision float 4 -// double double-precision float 8 - +#ifdef DOXYGEN_RUNNING // Document some parts from Stream_support here for convenience /** \ingroup PkgPointSetProcessing3IOPly @@ -88,23 +62,6 @@ namespace CGAL { PLY_property (const char* name) : name (name) { } }; - /// \cond SKIP_IN_MANUAL - - // Use a double property for all kernels... - template struct Convert_FT { typedef double type; }; - // ...except if kernel uses type float - template <> struct Convert_FT { typedef float type; }; - - template - struct GetFTFromMap - { - typedef typename Convert_FT - ::value_type>::Kernel::FT>::type type; - }; - /// \endcond - /** \ingroup PkgPointSetProcessing3IOPly @@ -118,24 +75,10 @@ namespace CGAL { \tparam PointMap the property map used to store points. */ template -#ifdef DOXYGEN_RUNNING std::tuple::Kernel::Construct_point_3, PLY_property, PLY_property, PLY_property > -#else - std::tuple::Kernel::Construct_point_3, - PLY_property::type>, - PLY_property::type>, - PLY_property::type> > -#endif - make_ply_point_reader(PointMap point_map) - { - return std::make_tuple (point_map, typename Kernel_traits::Kernel::Construct_point_3(), - PLY_property::type>("x"), - PLY_property::type>("y"), - PLY_property::type>("z")); - } + make_ply_point_reader(PointMap point_map); /** \ingroup PkgPointSetProcessing3IOPly @@ -151,573 +94,11 @@ namespace CGAL { \tparam VectorMap the property map used to store vectors. */ template -#ifdef DOXYGEN_RUNNING std::tuple::Kernel::Construct_vector_3, PLY_property, PLY_property, PLY_property > -#else - std::tuple::Kernel::Construct_vector_3, - PLY_property::type>, - PLY_property::type>, - PLY_property::type> > -#endif - make_ply_normal_reader(VectorMap normal_map) - { - return std::make_tuple (normal_map, typename Kernel_traits::Kernel::Construct_vector_3(), - PLY_property::type>("nx"), - PLY_property::type>("ny"), - PLY_property::type>("nz")); - } - - /// \cond SKIP_IN_MANUAL - -namespace internal { - - namespace PLY { - - class PLY_read_number - { - protected: - std::string m_name; - std::size_t m_format; - - public: - PLY_read_number (std::string name, std::size_t format) - : m_name (name), m_format (format) { } - virtual ~PLY_read_number() { } - - const std::string& name () const { return m_name; } - - virtual void get (std::istream& stream) const = 0; - - // The two following functions prevent the stream to only extract - // ONE character (= what the types char imply) by requiring - // explicitely an integer object when reading the stream - void read_ascii (std::istream& stream, char& c) const - { - short s; - stream >> s; - c = static_cast(s); - } - void read_ascii (std::istream& stream, signed char& c) const - { - short s; - stream >> s; - c = static_cast(s); - } - void read_ascii (std::istream& stream, unsigned char& c) const - { - unsigned short s; - stream >> s; - c = static_cast(s); - } - - void read_ascii (std::istream& stream, float& t) const - { - stream >> iformat(t); - } - - void read_ascii (std::istream& stream, double& t) const - { - stream >> iformat(t); - } - - // Default template when Type is not a char type - template - void read_ascii (std::istream& stream, Type& t) const - { - stream >> t; - } - - - template - Type read (std::istream& stream) const - { - if (m_format == 0) // Ascii - { - Type t; - read_ascii (stream, t); - return t; - } - else // Binary (2 = little endian) - { - union - { - char uChar[sizeof (Type)]; - Type type; - } buffer; - - std::size_t size = sizeof (Type); - - stream.read(buffer.uChar, size); - - if (m_format == 2) // Big endian - { - for (std::size_t i = 0; i < size / 2; ++ i) - { - unsigned char tmp = buffer.uChar[i]; - buffer.uChar[i] = buffer.uChar[size - 1 - i]; - buffer.uChar[size - 1 - i] = tmp; - } - } - return buffer.type; - } - return Type(); - } - }; - - template - class PLY_read_typed_number : public PLY_read_number - { - mutable Type m_buffer; - public: - PLY_read_typed_number (std::string name, std::size_t format) - : PLY_read_number (name, format) - { - } - void get (std::istream& stream) const - { - m_buffer = (this->read (stream)); - } - const Type& buffer() const - { - return m_buffer; - } - }; - - template - class PLY_read_typed_list : public PLY_read_number - { - protected: - mutable std::vector m_buffer; - public: - PLY_read_typed_list (std::string name, std::size_t format) - : PLY_read_number (name, format) - { - } - virtual void get (std::istream& stream) const = 0; - - const std::vector& buffer() const - { - return m_buffer; - } - }; - - template - class PLY_read_typed_list_with_typed_size - : public PLY_read_typed_list - { - - public: - PLY_read_typed_list_with_typed_size (std::string name, std::size_t format) - : PLY_read_typed_list (name, format) - { - } - void get (std::istream& stream) const - { - std::size_t size = static_cast(this->template read(stream)); - this->m_buffer.resize (size); - for (std::size_t i = 0; i < size; ++ i) - this->m_buffer[i] = this->template read (stream); - } - }; - - class PLY_element - { - std::string m_name; - std::size_t m_number; - - std::vector m_properties; - public: - - PLY_element (const std::string& name, std::size_t number) - : m_name (name), m_number (number) - { } - - PLY_element (const PLY_element& other) - : m_name (other.m_name), m_number (other.m_number), m_properties (other.m_properties) - { - const_cast(other).m_properties.clear(); - } - - PLY_element& operator= (const PLY_element& other) - { - m_name = other.m_name; - m_number = other.m_number; - m_properties = other.m_properties; - const_cast(other).m_properties.clear(); - return *this; - } - - ~PLY_element() - { - for (std::size_t i = 0; i < m_properties.size(); ++ i) - delete m_properties[i]; - } - - const std::string& name() const { return m_name; } - std::size_t number_of_items() const { return m_number; } - std::size_t number_of_properties() const { return m_properties.size(); } - - PLY_read_number* property (std::size_t idx) { return m_properties[idx]; } - - void add_property (PLY_read_number* read_number) - { - m_properties.push_back (read_number); - } - - template - bool has_property (const char* tag) - { - return has_property (tag, Type()); - } - template - bool has_property (const char* tag, const std::vector&) - { - for (std::size_t i = 0; i < number_of_properties(); ++ i) - if (m_properties[i]->name () == tag) - return (dynamic_cast*>(m_properties[i]) != NULL); - return false; - } - - template - bool has_property (const char* tag, Type) - { - for (std::size_t i = 0; i < number_of_properties(); ++ i) - if (m_properties[i]->name () == tag) - return (dynamic_cast*>(m_properties[i]) != NULL); - return false; - } - bool has_property (const char* tag, double) - { - for (std::size_t i = 0; i < number_of_properties(); ++ i) - if (m_properties[i]->name () == tag) - return (dynamic_cast*>(m_properties[i]) != NULL - || dynamic_cast*>(m_properties[i]) != NULL); - - return false; - } - - template - void assign (Type& t, const char* tag) - { - for (std::size_t i = 0; i < number_of_properties (); ++ i) - if (m_properties[i]->name () == tag) - { - PLY_read_typed_number* - property = dynamic_cast*>(m_properties[i]); - CGAL_assertion (property != NULL); - t = property->buffer(); - return; - } - } - - template - void assign (std::vector& t, const char* tag) - { - for (std::size_t i = 0; i < number_of_properties (); ++ i) - if (m_properties[i]->name () == tag) - { - PLY_read_typed_list* - property = dynamic_cast*>(m_properties[i]); - CGAL_assertion (property != NULL); - t = property->buffer(); - return; - } - } - - void assign (double& t, const char* tag) - { - for (std::size_t i = 0; i < number_of_properties (); ++ i) - if (m_properties[i]->name () == tag) - { - PLY_read_typed_number* - property_double = dynamic_cast*>(m_properties[i]); - if (property_double == NULL) - { - PLY_read_typed_number* - property_float = dynamic_cast*>(m_properties[i]); - CGAL_assertion (property_float != NULL); - t = property_float->buffer(); - } - else - t = property_double->buffer(); - - return; - } - } - - }; - - class PLY_reader - { - std::vector m_elements; - std::string m_comments; - - public: - PLY_reader () { } - - std::size_t number_of_elements() const { return m_elements.size(); } - PLY_element& element (std::size_t idx) - { - return m_elements[idx]; - } - - const std::string& comments() const { return m_comments; } - - template - bool init (Stream& stream) - { - std::size_t lineNumber = 0; // current line number - enum Format { ASCII = 0, BINARY_LITTLE_ENDIAN = 1, BINARY_BIG_ENDIAN = 2}; - Format format = ASCII; - - std::string line; - std::istringstream iss; - - while (getline (stream,line)) - { - iss.clear(); - iss.str (line); - ++ lineNumber; - - // Reads file signature on first line - if (lineNumber == 1) - { - std::string signature; - if (!(iss >> signature) || (signature != "ply")) - { - // if wrong file format - std::cerr << "Error: incorrect file format line " << lineNumber << " of file" << std::endl; - return false; - } - } - - // Reads format on 2nd line - else if (lineNumber == 2) - { - std::string tag, format_string, version; - if ( !(iss >> tag >> format_string >> version) ) - { - std::cerr << "Error line " << lineNumber << " of file" << std::endl; - return false; - } - if (format_string == "ascii") format = ASCII; - else if (format_string == "binary_little_endian") format = BINARY_LITTLE_ENDIAN; - else if (format_string == "binary_big_endian") format = BINARY_BIG_ENDIAN; - else - { - std::cerr << "Error: unknown file format \"" << format_string << "\" line " << lineNumber << std::endl; - return false; - } - } - - // Comments and vertex properties - else - { - std::string keyword; - if (!(iss >> keyword)) - { - std::cerr << "Error line " << lineNumber << " of file" << std::endl; - return false; - } - - if (keyword == "property") - { - std::string type, name; - if (!(iss >> type >> name)) - { - std::cerr << "Error line " << lineNumber << " of file" << std::endl; - return false; - } - - - if (type == "list") // Special case - { - std::string size_type = name; - std::string index_type; - name.clear(); - if (!(iss >> index_type >> name)) - { - std::cerr << "Error line " << lineNumber << " of file" << std::endl; - return false; - } - - TRY_TO_GENERATE_LIST_PROPERTY ("char", "int8", boost::int8_t); - else TRY_TO_GENERATE_LIST_PROPERTY ("uchar", "uint8", boost::uint8_t); - else TRY_TO_GENERATE_LIST_PROPERTY ("short", "int16", boost::int16_t); - else TRY_TO_GENERATE_LIST_PROPERTY ("ushort", "uint16", boost::uint16_t); - else TRY_TO_GENERATE_LIST_PROPERTY ("int", "int32", boost::int32_t); - else TRY_TO_GENERATE_LIST_PROPERTY ("uint", "uint32", boost::uint32_t); - else TRY_TO_GENERATE_LIST_PROPERTY ("float", "float32", float); - else TRY_TO_GENERATE_LIST_PROPERTY ("double", "float64", double); - } - else - { - TRY_TO_GENERATE_PROPERTY ("char", "int8", boost::int8_t); - else TRY_TO_GENERATE_PROPERTY ("uchar", "uint8", boost::uint8_t); - else TRY_TO_GENERATE_PROPERTY ("short", "int16", boost::int16_t); - else TRY_TO_GENERATE_PROPERTY ("ushort", "uint16", boost::uint16_t); - else TRY_TO_GENERATE_PROPERTY ("int", "int32", boost::int32_t); - else TRY_TO_GENERATE_PROPERTY ("uint", "uint32", boost::uint32_t); - else TRY_TO_GENERATE_PROPERTY ("float", "float32", float); - else TRY_TO_GENERATE_PROPERTY ("double", "float64", double); - } - - continue; - } - else if (keyword == "comment") - { - std::string str = iss.str(); - if (str.size() > 8) - { - std::copy (str.begin() + 8, str.end(), std::back_inserter (m_comments)); - m_comments += "\n"; - } - } - else if (keyword == "element") - { - std::string type; - std::size_t number; - if (!(iss >> type >> number)) - { - std::cerr << "Error line " << lineNumber << " of file" << std::endl; - return false; - } - - m_elements.push_back (PLY_element(type, number)); - } - // When end_header is reached, stop loop and begin reading points - else if (keyword == "end_header") - break; - } - } - return true; - } - - ~PLY_reader () - { - } - - }; - - template - void get_value(Reader& r, T& v, PLY_property& wrapper) - { - return r.assign(v, wrapper.name); - } - - - template - struct Filler - { - template - static void fill(Reader& r, Value_tuple& values, PLY_property_tuple wrappers) - { - get_value(r, std::get(values), std::get(wrappers)); - Filler::fill(r, values, wrappers); - } - }; - - template - struct seq { }; - - template - struct gens : gens { }; - - template - struct gens<0, S...> { - typedef seq type; - }; - - template - ValueType call_functor(Functor f, Tuple t, seq) { - return f(std::get(t) ...); - } - - template - ValueType call_functor(Functor f, std::tuple& t) - { - return call_functor(f, t, typename gens::type()); - } - - template<> - struct Filler<0> - { - template - static void fill(Reader& r, Value_tuple& values, PLY_property_tuple wrappers) - { - get_value(r, std::get<0>(values), std::get<2>(wrappers)); - } - }; - - template - void process_properties (PLY_element& element, OutputValueType& new_element, - std::tuple...>&& current) - { - typedef typename PropertyMap::value_type PmapValueType; - std::tuple values; - Filler::fill(element, values, current); - PmapValueType new_value = call_functor(std::get<1>(current), values); - put (std::get<0>(current), new_element, new_value); - } - - template - void process_properties (PLY_element& element, OutputValueType& new_element, - std::tuple...>&& current, - NextPropertyBinder&& next, - PropertyMapBinders&& ... properties) - { - typedef typename PropertyMap::value_type PmapValueType; - std::tuple values; - Filler::fill(element, values, current); - PmapValueType new_value = call_functor(std::get<1>(current), values); - put (std::get<0>(current), new_element, new_value); - - process_properties (element, new_element, std::forward(next), - std::forward(properties)...); - } - - - template - void process_properties (PLY_element& element, OutputValueType& new_element, - std::pair >&& current) - { - T new_value = T(); - element.assign (new_value, current.second.name); - put (current.first, new_element, new_value); - } - - template - void process_properties (PLY_element& element, OutputValueType& new_element, - std::pair >&& current, - NextPropertyBinder&& next, - PropertyMapBinders&& ... properties) - { - T new_value = T(); - element.assign (new_value, current.second.name); - put (current.first, new_element, new_value); - process_properties (element, new_element, std::forward(next), - std::forward(properties)...); - } - - } // namespace PLY - -} // namespace internal - - - /// \endcond - + make_ply_normal_reader(VectorMap normal_map); +#endif // DOXYGEN_RUNNING /* \ingroup PkgPointSetProcessing3IOPly diff --git a/Point_set_processing_3/include/CGAL/IO/write_ply_points.h b/Point_set_processing_3/include/CGAL/IO/write_ply_points.h index e20d211252f..d8558d10b7a 100644 --- a/Point_set_processing_3/include/CGAL/IO/write_ply_points.h +++ b/Point_set_processing_3/include/CGAL/IO/write_ply_points.h @@ -27,9 +27,9 @@ #include +#include #include #include -#include #include #include @@ -42,6 +42,7 @@ namespace CGAL { +#ifdef DOXYGEN_RUNNING // Document some parts from Stream_support here for convenience /** \ingroup PkgPointSetProcessing3IOPly @@ -55,21 +56,8 @@ namespace CGAL { \tparam PointMap the property map used to store points. */ template -#ifdef DOXYGEN_RUNNING std::tuple, PLY_property, PLY_property > -#else - std::tuple::type>, - PLY_property::type>, - PLY_property::type> > -#endif - make_ply_point_writer(PointMap point_map) - { - return std::make_tuple (point_map, - PLY_property::type>("x"), - PLY_property::type>("y"), - PLY_property::type>("z")); - } + make_ply_point_writer(PointMap point_map); /** \ingroup PkgPointSetProcessing3IOPly @@ -84,21 +72,9 @@ namespace CGAL { \tparam VectorMap the property map used to store vectors. */ template -#ifdef DOXYGEN_RUNNING std::tuple, PLY_property, PLY_property > -#else - std::tuple::type>, - PLY_property::type>, - PLY_property::type> > + make_ply_normal_writer(VectorMap normal_map); #endif - make_ply_normal_writer(VectorMap normal_map) - { - return std::make_tuple (normal_map, - PLY_property::type>("nx"), - PLY_property::type>("ny"), - PLY_property::type>("nz")); - } /// \cond SKIP_IN_MANUAL @@ -106,219 +82,6 @@ namespace internal { namespace PLY { - template void property_header_type (std::ostream& stream) - { - CGAL_assertion_msg (false, "Unknown PLY type"); - stream << "undefined_type"; - } - - template <> void property_header_type (std::ostream& stream) { stream << "char"; } - template <> void property_header_type (std::ostream& stream) { stream << "char"; } - template <> void property_header_type (std::ostream& stream) { stream << "uchar"; } - template <> void property_header_type (std::ostream& stream) { stream << "short"; } - template <> void property_header_type (std::ostream& stream) { stream << "ushort"; } - template <> void property_header_type (std::ostream& stream) { stream << "int"; } - template <> void property_header_type (std::ostream& stream) { stream << "uint"; } - template <> void property_header_type (std::ostream& stream) { stream << "float"; } - template <> void property_header_type (std::ostream& stream) { stream << "double"; } - - template - void property_header (std::ostream& stream, const PLY_property& prop) - { - stream << "property "; - property_header_type(stream); - stream << " " << prop.name << std::endl; - } - - template - void property_header (std::ostream& stream, const PLY_property >& prop) - { - stream << "property list uchar "; - property_header_type(stream); - stream << " " << prop.name << std::endl; - } - - - template - struct Properties_header - { - template - static void write(std::ostream& stream, PLY_property_tuple& wrappers) - { - Properties_header::write(stream, wrappers); - property_header (stream, std::get(wrappers)); - } - }; - template <> - struct Properties_header<0> - { - template - static void write(std::ostream& stream, PLY_property_tuple& wrappers) - { - property_header (stream, std::get<1>(wrappers)); - } - }; - - template - void output_property_header (std::ostream& stream, - std::tuple... >&& current) - { - Properties_header::write(stream, current); - } - - - template - void output_property_header (std::ostream& stream, - std::pair >&& current) - { - property_header (stream, current.second); - } - - template - void output_property_header (std::ostream& stream, - std::pair >&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) - { - property_header (stream, current.second); - output_property_header (stream, std::forward(next), - std::forward(properties)...); - } - template - void output_property_header (std::ostream& stream, - std::tuple... >&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) - { - Properties_header::write(stream, current); - output_property_header (stream, std::forward(next), - std::forward(properties)...); - } - - - template - void property_write (std::ostream& stream, ForwardIterator it, PropertyMap map) - { - stream << CGAL::oformat(get (map, *it)); - } - - template - T no_char_character (const T& t) { return t; } - int no_char_character (const char& t) { return int(t); } - int no_char_character (const signed char& t) { return int(t); } - int no_char_character (const unsigned char& t) { return int(t); } - - template - void simple_property_write (std::ostream& stream, ForwardIterator it, - std::pair > map) - { - if (CGAL::get_mode(stream) == IO::ASCII) - stream << no_char_character(get (map.first, *it)); - else - { - typename PropertyMap::value_type value = get(map.first, *it); - stream.write (reinterpret_cast(&value), sizeof(value)); - } - } - - template - void simple_property_write (std::ostream& stream, ForwardIterator it, - std::pair > > map) - { - const typename PropertyMap::reference value = get(map.first, *it); - - if (CGAL::get_mode(stream) == IO::ASCII) - { - stream << value.size(); - for (std::size_t i = 0; i < value.size(); ++ i) - stream << " " << no_char_character(value[i]); - } - else - { - unsigned char size = static_cast(value.size()); - stream.write (reinterpret_cast(&size), sizeof(size)); - for (std::size_t i = 0; i < value.size(); ++ i) - { - T t = T(value[i]); - stream.write (reinterpret_cast(&t), sizeof(t)); - } - } - } - - - template - void output_properties (std::ostream& stream, - ForwardIterator it, - std::tuple... >&& current) - { - property_write (stream, it, std::get<0>(current)); - if (get_mode(stream) == IO::ASCII) - stream << std::endl; - } - - - template - void output_properties (std::ostream& stream, - ForwardIterator it, - std::pair >&& current) - { - simple_property_write (stream, it, std::forward > >(current)); - if (get_mode(stream) == IO::ASCII) - stream << std::endl; - } - - template - void output_properties (std::ostream& stream, - ForwardIterator it, - std::pair >&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) - { - simple_property_write (stream, it, current); - if (get_mode(stream) == IO::ASCII) - stream << " "; - output_properties (stream, it, std::forward(next), - std::forward(properties)...); - } - - template - void output_properties (std::ostream& stream, - ForwardIterator it, - std::tuple... >&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) - { - property_write (stream, it, std::get<0>(current)); - if (get_mode(stream) == IO::ASCII) - stream << " "; - output_properties (stream, it, std::forward(next), - std::forward(properties)...); - } } // namespace PLY diff --git a/Point_set_processing_3/include/CGAL/Point_set_processing_3/internal/neighbor_query.h b/Point_set_processing_3/include/CGAL/Point_set_processing_3/internal/neighbor_query.h new file mode 100644 index 00000000000..85921d2f2eb --- /dev/null +++ b/Point_set_processing_3/include/CGAL/Point_set_processing_3/internal/neighbor_query.h @@ -0,0 +1,113 @@ +// Copyright (c) 2019 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0+ +// +// Author(s) : Simon Giraudot + +#ifndef CGAL_PSP_INTERNAL_NEIGHBOR_QUERY_H +#define CGAL_PSP_INTERNAL_NEIGHBOR_QUERY_H + +#include + +#include +#include +#include +#include + +#include + +namespace CGAL { +namespace Point_set_processing_3 { +namespace internal { + +struct Maximum_points_reached_exception : public std::exception { }; + +template +void neighbor_query (const Point& query, + const CGAL::Kd_tree& tree, + unsigned int k, + FT neighbor_radius, + PointContainer& points) +{ + typedef typename CGAL::Orthogonal_k_neighbor_search Neighbor_search; + typedef typename Neighbor_search::iterator Search_iterator; + typedef CGAL::Fuzzy_sphere Sphere; + + if (neighbor_radius != FT(0)) + { + Sphere fs (query, neighbor_radius, 0, tree.traits()); + + // if k=0, no limit on the number of neighbors returned + if (k == 0) + k = (std::numeric_limits::max)(); + + try + { + std::function back_insert_with_limit + = [&](const Point& point) -> void + { + points.push_back (point); + if (points.size() == k) + throw Maximum_points_reached_exception(); + }; + + auto function_output_iterator + = boost::make_function_output_iterator (back_insert_with_limit); + + tree.search (function_output_iterator, fs); + } + catch (const Maximum_points_reached_exception&) + { } + + // Fallback, if less than 3 points are return, search for the 3 + // first points + if (points.size() < 3) + k = 3; + // Else, no need to search for K nearest neighbors + else + k = 0; + } + + if (k != 0) + { + // Gather set of (k+1) neighboring points. + // Perform k+1 queries (as in point set, the query point is + // output first). Search may be aborted if k is greater + // than number of input points. + points.reserve(k+1); + Neighbor_search search(tree,query,k+1); + Search_iterator search_iterator = search.begin(); + unsigned int i; + for(i=0;i<(k+1);i++) + { + if(search_iterator == search.end()) + break; // premature ending + points.push_back(search_iterator->first); + search_iterator++; + } + CGAL_point_set_processing_precondition(points.size() >= 1); + } +} + +} } } // namespace CGAL::Point_set_processing_3::internal + +#endif // CGAL_PSP_INTERNAL_NEIGHBOR_QUERY_H diff --git a/Point_set_processing_3/include/CGAL/bilateral_smooth_point_set.h b/Point_set_processing_3/include/CGAL/bilateral_smooth_point_set.h index 5b12c20d770..f8900c62967 100644 --- a/Point_set_processing_3/include/CGAL/bilateral_smooth_point_set.h +++ b/Point_set_processing_3/include/CGAL/bilateral_smooth_point_set.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -185,58 +186,6 @@ compute_denoise_projection( return Pwn(update_point, update_normal); } -/// Computes neighbors from kdtree. -/// -/// \pre `k >= 2`. -/// -/// @tparam Kernel Geometric traits class. -/// @tparam Tree KD-tree. -/// -/// @return neighbors pwn of query point. -template < typename Kernel, - typename Tree> -std::vector, - CGAL_PSP3_DEFAULT_ALLOCATOR > > -compute_kdtree_neighbors( - const CGAL::Point_with_normal_3& query, ///< 3D point - const Tree& tree, ///< KD-tree - unsigned int k ///< number of neighbors -) -{ - // basic geometric types - typedef CGAL::Point_with_normal_3 Pwn; - - // types for K nearest neighbors search - typedef bilateral_smooth_point_set_internal::Kd_tree_traits Tree_traits; - typedef CGAL::Orthogonal_k_neighbor_search Neighbor_search; - typedef typename Neighbor_search::iterator Search_iterator; - - // performs k + 1 queries (if unique the query point is - // output first). search may be aborted when k is greater - // than number of input points - Neighbor_search search(tree, query, k+1); - Search_iterator search_iterator = search.begin(); - ++search_iterator; - unsigned int i; - std::vector - , CGAL_PSP3_DEFAULT_ALLOCATOR > - > neighbor_pwns; - - for(i = 0; i < (k+1); ++i) - { - if(search_iterator == search.end()) - break; // premature ending - - Pwn pwn = search_iterator->first; - neighbor_pwns.push_back(pwn); - ++search_iterator; - } - - // output - return neighbor_pwns; -} - - /// Computes max-spacing of one query point from K nearest neighbors. /// /// \pre `k >= 2`. @@ -302,6 +251,7 @@ class Compute_pwns_neighbors typedef typename Kernel::FT FT; unsigned int m_k; + FT m_neighbor_radius; const Tree & m_tree; const Pwns & m_pwns; Pwns_neighbors & m_pwns_neighbors; @@ -309,11 +259,12 @@ class Compute_pwns_neighbors cpp11::atomic& interrupted; public: - Compute_pwns_neighbors(unsigned int k, const Tree &tree, + Compute_pwns_neighbors(unsigned int k, FT neighbor_radius, const Tree &tree, const Pwns &pwns, Pwns_neighbors &neighbors, cpp11::atomic& advancement, cpp11::atomic& interrupted) - : m_k(k), m_tree(tree), m_pwns(pwns), m_pwns_neighbors(neighbors) + : m_k(k), m_neighbor_radius (neighbor_radius), m_tree(tree) + , m_pwns(pwns), m_pwns_neighbors(neighbors) , advancement (advancement), interrupted (interrupted) {} void operator() ( const tbb::blocked_range& r ) const @@ -322,9 +273,10 @@ public: { if (interrupted) break; + + CGAL::Point_set_processing_3::internal::neighbor_query + (m_pwns[i], m_tree, m_k, m_neighbor_radius, m_pwns_neighbors[i]); - m_pwns_neighbors[i] = bilateral_smooth_point_set_internal:: - compute_kdtree_neighbors(m_pwns[i], m_tree, m_k); ++ advancement; } } @@ -392,7 +344,7 @@ public: \ingroup PkgPointSetProcessing3Algorithms This function smooths an input point set by iteratively projecting each - point onto the implicit surface patch fitted over its k nearest neighbors. + point onto the implicit surface patch fitted over its nearest neighbors. Bilateral projection preserves sharp features according to the normal (gradient) information. Both point positions and normals will be modified. For more details, please see section 4 in \cgalCite{ear-2013}. @@ -422,6 +374,12 @@ public: If this parameter is omitted, `CGAL::Identity_property_map` is used.\cgalParamEnd \cgalParamBegin{normal_map} a model of `ReadWritePropertyMap` with value type `geom_traits::Vector_3`.\cgalParamEnd + \cgalParamBegin{neighbor_radius} spherical neighborhood radius. If + provided, the neighborhood of a query point is computed with a fixed spherical + radius instead of a fixed number of neighbors. In that case, the parameter + `k` is used as a limit on the number of points returned by each spherical + query (to avoid overly large number of points in high density areas). If no + limit is wanted, use `k=0`.\cgalParamEnd \cgalParamBegin{sharpness_angle} controls the sharpness of the result.\cgalParamEnd \cgalParamBegin{callback} an instance of `std::function`. It is called regularly when the @@ -477,7 +435,8 @@ bilateral_smooth_point_set( PointMap point_map = choose_param(get_param(np, internal_np::point_map), PointMap()); NormalMap normal_map = choose_param(get_param(np, internal_np::normal_map), NormalMap()); - + FT neighbor_radius = choose_param(get_param(np, internal_np::neighbor_radius), FT(0)); + // copy points and normals Pwns pwns; for(typename PointRange::iterator it = points.begin(); it != points.end(); ++it) @@ -546,7 +505,7 @@ bilateral_smooth_point_set( Point_set_processing_3::internal::Parallel_callback parallel_callback (callback, 2 * nb_points); - Compute_pwns_neighbors f(k, tree, pwns, pwns_neighbors, + Compute_pwns_neighbors f(k, neighbor_radius, tree, pwns, pwns_neighbors, parallel_callback.advancement(), parallel_callback.interrupted()); tbb::parallel_for(tbb::blocked_range(0, nb_points), f); @@ -570,8 +529,9 @@ bilateral_smooth_point_set( std::size_t nb = 0; for(pwn_iter = pwns.begin(); pwn_iter != pwns.end(); ++pwn_iter, ++pwns_iter, ++ nb) { - *pwns_iter = bilateral_smooth_point_set_internal:: - compute_kdtree_neighbors(*pwn_iter, tree, k); + CGAL::Point_set_processing_3::internal::neighbor_query + (*pwn_iter, tree, k, neighbor_radius, *pwns_iter); + if (callback && !callback ((nb+1) / double(2. * nb_points))) return std::numeric_limits::quiet_NaN(); } @@ -668,79 +628,6 @@ bilateral_smooth_point_set( return bilateral_smooth_point_set (points, k, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::bilateral_smooth_point_set(), please update your code") -double -bilateral_smooth_point_set( - ForwardIterator first, ///< forward iterator on the first input point. - ForwardIterator beyond, ///< past-the-end iterator. - PointMap point_map, ///< point property map. - NormalMap normal_map, ///< normal property map. - unsigned int k, ///< size of the neighborhood for the implicit surface patch fitting. - ///< The larger the value is, the smoother the result will be. - typename Kernel::FT sharpness_angle, ///< controls the sharpness of the result. - ///< The larger the value is, the smoother the result will be. - ///< The range of possible value is [0, 90]. - const Kernel& /*kernel*/) ///< geometric traits. -{ - CGAL::Iterator_range points = CGAL::make_range (first, beyond); - return bilateral_smooth_point_set - (points, - k, - CGAL::parameters::point_map(point_map).normal_map(normal_map) - .sharpness_angle(sharpness_angle).geom_traits(Kernel())); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::bilateral_smooth_point_set(), please update your code") -double -bilateral_smooth_point_set( - ForwardIterator first, ///< forward iterator to the first input point. - ForwardIterator beyond, ///< past-the-end iterator. - PointMap point_map, ///< property map OutputIterator -> Point_3. - NormalMap normal_map, ///< property map ForwardIterator -> Vector_3. - const unsigned int k, ///< number of neighbors. - double sharpness_angle ///< control sharpness(0-90) -) ///< property map OutputIterator -> Vector_3. -{ - CGAL::Iterator_range points = CGAL::make_range (first, beyond); - return bilateral_smooth_point_set - (points, - k, - CGAL::parameters::point_map(point_map).normal_map(normal_map).sharpness_angle(sharpness_angle)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::bilateral_smooth_point_set(), please update your code") -double -bilateral_smooth_point_set( - ForwardIterator first, ///< forward iterator to the first input point. - ForwardIterator beyond, ///< past-the-end iterator. - const unsigned int k, ///< number of neighbors. - double sharpness_angle, ///< control sharpness(0-90) - NormalMap normal_map) ///< property map OutputIterator -> Vector_3. -{ - CGAL::Iterator_range points = CGAL::make_range (first, beyond); - return bilateral_smooth_point_set - (points, - k, - CGAL::parameters::normal_map(normal_map).sharpness_angle(sharpness_angle)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond diff --git a/Point_set_processing_3/include/CGAL/compute_average_spacing.h b/Point_set_processing_3/include/CGAL/compute_average_spacing.h index 898531985ff..c89455efd23 100644 --- a/Point_set_processing_3/include/CGAL/compute_average_spacing.h +++ b/Point_set_processing_3/include/CGAL/compute_average_spacing.h @@ -291,65 +291,6 @@ compute_average_spacing( return compute_average_spacing (points, k, CGAL::Point_set_processing_3::parameters::all_default(points)); } - - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::compute_average_spacing(), please update your code") -typename Kernel::FT -compute_average_spacing( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3 - unsigned int k, ///< number of neighbors. - const Kernel& /*kernel*/) ///< geometric traits. -{ - return compute_average_spacing( - CGAL::make_range (first,beyond), - k, - CGAL::parameters::point_map (point_map).geom_traits (Kernel())); -} - - - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::compute_average_spacing(), please update your code") -typename Kernel_traits::value_type>::Kernel::FT -compute_average_spacing( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3 - unsigned int k) ///< number of neighbors -{ - return compute_average_spacing( - CGAL::make_range (first,beyond), - k, - CGAL::parameters::point_map (point_map)); -} - -// deprecated API -template < typename ConcurrencyTag, typename InputIterator > -typename Kernel_traits::value_type>::Kernel::FT -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::compute_average_spacing(), please update your code") -compute_average_spacing( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - unsigned int k) ///< number of neighbors. -{ - return compute_average_spacing( - CGAL::make_range (first,beyond), k); -} -#endif // CGAL_NO_DEPRECATED_CODE - /// \endcond diff --git a/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h b/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h index b66026ac2ea..c76178a201a 100644 --- a/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h +++ b/Point_set_processing_3/include/CGAL/edge_aware_upsample_point_set.h @@ -599,117 +599,6 @@ edge_aware_upsample_point_set( return edge_aware_upsample_point_set (points, output, CGAL::Point_set_processing_3::parameters::all_default(points)); } - - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::edge_aware_upsample_point_set(), please update your code") -OutputIterator -edge_aware_upsample_point_set( - ForwardIterator first, ///< forward iterator on the first input point. - ForwardIterator beyond, ///< past-the-end iterator. - OutputIterator output, ///< output iterator where output points and normals - ///< are put. - PointMap point_map, ///< point property map. - NormalMap normal_map, ///< vector property map. - const typename Kernel::FT sharpness_angle, ///< - ///< controls the preservation of sharp features. - ///< The larger the value is, - ///< the smoother the result will be. - ///< The range of possible values is `[0, 90]`. - ///< See section \ref Point_set_processing_3Upsample_Parameter2 - ///< for an example. - typename Kernel::FT edge_sensitivity, ///< - ///< larger values of edge-sensitivity give higher priority - ///< to inserting points along sharp features. - ///< The range of possible values is `[0, 1]`. - ///< See section \ref Point_set_processing_3Upsample_Parameter1 - ///< for an example. - typename Kernel::FT neighbor_radius, ///< - ///< indicates the radius of the largest hole that should be filled. - ///< The default value is set to 3 times the average spacing of the point set. - ///< If the value given by user is smaller than the average spacing, - ///< the function will use the default value instead. - const std::size_t number_of_output_points,///< number of output - ///< points to generate. - const Kernel& /*kernel*/ ///< geometric traits. -) -{ - return edge_aware_upsample_point_set - (CGAL::make_range (first, beyond), output, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - sharpness_angle (sharpness_angle). - edge_sensitivity (edge_sensitivity). - neighbor_radius (neighbor_radius). - number_of_output_points (number_of_output_points). - geom_traits (Kernel())); -} - - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::edge_aware_upsample_point_set(), please update your code") -OutputIterator -edge_aware_upsample_point_set( - ForwardIterator first, ///< forward iterator to the first input point. - ForwardIterator beyond, ///< past-the-end iterator. - OutputIterator output, ///< output iterator over points. - PointMap point_map, ///< property map: `ForwardIterator` -> Point_3. - NormalMap normal_map, ///< property map: `ForwardIterator` -> Vector_3. - double sharpness_angle, ///< control sharpness(0-90) - double edge_sensitivity, ///< edge sensitivity(0-5) - double neighbor_radius, ///< initial size of neighbors. - const std::size_t number_of_output_points///< number of iterations. - ) -{ - return edge_aware_upsample_point_set - (CGAL::make_range (first, beyond), output, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - sharpness_angle (sharpness_angle). - edge_sensitivity (edge_sensitivity). - neighbor_radius (neighbor_radius). - number_of_output_points (number_of_output_points)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::edge_aware_upsample_point_set(), please update your code") -OutputIterator -edge_aware_upsample_point_set( - ForwardIterator first, ///< iterator over the first input point - ForwardIterator beyond, ///< past-the-end iterator - OutputIterator output, ///< output iterator over points. - NormalMap normal_map, ///< property map: OutputIterator -> Vector_3. - double sharpness_angle = 30, ///< control sharpness(0-90) - double edge_sensitivity = 1, ///< edge sensitivity(0-5) - double neighbor_radius = -1, ///< initial size of neighbors. - const std::size_t number_of_output_points = 1000///< number of output points. - ) -{ - return edge_aware_upsample_point_set - (CGAL::make_range (first, beyond), output, - CGAL::parameters::normal_map (normal_map). - sharpness_angle (sharpness_angle). - edge_sensitivity (edge_sensitivity). - neighbor_radius (neighbor_radius). - number_of_output_points (number_of_output_points)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond } //namespace CGAL diff --git a/Point_set_processing_3/include/CGAL/estimate_scale.h b/Point_set_processing_3/include/CGAL/estimate_scale.h index 860bf5a183e..b85806f5c83 100644 --- a/Point_set_processing_3/include/CGAL/estimate_scale.h +++ b/Point_set_processing_3/include/CGAL/estimate_scale.h @@ -744,255 +744,6 @@ estimate_global_range_scale(const PointRange& points) return estimate_global_range_scale (points, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_local_k_neighbor_scales(), please update your code") -OutputIterator -estimate_local_k_neighbor_scales( - SamplesInputIterator first, ///< iterator over the first input sample. - SamplesInputIterator beyond, ///< past-the-end iterator over the input samples. - SamplesPointMap samples_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - QueriesInputIterator first_query, ///< iterator over the first point where scale must be estimated - QueriesInputIterator beyond_query, ///< past-the-end iterator over the points where scale must be estimated - QueriesPointMap queries_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - OutputIterator output, ///< output iterator to store the computed scales - const Kernel& /*kernel*/) ///< geometric traits. -{ - return estimate_local_k_neighbor_scales - (CGAL::make_range (first, beyond), - CGAL::make_range (first_query, beyond_query), - output, - CGAL::parameters::point_map (samples_map). - query_point_map (queries_map). - geom_traits (Kernel())); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_local_k_neighbor_scales(), please update your code") -OutputIterator -estimate_local_k_neighbor_scales( - SamplesInputIterator first, ///< iterator over the first input sample. - SamplesInputIterator beyond, ///< past-the-end iterator over the input samples. - SamplesPointMap samples_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - QueriesInputIterator first_query, ///< iterator over the first point where scale must be estimated - QueriesInputIterator beyond_query, ///< past-the-end iterator over the points where scale must be estimated - QueriesPointMap queries_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - OutputIterator output) ///< output iterator to store the computed scales -{ - return estimate_local_k_neighbor_scales - (CGAL::make_range (first, beyond), - CGAL::make_range (first_query, beyond_query), - output, - CGAL::parameters::point_map (samples_map). - query_point_map (queries_map)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_local_k_neighbor_scales(), please update your code") -OutputIterator -estimate_local_k_neighbor_scales( - SamplesInputIterator first, ///< iterator over the first input sample. - SamplesInputIterator beyond, ///< past-the-end iterator over the input samples. - QueriesInputIterator first_query, ///< iterator over the first point where scale must be estimated - QueriesInputIterator beyond_query, ///< past-the-end iterator over the points where scale must be estimated - OutputIterator output) ///< output iterator to store the computed scales -{ - return estimate_local_k_neighbor_scales - (CGAL::make_range (first, beyond), - CGAL::make_range (first_query, beyond_query), - output); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_global_k_neighbor_scale(), please update your code") -std::size_t -estimate_global_k_neighbor_scale( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - const Kernel& kernel) ///< geometric traits. -{ - return estimate_global_k_neighbor_scale - (CGAL::make_range (first, beyond), - CGAL::parameters::point_map (point_map). - geom_traits (kernel)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_global_k_neighbor_scale(), please update your code") -std::size_t -estimate_global_k_neighbor_scale( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map) ///< property map: value_type of InputIterator -> Point_3 or Point_2 -{ - return estimate_global_k_neighbor_scale - (CGAL::make_range (first, beyond), - CGAL::parameters::point_map (point_map)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_global_k_neighbor_scale(), please update your code") -std::size_t -estimate_global_k_neighbor_scale( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond) ///< past-the-end iterator over the input points. -{ - return estimate_global_k_neighbor_scale - (CGAL::make_range (first, beyond)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_local_range_scales(), please update your code") -OutputIterator -estimate_local_range_scales( - SamplesInputIterator first, ///< iterator over the first input sample. - SamplesInputIterator beyond, ///< past-the-end iterator over the input samples. - SamplesPointMap samples_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - QueriesInputIterator first_query, ///< iterator over the first point where scale must be estimated - QueriesInputIterator beyond_query, ///< past-the-end iterator over the points where scale must be estimated - QueriesPointMap queries_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - OutputIterator output, ///< output iterator to store the computed scales - const Kernel& /*kernel*/) ///< geometric traits. -{ - return estimate_local_range_scales - (CGAL::make_range (first, beyond), - CGAL::make_range (first_query, beyond_query), - output, - CGAL::parameters::point_map (samples_map). - query_point_map (queries_map). - geom_traits (Kernel())); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_local_range_scales(), please update your code") -OutputIterator -estimate_local_range_scales( - SamplesInputIterator first, ///< iterator over the first input sample. - SamplesInputIterator beyond, ///< past-the-end iterator over the input samples. - SamplesPointMap samples_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - QueriesInputIterator first_query, ///< iterator over the first point where scale must be estimated - QueriesInputIterator beyond_query, ///< past-the-end iterator over the points where scale must be estimated - QueriesPointMap queries_map, ///< property map: value_type of InputIterator -> Point_3 or Point_2 - OutputIterator output) ///< output iterator to store the computed scales -{ - return estimate_local_range_scales - (CGAL::make_range (first, beyond), - CGAL::make_range (first_query, beyond_query), - output, - CGAL::parameters::point_map (samples_map). - query_point_map (queries_map)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_local_range_scales(), please update your code") -OutputIterator -estimate_local_range_scales( - SamplesInputIterator first, ///< iterator over the first input sample. - SamplesInputIterator beyond, ///< past-the-end iterator over the input samples. - QueriesInputIterator first_query, ///< iterator over the first point where scale must be estimated - QueriesInputIterator beyond_query, ///< past-the-end iterator over the points where scale must be estimated - OutputIterator output) ///< output iterator to store the computed scales -{ - return estimate_local_range_scales - (CGAL::make_range (first, beyond), - CGAL::make_range (first_query, beyond_query), - output); -} - - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_global_range_scale(), please update your code") -double -estimate_global_range_scale( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3 or Point_3 - const Kernel& kernel) ///< geometric traits. -{ - return estimate_global_range_scale - (CGAL::make_range (first, beyond), - CGAL::parameters::point_map (point_map). - geom_traits (kernel)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_global_range_scale(), please update your code") -double -estimate_global_range_scale( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map) ///< property map: value_type of InputIterator -> Point_3 or Point_3 -{ - return estimate_global_range_scale - (CGAL::make_range (first, beyond), - CGAL::parameters::point_map (point_map)); -} - - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::estimate_global_range_scale(), please update your code") -double -estimate_global_range_scale( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond) ///< past-the-end iterator over the input points. -{ - return estimate_global_range_scale - (CGAL::make_range (first, beyond)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond } //namespace CGAL diff --git a/Point_set_processing_3/include/CGAL/grid_simplify_point_set.h b/Point_set_processing_3/include/CGAL/grid_simplify_point_set.h index 55144d5c0bb..a3a38098913 100644 --- a/Point_set_processing_3/include/CGAL/grid_simplify_point_set.h +++ b/Point_set_processing_3/include/CGAL/grid_simplify_point_set.h @@ -252,65 +252,6 @@ grid_simplify_point_set(PointRange& points, double epsilon) return grid_simplify_point_set (points, epsilon, CGAL::Point_set_processing_3::parameters::all_default(points)); } - - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::grid_simplify_point_set(), please update your code") -ForwardIterator grid_simplify_point_set( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3 - double epsilon, ///< tolerance value when merging 3D points. - const Kernel& /*kernel*/) ///< geometric traits. -{ - CGAL::Iterator_range points = CGAL::make_range (first, beyond); - return grid_simplify_point_set - (points, - epsilon, - CGAL::parameters::point_map (point_map). - geom_traits (Kernel())); -} - - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::grid_simplify_point_set(), please update your code") -ForwardIterator -grid_simplify_point_set( - ForwardIterator first, ///< iterator over the first input point - ForwardIterator beyond, ///< past-the-end iterator - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3 - double epsilon) ///< tolerance value when merging 3D points -{ - CGAL::Iterator_range points = CGAL::make_range (first, beyond); - return grid_simplify_point_set - (points, - epsilon, - CGAL::parameters::point_map (point_map)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::grid_simplify_point_set(), please update your code") -ForwardIterator -grid_simplify_point_set( - ForwardIterator first, ///< iterator over the first input point - ForwardIterator beyond, ///< past-the-end iterator - double epsilon) ///< tolerance value when merging 3D points -{ - CGAL::Iterator_range points = CGAL::make_range (first, beyond); - return grid_simplify_point_set - (points, - epsilon); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond diff --git a/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h b/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h index ed1c6502b4d..a2390db0eed 100644 --- a/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h +++ b/Point_set_processing_3/include/CGAL/hierarchy_simplify_point_set.h @@ -361,86 +361,6 @@ namespace CGAL { return hierarchy_simplify_point_set (points, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE - // deprecated API - template - CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::hierarchy_simplify_point_set(), please update your code") - ForwardIterator hierarchy_simplify_point_set (ForwardIterator begin, - ForwardIterator end, - PointMap point_map, - const unsigned int size, - const double var_max, - const DiagonalizeTraits&, - const Kernel&) - { - CGAL::Iterator_range points (begin, end); - return hierarchy_simplify_point_set - (points, - CGAL::parameters::point_map (point_map). - size (size). - maximum_variation (var_max). - diagonalize_traits (DiagonalizeTraits()). - geom_traits(Kernel())); - } - - // deprecated API - template - CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::hierarchy_simplify_point_set(), please update your code") - ForwardIterator hierarchy_simplify_point_set (ForwardIterator begin, - ForwardIterator end, - PointMap point_map, - const unsigned int size, - const double var_max, - const DiagonalizeTraits& diagonalize_traits) - { - CGAL::Iterator_range points (begin, end); - return hierarchy_simplify_point_set - (points, - CGAL::parameters::point_map (point_map). - size (size). - maximum_variation (var_max). - diagonalize_traits (diagonalize_traits)); - } - - // deprecated API - template - CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::hierarchy_simplify_point_set(), please update your code") - ForwardIterator hierarchy_simplify_point_set (ForwardIterator begin, - ForwardIterator end, - PointMap point_map, - const unsigned int size, - const double var_max) - { - CGAL::Iterator_range points (begin, end); - return hierarchy_simplify_point_set - (points, - CGAL::parameters::point_map (point_map). - size (size). - maximum_variation (var_max)); - } - - // deprecated API - template - CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::hierarchy_simplify_point_set(), please update your code") - ForwardIterator hierarchy_simplify_point_set (ForwardIterator begin, - ForwardIterator end, - const unsigned int size = 10, - const double var_max = 0.333) - { - CGAL::Iterator_range points (begin, end); - return hierarchy_simplify_point_set - (points, - CGAL::parameters::size (size). - maximum_variation (var_max)); - } -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond } // namespace CGAL diff --git a/Point_set_processing_3/include/CGAL/jet_estimate_normals.h b/Point_set_processing_3/include/CGAL/jet_estimate_normals.h index 9d627e9c8c1..e1796be667a 100644 --- a/Point_set_processing_3/include/CGAL/jet_estimate_normals.h +++ b/Point_set_processing_3/include/CGAL/jet_estimate_normals.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -74,39 +75,22 @@ typename Kernel::Vector_3 jet_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute the normal at Tree& tree, ///< KD-tree unsigned int k, ///< number of neighbors + typename Kernel::FT neighbor_radius, unsigned int degree_fitting) { // basic geometric types typedef typename Kernel::Point_3 Point; - // types for K nearest neighbors search - typedef typename CGAL::Search_traits_3 Tree_traits; - typedef typename CGAL::Orthogonal_k_neighbor_search Neighbor_search; - typedef typename Neighbor_search::iterator Search_iterator; - // types for jet fitting typedef Monge_via_jet_fitting< Kernel, Simple_cartesian, SvdTraits> Monge_jet_fitting; typedef typename Monge_jet_fitting::Monge_form Monge_form; - // Gather set of (k+1) neighboring points. - // Perform k+1 queries (as in point set, the query point is - // output first). Search may be aborted if k is greater - // than number of input points. - std::vector points; points.reserve(k+1); - Neighbor_search search(tree,query,k+1); - Search_iterator search_iterator = search.begin(); - unsigned int i; - for(i=0;i<(k+1);i++) - { - if(search_iterator == search.end()) - break; // premature ending - points.push_back(search_iterator->first); - search_iterator++; - } - CGAL_point_set_processing_precondition(points.size() >= 1); - + std::vector points; + CGAL::Point_set_processing_3::internal::neighbor_query + (query, tree, k, neighbor_radius, points); + // performs jet fitting Monge_jet_fitting monge_fit; const unsigned int degree_monge = 1; // we seek for normal and not more. @@ -120,10 +104,12 @@ jet_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute #ifdef CGAL_LINKED_WITH_TBB template class Jet_estimate_normals { + typedef typename Kernel::FT FT; typedef typename Kernel::Point_3 Point; typedef typename Kernel::Vector_3 Vector; const Tree& tree; const unsigned int k; + const FT neighbor_radius; const unsigned int degree_fitting; const std::vector& input; std::vector& output; @@ -131,11 +117,13 @@ jet_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute cpp11::atomic& interrupted; public: - Jet_estimate_normals(Tree& tree, unsigned int k, std::vector& points, + Jet_estimate_normals(Tree& tree, unsigned int k, FT neighbor_radius, + std::vector& points, unsigned int degree_fitting, std::vector& output, cpp11::atomic& advancement, cpp11::atomic& interrupted) - : tree(tree), k (k), degree_fitting (degree_fitting), input (points), output (output) + : tree(tree), k (k), neighbor_radius (neighbor_radius) + , degree_fitting (degree_fitting), input (points), output (output) , advancement (advancement) , interrupted (interrupted) { } @@ -146,7 +134,7 @@ jet_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute { if (interrupted) break; - output[i] = CGAL::internal::jet_estimate_normal(input[i], tree, k, degree_fitting); + output[i] = CGAL::internal::jet_estimate_normal(input[i], tree, k, neighbor_radius, degree_fitting); ++ advancement; } } @@ -168,7 +156,7 @@ jet_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute /** \ingroup PkgPointSetProcessing3Algorithms Estimates normal directions of the range of `points` - using jet fitting on the k nearest neighbors. + using jet fitting on the nearest neighbors. The output normals are randomly oriented. \pre `k >= 2` @@ -188,6 +176,12 @@ jet_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute If this parameter is omitted, `CGAL::Identity_property_map` is used.\cgalParamEnd \cgalParamBegin{normal_map} a model of `ReadWritePropertyMap` with value type `geom_traits::Vector_3`.\cgalParamEnd + \cgalParamBegin{neighbor_radius} spherical neighborhood radius. If + provided, the neighborhood of a query point is computed with a fixed spherical + radius instead of a fixed number of neighbors. In that case, the parameter + `k` is used as a limit on the number of points returned by each spherical + query (to avoid overly large number of points in high density areas). If no + limit is wanted, use `k=0`.\cgalParamEnd \cgalParamBegin{degree_fitting} degree of jet fitting.\cgalParamEnd \cgalParamBegin{svd_traits} template parameter for the class `Monge_via_jet_fitting`. If \ref thirdpartyEigen "Eigen" 3.2 (or greater) is available and `CGAL_EIGEN3_ENABLED` is defined, @@ -220,6 +214,7 @@ jet_estimate_normals( typedef typename Point_set_processing_3::GetPointMap::type PointMap; typedef typename Point_set_processing_3::GetNormalMap::type NormalMap; typedef typename Point_set_processing_3::GetK::Kernel Kernel; + typedef typename Kernel::FT FT; typedef typename GetSvdTraits::type SvdTraits; CGAL_static_assertion_msg(!(boost::is_same& callback = choose_param(get_param(np, internal_np::callback), std::function()); @@ -251,7 +248,7 @@ jet_estimate_normals( CGAL_point_set_processing_precondition(points.begin() != points.end()); // precondition: at least 2 nearest neighbors - CGAL_point_set_processing_precondition(k >= 2); + CGAL_point_set_processing_precondition(k >= 2 || neighbor_radius > FT(0)); std::size_t memory = CGAL::Memory_sizer().virtual_size(); CGAL_TRACE(" %ld Mb allocated\n", memory>>20); CGAL_TRACE(" Creates KD-tree\n"); @@ -282,7 +279,8 @@ jet_estimate_normals( std::vector normals (kd_tree_points.size (), CGAL::NULL_VECTOR); CGAL::internal::Jet_estimate_normals - f (tree, k, kd_tree_points, degree_fitting, normals, + f (tree, k, neighbor_radius, + kd_tree_points, degree_fitting, normals, parallel_callback.advancement(), parallel_callback.interrupted()); tbb::parallel_for(tbb::blocked_range(0, kd_tree_points.size ()), f); @@ -301,7 +299,7 @@ jet_estimate_normals( { Vector normal = internal::jet_estimate_normal( get(point_map,*it), - tree, k, degree_fitting); + tree, k, neighbor_radius, degree_fitting); put(normal_map, *it, normal); // normal_map[it] = normal if (callback && !callback ((nb+1) / double(kd_tree_points.size()))) @@ -327,121 +325,6 @@ jet_estimate_normals( jet_estimate_normals (points, k, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_estimate_normals(), please update your code") -void -jet_estimate_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k, ///< number of neighbors. - const Kernel& /*kernel*/, ///< geometric traits. - unsigned int degree_fitting = 2) ///< fitting degree -{ - CGAL::Iterator_range points (first, beyond); - return jet_estimate_normals - (points, - k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - degree_fitting (degree_fitting). - geom_traits(Kernel())); -} - -#if defined(CGAL_EIGEN3_ENABLED) || defined(CGAL_LAPACK_ENABLED) -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_estimate_normals(), please update your code") -void -jet_estimate_normals( - ForwardIterator first, - ForwardIterator beyond, - PointMap point_map, - NormalMap normal_map, - unsigned int k, - const Kernel& kernel, - unsigned int degree_fitting = 2) -{ - #ifdef CGAL_EIGEN3_ENABLED - typedef Eigen_svd SvdTraits; - #else - typedef Lapack_svd SvdTraits; - #endif - - CGAL::Iterator_range points (first, beyond); - return jet_estimate_normals - (points, - k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - degree_fitting (degree_fitting). - svd_traits (SvdTraits()). - geom_traits(kernel)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_estimate_normals(), please update your code") -void -jet_estimate_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k, ///< number of neighbors. - unsigned int degree_fitting = 2) -{ - CGAL::Iterator_range points (first, beyond); - return jet_estimate_normals - (points, - k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - degree_fitting (degree_fitting)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_estimate_normals(), please update your code") -void -jet_estimate_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k, ///< number of neighbors. - unsigned int degree_fitting = 2) -{ - CGAL::Iterator_range points (first, beyond); - return jet_estimate_normals - (points, - k, - CGAL::parameters::normal_map (normal_map). - degree_fitting (degree_fitting)); -} -#endif // CGAL Eigen / Lapack -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond } //namespace CGAL diff --git a/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h b/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h index 498097cdb3b..b8918df0eb0 100644 --- a/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h +++ b/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -74,39 +75,22 @@ jet_smooth_point( const typename Kernel::Point_3& query, ///< 3D point to project Tree& tree, ///< KD-tree const unsigned int k, ///< number of neighbors. + typename Kernel::FT neighbor_radius, const unsigned int degree_fitting, const unsigned int degree_monge) { // basic geometric types typedef typename Kernel::Point_3 Point; - // types for K nearest neighbors search - typedef typename CGAL::Search_traits_3 Tree_traits; - typedef typename CGAL::Orthogonal_k_neighbor_search Neighbor_search; - typedef typename Neighbor_search::iterator Search_iterator; - // types for jet fitting typedef Monge_via_jet_fitting< Kernel, Simple_cartesian, SvdTraits> Monge_jet_fitting; typedef typename Monge_jet_fitting::Monge_form Monge_form; - - // Gather set of (k+1) neighboring points. - // Performs k + 1 queries (if unique the query point is - // output first). Search may be aborted if k is greater - // than number of input points. - std::vector points; points.reserve(k+1); - Neighbor_search search(tree,query,k+1); - Search_iterator search_iterator = search.begin(); - unsigned int i; - for(i=0;i<(k+1);i++) - { - if(search_iterator == search.end()) - break; // premature ending - points.push_back(search_iterator->first); - search_iterator++; - } - CGAL_point_set_processing_precondition(points.size() >= 1); + + std::vector points; + CGAL::Point_set_processing_3::internal::neighbor_query + (query, tree, k, neighbor_radius, points); // performs jet fitting Monge_jet_fitting monge_fit; @@ -123,6 +107,7 @@ jet_smooth_point( typedef typename Kernel::Point_3 Point; const Tree& tree; const unsigned int k; + const typename Kernel::FT neighbor_radius; unsigned int degree_fitting; unsigned int degree_monge; const std::vector& input; @@ -131,12 +116,14 @@ jet_smooth_point( cpp11::atomic& interrupted; public: - Jet_smooth_pwns (Tree& tree, unsigned int k, std::vector& points, - unsigned int degree_fitting, unsigned int degree_monge, std::vector& output, + Jet_smooth_pwns (Tree& tree, unsigned int k, typename Kernel::FT neighbor_radius, + std::vector& points, + unsigned int degree_fitting, unsigned int degree_monge, std::vector& output, cpp11::atomic& advancement, cpp11::atomic& interrupted) - : tree(tree), k (k), degree_fitting (degree_fitting), - degree_monge (degree_monge), input (points), output (output) + : tree(tree), k (k), neighbor_radius(neighbor_radius) + , degree_fitting (degree_fitting) + , degree_monge (degree_monge), input (points), output (output) , advancement (advancement) , interrupted (interrupted) { } @@ -148,6 +135,7 @@ jet_smooth_point( if (interrupted) break; output[i] = CGAL::internal::jet_smooth_point(input[i], tree, k, + neighbor_radius, degree_fitting, degree_monge); ++ advancement; @@ -170,7 +158,7 @@ jet_smooth_point( /** \ingroup PkgPointSetProcessing3Algorithms - Smoothes the range of `points` using jet fitting on the k + Smoothes the range of `points` using jet fitting on the nearest neighbors and reprojection onto the jet. As this method relocates the points, it should not be called on containers sorted w.r.t. point locations. @@ -190,6 +178,12 @@ jet_smooth_point( \cgalNamedParamsBegin \cgalParamBegin{point_map} a model of `ReadablePropertyMap` with value type `geom_traits::Point_3`. If this parameter is omitted, `CGAL::Identity_property_map` is used.\cgalParamEnd + \cgalParamBegin{neighbor_radius} spherical neighborhood radius. If + provided, the neighborhood of a query point is computed with a fixed spherical + radius instead of a fixed number of neighbors. In that case, the parameter + `k` is used as a limit on the number of points returned by each spherical + query (to avoid overly large number of points in high density areas). If no + limit is wanted, use `k=0`.\cgalParamEnd \cgalParamBegin{degree_fitting} degree of jet fitting.\cgalParamEnd \cgalParamBegin{degree_monge} Monge degree.\cgalParamEnd \cgalParamBegin{svd_traits} template parameter for the class `Monge_via_jet_fitting`. If @@ -228,6 +222,8 @@ jet_smooth_point_set( "Error: no SVD traits"); PointMap point_map = choose_param(get_param(np, internal_np::point_map), PointMap()); + typename Kernel::FT neighbor_radius = choose_param(get_param(np, internal_np::neighbor_radius), + typename Kernel::FT(0)); unsigned int degree_fitting = choose_param(get_param(np, internal_np::degree_fitting), 2); unsigned int degree_monge = choose_param(get_param(np, internal_np::degree_monge), 2); const std::function& callback = choose_param(get_param(np, internal_np::callback), @@ -271,8 +267,8 @@ jet_smooth_point_set( std::vector mutated_points (kd_tree_points.size (), CGAL::ORIGIN); CGAL::internal::Jet_smooth_pwns - f (tree, k, kd_tree_points, degree_fitting, degree_monge, - mutated_points, + f (tree, k, neighbor_radius, kd_tree_points, degree_fitting, degree_monge, + mutated_points, parallel_callback.advancement(), parallel_callback.interrupted()); tbb::parallel_for(tbb::blocked_range(0, kd_tree_points.size ()), f); @@ -293,7 +289,7 @@ jet_smooth_point_set( const typename boost::property_traits::reference p = get(point_map, *it); put(point_map, *it , internal::jet_smooth_point( - p,tree,k,degree_fitting,degree_monge) ); + p,tree,k,neighbor_radius,degree_fitting,degree_monge) ); if (callback && !callback ((nb+1) / double(kd_tree_points.size()))) break; } @@ -313,117 +309,6 @@ jet_smooth_point_set( jet_smooth_point_set (points, k, CGAL::Point_set_processing_3::parameters::all_default(points)); } - - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_smooth_point_set(), please update your code") -void -jet_smooth_point_set( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3. - unsigned int k, ///< number of neighbors. - const Kernel& /*kernel*/, ///< geometric traits. - unsigned int degree_fitting = 2, ///< fitting degree - unsigned int degree_monge = 2) ///< Monge degree -{ - CGAL::Iterator_range points (first, beyond); - return jet_smooth_point_set - (points, - k, - CGAL::parameters::point_map (point_map). - degree_fitting (degree_fitting). - degree_monge (degree_monge). - geom_traits(Kernel())); -} - -#if defined(CGAL_EIGEN3_ENABLED) || defined(CGAL_LAPACK_ENABLED) -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_smooth_point_set(), please update your code") -void -jet_smooth_point_set( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3. - unsigned int k, ///< number of neighbors. - const Kernel& kernel, ///< geometric traits. - unsigned int degree_fitting = 2, ///< fitting degree - unsigned int degree_monge = 2) ///< Monge degree -{ - #ifdef CGAL_EIGEN3_ENABLED - typedef Eigen_svd SvdTraits; - #else - typedef Lapack_svd SvdTraits; - #endif - CGAL::Iterator_range points (first, beyond); - return jet_smooth_point_set - (points, - k, - CGAL::parameters::point_map (point_map). - degree_fitting (degree_fitting). - degree_monge (degree_monge). - svd_traits (SvdTraits()). - geom_traits(kernel)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_smooth_point_set(), please update your code") -void -jet_smooth_point_set( - InputIterator first, ///< iterator over the first input point - InputIterator beyond, ///< past-the-end iterator - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3 - unsigned int k, ///< number of neighbors. - const unsigned int degree_fitting = 2, - const unsigned int degree_monge = 2) -{ - CGAL::Iterator_range points (first, beyond); - return jet_smooth_point_set - (points, - k, - CGAL::parameters::point_map (point_map). - degree_fitting (degree_fitting). - degree_monge (degree_monge)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::jet_smooth_point_set(), please update your code") -void -jet_smooth_point_set( - InputIterator first, ///< iterator over the first input point - InputIterator beyond, ///< past-the-end iterator - unsigned int k, ///< number of neighbors. - const unsigned int degree_fitting = 2, - const unsigned int degree_monge = 2) -{ - CGAL::Iterator_range points (first, beyond); - return jet_smooth_point_set - (points, - k, - CGAL::parameters::degree_fitting (degree_fitting). - degree_monge (degree_monge)); -} -#endif // CGAL Eigen / Lapack -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond diff --git a/Point_set_processing_3/include/CGAL/mst_orient_normals.h b/Point_set_processing_3/include/CGAL/mst_orient_normals.h index 8cc551a31bc..2db5da5d3d8 100644 --- a/Point_set_processing_3/include/CGAL/mst_orient_normals.h +++ b/Point_set_processing_3/include/CGAL/mst_orient_normals.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -319,6 +320,7 @@ create_riemannian_graph( IndexMap index_map, ///< property map ForwardIterator -> index ConstrainedMap constrained_map, ///< property map ForwardIterator -> bool unsigned int k, ///< number of neighbors + typename Kernel::FT neighbor_radius, const Kernel& /*kernel*/) ///< geometric traits. { // Input points types @@ -331,7 +333,6 @@ create_riemannian_graph( typedef Euclidean_distance_vertex_handle_3 KDistance; typedef Orthogonal_k_neighbor_search Neighbor_search; typedef typename Neighbor_search::Tree Tree; - typedef typename Neighbor_search::iterator Search_iterator; // Riemannian_graph types typedef internal::Riemannian_graph Riemannian_graph; @@ -395,21 +396,15 @@ create_riemannian_graph( std::size_t it_index = get(index_map,it); Vector_ref it_normal_vector = get(normal_map,*it); - // Gather set of (k+1) neighboring points. - // Perform k+1 queries (as in point set, the query point is - // output first). Search may be aborted if k is greater - // than number of input points. - Point_ref point = get(point_map, *it); Point_vertex_handle_3 point_wrapper(point.x(), point.y(), point.z(), it); - Neighbor_search search(*tree, point_wrapper, k+1); - Search_iterator search_iterator = search.begin(); - for(std::size_t i=0;i<(k+1);i++) - { - if(search_iterator == search.end()) - break; // premature ending + std::vector neighbor_points; + CGAL::Point_set_processing_3::internal::neighbor_query + (point_wrapper, *tree, k, neighbor_radius, neighbor_points); - ForwardIterator neighbor = search_iterator->first; + for (std::size_t i = 0; i < neighbor_points.size(); ++ i) + { + ForwardIterator neighbor = neighbor_points[i]; std::size_t neighbor_index = get(index_map,neighbor); if (neighbor_index > it_index) // undirected graph { @@ -431,8 +426,6 @@ create_riemannian_graph( weight = 0; // safety check riemannian_graph_weight_map[e] = (float)weight; } - - search_iterator++; } // Check if point is source @@ -595,6 +588,12 @@ create_mst_graph( If this parameter is omitted, `CGAL::Identity_property_map` is used.\cgalParamEnd \cgalParamBegin{normal_map} a model of `ReadWritePropertyMap` with value type `geom_traits::Vector_3`.\cgalParamEnd + \cgalParamBegin{neighbor_radius} spherical neighborhood radius. If + provided, the neighborhood of a query point is computed with a fixed spherical + radius instead of a fixed number of neighbors. In that case, the parameter + `k` is used as a limit on the number of points returned by each spherical + query (to avoid overly large number of points in high density areas). If no + limit is wanted, use `k=0`.\cgalParamEnd \cgalParamBegin{point_is_constrained_map} a model of `ReadablePropertyMap` with value type `bool`. Points with a `true` value will be used as seed points: their normal will be considered as already oriented, it won't be altered and it will be propagated to its neighbors. If this parameter is omitted, @@ -628,6 +627,8 @@ mst_orient_normals( PointMap point_map = choose_param(get_param(np, internal_np::point_map), PointMap()); NormalMap normal_map = choose_param(get_param(np, internal_np::normal_map), NormalMap()); + typename Kernel::FT neighbor_radius = choose_param(get_param(np, internal_np::neighbor_radius), + typename Kernel::FT(0)); ConstrainedMap constrained_map = choose_param(get_param(np, internal_np::point_is_constrained), ConstrainedMap()); Kernel kernel; @@ -677,12 +678,14 @@ mst_orient_normals( point_map, normal_map, kernel)), k, + neighbor_radius, kernel); else riemannian_graph = create_riemannian_graph(points.begin(), points.end(), point_map, normal_map, index_map, constrained_map, k, + neighbor_radius, kernel); // Creates a Minimum Spanning Tree starting at source_point @@ -742,74 +745,6 @@ mst_orient_normals( { return mst_orient_normals (points, k, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::mst_orient_normals(), please update your code") -ForwardIterator -mst_orient_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k, ///< number of neighbors - const Kernel& kernel) ///< geometric traits. -{ - CGAL::Iterator_range points (first, beyond); - return mst_orient_normals - (points, - k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - geom_traits(kernel)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::mst_orient_normals(), please update your code") -ForwardIterator -mst_orient_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k) ///< number of neighbors -{ - CGAL::Iterator_range points (first, beyond); - return mst_orient_normals - (points, - k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::mst_orient_normals(), please update your code") -ForwardIterator -mst_orient_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k) ///< number of neighbors -{ - CGAL::Iterator_range points (first, beyond); - return mst_orient_normals - (points, - k, - CGAL::parameters::normal_map (normal_map)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond diff --git a/Point_set_processing_3/include/CGAL/pca_estimate_normals.h b/Point_set_processing_3/include/CGAL/pca_estimate_normals.h index 2cdabd3e57d..54f110c236d 100644 --- a/Point_set_processing_3/include/CGAL/pca_estimate_normals.h +++ b/Point_set_processing_3/include/CGAL/pca_estimate_normals.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -57,7 +58,6 @@ namespace CGAL { /// \cond SKIP_IN_MANUAL namespace internal { - /// Estimates normal direction using linear least /// squares fitting of a plane on the K nearest neighbors. /// @@ -73,34 +73,17 @@ template < typename Kernel, typename Kernel::Vector_3 pca_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute the normal at const Tree& tree, ///< KD-tree - unsigned int k) ///< number of neighbors + unsigned int k, ///< number of neighbors + typename Kernel::FT neighbor_radius) { // basic geometric types typedef typename Kernel::Point_3 Point; typedef typename Kernel::Plane_3 Plane; - // types for K nearest neighbors search - typedef typename CGAL::Search_traits_3 Tree_traits; - typedef typename CGAL::Orthogonal_k_neighbor_search Neighbor_search; - typedef typename Neighbor_search::iterator Search_iterator; - - // Gather set of (k+1) neighboring points. - // Perform k+1 queries (as in point set, the query point is - // output first). Search may be aborted if k is greater - // than number of input points. - std::vector points; points.reserve(k+1); - Neighbor_search search(tree,query,k+1); - Search_iterator search_iterator = search.begin(); - unsigned int i; - for(i=0;i<(k+1);i++) - { - if(search_iterator == search.end()) - break; // premature ending - points.push_back(search_iterator->first); - search_iterator++; - } - CGAL_point_set_processing_precondition(points.size() >= 1); - + std::vector points; + CGAL::Point_set_processing_3::internal::neighbor_query + (query, tree, k, neighbor_radius, points); + // performs plane fitting by point-based PCA Plane plane; linear_least_squares_fitting_3(points.begin(),points.end(),plane,Dimension_tag<0>()); @@ -113,21 +96,25 @@ pca_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute #ifdef CGAL_LINKED_WITH_TBB template class PCA_estimate_normals { + typedef typename Kernel::FT FT; typedef typename Kernel::Point_3 Point; typedef typename Kernel::Vector_3 Vector; const Tree& tree; const unsigned int k; + const FT neighbor_radius; const std::vector& input; std::vector& output; cpp11::atomic& advancement; cpp11::atomic& interrupted; public: - PCA_estimate_normals(Tree& tree, unsigned int k, std::vector& points, - std::vector& output, + PCA_estimate_normals(Tree& tree, unsigned int k, FT neighbor_radius, + std::vector& points, + std::vector& output, cpp11::atomic& advancement, cpp11::atomic& interrupted) - : tree(tree), k (k), input (points), output (output) + : tree(tree), k (k), neighbor_radius (neighbor_radius) + , input (points), output (output) , advancement (advancement) , interrupted (interrupted) { } @@ -138,7 +125,7 @@ pca_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute { if (interrupted) break; - output[i] = CGAL::internal::pca_estimate_normal(input[i], tree, k); + output[i] = CGAL::internal::pca_estimate_normal(input[i], tree, k, neighbor_radius); ++ advancement; } } @@ -159,7 +146,7 @@ pca_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute /** \ingroup PkgPointSetProcessing3Algorithms Estimates normal directions of the range of `points` - by linear least squares fitting of a plane over the k nearest neighbors. + by linear least squares fitting of a plane over the nearest neighbors. The output normals are randomly oriented. \pre `k >= 2` @@ -174,20 +161,29 @@ pca_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute \param k number of neighbors \param np optional sequence of \ref psp_namedparameters "Named Parameters" among the ones listed below. - \cgalNamedParamsBegin - \cgalParamBegin{point_map} a model of `ReadablePropertyMap` with value type `geom_traits::Point_3`. - If this parameter is omitted, `CGAL::Identity_property_map` is used.\cgalParamEnd - \cgalParamBegin{normal_map} a model of `WritablePropertyMap` with value type + \cgalNamedParamsBegin \cgalParamBegin{point_map} a model of + `ReadablePropertyMap` with value type `geom_traits::Point_3`. If + this parameter is omitted, + `CGAL::Identity_property_map` is + used.\cgalParamEnd \cgalParamBegin{normal_map} a model of + `WritablePropertyMap` with value type `geom_traits::Vector_3`.\cgalParamEnd + \cgalParamBegin{neighbor_radius} spherical neighborhood + radius. If provided, the neighborhood of a query point is + computed with a fixed spherical radius instead of a fixed number + of neighbors. In that case, the parameter `k` is used as a limit + on the number of points returned by each spherical query (to + avoid overly large number of points in high density areas). If no + limit is wanted, use `k=0`.\cgalParamEnd \cgalParamBegin{callback} an instance of - `std::function`. It is called regularly when the - algorithm is running: the current advancement (between 0. and - 1.) is passed as parameter. If it returns `true`, then the - algorithm continues its execution normally; if it returns - `false`, the algorithm is stopped and the remaining normals are - left unchanged.\cgalParamEnd - \cgalParamBegin{geom_traits} an instance of a geometric traits class, model of `Kernel`\cgalParamEnd - \cgalNamedParamsEnd + `std::function`. It is called regularly when the + algorithm is running: the current advancement (between 0. and 1.) + is passed as parameter. If it returns `true`, then the algorithm + continues its execution normally; if it returns `false`, the + algorithm is stopped and the remaining normals are left + unchanged.\cgalParamEnd \cgalParamBegin{geom_traits} an instance + of a geometric traits class, model of `Kernel`\cgalParamEnd + \cgalNamedParamsEnd */ template ::type PointMap; typedef typename Point_set_processing_3::GetNormalMap::type NormalMap; typedef typename Point_set_processing_3::GetK::Kernel Kernel; + typedef typename Kernel::FT FT; CGAL_static_assertion_msg(!(boost::is_same::NoMap>::value), @@ -213,6 +210,7 @@ pca_estimate_normals( PointMap point_map = choose_param(get_param(np, internal_np::point_map), PointMap()); NormalMap normal_map = choose_param(get_param(np, internal_np::normal_map), NormalMap()); + FT neighbor_radius = choose_param(get_param(np, internal_np::neighbor_radius), FT(0)); const std::function& callback = choose_param(get_param(np, internal_np::callback), std::function()); @@ -263,7 +261,7 @@ pca_estimate_normals( std::vector normals (kd_tree_points.size (), CGAL::NULL_VECTOR); CGAL::internal::PCA_estimate_normals - f (tree, k, kd_tree_points, normals, + f (tree, k, neighbor_radius, kd_tree_points, normals, parallel_callback.advancement(), parallel_callback.interrupted()); tbb::parallel_for(tbb::blocked_range(0, kd_tree_points.size ()), f); @@ -283,7 +281,7 @@ pca_estimate_normals( Vector normal = internal::pca_estimate_normal( get(point_map,*it), tree, - k); + k, neighbor_radius); put(normal_map, *it, normal); // normal_map[it] = normal if (callback && !callback ((nb+1) / double(kd_tree_points.size()))) @@ -308,77 +306,6 @@ pca_estimate_normals( return pca_estimate_normals (points, k, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::pca_estimate_normals(), please update your code") -void -pca_estimate_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k, ///< number of neighbors. - const Kernel& /*kernel*/) ///< geometric traits. -{ - CGAL::Iterator_range points (first, beyond); - return pca_estimate_normals - (points, - k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - geom_traits(Kernel())); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::pca_estimate_normals(), please update your code") -void -pca_estimate_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k) ///< number of neighbors. -{ - CGAL::Iterator_range points (first, beyond); - return pca_estimate_normals - (points, - k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::pca_estimate_normals(), please update your code") -void -pca_estimate_normals( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - unsigned int k) ///< number of neighbors. -{ - CGAL::Iterator_range points (first, beyond); - return pca_estimate_normals - (points, - k, - CGAL::parameters::normal_map (normal_map)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond diff --git a/Point_set_processing_3/include/CGAL/random_simplify_point_set.h b/Point_set_processing_3/include/CGAL/random_simplify_point_set.h index 51017d05771..63b8cc9702f 100644 --- a/Point_set_processing_3/include/CGAL/random_simplify_point_set.h +++ b/Point_set_processing_3/include/CGAL/random_simplify_point_set.h @@ -76,60 +76,6 @@ random_simplify_point_set( return first_point_to_remove; } -/// \cond SKIP_IN_MANUAL -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::random_simplify_point_set(), please update your code") -ForwardIterator -random_simplify_point_set( - ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap /*point_map*/, ///< property map: value_type of ForwardIterator -> Point_3 - double removed_percentage, ///< percentage of points to remove. - const Kernel& /*kernel*/) ///< geometric traits. -{ - CGAL::Iterator_range points (first, beyond); - return random_simplify_point_set (points, removed_percentage); -} - - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::random_simplify_point_set(), please update your code") -ForwardIterator -random_simplify_point_set( - ForwardIterator first, ///< iterator over the first input point - ForwardIterator beyond, ///< past-the-end iterator - PointMap, ///< property map: value_type of ForwardIterator -> Point_3 - double removed_percentage) ///< percentage of points to remove -{ - CGAL::Iterator_range points (first, beyond); - return random_simplify_point_set (points, removed_percentage); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::random_simplify_point_set(), please update your code") -ForwardIterator -random_simplify_point_set( - ForwardIterator first, ///< iterator over the first input point - ForwardIterator beyond, ///< past-the-end iterator - double removed_percentage) ///< percentage of points to remove -{ - CGAL::Iterator_range points (first, beyond); - return random_simplify_point_set (points, removed_percentage); -} -#endif // CGAL_NO_DEPRECATED_CODE -/// \endcond - - } //namespace CGAL #include diff --git a/Point_set_processing_3/include/CGAL/remove_outliers.h b/Point_set_processing_3/include/CGAL/remove_outliers.h index 64118d54e76..6cb08460c27 100644 --- a/Point_set_processing_3/include/CGAL/remove_outliers.h +++ b/Point_set_processing_3/include/CGAL/remove_outliers.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -63,33 +64,16 @@ typename Kernel::FT compute_avg_knn_sq_distance_3( const typename Kernel::Point_3& query, ///< 3D point to project Tree& tree, ///< KD-tree - unsigned int k) ///< number of neighbors + unsigned int k, ///< number of neighbors + typename Kernel::FT neighbor_radius) { // geometric types typedef typename Kernel::FT FT; typedef typename Kernel::Point_3 Point; - // types for K nearest neighbors search - typedef typename CGAL::Search_traits_3 Tree_traits; - typedef typename CGAL::Orthogonal_k_neighbor_search Neighbor_search; - typedef typename Neighbor_search::iterator Search_iterator; - - // Gather set of (k+1) neighboring points. - // Perform k+1 queries (if in point set, the query point is - // output first). Search may be aborted if k is greater - // than number of input points. - std::vector points; points.reserve(k+1); - Neighbor_search search(tree,query,k+1); - Search_iterator search_iterator = search.begin(); - unsigned int i; - for(i=0;i<(k+1);i++) - { - if(search_iterator == search.end()) - break; // premature ending - points.push_back(search_iterator->first); - search_iterator++; - } - CGAL_point_set_processing_precondition(points.size() >= 1); + std::vector points; + CGAL::Point_set_processing_3::internal::neighbor_query + (query, tree, k, neighbor_radius, points); // compute average squared distance typename Kernel::Compute_squared_distance_3 sqd; @@ -111,7 +95,7 @@ compute_avg_knn_sq_distance_3( /** \ingroup PkgPointSetProcessing3Algorithms Removes outliers: - - computes average squared distance to the K nearest neighbors, + - computes average squared distance to the nearest neighbors, - and sorts the points in increasing order of average distance. This method modifies the order of input points so as to pack all remaining points first, @@ -130,6 +114,13 @@ compute_avg_knn_sq_distance_3( \cgalNamedParamsBegin \cgalParamBegin{point_map} a model of `ReadablePropertyMap` with value type `geom_traits::Point_3`. If this parameter is omitted, `CGAL::Identity_property_map` is used.\cgalParamEnd + \cgalParamBegin{neighbor_radius} spherical neighborhood + radius. If provided, the neighborhood of a query point is + computed with a fixed spherical radius instead of a fixed number + of neighbors. In that case, the parameter `k` is used as a limit + on the number of points returned by each spherical query (to + avoid overly large number of points in high density areas). If no + limit is wanted, use `k=0`.\cgalParamEnd \cgalParamBegin{threshold_percent} maximum percentage of points to remove.\cgalParamEnd \cgalParamBegin{threshold_distance} minimum distance for a point to be considered as outlier (distance here is the square root of the average squared distance to K nearest neighbors).\cgalParamEnd @@ -148,7 +139,7 @@ compute_avg_knn_sq_distance_3( \note There are two thresholds that can be used: `threshold_percent` and `threshold_distance`. This function returns the smallest number of outliers such that at least one of - these threshold is fullfilled. This means that if + these threshold is fulfilled. This means that if `threshold_percent=100`, only `threshold_distance` is taken into account; if `threshold_distance=0` only `threshold_percent` is taken into account. @@ -169,6 +160,8 @@ remove_outliers( typedef typename Point_set_processing_3::GetK::Kernel Kernel; PointMap point_map = choose_param(get_param(np, internal_np::point_map), PointMap()); + typename Kernel::FT neighbor_radius = choose_param(get_param(np, internal_np::neighbor_radius), + typename Kernel::FT(0)); double threshold_percent = choose_param(get_param(np, internal_np::threshold_percent), 10.); double threshold_distance = choose_param(get_param(np, internal_np::threshold_distance), 0.); const std::function& callback = choose_param(get_param(np, internal_np::callback), @@ -213,7 +206,7 @@ remove_outliers( { FT sq_distance = internal::compute_avg_knn_sq_distance_3( get(point_map,*it), - tree, k); + tree, k, neighbor_radius); sorted_points.insert( std::make_pair(sq_distance, *it) ); if (callback && !callback ((nb+1) / double(kd_tree_points.size()))) return points.end(); @@ -249,82 +242,6 @@ remove_outliers( { return remove_outliers (points, k, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::remove_outliers(), please update your code") -InputIterator -remove_outliers( - InputIterator first, ///< iterator over the first input point. - InputIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3 - unsigned int k, ///< number of neighbors. - double threshold_percent, ///< maximum percentage of points to remove. - double threshold_distance, ///< minimum distance for a point to be - ///< considered as outlier (distance here is the square root of the average - ///< squared distance to K nearest - ///< neighbors) - const Kernel& /*kernel*/) ///< geometric traits. -{ - CGAL::Iterator_range points (first, beyond); - return remove_outliers - (points, - k, - CGAL::parameters::point_map (point_map). - threshold_percent (threshold_percent). - threshold_distance (threshold_distance). - geom_traits(Kernel())); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::remove_outliers(), please update your code") -InputIterator -remove_outliers( - InputIterator first, ///< iterator over the first input point - InputIterator beyond, ///< past-the-end iterator - PointMap point_map, ///< property map: value_type of InputIterator -> Point_3 - unsigned int k, ///< number of neighbors. - double threshold_percent, ///< percentage of points to remove - double threshold_distance = 0.0) ///< minimum average squared distance to K nearest neighbors - ///< for a point to be removed. -{ - CGAL::Iterator_range points (first, beyond); - return remove_outliers - (points, - k, - CGAL::parameters::point_map (point_map). - threshold_percent (threshold_percent). - threshold_distance (threshold_distance)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::remove_outliers(), please update your code") -InputIterator -remove_outliers( - InputIterator first, ///< iterator over the first input point - InputIterator beyond, ///< past-the-end iterator - unsigned int k, ///< number of neighbors. - double threshold_percent, ///< percentage of points to remove - double threshold_distance = 0.0) ///< minimum average squared distance to K nearest neighbors - ///< for a point to be removed. -{ - CGAL::Iterator_range points (first, beyond); - return remove_outliers - (points, - k, - CGAL::parameters::threshold_percent (threshold_percent). - threshold_distance (threshold_distance)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond diff --git a/Point_set_processing_3/include/CGAL/structure_point_set.h b/Point_set_processing_3/include/CGAL/structure_point_set.h index c92d8174c3b..c57b0b110cd 100644 --- a/Point_set_processing_3/include/CGAL/structure_point_set.h +++ b/Point_set_processing_3/include/CGAL/structure_point_set.h @@ -62,7 +62,7 @@ detected planes. Given a point set in 3D space along with a set of fitted planes, this class stores a simplified and structured version of the point set. Each output point is assigned to one, two or more primitives -(depending wether it belongs to a planar section, an edge or a if it +(depending whether it belongs to a planar section, an edge or a if it is a vertex). The implementation follow \cgalCite{cgal:la-srpss-13}. \tparam Kernel a model of `EfficientRANSACTraits` that must provide in @@ -202,30 +202,6 @@ public: } /// \cond SKIP_IN_MANUAL - // deprecated - template - CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::Point_set_with_structure(), please update your code") - Point_set_with_structure (const PointRange& points, - PointMap point_map, - NormalMap normal_map, - const PlaneRange& planes, - PlaneMap plane_map, - IndexMap index_map, - double epsilon, - double attraction_factor = 3.) - { - init (points, planes, epsilon, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - plane_map (plane_map). - plane_index_map (index_map). - attraction_factor (attraction_factor)); - } template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::compute_vcm(), please update your code") -void -compute_vcm (ForwardIterator first, - ForwardIterator beyond, - PointMap point_map, - std::vector< std::array > &ccov, - double offset_radius, - double convolution_radius, - const Kernel & kernel) -{ - CGAL::Iterator_range points (first, beyond); - compute_vcm (points, ccov, offset_radius, convolution_radius, - CGAL::parameters::point_map (point_map). - geom_traits (kernel)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond /// \cond SKIP_IN_MANUAL @@ -466,33 +444,6 @@ vcm_estimate_normals (PointRange& points, CGAL::Point_set_processing_3::parameters::all_default(points)); } -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template < typename ForwardIterator, - typename PointMap, - typename NormalMap, - typename VCMTraits -> -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::vcm_estimate_normals(), please update your code") -void -vcm_estimate_normals (ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - double offset_radius, ///< offset radius. - double convolution_radius, ///< convolution radius. - VCMTraits -) -{ - CGAL::Iterator_range points (first, beyond); - vcm_estimate_normals - (points, - offset_radius, convolution_radius, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - diagonalize_traits (VCMTraits())); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond @@ -551,114 +502,7 @@ vcm_estimate_normals (PointRange& points, CGAL::Point_set_processing_3::parameters::all_default(points)); } -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template < typename ForwardIterator, - typename PointMap, - typename NormalMap, - typename VCMTraits -> -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::vcm_estimate_normals(), please update your code") -void -vcm_estimate_normals (ForwardIterator first, ///< iterator over the first input point. - ForwardIterator beyond, ///< past-the-end iterator over the input points. - PointMap point_map, ///< property map: value_type of ForwardIterator -> Point_3. - NormalMap normal_map, ///< property map: value_type of ForwardIterator -> Vector_3. - double offset_radius, ///< offset radius. - unsigned int k, ///< number of neighbor points used for the convolution. - VCMTraits -) -{ - CGAL::Iterator_range points (first, beyond); - vcm_estimate_normals - (points, - offset_radius, k, - CGAL::parameters::point_map (point_map). - normal_map (normal_map). - diagonalize_traits (VCMTraits())); -} -// deprecated API -template < typename ForwardIterator, - typename PointMap, - typename NormalMap -> -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::vcm_estimate_normals(), please update your code") -void -vcm_estimate_normals (ForwardIterator first, - ForwardIterator beyond, - PointMap point_map, - NormalMap normal_map, - double offset_radius, - double convolution_radius) -{ - CGAL::Iterator_range points (first, beyond); - vcm_estimate_normals - (points, - offset_radius, convolution_radius, - CGAL::parameters::point_map (point_map). - normal_map (normal_map)); -} - -// deprecated API -template < typename ForwardIterator, - typename PointMap, - typename NormalMap -> -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::vcm_estimate_normals(), please update your code") -void -vcm_estimate_normals (ForwardIterator first, - ForwardIterator beyond, - PointMap point_map, - NormalMap normal_map, - double offset_radius, - unsigned int nb_neighbors_convolve) -{ - CGAL::Iterator_range points (first, beyond); - vcm_estimate_normals - (points, - offset_radius, nb_neighbors_convolve, - CGAL::parameters::point_map (point_map). - normal_map (normal_map)); -} - - -// deprecated API -template < typename ForwardIterator, - typename NormalMap -> -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::vcm_estimate_normals(), please update your code") -void -vcm_estimate_normals (ForwardIterator first, - ForwardIterator beyond, - NormalMap normal_map, - double offset_radius, - double convolution_radius) { - CGAL::Iterator_range points (first, beyond); - vcm_estimate_normals - (points, - offset_radius, convolution_radius, - CGAL::parameters::normal_map (normal_map)); -} - -// deprecated API -template < typename ForwardIterator, - typename NormalMap -> -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::vcm_estimate_normals(), please update your code") -void -vcm_estimate_normals (ForwardIterator first, - ForwardIterator beyond, - NormalMap normal_map, - double offset_radius, - unsigned int nb_neighbors_convolve) { - CGAL::Iterator_range points (first, beyond); - vcm_estimate_normals - (points, - offset_radius, nb_neighbors_convolve, - CGAL::parameters::normal_map (normal_map)); -} -#endif // CGAL_NO_DEPRECATED_CODE /// \endcond } // namespace CGAL diff --git a/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h b/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h index b3b5789bab7..9ed0706f207 100644 --- a/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h +++ b/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h @@ -442,8 +442,8 @@ public: \cgalParamBegin{neighbor_radius} spherical neighborhood radius. This is a key parameter that needs to be finely tuned. The result will be irregular if too small, but a larger value will impact the runtime. In practice, choosing a radius such that the neighborhood of each sample point includes at least two rings - of neighboring sample points gives satisfactory result. The default value is set to 8 times the average - spacing of the point set.\cgalParamEnd + of neighboring sample points gives satisfactory result. If this parameter is not provided, it is + automatically set to 8 times the average spacing of the point set.\cgalParamEnd \cgalParamBegin{number_of_iterations} number of iterations to solve the optimsation problem. The default value is 35. More iterations give a more regular result but increase the runtime.\cgalParamEnd \cgalParamBegin{require_uniform_sampling} an optional preprocessing, which will give better result if the @@ -688,107 +688,7 @@ wlop_simplify_and_regularize_point_set( return wlop_simplify_and_regularize_point_set (points, output, CGAL::Point_set_processing_3::parameters::all_default(points)); } - -#ifndef CGAL_NO_DEPRECATED_CODE -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::wlop_simplify_and_regularize_point_set(), please update your code") -OutputIterator -wlop_simplify_and_regularize_point_set( - RandomAccessIterator first, ///< random-access iterator to the first input point. - RandomAccessIterator beyond, ///< past-the-end iterator. - OutputIterator output, ///< output iterator where output points are put. - PointMap point_map, ///< point property map. - double select_percentage, ///< percentage of points to retain. - ///< The default value is set to 5 (\%). - double radius, ///< spherical neighborhood radius. - ///< This is a key parameter that needs to be finely tuned. - ///< The result will be irregular if too small, but a larger - ///< value will impact the runtime. - ///< In practice, choosing a radius such that the neighborhood of each sample point - ///< includes at least two rings of neighboring sample points - ///< gives satisfactory result. - ///< The default value is set to 8 times the average spacing of the point set. - unsigned int iter_number, ///< number of iterations to solve the optimsation problem. The default value is 35. - ///< More iterations give a more regular result but increase the runtime. - bool require_uniform_sampling,///< an optional preprocessing, which will give better result - ///< if the distribution of the input points is highly non-uniform. - ///< The default value is `false`. - const Kernel& ///< geometric traits. -) -{ - CGAL::Iterator_range points (first, beyond); - return wlop_simplify_and_regularize_point_set - (points, output, - CGAL::parameters::point_map (point_map). - select_percentage (select_percentage). - neighbor_radius (radius). - number_of_iterations(iter_number). - require_uniform_sampling (require_uniform_sampling). - geom_traits (Kernel())); -} - - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::wlop_simplify_and_regularize_point_set(), please update your code") -OutputIterator -wlop_simplify_and_regularize_point_set( - RandomAccessIterator first, ///< iterator over the first input point - RandomAccessIterator beyond, ///< past-the-end iterator - OutputIterator output, ///< add back-inserter - PointMap point_map, ///< property map RandomAccessIterator -> Point_3 - const double select_percentage, ///< percentage of points to retain - double neighbor_radius, ///< size of neighbors. - const unsigned int max_iter_number, ///< number of iterations. - const bool require_uniform_sampling ///< if needed to compute density - /// to generate more rugularized result. -) -{ - CGAL::Iterator_range points (first, beyond); - return wlop_simplify_and_regularize_point_set - (points, output, - CGAL::parameters::point_map (point_map). - select_percentage (select_percentage). - neighbor_radius (neighbor_radius). - number_of_iterations(max_iter_number). - require_uniform_sampling (require_uniform_sampling)); -} - -// deprecated API -template -CGAL_DEPRECATED_MSG("you are using the deprecated V1 API of CGAL::wlop_simplify_and_regularize_point_set(), please update your code") -OutputIterator -wlop_simplify_and_regularize_point_set( - RandomAccessIterator first, ///< iterator to the first input point. - RandomAccessIterator beyond, ///< past-the-end iterator. - OutputIterator output, ///< add back-inserter. - const double select_percentage = 5, ///< percentage of points to retain - double neighbor_radius = -1, ///< size of neighbors. - const unsigned int max_iter_number = 35, ///< number of iterations. - const bool require_uniform_sampling = false ///< if needed to compute density - ///to generate a more uniform result. -) -{ - CGAL::Iterator_range points (first, beyond); - return wlop_simplify_and_regularize_point_set - (points, output, - CGAL::parameters::select_percentage (select_percentage). - neighbor_radius (neighbor_radius). - number_of_iterations(max_iter_number). - require_uniform_sampling (require_uniform_sampling)); -} -#endif // CGAL_NO_DEPRECATED_CODE -/// @endcond +/// \endcond } //namespace CGAL diff --git a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt index fd52ff350d0..e168fc5f532 100644 --- a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt +++ b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt @@ -28,7 +28,7 @@ if ( CGAL_FOUND ) find_package( TBB QUIET ) - # Executables that do *not* require LAPACK + # Executables that do *not* require Eigen create_single_source_cgal_program( "read_test.cpp" ) create_single_source_cgal_program( "read_test_with_different_pmaps.cpp" ) create_single_source_cgal_program( "analysis_test.cpp" ) @@ -38,50 +38,20 @@ if ( CGAL_FOUND ) create_single_source_cgal_program( "edge_aware_upsample_test.cpp" ) create_single_source_cgal_program( "structuring_test.cpp" ) - # Deprecated tests - create_single_source_cgal_program( "deprecated_read_test.cpp" ) - create_single_source_cgal_program( "deprecated_read_test_with_different_pmaps.cpp" ) - create_single_source_cgal_program( "deprecated_analysis_test.cpp" ) - create_single_source_cgal_program( "deprecated_remove_outliers_test.cpp" ) - create_single_source_cgal_program( "deprecated_wlop_simplify_and_regularize_test.cpp" ) - create_single_source_cgal_program( "deprecated_bilateral_smoothing_test.cpp" ) - create_single_source_cgal_program( "deprecated_edge_aware_upsample_test.cpp" ) - create_single_source_cgal_program( "deprecated_structuring_test.cpp" ) - - # Use Eigen or BLAS and LAPACK (optional) + # Use Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) - if (NOT EIGEN3_FOUND) - find_package(LAPACK) - if(LAPACK_FOUND) - include( ${LAPACK_USE_FILE} ) - endif(LAPACK_FOUND) - else() + if (EIGEN3_FOUND) include( ${EIGEN3_USE_FILE} ) - endif() - - - if(EIGEN3_FOUND OR LAPACK_FOUND) - # Executables that require Eigen or BLAS and LAPACK + # Executables that require Eigen create_single_source_cgal_program( "normal_estimation_test.cpp" ) create_single_source_cgal_program( "hierarchy_simplification_test.cpp" ) create_single_source_cgal_program( "smoothing_test.cpp" ) create_single_source_cgal_program( "vcm_plane_test.cpp" ) create_single_source_cgal_program( "vcm_all_test.cpp" ) create_single_source_cgal_program( "jet_pointer_as_property_map.cpp" ) - - # Deprecated tests - create_single_source_cgal_program( "deprecated_normal_estimation_test.cpp" ) - create_single_source_cgal_program( "deprecated_hierarchy_simplification_test.cpp" ) - create_single_source_cgal_program( "deprecated_smoothing_test.cpp" ) - create_single_source_cgal_program( "deprecated_vcm_plane_test.cpp" ) - create_single_source_cgal_program( "deprecated_vcm_all_test.cpp" ) - create_single_source_cgal_program( "deprecated_jet_pointer_as_property_map.cpp" ) - - else(EIGEN3_FOUND OR LAPACK_FOUND) - - message(STATUS "NOTICE: This program requires either Eigen 3.1 (or greater) or LAPACK, and will not be compiled.") - - endif(EIGEN3_FOUND OR LAPACK_FOUND) + else() + message(STATUS "NOTICE: This program requires Eigen 3.1 (or greater) and will not be compiled.") + endif() foreach(target analysis_test diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_analysis_test.cmd b/Point_set_processing_3/test/Point_set_processing_3/deprecated_analysis_test.cmd deleted file mode 100644 index 19722151afc..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_analysis_test.cmd +++ /dev/null @@ -1 +0,0 @@ -data/*.xyz diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_analysis_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_analysis_test.cpp deleted file mode 100644 index 8ca967a03c3..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_analysis_test.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include - -// analysis_test.cpp - -//---------------------------------------------------------- -// Test the analysis methods: -// For each input point set, compute the average spacing. -// Input format is .xyz. -// No output. -//---------------------------------------------------------- -// analysis_test points1.xyz points2.xyz... - -// CGAL -#include -#include -#include - -// This package -#include -#include - -#include -#include -#include - -// ---------------------------------------------------------------------------- -// Types -// ---------------------------------------------------------------------------- - -// kernel -typedef CGAL::Simple_cartesian Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point; - -// Concurrency -#ifdef CGAL_LINKED_WITH_TBB -typedef CGAL::Parallel_tag Concurrency_tag; -#else -typedef CGAL::Sequential_tag Concurrency_tag; -#endif - - -// ---------------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------------- - -// Computes average spacing. -void test_average_spacing(std::deque& points, // input point set - unsigned int nb_neighbors) // number of neighbors -{ - std::cerr << "Computes average spacing to k nearest neighbors (k="<< nb_neighbors << ")... "; - CGAL::Timer task_timer; task_timer.start(); - - FT average_spacing = CGAL::compute_average_spacing(points.begin(), points.end(), nb_neighbors); - std::cout << average_spacing << std::endl; - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "ok: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; -} - - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -int main(int argc, char * argv[]) -{ - std::cerr << "Analysis test" << std::endl; - - //*************************************** - // decode parameters - //*************************************** - - // usage - if(argc < 2) - { - std::cerr << "For each input point set, compute the average spacing.\n"; - std::cerr << "\n"; - std::cerr << "Usage: " << argv[0] << " file1.xyz file2.xyz..." << std::endl; - std::cerr << "Input file format is .xyz.\n"; - std::cerr << "No output" << std::endl; - return EXIT_FAILURE; - } - - // Average Spacing options - const unsigned int nb_neighbors = 6; // K-nearest neighbors = 1 ring (average spacing) - - // Accumulated errors - int accumulated_fatal_err = EXIT_SUCCESS; - - // Process each input file - for(int i=1; i points; - std::cerr << "Open " << input_filename << " for reading..." << std::endl; - - // If XYZ file format: - std::ifstream stream(input_filename.c_str()); - if(stream && - CGAL::read_xyz_points(stream, std::back_inserter(points))) - { - std::cerr << "ok (" << points.size() << " points)" << std::endl; - } - else - { - std::cerr << "Error: cannot read file " << input_filename << std::endl; - accumulated_fatal_err = EXIT_FAILURE; - continue; - } - - //*************************************** - // Test - //*************************************** - - test_average_spacing(points, nb_neighbors); - - } // for each input file - - std::cerr << std::endl; - - // Returns accumulated fatal error - std::cerr << "Tool returned " << accumulated_fatal_err << std::endl; - return accumulated_fatal_err; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_bilateral_smoothing_test.cmd b/Point_set_processing_3/test/Point_set_processing_3/deprecated_bilateral_smoothing_test.cmd deleted file mode 100644 index 39d9a38f5d5..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_bilateral_smoothing_test.cmd +++ /dev/null @@ -1 +0,0 @@ -data/fin90_with_PCA_normals.xyz diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_bilateral_smoothing_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_bilateral_smoothing_test.cpp deleted file mode 100644 index 02b08a7ce30..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_bilateral_smoothing_test.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#include - -// bilateral_smoothing_test.cpp - -//---------------------------------------------------------- -// Test the smoothing methods: -// For each input point set, smooth it. -// Input format is .xyz. -// No output. -//---------------------------------------------------------- -// bilateral_smoothing_test points1.xyz points2.xyz... - -// CGAL -#include -#include -#include - -// This package -#include -#include - -#include -#include -#include - - -// ---------------------------------------------------------------------------- -// Types -// ---------------------------------------------------------------------------- - -// kernel -typedef CGAL::Simple_cartesian Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point; -typedef Kernel::Vector_3 Vector; - -// Point with normal vector stored in a std::pair. -typedef std::pair PointVectorPair; - -// ---------------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------------- - -template -void test_bilateral_smoothing(std::deque& points,// input point set - unsigned int nb_neighbors, // number of neighbors - double sharpness_sigma) -{ - CGAL::Real_timer task_timer; task_timer.start(); - - for (int i = 0; i < 3; i++) - { - CGAL::bilateral_smooth_point_set ( - points.begin(), - points.end(), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map(), - nb_neighbors, - sharpness_sigma); - } - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "ok: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; -} - - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -int main(int argc, char * argv[]) -{ - std::cerr << "Bilateral smoothing test" << std::endl; - - //*************************************** - // decode parameters - //*************************************** - - // usage - if(argc < 2) - { - std::cerr << "For each input point set, smooth it.\n"; - std::cerr << "\n"; - std::cerr << "Usage: " << argv[0] << " file1.xyz file2.xyz..." << std::endl; - std::cerr << "Input file format is .xyz.\n"; - std::cerr << "No output" << std::endl; - return EXIT_FAILURE; - } - - // Smoothing options - const unsigned int nb_neighbors = 50; // K-nearest neighbors - const double sharpness_sigma = 25; // control sharpness - - // Accumulated errors - int accumulated_fatal_err = EXIT_SUCCESS; - - // Process each input file - for(int i=1; i points; - std::cerr << "Opening " << input_filename << " for reading..." << std::endl; - - // If XYZ file format: - std::ifstream stream(input_filename.c_str()); - if(stream && - CGAL::read_xyz_points_and_normals(stream, - std::back_inserter(points), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map())) - { - std::cerr << "ok (" << points.size() << " points)" << std::endl; - } - else - { - std::cerr << "Error: cannot read file " << input_filename << std::endl; - accumulated_fatal_err = EXIT_FAILURE; - continue; - } - - //*************************************** - // Test - //*************************************** - -#ifdef CGAL_LINKED_WITH_TBB - std::deque points2(points); -#endif // CGAL_LINKED_WITH_TBB - - test_bilateral_smoothing( - points, nb_neighbors, sharpness_sigma); - -#ifdef CGAL_LINKED_WITH_TBB - test_bilateral_smoothing( - points2, nb_neighbors, sharpness_sigma); -#endif // CGAL_LINKED_WITH_TBB - - } // for each input file - - std::cerr << std::endl; - // Returns accumulated fatal error - std::cerr << "Tool returned " << accumulated_fatal_err << std::endl; - return accumulated_fatal_err; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_edge_aware_upsample_test.cmd b/Point_set_processing_3/test/Point_set_processing_3/deprecated_edge_aware_upsample_test.cmd deleted file mode 100644 index ac214ba0b5e..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_edge_aware_upsample_test.cmd +++ /dev/null @@ -1 +0,0 @@ -data/before_upsample.xyz diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_edge_aware_upsample_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_edge_aware_upsample_test.cpp deleted file mode 100644 index e72f8e663be..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_edge_aware_upsample_test.cpp +++ /dev/null @@ -1,168 +0,0 @@ -#include - -// edge_aware_upsample_test.cpp - -//---------------------------------------------------------- -// Test the edge aware up-sample test method: -// Input format is .xyz. -// No output. -//---------------------------------------------------------- -// edge_aware_upsample_test points1.xyz points2.xyz... - -// CGAL -#include -#include -#include - -// This package -#include -#include - -#include -#include - - -// ---------------------------------------------------------------------------- -// Types -// ---------------------------------------------------------------------------- - -// kernel -typedef CGAL::Simple_cartesian Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point; -typedef Kernel::Vector_3 Vector; - -// Point with normal vector stored in a std::pair. -typedef std::pair PointVectorPair; - -// Concurrency -#ifdef CGAL_LINKED_WITH_TBB -typedef CGAL::Parallel_tag Concurrency_tag; -#else -typedef CGAL::Sequential_tag Concurrency_tag; -#endif - - -// ---------------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------------- - -void test_edge_aware_upsample(std::vector& points, // input point set - double sharpness_sigma, //control sharpness - double edge_sensitivity,// more points will up-sample on edge - double neighbor_radius, // initial neighbors size. - unsigned int times_of_output_points) - -{ - CGAL::Real_timer task_timer; task_timer.start(); - std::cerr << "Running edge aware up-sample, (sharpness_sigma: " - << sharpness_sigma << "%, number_of_output_points=" - << points.size() * times_of_output_points << ")...\n"; - - //Run algorithm - CGAL::edge_aware_upsample_point_set( - points.begin(), - points.end(), - std::back_inserter(points), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map(), - sharpness_sigma, - edge_sensitivity, - neighbor_radius, - points.size() * times_of_output_points); - - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "ok: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; -} - - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -int main(int argc, char * argv[]) -{ - std::cerr << "Edge aware up-sample" << std::endl; - - //*************************************** - // decode parameters - //*************************************** - - // usage - if(argc < 2) - { - std::cerr << "Upsample each input point set.\n"; - std::cerr << "\n"; - std::cerr << "Usage: " << argv[0] << " file1.xyz file2.xyz..." << std::endl; - std::cerr << "Input file format is .xyz.\n"; - std::cerr << "No output" << std::endl; - return EXIT_FAILURE; - } - - //Algorithm parameters - const double sharpness_sigma = 25; //control sharpness of the result. - const double edge_sensitivity = 0; // more points will up-sample on edge. - const double neighbor_radius = 0.2; // initial neighbors size. - const unsigned int times_of_output_points = 4; - - // Accumulated errors - int accumulated_fatal_err = EXIT_SUCCESS; - - // Process each input file - for(int i=1; i points; - std::cerr << "Opening " << input_filename << " for reading..." << std::endl; - - // If XYZ file format: - std::ifstream stream(input_filename.c_str()); - if(stream && - CGAL::read_xyz_points_and_normals - (stream, - std::back_inserter(points), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map())) - { - std::cerr << "ok (" << points.size() << " points)" << std::endl; - } - else - { - std::cerr << "Error: cannot read file " << input_filename << std::endl; - accumulated_fatal_err = EXIT_FAILURE; - continue; - } - - //*************************************** - // Test - //*************************************** - - test_edge_aware_upsample(points, - sharpness_sigma, - edge_sensitivity, - neighbor_radius, - times_of_output_points); - - } // for each input file - - std::cerr << std::endl; - - // Returns accumulated fatal error - std::cerr << "Tool returned " << accumulated_fatal_err << std::endl; - return accumulated_fatal_err; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_hierarchy_simplification_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_hierarchy_simplification_test.cpp deleted file mode 100644 index 009f01082f6..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_hierarchy_simplification_test.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include - -#include - -#include -#include - -#include - -// types -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; -typedef Kernel::Point_3 Point; -typedef Kernel::FT FT; - -void test (std::vector& input, - std::ptrdiff_t result0 = 1, int result1 = 1, int result2 = 1, int result3 = 1, int result4 = 1) -{ - std::vector::iterator it = - CGAL::hierarchy_simplify_point_set (input.begin (), input.end (), 1); - if (result0 > 0 && std::distance (input.begin (), it) != result0) - exit (EXIT_FAILURE); - - it = CGAL::hierarchy_simplify_point_set (input.begin (), input.end ()); - if (result1 > 0 && std::distance (input.begin (), it) != result1) - exit (EXIT_FAILURE); - - it = CGAL::hierarchy_simplify_point_set (input.begin (), input.end (), 100); - if (result2 > 0 && std::distance (input.begin (), it) != result2) - exit (EXIT_FAILURE); - - - it = CGAL::hierarchy_simplify_point_set (input.begin (), input.end (), 1000, 0.1); - if (result3 > 0 && std::distance (input.begin (), it) != result3) - exit (EXIT_FAILURE); - - - it = CGAL::hierarchy_simplify_point_set (input.begin (), input.end (), - CGAL::Identity_property_map(), - (std::numeric_limits::max)(), - 0.0001); - if (result4 > 0 && std::distance (input.begin (), it) != result4) - exit (EXIT_FAILURE); - - input.clear (); -} - - -int main(void) -{ - - std::vector input; - - // Test 1 point - input.push_back (Point (0., 0., 0.)); - test (input); - - // Test twice the same point - input.push_back (Point (0., 0., 0.)); - input.push_back (Point (0., 0., 0.)); - test (input); - - // Test 2 points - input.push_back (Point (0., 0., 0.)); - input.push_back (Point (1., 0., 0.)); - test (input, 2); - - // Test line - for (std::size_t i = 0; i < 1000; ++ i) - input.push_back (Point (0., 0., (double)i)); - test (input, input.size (), 128, 16, 1, 1); - - // Test plane - for (std::size_t i = 0; i < 128; ++ i) - for (std::size_t j = 0; j < 128; ++ j) - input.push_back (Point (0., (double)j, (double)i)); - test (input, input.size (), 2048, 256, 32, 1); - - // Test random - for (std::size_t i = 0; i < 10000; ++ i) - input.push_back (Point (rand() / (FT)RAND_MAX, - rand() / (FT)RAND_MAX, - rand() / (FT)RAND_MAX)); - test (input, input.size (), -1, -1, -1, -1); - - return EXIT_SUCCESS; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_jet_pointer_as_property_map.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_jet_pointer_as_property_map.cpp deleted file mode 100644 index 3e97a2c0c12..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_jet_pointer_as_property_map.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include - -#include - -#include - -#include - -#include - - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point_3; -typedef Kernel::Vector_3 Vector_3; - - - - -int main() -{ - std::vector points; - std::vector indices(100); - - for(int i=0; i < 100; i++){ - indices[i] = i; - } - std::vector normals(100); - - - for(int i=0; i <10; i++){ - for(int j=0; j <10; j++){ - points.push_back(Point_3(i,j,0)); - } - } - - - CGAL::jet_estimate_normals(indices.begin(), indices.end(), - CGAL::make_property_map(points), - CGAL::make_property_map(normals), - 12); - - - return 0; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_normal_estimation_test.cmd b/Point_set_processing_3/test/Point_set_processing_3/deprecated_normal_estimation_test.cmd deleted file mode 100644 index c6919d97e3e..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_normal_estimation_test.cmd +++ /dev/null @@ -1 +0,0 @@ -data/sphere926.pwn data/sphere_1k.xyz diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_normal_estimation_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_normal_estimation_test.cpp deleted file mode 100644 index 1ac14a5392f..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_normal_estimation_test.cpp +++ /dev/null @@ -1,407 +0,0 @@ -#include - -// normal_estimation_test.cpp - -//---------------------------------------------------------- -// Test the normal estimation methods: -// For each input point set, compute and orient its normals. -// If an input mesh has normals, print the normal deviation. -// Input file formats are .off, .xyz and .pwn. -// No output. -//---------------------------------------------------------- -// normal_estimation_test points1.xyz points2.xyz... - -// With iterator debugging this testsuite takes to long and the process gets killed -//#define _HAS_ITERATOR_DEBUGGING 0 - -// CGAL -#include -#include -#include - -// This package -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - - -// ---------------------------------------------------------------------------- -// Types -// ---------------------------------------------------------------------------- - -// kernel -typedef CGAL::Simple_cartesian Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point; -typedef Kernel::Vector_3 Vector; -typedef CGAL::Point_with_normal_3 Point_with_normal; // position + normal vector -typedef std::vector PointList; - -// Concurrency -#ifdef CGAL_LINKED_WITH_TBB -typedef CGAL::Parallel_tag Concurrency_tag; -#else -typedef CGAL::Sequential_tag Concurrency_tag; -#endif - - -// ---------------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------------- - -// Check the accuracy of normals direction estimation. -// If original normals are available, compare with them and count normals with large deviation. -// @return true on success. -bool verify_normal_direction(const PointList& points, // input points + computed normals - const std::vector& original_normals) // may be empty -{ - bool success = true; - - bool points_have_original_normals = ! original_normals.empty(); - if (points_have_original_normals) - { - assert(points.size() == original_normals.size()); - - std::cerr << "Compare with original normals:" << std::endl; - - double min_normal_deviation = DBL_MAX; // deviation / original normal - double max_normal_deviation = DBL_MIN; - double avg_normal_deviation = 0; - int invalid_normals = 0; // #normals with large deviation - PointList::const_iterator p; - std::vector::const_iterator n; - for (p = points.begin(), n = original_normals.begin(); p != points.end(); p++, n++) - { - // Computes normal deviation. - Vector v1 = *n; // original normal - double norm1 = std::sqrt( v1*v1 ); - assert(norm1 != 0.0); - Vector v2 = p->normal(); // computed normal - double norm2 = std::sqrt( v2*v2 ); - assert(norm2 != 0.0); - double cos_normal_deviation = (v1*v2)/(norm1*norm2); - if (cos_normal_deviation < 0) - { - cos_normal_deviation = -cos_normal_deviation; - } - double normal_deviation = std::acos(cos_normal_deviation); - - // statistics about normals deviation - min_normal_deviation = (std::min)(min_normal_deviation, normal_deviation); - max_normal_deviation = (std::max)(max_normal_deviation, normal_deviation); - avg_normal_deviation += normal_deviation; - - // count normal if large deviation - bool valid = (normal_deviation <= CGAL_PI/3.); // valid if deviation <= 60 degrees - if ( ! valid ) - { - invalid_normals++; - } - } - avg_normal_deviation /= double(points.size()); - - std::cerr << " Min normal deviation=" << min_normal_deviation*180.0/CGAL_PI << " degrees\n"; - std::cerr << " Max normal deviation=" << max_normal_deviation*180.0/CGAL_PI << " degrees\n"; - std::cerr << " Avg normal deviation=" << avg_normal_deviation*180.0/CGAL_PI << " degrees\n"; - if (invalid_normals > 0) - { - std::cerr << " Error: " << invalid_normals << " normals have a deviation > 60 degrees\n"; - success = false; - } - } - - return success; -} - -// Computes normals direction by Principal Component Analysis -// @return true on success. -bool run_pca_estimate_normals(PointList& points, // input points + output normals - unsigned int nb_neighbors_pca_normals, // number of neighbors - const std::vector& original_normals) // may be empty -{ - CGAL::Timer task_timer; task_timer.start(); - std::cerr << "Estimates Normals Direction by PCA (k=" - << nb_neighbors_pca_normals << ")...\n"; - - CGAL::pca_estimate_normals(points.begin(), points.end(), - CGAL::make_normal_of_point_with_normal_map(PointList::value_type()), - nb_neighbors_pca_normals); - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "done: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; - - // Check the accuracy of normals direction estimation. - // If original normals are available, compare with them. - return verify_normal_direction(points, original_normals); -} - -// Computes normals direction by Jet Fitting -// @return true on success. -bool run_jet_estimate_normals(PointList& points, // input points + output normals - unsigned int nb_neighbors_jet_fitting_normals, // number of neighbors - const std::vector& original_normals) // may be empty -{ - CGAL::Timer task_timer; task_timer.start(); - std::cerr << "Estimates Normals Direction by Jet Fitting (k=" - << nb_neighbors_jet_fitting_normals << ")...\n"; - - CGAL::jet_estimate_normals(points.begin(), points.end(), - CGAL::make_normal_of_point_with_normal_map(PointList::value_type()), - nb_neighbors_jet_fitting_normals); - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "done: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; - - // Check the accuracy of normals direction estimation. - // If original normals are available, compare with them. - return verify_normal_direction(points, original_normals); -} - -// Check the accuracy of normal orientation. -// Count non-oriented normals. -// If original normals are available, compare with them and count flipped normals. -bool verify_normal_orientation(const PointList& points, // input points + computed normals - PointList::const_iterator unoriented_points_begin, // first pt w/ unoriented normal - const std::vector& original_normals) // may be empty -{ - bool success = true; - - // Count non-oriented normals - int unoriented_normals = 0; - for (PointList::const_iterator p = unoriented_points_begin ; p != points.end(); p++) - { - unoriented_normals++; - } - if (unoriented_normals > 0) - { - std::cerr << "Error: " << unoriented_normals << " normals are unoriented\n"; - success = false; - } - - // Compare oriented normals with original ones and count flipped normals - bool points_have_original_normals = ! original_normals.empty(); - if (points_have_original_normals) - { - assert(points.size() == original_normals.size()); - - std::cerr << "Compare with original normals:" << std::endl; - - int flipped_normals = 0; // #normals with wrong orientation - PointList::const_iterator p; - std::vector::const_iterator n; - for (p = points.begin(), n = original_normals.begin(); p != unoriented_points_begin; p++, n++) - { - Vector v1 = *n; // original normal - double norm1 = std::sqrt( v1*v1 ); - assert(norm1 != 0.0); - Vector v2 = p->normal(); // computed normal - double norm2 = std::sqrt( v2*v2 ); - assert(norm2 != 0.0); - double cos_normal_deviation = (v1*v2)/(norm1*norm2); - if (cos_normal_deviation < 0) // if flipped - { - flipped_normals++; - } - } - - if (flipped_normals == 0) - std::cerr << " ok\n"; - else - std::cerr << " Error: " << flipped_normals << " normal(s) are flipped\n"; - } - - return success; -} - -// Hoppe92 normal orientation using a Minimum Spanning Tree. -// @return true on success. -bool run_mst_orient_normals(PointList& points, // input points + input/output normals - unsigned int nb_neighbors_mst, // number of neighbors - const std::vector& original_normals) // may be empty -{ -#if (BOOST_VERSION / 100) == 1054 - std::cerr << - "In run_mst_orient_normals():\n" - "NOTICE: This function is incompatible with Boost 1.54, " - "and will not be tested. See the following bug:\n" - " https://svn.boost.org/trac/boost/ticket/9012\n"; - return true; -#endif // Boost version is 1.54 - - std::cerr << "Orients Normals with a Minimum Spanning Tree (k="<< nb_neighbors_mst << ")...\n"; - CGAL::Timer task_timer; task_timer.start(); - - PointList::iterator unoriented_points_begin = - CGAL::mst_orient_normals(points.begin(), points.end(), - CGAL::make_normal_of_point_with_normal_map(PointList::value_type()), - nb_neighbors_mst); - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "done: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; - - // Note: we do *not* delete points with unoriented normals in this test. - // Instead, we check the accuracy of normal orientation and, - // if original normals are available, compare with them. - return verify_normal_orientation(points, unoriented_points_begin, original_normals); -} - - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -int main(int argc, char * argv[]) -{ - std::cerr << "Normal estimation test" << std::endl; - - //*************************************** - // decode parameters - //*************************************** - - // usage - if(argc < 2) - { - std::cerr << "For each input point set, compute and orient its normals.\n"; - std::cerr << "If an input mesh has normals, print the normals deviation.\n"; - std::cerr << "\n"; - std::cerr << "Usage: " << argv[0] << " file1.xyz file2.xyz..." << std::endl; - std::cerr << "Input file formats are .off, .xyz and .pwn.\n"; - std::cerr << "No output" << std::endl; - return EXIT_FAILURE; - } - - // Normals Computing options - unsigned int nb_neighbors_pca_normals = 18; // K-nearest neighbors = 3 rings (estimate normals by PCA) - unsigned int nb_neighbors_jet_fitting_normals = 18; // K-nearest neighbors (estimate normals by Jet Fitting) - unsigned int nb_neighbors_mst = 18; // K-nearest neighbors (orient normals by MST) - - // Accumulated errors - int accumulated_fatal_err = EXIT_SUCCESS; - - // Process each input file - for(int i=1; i original_normals; - bool points_have_original_normals = (points.begin()->normal() != CGAL::NULL_VECTOR); - if ( points_have_original_normals ) - { - for (PointList::iterator p = points.begin() ; p != points.end(); p++) - original_normals.push_back(p->normal()); - } - - //*************************************** - // Computes normals (PCA + MST) - //*************************************** - - // Estimates normals direction. - success = run_pca_estimate_normals(points, nb_neighbors_pca_normals, original_normals); - if ( ! success ) - accumulated_fatal_err = EXIT_FAILURE; // set error and continue - - // Orients normals. - success = run_mst_orient_normals(points, nb_neighbors_mst, original_normals); - if ( ! success ) - accumulated_fatal_err = EXIT_FAILURE; // set error and continue - - //*************************************** - // Computes normals (jet fitting + MST) - //*************************************** - - // Estimates normals direction - success = run_jet_estimate_normals(points, nb_neighbors_jet_fitting_normals, original_normals); - if ( ! success ) - accumulated_fatal_err = EXIT_FAILURE; // set error and continue - - // Orients normals - success = run_mst_orient_normals(points, nb_neighbors_mst, original_normals); - if ( ! success ) - accumulated_fatal_err = EXIT_FAILURE; // set error and continue - - } // for each input file - - std::cerr << std::endl; - - // Returns accumulated fatal error - std::cerr << "Tool returned " << accumulated_fatal_err << std::endl; - return accumulated_fatal_err; -} diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_read_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_read_test.cpp deleted file mode 100644 index 1f1b1ae4da0..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_read_test.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include - -#include -#include -#include -#include - -#include -#ifdef CGAL_CXX11 -#include -#endif - -#include -#include -#include -#include - -typedef CGAL::Simple_cartesian Kernel; -typedef Kernel::Point_3 Point_3; -typedef Kernel::Vector_3 Vector_3; -typedef std::pair PointVectorPair; - -bool read(std::string s) -{ - std::ifstream fs(s.c_str()); - std::vector pv_pairs; - return CGAL::read_xyz_points_and_normals(fs, - back_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map()); -} - - - -bool read(std::string s, - std::vector& pv_pairs) -{ - std::ifstream fs(s.c_str()); - - return CGAL::read_xyz_points_and_normals(fs, - back_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map()); -} - -bool read_off(std::string s, - std::vector& pv_pairs) -{ - std::ifstream fs(s.c_str()); - - return CGAL::read_off_points_and_normals(fs, - back_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map()); -} - -#ifdef CGAL_CXX11 -bool read_ply (std::string s, - std::vector& pv_pairs) -{ - std::ifstream fs(s.c_str()); - - return CGAL::read_ply_points_and_normals (fs, - back_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map()); -} -#endif - -int main() -{ - std::cerr << "### There should be three errors following this line...\n"; - assert(! read("data/read_test/bug_1.xyz")); - assert(! read("data/read_test/bug_2.xyz")); - assert(! read("data/read_test/bug_3.xyz")); - std::cerr << "### ... Done. Now, there should not be any error.\n"; - - assert(read("data/read_test/ok_1.xyz")); - assert(read("data/read_test/ok_2.xyz")); - assert(read("data/read_test/ok_3.xyz")); - - std::vector pv_pairs; - - read("data/read_test/ok_2.xyz", pv_pairs); - assert(pv_pairs.size() == 4); - assert(pv_pairs[0] == std::make_pair(Point_3(2,3,4), Vector_3(4,4,2))); - assert(pv_pairs[1] == std::make_pair(Point_3(3,4,6), Vector_3(0,0,0))); - assert(pv_pairs[2] == std::make_pair(Point_3(3,6,7), Vector_3(3,5,6))); - assert(pv_pairs[3] == std::make_pair(Point_3(1,3,4), Vector_3(4,6,8))); - - pv_pairs.clear(); - - assert(read_off("data/read_test/ok_1.off", pv_pairs)); - assert(pv_pairs.size() == 4); - assert(pv_pairs[0] == std::make_pair(Point_3(3,2,0), Vector_3(1,2,3))); - assert(pv_pairs[1] == std::make_pair(Point_3(1,2,3), Vector_3(0,0,0))); - assert(pv_pairs[2] == std::make_pair(Point_3(4,5,6), Vector_3(0,0,0))); - assert(pv_pairs[3] == std::make_pair(Point_3(7,8,9), Vector_3(0,0,0))); - -#ifdef CGAL_CXX11 - pv_pairs.clear (); - assert(read_ply("data/read_test/simple.ply", pv_pairs)); - assert(pv_pairs[0] == std::make_pair(Point_3(1,1,1), Vector_3(2,2,2))); - assert(pv_pairs[1] == std::make_pair(Point_3(3,3,3), Vector_3(4,4,4))); - assert(pv_pairs[2] == std::make_pair(Point_3(5,5,5), Vector_3(6,6,6))); - - pv_pairs.clear (); - assert(read_ply("data/read_test/simple_ascii.ply", pv_pairs)); - assert(pv_pairs[0] == std::make_pair(Point_3(1,1,1), Vector_3(2,2,2))); - assert(pv_pairs[1] == std::make_pair(Point_3(3,3,3), Vector_3(4,4,4))); - assert(pv_pairs[2] == std::make_pair(Point_3(5,5,5), Vector_3(6,6,6))); - - pv_pairs.clear (); - assert(read_ply("data/read_test/simple_with_flag.ply", pv_pairs)); - assert(pv_pairs[0] == std::make_pair(Point_3(1,1,1), Vector_3(2,2,2))); - assert(pv_pairs[1] == std::make_pair(Point_3(3,3,3), Vector_3(4,4,4))); - assert(pv_pairs[2] == std::make_pair(Point_3(5,5,5), Vector_3(6,6,6))); -#endif - - return 0; -} diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_read_test_with_different_pmaps.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_read_test_with_different_pmaps.cpp deleted file mode 100644 index f15357b13da..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_read_test_with_different_pmaps.cpp +++ /dev/null @@ -1,340 +0,0 @@ -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - - -typedef CGAL::Simple_cartesian Kernel; -typedef Kernel::Point_3 Point_3; -typedef Kernel::Vector_3 Vector_3; -typedef std::pair PointVectorPair; - -// this is going to be custom OutputIterator value_type -struct dummy_counter { - static std::size_t counter; - - dummy_counter() { ++counter; } - operator std::size_t() { return counter-1; } -}; -std::size_t dummy_counter::counter = 0; - -bool check_points_and_vectors( - const boost::vector_property_map& points, - const boost::vector_property_map& normals, - const std::vector& pv_pairs, - const std::vector& indices) -{ - if(pv_pairs.size() != indices.size()) { - std::cerr << "Error: inconsistency between point / normal size." << std::endl; - return false; - } - - for(std::size_t i = 0; i < pv_pairs.size(); ++i ) { - if(pv_pairs[i].first != points[i]) { - std::cerr << "Error: points are not equal." << std::endl; - return false; - } - if(pv_pairs[i].second != normals[i]) { - std::cerr << "Error: normals are not equal." << std::endl; - return false; - } - } - return true; -} - -bool check_points( - const boost::vector_property_map& points_1, - const std::vector& points_2, - const std::vector& indices) -{ - if(points_2.size() != indices.size()) { - std::cerr << "Error: inconsistency between point / normal size." << std::endl; - return false; - } - - for(std::size_t i = 0; i < points_2.size(); ++i ) { - if(points_2[i] != points_1[i]) { - std::cerr << "Error: points are not equal." << std::endl; - return false; - } - } - return true; -} - -bool test_no_deduction_points_and_normals_xyz(const char* file_name) -{ - boost::vector_property_map points; - boost::vector_property_map normals; - std::vector indices; - - std::vector pv_pairs; - - // read with custom output iterator type - dummy_counter::counter = 0; - std::ifstream input(file_name); - CGAL::read_xyz_points_and_normals( - input, back_inserter(indices), points, normals, Kernel()); - - // read with ordinary pmaps - input.clear(); - input.close(); - input.open(file_name); - CGAL::read_xyz_points_and_normals( - input, back_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map(), - Kernel()); - - return check_points_and_vectors(points, normals, pv_pairs, indices); -} - -bool test_no_deduction_points_and_normals_off(const char* file_name) -{ - boost::vector_property_map points; - boost::vector_property_map normals; - std::vector indices; - - std::vector pv_pairs; - - // read with custom output iterator type - dummy_counter::counter = 0; - std::ifstream input(file_name); - CGAL::read_off_points_and_normals( - input, back_inserter(indices), points, normals, Kernel()); - - // read with ordinary pmaps - input.clear(); - input.close(); - input.open(file_name); - CGAL::read_off_points_and_normals( - input, back_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map(), - Kernel()); - - return check_points_and_vectors(points, normals, pv_pairs, indices); -} - -bool test_no_deduction_points_xyz(const char* file_name) -{ - boost::vector_property_map points_1; \ - std::vector indices; - - std::vector points_2; - - // read with custom output iterator type - dummy_counter::counter = 0; - std::ifstream input(file_name); - CGAL::read_xyz_points( - input, back_inserter(indices), points_1, Kernel()); - - // read with ordinary pmaps - input.clear(); - input.close(); - input.open(file_name); - CGAL::read_xyz_points( - input, back_inserter(points_2), - CGAL::Identity_property_map(), - Kernel()); - - return check_points(points_1, points_2, indices); -} - -bool test_no_deduction_points_off(const char* file_name) -{ - boost::vector_property_map points_1; - std::vector indices; - - std::vector points_2; - - // read with custom output iterator type - dummy_counter::counter = 0; - std::ifstream input(file_name); - CGAL::read_off_points( - input, back_inserter(indices), points_1, Kernel()); - - // read with ordinary pmaps - input.clear(); - input.close(); - input.open(file_name); - CGAL::read_off_points( - input, back_inserter(points_2), - CGAL::Identity_property_map(), - Kernel()); - - return check_points(points_1, points_2, indices); -} - -void compile_test() { - std::deque points; - std::deque normals; - std::deque pv_pairs; - std::ifstream input; - - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points( - input, - std::front_inserter(points)); - input.clear(); - input.close(); - - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points( - input, - std::front_inserter(points), - CGAL::Identity_property_map()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points( - input, - std::front_inserter(points), - CGAL::Identity_property_map(), - Kernel()); - input.clear(); - input.close(); - - // this will span all OutputIteratorValueType versions - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points( - input, - std::front_inserter(points)); - input.clear(); - input.close(); - //----------------------------------------------------------------------- - input.open("data/read_test/simple.off"); - CGAL::read_off_points( - input, - std::front_inserter(points)); - input.clear(); - input.close(); - - input.open("data/read_test/simple.off"); - CGAL::read_off_points( - input, - std::front_inserter(points), - CGAL::Identity_property_map()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.off"); - CGAL::read_off_points( - input, - std::front_inserter(points), - CGAL::Identity_property_map(), - Kernel()); - input.clear(); - input.close(); - - // this will span all OutputIteratorValueType versions - input.open("data/read_test/simple.off"); - CGAL::read_off_points( - input, - std::front_inserter(points)); - input.clear(); - input.close(); - //----------------------------------------------------------------------- - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points_and_normals( - input, - std::front_inserter(points), - boost::dummy_property_map()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points_and_normals( - input, - std::front_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points_and_normals( - input, - std::front_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map(), - Kernel()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.xyz"); - CGAL::read_xyz_points_and_normals( - input, - std::front_inserter(points), - boost::dummy_property_map()); - input.clear(); - input.close(); - //----------------------------------------------------------------------- - input.open("data/read_test/simple.off"); - CGAL::read_off_points_and_normals( - input, - std::front_inserter(points), - boost::dummy_property_map()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.off"); - CGAL::read_off_points_and_normals( - input, - std::front_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.off"); - CGAL::read_off_points_and_normals( - input, - std::front_inserter(pv_pairs), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map(), - Kernel()); - input.clear(); - input.close(); - - input.open("data/read_test/simple.off"); - CGAL::read_off_points_and_normals( - input, - std::front_inserter(points), - boost::dummy_property_map()); - input.clear(); - input.close(); -} - -int main() { - if(!test_no_deduction_points_and_normals_xyz("data/read_test/simple.xyz")) { - return EXIT_FAILURE; - } - std::cerr << "test_no_deduction_points_and_normals_xyz OK." << std::endl; - - if(!test_no_deduction_points_and_normals_off("data/read_test/simple.off")) { - return EXIT_FAILURE; - } - std::cerr << "test_no_deduction_points_and_normals_off OK." << std::endl; - - if(!test_no_deduction_points_xyz("data/read_test/simple.xyz")) { - return EXIT_FAILURE; - } - std::cerr << "test_no_deduction_points_xyz OK." << std::endl; - - if(!test_no_deduction_points_off("data/read_test/simple.off")) { - return EXIT_FAILURE; - } - std::cerr << "test_no_deduction_points_off OK." << std::endl; - - compile_test(); - return EXIT_SUCCESS; -} diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_remove_outliers_test.cmd b/Point_set_processing_3/test/Point_set_processing_3/deprecated_remove_outliers_test.cmd deleted file mode 100644 index 19722151afc..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_remove_outliers_test.cmd +++ /dev/null @@ -1 +0,0 @@ -data/*.xyz diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_remove_outliers_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_remove_outliers_test.cpp deleted file mode 100644 index 0a473a22a57..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_remove_outliers_test.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include - -// remove_outliers_test.cpp - -//---------------------------------------------------------- -// Test the outlier removal methods: -// For each input point set, remove outliers. -// Input format is .xyz. -// No output. -//---------------------------------------------------------- -// remove_outliers_test points1.xyz points2.xyz... - -// CGAL -#include -#include -#include - -// This package -#include -#include - -#include -#include -#include -#include - - -// ---------------------------------------------------------------------------- -// Types -// ---------------------------------------------------------------------------- - -// kernel -typedef CGAL::Simple_cartesian Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point; - - -// ---------------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------------- - -// Removes outliers -void test_avg_knn_sq_distance(std::deque& points, // input point set - unsigned int nb_neighbors_remove_outliers, // K-nearest neighbors - double removed_percentage) // percentage of points to remove -{ - CGAL::Timer task_timer; task_timer.start(); - std::cerr << "Removes outliers wrt average squared distance to k nearest neighbors (remove " - << removed_percentage << "%, k=" - << nb_neighbors_remove_outliers << ")...\n"; - - // Removes outliers using erase-remove idiom - points.erase(CGAL::remove_outliers(points.begin(), points.end(), - nb_neighbors_remove_outliers, removed_percentage), - points.end()); - - // Optional: after erase(), use Scott Meyer's "swap trick" to trim excess capacity - std::deque(points).swap(points); - - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "ok: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; -} - - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -int main(int argc, char * argv[]) -{ - std::cerr << "Outlier removal test" << std::endl; - - //*************************************** - // decode parameters - //*************************************** - - // usage - if(argc < 2) - { - std::cerr << "For each input point set, remove outliers.\n"; - std::cerr << "\n"; - std::cerr << "Usage: " << argv[0] << " file1.xyz file2.xyz..." << std::endl; - std::cerr << "Input file format is .xyz.\n"; - std::cerr << "No output" << std::endl; - return EXIT_FAILURE; - } - - // Outlier Removal options - const double removed_percentage = 5.0 /* % */; // percentage of outliers to remove - const unsigned int nb_neighbors_remove_outliers = 24; // K-nearest neighbors - - // Accumulated errors - int accumulated_fatal_err = EXIT_SUCCESS; - - // Process each input file - for(int i=1; i points; - std::cerr << "Open " << input_filename << " for reading..." << std::endl; - - // If XYZ file format: - std::ifstream stream(input_filename.c_str()); - if(stream && - CGAL::read_xyz_points(stream, std::back_inserter(points))) - { - std::cerr << "ok (" << points.size() << " points)" << std::endl; - } - else - { - std::cerr << "Error: cannot read file " << input_filename << std::endl; - accumulated_fatal_err = EXIT_FAILURE; - continue; - } - - //*************************************** - // Test - //*************************************** - - test_avg_knn_sq_distance(points, nb_neighbors_remove_outliers, removed_percentage); - - } // for each input file - - std::cerr << std::endl; - - // Returns accumulated fatal error - std::cerr << "Tool returned " << accumulated_fatal_err << std::endl; - return accumulated_fatal_err; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_smoothing_test.cmd b/Point_set_processing_3/test/Point_set_processing_3/deprecated_smoothing_test.cmd deleted file mode 100644 index 19722151afc..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_smoothing_test.cmd +++ /dev/null @@ -1 +0,0 @@ -data/*.xyz diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_smoothing_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_smoothing_test.cpp deleted file mode 100644 index 99e1356f9ca..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_smoothing_test.cpp +++ /dev/null @@ -1,140 +0,0 @@ -#include - -// smoothing_test.cpp - -//---------------------------------------------------------- -// Test the smoothing methods: -// For each input point set, smooth it. -// Input format is .xyz. -// No output. -//---------------------------------------------------------- -// smoothing_test points1.xyz points2.xyz... - -// CGAL -#include -#include -#include - -// This package -#include -#include - -#include -#include -#include -#include - - -// ---------------------------------------------------------------------------- -// Types -// ---------------------------------------------------------------------------- - -// kernel -typedef CGAL::Simple_cartesian Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point; -typedef Kernel::Vector_3 Vector; - -// Concurrency -#ifdef CGAL_LINKED_WITH_TBB -typedef CGAL::Parallel_tag Concurrency_tag; -#else -typedef CGAL::Sequential_tag Concurrency_tag; -#endif - -// ---------------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------------- - -void test_smooth_jet_fitting(std::deque& points,// input point set - unsigned int nb_neighbors_smooth_jet_fitting) // number of neighbors -{ - CGAL::Timer task_timer; task_timer.start(); - std::cerr << "Smoothes Point Set (k=" << nb_neighbors_smooth_jet_fitting << ")...\n"; - - CGAL::jet_smooth_point_set(points.begin(), points.end(), - nb_neighbors_smooth_jet_fitting); - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "ok: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; -} - - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -int main(int argc, char * argv[]) -{ - std::cerr << "Smoothing test" << std::endl; - - //*************************************** - // decode parameters - //*************************************** - - // usage - if(argc < 2) - { - std::cerr << "For each input point set, smooth it.\n"; - std::cerr << "\n"; - std::cerr << "Usage: " << argv[0] << " file1.xyz file2.xyz..." << std::endl; - std::cerr << "Input file format is .xyz.\n"; - std::cerr << "No output" << std::endl; - return EXIT_FAILURE; - } - - // Smoothing options - const unsigned int nb_neighbors_smooth_jet_fitting = 24; // K-nearest neighbors (smooth points by Jet Fitting) - - // Accumulated errors - int accumulated_fatal_err = EXIT_SUCCESS; - - // Process each input file - for(int i=1; i points; - std::cerr << "Open " << input_filename << " for reading..." << std::endl; - - // If XYZ file format: - std::ifstream stream(input_filename.c_str()); - if(stream && - CGAL::read_xyz_points(stream, std::back_inserter(points))) - { - std::cerr << "ok (" << points.size() << " points)" << std::endl; - } - else - { - std::cerr << "Error: cannot read file " << input_filename << std::endl; - accumulated_fatal_err = EXIT_FAILURE; - continue; - } - - //*************************************** - // Test - //*************************************** - - test_smooth_jet_fitting(points, nb_neighbors_smooth_jet_fitting); - - } // for each input file - - std::cerr << std::endl; - - // Returns accumulated fatal error - std::cerr << "Tool returned " << accumulated_fatal_err << std::endl; - return accumulated_fatal_err; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_vcm_all_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_vcm_all_test.cpp deleted file mode 100644 index e3b8620fe9d..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_vcm_all_test.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include - -#include -#include -#include -#include - -#include - -#include -#include - - -// Types -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; -typedef Kernel::Point_3 Point; -typedef Kernel::Vector_3 Vector; - -typedef std::array Covariance; - - -bool test_fandisk() -{ -std::cout << "=== test_fandisk ===\n"; - std::size_t nb_points = 15843; - CGAL::Identity_property_map pmap; - Covariance expected; - int index; - - // Reads a .xyz point set file in points[]. - std::vector points; - std::vector cov; - boost::dynamic_bitset on_feature_edge(nb_points); - points.reserve(nb_points); - cov.reserve(nb_points); - std::ifstream stream("data/fandisk.off"); - if (!stream || - !CGAL::read_off_points(stream, - std::back_inserter(points), - pmap)) - { - std::cerr << "Error: cannot read file data/fandisk.off" << std::endl; - return false; - } - -// test vcm without convolution - std::cout << " Test compute vcm without convolution\n"; - cov.clear(); - CGAL::compute_vcm(points.begin(), points.end(), pmap, cov, 0.2, 0, Kernel()); - -// check the cov matrices - std::ifstream cov_stream("vcm_all_test-covmat_no_cov.txt"); - while( cov_stream >> index >> expected[0] >> expected[1] >> expected[2] >> expected[3] >> expected[4] >> expected[5] ) - for(int i=0;i<6;++i) - assert( CGAL::abs(cov[index][i]-expected[i]) <= CGAL::abs(expected[i])*5/100 ); - cov_stream.close(); - -// check points detected as feature point - int indices_no_cov[243]={81,616,694,726,740,812,814,823,834,835,874,1153,1170,1188,1273,1382,1415,1563,1720,1745,1752,1763,1825,2013,2041,2042,2065,2181,2463,2508,2573,2616,2630,2632,2654,2715,2842,2864,2867,2893,3006,3014,3018,3121,3122,3144,3382,3654,3740,3914,4392,4454,4549,4765,4774,4804,4843,4862,4918,4949,4980,5054,5150,5178,5179,5181,5183,5373,5374,5557,5583,5584,5655,5657,5767,5827,6380,6565,6619,6645,6784,6786,6839,6895,6896,6929,7064,7071,7074,7098,7239,7350,7545,7659,7661,7681,7709,7843,7859,7895,7973,7983,8003,8064,8115,8125,8143,8255,8334,8428,8429,8464,8554,8689,8768,8769,8881,8883,8924,8962,8963,9121,9168,9213,9267,9380,9495,9503,9536,9577,9648,9661,9665,9668,9695,9696,9740,9753,9798,9805,9821,9972,9977,10095,10096,10254,10266,10267,10269,10297,10305,10671,10725,10727,10824,10915,10948,11015,11026,11201,11234,11455,11466,11553,11611,11667,11713,11724,11745,11849,11903,11952,11992,12008,12287,12297,12321,12342,12467,12468,12511,12530,12715,12758,12987,13012,13045,13188,13210,13380,13442,13443,13475,13503,13549,13564,13572,13591,13630,13672,13694,13740,13742,13791,13856,13896,13905,13942,13945,14008,14055,14077,14140,14166,14397,14460,14482,14485,14546,14566,14614,14667,14721,14793,14816,14864,14928,15029,15037,15090,15132,15148,15168,15360,15363,15384,15394,15478,15501,15522,15810,15811,15827}; - on_feature_edge.reset(); - for(int i=0;i<243;++i) - on_feature_edge.set(indices_no_cov[i]); - std::size_t nb_wrong=0; - for (std::size_t i=0; i> index >> expected[0] >> expected[1] >> expected[2] >> expected[3] >> expected[4] >> expected[5] ) - for(int i=0;i<6;++i) - assert( CGAL::abs(cov[index][i]-expected[i]) <= CGAL::abs(expected[i])*5/100 ); - cov_stream.close(); -// check points detected as feature point - int indices_with_cov[2746]={21,22,23,24,25,36,37,38,42,43,44,45,77,78,79,80,81,82,83,89,120,121,129,130,173,174,181,182,184,185,186,215,216,221,222,228,232,233,234,236,255,256,269,270,271,275,288,289,290,291,292,293,294,315,317,329,354,355,356,378,379,380,381,382,383,402,403,404,405,419,420,467,469,477,478,479,480,482,483,497,498,499,521,527,528,536,557,581,582,586,587,593,594,613,614,616,617,618,619,624,625,627,629,644,678,693,694,695,696,700,725,726,727,734,735,736,740,741,742,755,791,794,798,811,812,813,814,823,824,825,826,829,830,831,835,844,850,851,858,859,860,861,874,875,876,927,928,936,945,946,962,970,972,985,987,998,1003,1005,1014,1015,1016,1059,1060,1086,1102,1103,1104,1111,1112,1113,1121,1122,1129,1131,1133,1134,1135,1153,1154,1164,1167,1168,1169,1170,1171,1172,1173,1180,1186,1187,1188,1192,1193,1194,1195,1196,1197,1198,1214,1216,1236,1237,1238,1257,1258,1266,1270,1271,1272,1273,1298,1299,1305,1309,1310,1311,1312,1317,1318,1326,1330,1339,1342,1343,1347,1348,1349,1368,1370,1372,1373,1374,1375,1381,1382,1383,1387,1389,1393,1395,1399,1401,1412,1415,1416,1417,1482,1490,1492,1493,1503,1504,1505,1506,1507,1521,1522,1543,1544,1549,1550,1552,1553,1563,1564,1566,1567,1568,1569,1570,1595,1597,1598,1599,1650,1651,1652,1657,1659,1660,1661,1662,1704,1710,1711,1719,1720,1721,1740,1745,1746,1747,1749,1750,1751,1752,1754,1762,1763,1764,1765,1770,1771,1816,1817,1818,1823,1824,1825,1828,1829,1830,1853,1854,1855,1856,1857,1859,1867,1868,1872,1931,1933,1935,1936,1958,1959,1971,1972,1988,1998,1999,2000,2001,2005,2006,2007,2011,2012,2013,2028,2030,2032,2041,2042,2043,2044,2051,2052,2053,2063,2064,2065,2072,2106,2108,2109,2123,2129,2130,2132,2133,2134,2135,2160,2170,2178,2179,2180,2181,2206,2238,2247,2269,2296,2309,2310,2311,2330,2331,2332,2334,2343,2345,2346,2358,2361,2362,2363,2368,2370,2398,2399,2400,2440,2441,2446,2447,2448,2452,2463,2464,2475,2502,2503,2508,2509,2510,2511,2512,2520,2530,2567,2572,2573,2576,2584,2585,2612,2614,2615,2616,2621,2625,2626,2627,2628,2630,2631,2632,2635,2648,2650,2651,2652,2653,2654,2660,2661,2662,2664,2665,2666,2667,2669,2671,2680,2692,2699,2700,2701,2703,2713,2714,2715,2719,2720,2721,2726,2727,2733,2745,2746,2759,2778,2786,2796,2797,2798,2803,2804,2842,2843,2844,2845,2849,2851,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2891,2892,2893,2919,2921,2941,2942,2964,2967,2968,2969,2970,2982,3004,3005,3006,3008,3009,3010,3012,3013,3014,3015,3016,3017,3018,3019,3037,3038,3039,3079,3080,3081,3094,3118,3120,3121,3122,3123,3130,3131,3134,3144,3145,3146,3176,3177,3178,3179,3195,3196,3197,3198,3200,3209,3211,3236,3238,3244,3245,3254,3255,3259,3260,3261,3262,3276,3277,3296,3297,3309,3322,3323,3328,3329,3337,3340,3368,3380,3381,3382,3386,3387,3401,3409,3410,3411,3412,3450,3452,3507,3508,3523,3524,3525,3532,3533,3542,3558,3559,3568,3569,3575,3605,3606,3607,3610,3611,3624,3629,3639,3645,3646,3654,3655,3688,3694,3695,3738,3739,3740,3741,3745,3746,3747,3751,3760,3761,3762,3763,3773,3802,3817,3818,3819,3820,3840,3844,3880,3881,3907,3908,3909,3913,3914,3923,3931,3932,3933,3942,3963,3964,3965,3983,3989,3990,3991,3992,4013,4014,4019,4020,4022,4023,4024,4026,4028,4029,4065,4076,4077,4078,4135,4136,4137,4138,4143,4150,4170,4171,4180,4189,4197,4198,4200,4201,4206,4208,4209,4211,4212,4213,4224,4237,4286,4287,4288,4296,4346,4348,4355,4391,4392,4411,4412,4413,4414,4429,4433,4434,4451,4453,4454,4455,4472,4505,4508,4513,4514,4519,4535,4537,4549,4550,4551,4555,4556,4557,4558,4562,4568,4576,4584,4586,4587,4617,4619,4629,4631,4632,4653,4657,4696,4698,4700,4701,4715,4718,4727,4728,4729,4732,4733,4734,4740,4757,4758,4765,4767,4772,4773,4774,4775,4786,4787,4800,4801,4802,4803,4804,4805,4806,4815,4817,4843,4844,4845,4846,4848,4854,4862,4863,4864,4870,4871,4900,4901,4902,4903,4906,4918,4919,4922,4928,4929,4935,4943,4947,4948,4949,4967,4972,4973,4976,4979,4980,4981,4986,4987,4988,4991,5002,5003,5004,5006,5007,5010,5012,5013,5014,5015,5016,5040,5053,5054,5055,5091,5092,5102,5103,5111,5115,5118,5119,5123,5134,5149,5150,5151,5173,5175,5176,5177,5178,5179,5180,5181,5182,5183,5190,5191,5244,5245,5255,5258,5259,5263,5265,5297,5298,5326,5327,5330,5331,5336,5338,5364,5366,5370,5371,5372,5373,5374,5375,5379,5391,5393,5396,5397,5399,5400,5401,5411,5412,5413,5459,5463,5464,5489,5518,5519,5520,5522,5524,5531,5532,5539,5550,5551,5555,5556,5557,5583,5584,5585,5594,5595,5614,5619,5620,5621,5639,5651,5653,5655,5656,5657,5661,5662,5668,5681,5682,5683,5684,5687,5688,5689,5697,5700,5701,5702,5703,5707,5708,5713,5724,5725,5737,5738,5750,5766,5767,5782,5783,5784,5785,5790,5805,5806,5810,5826,5836,5857,5858,5860,5882,5883,5903,5904,5905,5907,5908,5909,5910,5918,5919,5921,5922,5928,5930,5931,5932,5936,5937,5953,5958,5960,5961,5982,5988,5989,6016,6025,6026,6061,6062,6086,6087,6095,6096,6097,6103,6104,6108,6109,6114,6116,6119,6121,6129,6156,6157,6158,6171,6172,6173,6179,6180,6201,6225,6227,6228,6229,6232,6233,6234,6246,6247,6248,6268,6269,6270,6271,6282,6283,6285,6289,6290,6309,6310,6341,6359,6362,6367,6369,6370,6371,6372,6380,6381,6400,6401,6402,6422,6431,6445,6446,6483,6487,6488,6492,6498,6500,6506,6507,6510,6511,6519,6520,6521,6522,6523,6524,6525,6543,6552,6553,6559,6560,6561,6564,6565,6567,6579,6585,6586,6587,6595,6596,6599,6614,6615,6616,6619,6627,6631,6632,6633,6634,6635,6637,6638,6645,6651,6652,6653,6661,6662,6669,6670,6694,6705,6707,6708,6709,6714,6718,6722,6723,6742,6743,6744,6746,6747,6763,6764,6765,6766,6767,6783,6784,6785,6786,6801,6809,6810,6816,6817,6846,6858,6873,6874,6875,6876,6880,6881,6885,6895,6896,6897,6908,6917,6919,6927,6929,6930,6931,6932,6942,6944,6945,6954,6955,6956,6962,6966,6995,7033,7034,7037,7043,7044,7045,7049,7063,7064,7065,7071,7072,7073,7074,7084,7090,7092,7093,7096,7097,7098,7099,7104,7118,7127,7128,7133,7174,7194,7195,7197,7198,7199,7208,7209,7213,7237,7238,7239,7240,7253,7254,7255,7259,7279,7342,7347,7348,7349,7350,7352,7354,7355,7357,7358,7368,7385,7395,7429,7430,7431,7432,7490,7498,7529,7534,7537,7543,7544,7545,7546,7560,7562,7563,7564,7568,7569,7572,7584,7590,7602,7627,7628,7634,7636,7641,7642,7643,7644,7645,7657,7658,7659,7660,7661,7666,7668,7671,7676,7680,7681,7682,7699,7703,7706,7709,7710,7714,7715,7718,7719,7721,7722,7724,7727,7730,7732,7754,7769,7771,7775,7785,7786,7810,7811,7812,7842,7843,7844,7850,7858,7859,7869,7873,7877,7890,7891,7892,7893,7894,7895,7896,7900,7913,7930,7931,7932,7933,7934,7938,7939,7940,7941,7945,7951,7960,7961,7966,7970,7971,7972,7973,7974,7975,7977,7980,7981,7982,7983,7985,7999,8003,8004,8005,8012,8013,8015,8017,8047,8053,8064,8065,8083,8084,8087,8093,8094,8095,8097,8115,8116,8117,8120,8123,8124,8125,8126,8129,8131,8132,8135,8136,8143,8144,8146,8147,8148,8185,8188,8205,8206,8211,8212,8213,8214,8215,8225,8229,8230,8252,8255,8256,8257,8258,8260,8293,8294,8295,8305,8306,8307,8332,8333,8334,8335,8338,8342,8343,8344,8345,8365,8366,8367,8368,8373,8374,8379,8380,8384,8410,8426,8427,8428,8429,8442,8443,8444,8445,8462,8463,8464,8465,8467,8477,8482,8483,8484,8485,8499,8500,8501,8502,8503,8552,8553,8554,8565,8604,8605,8612,8626,8637,8638,8639,8644,8647,8648,8649,8659,8665,8676,8677,8680,8681,8683,8687,8688,8689,8696,8697,8725,8726,8727,8740,8742,8743,8750,8752,8753,8758,8768,8784,8785,8786,8787,8788,8796,8803,8821,8830,8831,8842,8849,8859,8860,8881,8883,8892,8893,8900,8901,8902,8912,8923,8924,8925,8941,8942,8943,8945,8946,8947,8948,8949,8962,8963,8989,8994,9006,9007,9010,9011,9015,9017,9030,9057,9058,9060,9061,9065,9067,9096,9099,9103,9118,9119,9120,9121,9122,9130,9134,9141,9154,9155,9164,9168,9169,9170,9179,9181,9194,9208,9210,9211,9212,9213,9220,9223,9226,9235,9263,9264,9266,9267,9268,9269,9286,9310,9311,9312,9325,9332,9350,9352,9355,9356,9358,9361,9374,9376,9377,9380,9381,9385,9389,9400,9408,9409,9420,9424,9430,9438,9445,9446,9460,9461,9470,9473,9483,9495,9496,9500,9501,9503,9512,9516,9529,9530,9536,9542,9555,9560,9561,9565,9566,9567,9577,9582,9583,9587,9589,9591,9592,9626,9628,9629,9634,9635,9640,9641,9642,9646,9647,9648,9649,9650,9652,9658,9661,9662,9664,9665,9668,9669,9676,9678,9679,9680,9682,9687,9688,9689,9695,9696,9703,9730,9740,9741,9742,9743,9748,9749,9751,9752,9753,9763,9779,9780,9798,9805,9806,9814,9821,9822,9823,9824,9831,9837,9838,9848,9854,9858,9859,9860,9862,9872,9874,9899,9900,9905,9906,9925,9926,9928,9932,9938,9945,9950,9953,9961,9965,9966,9967,9972,9976,9977,9988,10015,10016,10035,10038,10039,10042,10043,10044,10045,10054,10055,10057,10058,10060,10063,10065,10073,10074,10080,10095,10096,10097,10099,10103,10104,10113,10121,10122,10124,10125,10132,10143,10148,10168,10172,10173,10177,10181,10182,10187,10204,10205,10216,10220,10230,10236,10254,10255,10266,10267,10269,10270,10297,10298,10304,10305,10306,10311,10312,10313,10317,10327,10328,10331,10342,10343,10373,10378,10394,10395,10396,10403,10408,10409,10430,10432,10434,10435,10470,10471,10479,10504,10517,10542,10543,10544,10556,10557,10559,10560,10565,10567,10568,10569,10571,10572,10584,10589,10605,10607,10613,10615,10626,10627,10633,10638,10642,10643,10644,10649,10655,10656,10657,10664,10665,10670,10671,10677,10687,10688,10690,10699,10700,10701,10723,10724,10725,10727,10730,10734,10738,10739,10757,10758,10759,10761,10762,10771,10774,10775,10776,10777,10780,10783,10784,10787,10788,10807,10808,10815,10823,10824,10834,10855,10867,10874,10879,10889,10911,10912,10913,10914,10915,10916,10918,10919,10924,10925,10928,10932,10933,10937,10942,10946,10948,10949,10953,10954,10964,10977,10978,11002,11006,11007,11008,11015,11021,11022,11026,11027,11032,11060,11067,11068,11069,11075,11080,11082,11083,11084,11090,11105,11107,11110,11111,11112,11115,11116,11120,11130,11145,11146,11155,11165,11183,11192,11193,11197,11201,11202,11209,11210,11211,11217,11219,11222,11231,11232,11234,11249,11251,11252,11269,11292,11294,11298,11327,11330,11331,11338,11344,11345,11346,11347,11349,11350,11364,11365,11366,11367,11386,11387,11389,11390,11404,11410,11412,11415,11416,11417,11430,11436,11437,11455,11456,11457,11465,11466,11467,11476,11480,11483,11492,11503,11506,11519,11520,11521,11524,11527,11528,11532,11533,11534,11535,11543,11545,11553,11554,11560,11579,11583,11603,11604,11606,11611,11630,11641,11651,11656,11667,11668,11683,11685,11686,11687,11695,11704,11709,11710,11711,11713,11721,11723,11724,11725,11726,11727,11743,11745,11747,11748,11756,11769,11787,11792,11803,11804,11836,11841,11842,11848,11849,11860,11861,11903,11911,11914,11915,11917,11918,11925,11929,11938,11939,11951,11952,11953,11955,11956,11969,11970,11979,11985,11986,11991,11992,11994,12007,12008,12009,12010,12026,12048,12059,12060,12069,12070,12071,12079,12098,12099,12109,12126,12127,12132,12143,12146,12148,12149,12155,12171,12173,12174,12175,12187,12191,12197,12212,12213,12214,12219,12227,12233,12252,12267,12278,12285,12286,12287,12291,12294,12295,12296,12297,12299,12306,12317,12321,12322,12324,12330,12331,12333,12341,12342,12343,12344,12357,12364,12369,12374,12383,12384,12390,12397,12398,12399,12400,12402,12411,12412,12433,12449,12467,12468,12469,12495,12505,12511,12513,12515,12516,12517,12530,12531,12539,12540,12541,12549,12550,12553,12560,12566,12567,12582,12586,12598,12601,12602,12603,12606,12612,12613,12614,12615,12619,12628,12636,12639,12645,12650,12651,12659,12701,12715,12716,12717,12732,12738,12740,12757,12758,12761,12778,12779,12780,12781,12800,12802,12810,12811,12812,12816,12827,12832,12833,12841,12842,12843,12882,12883,12884,12885,12887,12888,12895,12905,12917,12926,12927,12928,12929,12935,12940,12945,12952,12960,12981,12984,12987,12991,12994,13012,13014,13021,13022,13043,13044,13045,13051,13054,13055,13056,13057,13059,13064,13067,13068,13069,13070,13081,13083,13088,13090,13092,13095,13102,13105,13106,13112,13113,13120,13127,13132,13137,13138,13139,13140,13144,13145,13146,13147,13157,13163,13188,13192,13196,13199,13200,13210,13234,13239,13247,13248,13252,13261,13263,13264,13269,13272,13273,13276,13282,13284,13288,13307,13323,13325,13326,13331,13332,13333,13339,13341,13342,13343,13344,13346,13347,13348,13349,13350,13358,13361,13364,13366,13367,13369,13370,13371,13374,13379,13380,13396,13397,13406,13415,13420,13421,13422,13424,13426,13428,13429,13440,13442,13443,13453,13458,13462,13467,13468,13474,13475,13487,13488,13499,13503,13510,13520,13528,13530,13537,13548,13549,13550,13563,13564,13571,13572,13574,13576,13579,13591,13595,13597,13622,13626,13629,13630,13631,13649,13657,13666,13667,13672,13673,13679,13682,13683,13694,13696,13706,13707,13721,13725,13731,13732,13738,13739,13740,13742,13743,13748,13753,13763,13767,13771,13783,13789,13790,13791,13796,13799,13803,13804,13805,13806,13810,13815,13817,13818,13821,13822,13833,13837,13842,13843,13855,13856,13857,13863,13867,13872,13873,13874,13875,13876,13877,13878,13887,13888,13889,13896,13905,13906,13916,13918,13929,13933,13939,13942,13944,13945,13946,13947,13948,13955,13958,13959,13973,13984,13985,13986,13997,14001,14002,14005,14007,14008,14009,14020,14036,14051,14055,14056,14057,14064,14065,14070,14077,14093,14097,14099,14113,14114,14116,14117,14126,14129,14130,14133,14139,14140,14141,14142,14146,14154,14164,14165,14166,14169,14178,14181,14189,14197,14198,14213,14222,14226,14233,14238,14239,14245,14246,14251,14252,14262,14263,14267,14270,14273,14294,14299,14304,14319,14325,14337,14338,14343,14345,14347,14353,14360,14361,14362,14368,14369,14382,14387,14388,14396,14397,14409,14411,14415,14424,14425,14445,14449,14460,14462,14464,14466,14468,14475,14482,14483,14485,14495,14496,14503,14504,14515,14525,14526,14538,14545,14546,14547,14548,14549,14560,14561,14562,14563,14566,14571,14577,14596,14597,14598,14614,14628,14640,14644,14648,14652,14654,14658,14660,14662,14667,14668,14669,14670,14685,14694,14700,14701,14702,14707,14716,14721,14722,14726,14740,14741,14742,14744,14755,14758,14780,14781,14787,14793,14794,14796,14797,14801,14815,14816,14824,14830,14846,14848,14864,14865,14879,14881,14883,14884,14903,14905,14926,14928,14932,14933,14934,14935,14936,14961,14965,14967,14973,14975,14983,14990,14999,15000,15004,15005,15006,15007,15022,15023,15029,15036,15037,15038,15045,15047,15054,15061,15072,15089,15090,15101,15114,15118,15128,15129,15132,15141,15148,15149,15150,15158,15160,15161,15164,15165,15168,15172,15173,15174,15183,15191,15194,15196,15200,15209,15210,15213,15216,15217,15221,15228,15229,15243,15247,15286,15287,15291,15321,15322,15331,15352,15353,15354,15360,15362,15363,15377,15379,15384,15393,15394,15395,15397,15403,15406,15412,15422,15451,15455,15470,15473,15476,15478,15482,15487,15492,15498,15501,15504,15522,15552,15556,15574,15576,15581,15585,15586,15587,15602,15603,15604,15605,15615,15616,15617,15624,15625,15637,15644,15646,15662,15663,15664,15682,15688,15689,15692,15726,15735,15740,15743,15756,15758,15763,15796,15802,15803,15805,15809,15810,15811,15818,15823,15827,15836,15839,15841}; - on_feature_edge.reset(); - for(int i=0;i<2746;++i) - on_feature_edge.set(indices_with_cov[i]); - nb_wrong=0; - for (std::size_t i=0; i - -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; -typedef CGAL::Point_3 Point_3; -typedef CGAL::Vector_3 Vector_3; -typedef std::pair PointWithNormal; - -int main (void) { - // Generate points on a plane - int k = 100; - double r = 10; - - std::vector points; - points.push_back(std::make_pair(Point_3(0, 0, 0), Vector_3(0, 0, 0))); - for (int i = 0; i < k; ++i) { - double theta = 2 * i * CGAL_PI / k; - points.push_back(std::make_pair(Point_3(r * cos(theta), r * sin(theta), 0), - Vector_3(0, 0, 0))); - } - - // Estimate the normals using VCM - double R = 20; - vcm_estimate_normals(points.begin(), points.end(), - CGAL::First_of_pair_property_map(), - CGAL::Second_of_pair_property_map(), - R, 0.0); - - std::cout << "Normal is " << points[0].second << std::endl; - - // The normal at the origin should be (0, 0, 1) - double epsilon=2e-5; - assert(points[0].second.x() < epsilon && points[0].second.x() > -epsilon); - assert(points[0].second.y() < epsilon && points[0].second.y() > -epsilon); - assert(points[0].second.z() < 0 || (points[0].second.z() < 1+epsilon && points[0].second.z() > 1-epsilon)); - assert(points[0].second.z() > 0 || (points[0].second.z() < -1+epsilon && points[0].second.z() > -1-epsilon)); - - return 0; -} - diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_wlop_simplify_and_regularize_test.cmd b/Point_set_processing_3/test/Point_set_processing_3/deprecated_wlop_simplify_and_regularize_test.cmd deleted file mode 100644 index ee93d623f58..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_wlop_simplify_and_regularize_test.cmd +++ /dev/null @@ -1 +0,0 @@ -data/sphere_20k.xyz diff --git a/Point_set_processing_3/test/Point_set_processing_3/deprecated_wlop_simplify_and_regularize_test.cpp b/Point_set_processing_3/test/Point_set_processing_3/deprecated_wlop_simplify_and_regularize_test.cpp deleted file mode 100644 index eb7467d422d..00000000000 --- a/Point_set_processing_3/test/Point_set_processing_3/deprecated_wlop_simplify_and_regularize_test.cpp +++ /dev/null @@ -1,170 +0,0 @@ -#include - -// wlop_simplify_and_regularize_test.cpp - -//---------------------------------------------------------- -// Test the wlop simplify and regularize method: -// Input format is .xyz. -// No output. -//---------------------------------------------------------- -// wlop_simplify_and_regularize_test points1.xyz points2.xyz... - -// CGAL -#include -#include -#include -#include - -// This package -#include -#include - -#include -#include -#include -#include - - -// ---------------------------------------------------------------------------- -// Types -// ---------------------------------------------------------------------------- - -// kernel -typedef CGAL::Simple_cartesian Kernel; - -// Simple geometric types -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point; - -// ---------------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------------- - -// Removes outliers -template -void test_wlop_simplify_and_regularize( - std::vector& points, // input point set - std::vector& output, - double retain_percentage, // percentage of points to remove - double neighbor_radius, // neighborhood size - unsigned int iter_number, // iteration number - bool need_compute_density) - -{ - CGAL::Real_timer task_timer; task_timer.start(); - std::cerr << "Running WLOP simplify and regularize, (retain_percentage: " - << retain_percentage << "%, neighbor_radius=" - << neighbor_radius << ")...\n"; - - // Make room for sample points - std::vector points_sampled; - points_sampled.resize(static_cast(points.size() * (retain_percentage / 100.))); - - output.clear(); - // Run algorithm - CGAL::wlop_simplify_and_regularize_point_set( - points.begin(), - points.end(), - std::back_inserter(output), - retain_percentage, - neighbor_radius, - iter_number, - need_compute_density); - - output.clear(); - - std::size_t memory = CGAL::Memory_sizer().virtual_size(); - std::cerr << "ok: " << task_timer.time() << " seconds, " - << (memory>>20) << " Mb allocated" - << std::endl; -} - - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -int main(int argc, char * argv[]) -{ - std::cerr << "WLOP simplify and regularize" << std::endl; - - //*************************************** - // decode parameters - //*************************************** - - // usage - if(argc < 2) - { - std::cerr << "For each input point set, apply WLOP algorithm.\n"; - std::cerr << "\n"; - std::cerr << "Usage: " << argv[0] << " file1.xyz file2.xyz..." << std::endl; - std::cerr << "Input file format is .xyz.\n"; - std::cerr << "No output" << std::endl; - return EXIT_FAILURE; - } - - //Algorithm parameters - const double retain_percentage = 2; // percentage of points to retain. - const double neighbor_radius = 0.5; // neighbors size. - const unsigned int iter_number = 25; // number of iterations. - const bool need_compute_density = false; // if needed to compute density. - - // Accumulated errors - int accumulated_fatal_err = EXIT_SUCCESS; - - // Process each input file - for(int i=1; i points; - std::cerr << "Opening " << input_filename << " for reading..." << std::endl; - - // If XYZ file format: - std::ifstream stream(input_filename.c_str()); - if(stream && - CGAL::read_xyz_points(stream, std::back_inserter(points))) - { - std::cerr << "ok (" << points.size() << " points)" << std::endl; - } - else - { - std::cerr << "Error: cannot read file " << input_filename << std::endl; - accumulated_fatal_err = EXIT_FAILURE; - continue; - } - - //*************************************** - // Test - //*************************************** -#ifdef CGAL_LINKED_WITH_TBB - std::vector points2(points); -#endif - std::vector output; - test_wlop_simplify_and_regularize( - points, output, retain_percentage, neighbor_radius, - iter_number, need_compute_density); - -#ifdef CGAL_LINKED_WITH_TBB - output.clear(); - test_wlop_simplify_and_regularize( - points2, output, retain_percentage, neighbor_radius, - iter_number, need_compute_density); -#endif // CGAL_LINKED_WITH_TBB - - - } // for each input file - - std::cerr << std::endl; - // Returns accumulated fatal error - std::cerr << "Tool returned " << accumulated_fatal_err << std::endl; - return accumulated_fatal_err; -} diff --git a/Polygon/doc/Polygon/Polygon.txt b/Polygon/doc/Polygon/Polygon.txt index 44e90d92af8..279d24c457f 100644 --- a/Polygon/doc/Polygon/Polygon.txt +++ b/Polygon/doc/Polygon/Polygon.txt @@ -64,7 +64,7 @@ Polygons may be contours of a 3D object, where the contours are organized in parallel slices, generated by segmentation of image data from a scanner. -In order to avoid an explixit projection on the \c xy plane, one can +In order to avoid an explicit projection on the \c xy plane, one can use the traits class `Projection_traits_xy_3` which is part of the 2D and 3D Linear Geometric %Kernel. diff --git a/Polygon/include/CGAL/Polygon_2.h b/Polygon/include/CGAL/Polygon_2.h index 71f41762e8e..9bf1e438eef 100644 --- a/Polygon/include/CGAL/Polygon_2.h +++ b/Polygon/include/CGAL/Polygon_2.h @@ -148,13 +148,16 @@ class Polygon_2 { /// @{ /// Creates an empty polygon. - Polygon_2(const Traits & p_traits = Traits()) : traits(p_traits) {} + Polygon_2() : traits() {} + + /// Creates an empty polygon. + Polygon_2(const Traits & p_traits) : traits(p_traits) {} /// Copy constructor. Polygon_2(const Polygon_2& polygon) : d_container(polygon.d_container), traits(polygon.traits) {} - /// Introduces a polygon with vertices from the sequence + /// Creates a polygon with vertices from the sequence /// defined by the range \c [first,last). /// The value type of \c InputIterator must be \c Point_2. template diff --git a/Polygon/include/CGAL/Polygon_2/Polygon_2_simplicity.h b/Polygon/include/CGAL/Polygon_2/Polygon_2_simplicity.h index 0d051151704..d67caf0edfc 100644 --- a/Polygon/include/CGAL/Polygon_2/Polygon_2_simplicity.h +++ b/Polygon/include/CGAL/Polygon_2/Polygon_2_simplicity.h @@ -1,4 +1,4 @@ -// Copyright (c) 2001 +// Copyright (c) 2001 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), @@ -19,7 +19,7 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// +// // // Author(s) : Geert-Jan Giezeman @@ -211,7 +211,12 @@ template bool Less_segments:: operator()(Vertex_index i, Vertex_index j) const { - if (m_vertex_data->edges[j.as_int()].is_in_tree) { + if (i.as_int() == j.as_int()) { + // Some STL implementations may call comparator(x, x) + // to verify irreflexivity. Don't violate less_than_in_tree's + // preconditions in such an environment. + return false; + } else if (m_vertex_data->edges[j.as_int()].is_in_tree) { return less_than_in_tree(i,j); } else { return !less_than_in_tree(j,i); diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt index 6176b34f75c..4d34f30d8b3 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt @@ -368,7 +368,7 @@ should be considered as part of the clipping volume or not. Parameter to pass an output iterator. \n \b Type : a model of `OutputIterator` \n -\b Default : `Emptyset_iterator` +\b Default : `#CGAL::Emptyset_iterator` \cgalNPEnd \cgalNPBegin{erase_all_duplicates} \anchor PMP_erase_all_duplicates diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 004aad17948..7c2bf8ab4e2 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -484,7 +484,7 @@ described in \cgalCite{gueziec2001cutting}. To deal with polygon soups that cannot be converted to a combinatorially manifold surface, some points must be duplicated. Because a polygon soup does not have any connectivity (each point -has as many occurences as the number of polygons it belongs to), +has as many occurrences as the number of polygons it belongs to), duplicating one point (or a pair of points) amounts to duplicating the polygon to which it belongs. The duplicated points are either an endpoint of an edge incident to more diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h index 38bdd86ddef..fde41825686 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h @@ -299,7 +299,7 @@ void detect_sharp_edges(PolygonMesh& pmesh, * collects the surface patches of the faces incident to each vertex of the input polygon mesh. * * \tparam PolygonMesh a model of `HalfedgeListGraph` - * \tparam PatchIdMap a model of `ReadPropertyMap` with + * \tparam PatchIdMap a model of `ReadablePropertyMap` with `boost::graph_traits::%face_descriptor` as key type and the desired patch id, model of `CopyConstructible` as value type. * \tparam VertexIncidentPatchesMap a model of mutable `LvaluePropertyMap` with @@ -307,7 +307,7 @@ void detect_sharp_edges(PolygonMesh& pmesh, must be a container of `boost::property_traits::%value_type` and have a function `insert()`. A `std::set` or a `boost::unordered_set` are recommended, as a patch index may be inserted several times. - * \tparam EdgeIsFeatureMap a model of `ReadPropertyMap` with `boost::graph_traits::%edge_descriptor` + * \tparam EdgeIsFeatureMap a model of `ReadablePropertyMap` with `boost::graph_traits::%edge_descriptor` * as key type and `bool` as value type. * \param pmesh the polygon mesh * \param patch_id_map the property map containing the surface patch ids for the faces of `pmesh`. It must be already filled. diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h index 55f3d3dde04..ed08eaef152 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h @@ -1197,7 +1197,7 @@ public: // An_edge_per_polyline_map; #ifdef CGAL_COREFINEMENT_POLYHEDRA_DEBUG - #warning add a mechanism to handle the patches independantly \ + #warning add a mechanism to handle the patches independently \ (for example calculating the volume without \ building the polyhedron) \ This can be done by using a functor to which we give \ @@ -1553,7 +1553,7 @@ public: if (used_to_clip_a_surface) { // The following code is here to handle the case when an intersection polyline - // contains some border edges of tm1 that should be considered as an independant polyline. + // contains some border edges of tm1 that should be considered as an independent polyline. // This polyline removal should be handled by remove_unused_polylines. // However, since all nodes are of degree 2 the polyline is not split at // the correct point and trouble happen. Here the workaround consists in diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h new file mode 100644 index 00000000000..c8a9266375f --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h @@ -0,0 +1,1030 @@ +// Copyright (c) 2018 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// Mael Rouxel-Labbé + +#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERNAL_SNAP_H +#define CGAL_POLYGON_MESH_PROCESSING_INTERNAL_SNAP_H + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace CGAL { +namespace Polygon_mesh_processing { +namespace internal { + +// Assigns at each vertex the 'tolerance' value as tolerance, but bounded by a percentage of the length of its shortest incident edge +template +void assign_tolerance_with_local_edge_length_bound(const HalfedgeRange& hrange, + ToleranceMap& tol_pmap, + const typename GetGeomTraits::type::FT tolerance, + PolygonMesh& mesh, + const SourceNamedParameters& snp) +{ + using boost::get_param; + using boost::choose_param; + + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typedef typename GetVertexPointMap::type SVPM; + typedef typename GetGeomTraits::type GT; + typedef typename GT::FT FT; + + GT gt = choose_param(get_param(snp, internal_np::geom_traits), GT()); + SVPM svpm = choose_param(get_param(snp, internal_np::vertex_point), + get_property_map(vertex_point, mesh)); + + for(halfedge_descriptor hd : hrange) + { + const vertex_descriptor vd = target(hd, mesh); + CGAL::Halfedge_around_target_iterator hit, hend; + boost::tie(hit, hend) = CGAL::halfedges_around_target(vd, mesh); + CGAL_assertion(hit != hend); + + FT sq_length = gt.compute_squared_distance_3_object()(get(svpm, source(*hit, mesh)), + get(svpm, target(*hit, mesh))); + FT min_sq_dist = sq_length; + ++hit; + + for(; hit!=hend; ++hit) + { + sq_length = gt.compute_squared_distance_3_object()(get(svpm, source(*hit, mesh)), + get(svpm, target(*hit, mesh))); + + if(sq_length < min_sq_dist) + min_sq_dist = sq_length; + } + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "tolerance at vd: " /*<< vd */ << " [" << get(svpm, vd) << "]: min of " + << 0.9 * CGAL::approximate_sqrt(min_sq_dist) << " AND " << tolerance << std::endl; +#endif + put(tol_pmap, vd, CGAL::min(0.9 * CGAL::approximate_sqrt(min_sq_dist), tolerance)); + } +} + +template +void assign_tolerance_with_local_edge_length_bound(const HalfedgeRange& hrange, + ToleranceMap& tol_pmap, + const typename GetGeomTraits::type::FT tolerance, + PolygonMesh& mesh) +{ + return assign_tolerance_with_local_edge_length_bound(hrange, tol_pmap, tolerance, mesh, CGAL::parameters::all_default()); +} + +template +struct Snapping_pair +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename GeomTraits::FT FT; + + Snapping_pair(const vertex_descriptor vs_, const vertex_descriptor vt_, const FT sq_dist_) + : vs(vs_), vt(vt_), sq_dist(sq_dist_) + { } + + vertex_descriptor vs; + vertex_descriptor vt; + FT sq_dist; +}; + +template +struct Vertex_proximity_report +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + + typedef typename GeomTraits::FT FT; + typedef typename boost::property_traits::value_type Point; + + Vertex_proximity_report(DistanceMultiIndexContainer& snapping_pairs, + const SVPM& svpm, const PolygonMesh& smesh, + const TVPM& tvpm, const PolygonMesh& tmesh, + const ToleranceMap& tol_pmap, + const GeomTraits& gt) + : + m_snapping_pairs(snapping_pairs), + is_same_mesh((&smesh == &tmesh)), + svpm(svpm), tvpm(tvpm), + tol_pmap(tol_pmap), + gt(gt) + { } + + void operator()(const Box& a, const Box& b) + { + vertex_descriptor va = a.info(); + vertex_descriptor vb = b.info(); + + if(is_same_mesh && va == vb) + return; + + const Point sp = get(svpm, va); + const Point tp = get(tvpm, vb); + const FT tol = get(tol_pmap, va); + + // Don't reject a '0' distance, it still needs to lock the points in place + const FT sq_dist = gt.compute_squared_distance_3_object()(sp, tp); + CGAL::Comparison_result res = CGAL::compare(sq_dist, tol * tol); + +#ifdef CGAL_PMP_SNAP_DEBUG_PP + std::cout << "distance between " /*<< va*/ << " [" << sp << "] and " + /*<< vb*/ << " [" << tp << "]: " << sq_dist + << " (bound: " << tol*tol << ") larger? " << (res == CGAL::LARGER) + << std::endl; +#endif + + if(res == CGAL::LARGER) + return; + + m_snapping_pairs.insert(Snapping_pair(va, vb, sq_dist)); + } + +private: + DistanceMultiIndexContainer& m_snapping_pairs; + + const bool is_same_mesh; + const SVPM& svpm; + const TVPM& tvpm; + const ToleranceMap& tol_pmap; + const GeomTraits& gt; +}; + +} // namespace internal + +namespace experimental { + +// This is the function if you know what you're doing with the ranges +// +// \ingroup PMP_repairing_grp +// +// Attempts to snap the vertices in `source_hrange` onto the vertices in `target_hrange`. +// A vertex of the source range is only snapped to a vertex of the target mesh +// if its distance to the target mesh vertex is smaller than a user-chosen bound. +// If a source vertex can be snapped onto multiple vertices of the target +// range, the closest target vertex is used. +// If multiple vertices within the source range could be snapped onto the same target vertex, +// the source vertex closest to the target vertex will be snapped. Other source vertices will try to snap +// to free target vertices until they find a valid target, or until there is no more target +// to snap to (within the tolerance). +// +// @warning This function does not give any guarantee on the conformity between the source and target meshes after the snapping. +// @warning This function does not merge vertices together. +// +// @tparam PolygonMesh a model of `FaceListGraph` and `MutableFaceGraph` +// @tparam SourceHalfedgeRange a model of `Range` with value type `boost::graph_traits::%halfedge_descriptor` +// @tparam TargetHalfedgeRange a model of `Range` with value type `boost::graph_traits::%halfedge_descriptor` +// @tparam ToleranceMap a model of `ReadablePropertyMap` with key type `boost::graph_traits::%vertex_descriptor` +// and value type `GetGeomTraits::type::FT` +// @tparam SourceNamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" +// @tparam TargetNamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" +// +// @param source_hrange a range of vertices of the source mesh whose positions can be changed. +// the vertices must be border vertices of `smesh`. +// @param smesh the source mesh whose border vertices might be moved +// @param target_hrange a range of vertices of the target mesh which are potential new positions +// for the vertices in the source range +// @param tmesh the target mesh to which the vertices in `target_hrange` belong +// @param tol_pmap a tolerance map associating to each vertex of the source range a tolerance value: +// potential projection targets are sought in a sphere centered at the vertex and +// whose radius is the tolerance value. +// @param snp optional \ref pmp_namedparameters "Named Parameters" related to the source mesh, +// amongst those described below: +// +// \cgalNamedParamsBegin +// \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of the source mesh. +// The type of this map is model of `ReadWritePropertyMap`. +// If this parameter is omitted, an internal property map for +// `CGAL::vertex_point_t` must be available in `PolygonMesh` +// \cgalParamEnd +// \cgalParamBegin{geom_traits} a geometric traits class instance. +// The traits class must provide the nested types `Point_3` and `Vector_3`, +// and the nested functors : +// - `Construct_bbox_3` to construct a bounding box of a point, +// - `Compute_squared_distance_3` to compute the distance between two points, +// +// and, for each functor `Foo`, a function `Foo foo_object()` +// \cgalParamEnd +// \cgalNamedParamsEnd +// +// @param tnp optional \ref pmp_namedparameters "Named Parameters" related to the target mesh, +// amongst those described below: +// +// \cgalNamedParamsBegin +// \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of the target mesh. +// The type of this map is model of `ReadablePropertyMap`. +// If this parameter is omitted, an internal property map for +// `CGAL::vertex_point_t` must be available in `PolygonMesh` +// \cgalParamEnd +// \cgalNamedParamsEnd +// +// @return the number of snapped vertices +// +// @sa `merge_duplicated_vertices_in_boundary_cycles()` +// +template +std::size_t snap_vertex_range_onto_vertex_range(const SourceHalfedgeRange& source_hrange, + PolygonMesh& smesh, + const TargetHalfedgeRange& target_hrange, + const PolygonMesh& tmesh, + const ToleranceMap& tol_pmap, + const SourceNamedParameters& snp, + const TargetNamedParameters& tnp) +{ + using boost::get_param; + using boost::choose_param; + + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typedef CGAL::Box_intersection_d::Box_with_info_d Box; + + typedef typename GetVertexPointMap::type SVPM; + typedef typename GetVertexPointMap::const_type TVPM; + typedef typename boost::property_traits::value_type Point; + + typedef typename GetGeomTraits::type GT; + typedef typename GT::FT FT; + + if(is_empty_range(source_hrange.begin(), source_hrange.end()) || + is_empty_range(target_hrange.begin(), target_hrange.end())) + return 0; + + CGAL_static_assertion((std::is_same::value)); + + GT gt = choose_param(get_param(snp, internal_np::geom_traits), GT()); + + SVPM svpm = choose_param(get_param(snp, internal_np::vertex_point), + get_property_map(vertex_point, smesh)); + TVPM tvpm = choose_param(get_param(tnp, internal_np::vertex_point), + get_const_property_map(vertex_point, tmesh)); + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "Snapping vertices to vertices. Range sizes: " + << std::distance(source_hrange.begin(), source_hrange.end()) << " and " + << std::distance(target_hrange.begin(), target_hrange.end()) << std::endl; + + if(&smesh == &tmesh) + std::cout << "same mesh!" << std::endl; +#endif + + // Try to snap vertices + std::vector boxes; + std::unordered_set unique_vertices; + for(halfedge_descriptor hd : source_hrange) + { + const vertex_descriptor vd = target(hd, smesh); + if(!unique_vertices.insert(vd).second) + continue; // if 'vd' appears multiple times on the border, move it only once + + // only making the box a little larger, but the final tolerance is not changed + const double eps = 1.01 * CGAL::to_double(get(tol_pmap, vd)); + + const Bbox_3 pb = gt.construct_bbox_3_object()(get(svpm, vd)); + const Bbox_3 b(pb.xmin() - eps, pb.ymin() - eps, pb.zmin() - eps, + pb.xmax() + eps, pb.ymax() + eps, pb.zmax() + eps); + boxes.push_back(Box(b, vd)); + } + + std::vector target_boxes; + for(halfedge_descriptor hd : target_hrange) + { + const vertex_descriptor vd = target(hd, tmesh); + const Point& p = get(tvpm, vd); + target_boxes.push_back(Box(gt.construct_bbox_3_object()(p), vd)); + } + + // Use a multi index to sort easily by sources, targets, AND distance. + // Then, look up the distances in increasing order, and snap whenever the source and the target + // have both not been snapped yet. + typedef internal::Snapping_pair Snapping_pair; + typedef boost::multi_index::multi_index_container< + Snapping_pair, + boost::multi_index::indexed_by< + boost::multi_index::ordered_non_unique< + BOOST_MULTI_INDEX_MEMBER(Snapping_pair, vertex_descriptor, vs)>, + boost::multi_index::ordered_non_unique< + BOOST_MULTI_INDEX_MEMBER(Snapping_pair, vertex_descriptor, vt)>, + boost::multi_index::ordered_non_unique< + BOOST_MULTI_INDEX_MEMBER(Snapping_pair, FT, sq_dist)> + > + > Snapping_pair_container; + + typedef internal::Vertex_proximity_report Reporter; + + Snapping_pair_container snapping_pairs; + Reporter vpr(snapping_pairs, svpm, smesh, tvpm, tmesh, tol_pmap, gt); + + // Shenanigans to pass a reference as callback (which is copied by value by 'box_intersection_d') + std::function callback(std::ref(vpr)); + + CGAL::box_intersection_d(boxes.begin(), boxes.end(), + target_boxes.begin(), target_boxes.end(), + callback); + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << snapping_pairs.size() << " snappable pair(s)!" << std::endl; +#endif + + if(snapping_pairs.empty()) + return 0; + + // Sorted views of the container + typedef typename Snapping_pair_container::template nth_index<0>::type Container_by_source; + typedef typename Snapping_pair_container::template nth_index<1>::type Container_by_target; + typedef typename Snapping_pair_container::template nth_index<2>::type Container_by_distance; + + Container_by_source& container_by_source = snapping_pairs.template get<0>(); + Container_by_target& container_by_target = snapping_pairs.template get<1>(); + Container_by_distance& container_by_dist = snapping_pairs.template get<2>(); + + std::size_t counter = 0; + + CGAL_assertion_code(FT prev = -1;) + while(!container_by_dist.empty()) + { + const Snapping_pair& sp = *(container_by_dist.begin()); + const vertex_descriptor vs = sp.vs; + const vertex_descriptor vt = sp.vt; + CGAL_assertion(sp.sq_dist >= prev); + CGAL_assertion_code(prev = sp.sq_dist;) + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "Snapping " /*<< vs*/ << " (" << get(svpm, vs) << ") " + << " to " /*<< vt*/ << " (" << get(tvpm, vt) << ") at dist: " << sp.sq_dist << std::endl; +#endif + + // Collect all the source vertices projecting onto that target vertex + ++counter; + put(svpm, vs, get(tvpm, vt)); + + // 'vs' and 'vt' cannot be used anymore, remove them from the container + container_by_source.erase(vs); + container_by_target.erase(vt); + } + + return counter; +} + +template +std::size_t snap_vertex_range_onto_vertex_range(const SourceHalfedgeRange& source_hrange, + PolygonMesh& smesh, + const TargetHalfedgeRange& target_hrange, + const PolygonMesh& tmesh, + const SourceNamedParameters& snp, + const TargetNamedParameters& tnp) +{ + typedef typename GetGeomTraits::type GT; + typedef typename GT::FT FT; + typedef CGAL::dynamic_vertex_property_t Vertex_property_tag; + typedef typename boost::property_map::type Tolerance_map; + + Tolerance_map tol_pmap = get(Vertex_property_tag(), smesh); + const FT tol_mx(std::numeric_limits::max()); + internal::assign_tolerance_with_local_edge_length_bound(source_hrange, tol_pmap, tol_mx, smesh, snp); + + return snap_vertex_range_onto_vertex_range(source_hrange, smesh, target_hrange, tmesh, tol_pmap, snp, tnp); +} + +template +std::size_t snap_vertex_range_onto_vertex_range(const SourceHalfedgeRange& source_hrange, + PolygonMesh& smesh, + const TargetHalfedgeRange& target_hrange, + const PolygonMesh& tmesh, + const ToleranceMap& tol_pmap) +{ + return snap_vertex_range_onto_vertex_range(source_hrange, smesh, target_hrange, tmesh, tol_pmap, + CGAL::parameters::all_default(), + CGAL::parameters::all_default()); +} + +template +std::size_t snap_vertex_range_onto_vertex_range(const SourceHalfedgeRange& source_hrange, + PolygonMesh& smesh, + const TargetHalfedgeRange& target_hrange, + const PolygonMesh& tmesh) +{ + return snap_vertex_range_onto_vertex_range(source_hrange, smesh, target_hrange, tmesh, + CGAL::parameters::all_default(), + CGAL::parameters::all_default()); +} + +template +std::size_t snap_vertex_range_onto_vertex_range(PolygonMesh& smesh, const PolygonMesh& tmesh) +{ + return snap_vertex_range_onto_vertex_range(halfedges(smesh), smesh, halfedges(tmesh), tmesh); +} + +template +std::size_t snap_border_vertices_onto_vertex_range(PolygonMesh& smesh, + const HalfedgeRange& target_hrange, + const PolygonMesh& tmesh, + const ToleranceMap& tol_pmap) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + std::vector border_vertices; + border_halfedges(smesh, std::back_inserter(border_vertices)); + + return snap_vertex_range_onto_vertex_range(border_vertices, smesh, target_hrange, tmesh, tol_pmap); +} + +template +std::size_t snap_border_vertices_onto_vertex_range(PolygonMesh& smesh, + const HalfedgeRange& target_hrange, + const PolygonMesh& tmesh) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + std::vector border_vertices; + border_halfedges(smesh, std::back_inserter(border_vertices)); + + return snap_vertex_range_onto_vertex_range(border_vertices, smesh, target_hrange, tmesh); +} + +template +std::size_t snap_border_vertices_onto_border_vertices(PolygonMesh& smesh, + const PolygonMesh& tmesh, + const ToleranceMap& tol_pmap) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + std::vector sborder_vertices; + border_halfedges(smesh, std::back_inserter(sborder_vertices)); + + std::vector tborder_vertices; + border_halfedges(tmesh, std::back_inserter(tborder_vertices)); + + return snap_vertex_range_onto_vertex_range(sborder_vertices, smesh, tborder_vertices, tmesh, tol_pmap); +} + +// \ingroup PMP_repairing_grp +// +// Attempts to snap the border vertices of the source mesh onto the vertices of the target mesh. +// +// A vertex of the source range is only snapped to a vertex of the target mesh +// if its distance to the target mesh vertex is smaller than a user-chosen bound. +// If any source vertex can be snapped onto multiple vertices of the target +// range, the closest one is chosen. +// If multiple vertices within the source range could be snapped onto the same target vertex, +// the source vertex closest to the target vertex will be snapped. Other source vertices will try to snap +// to free target vertices until they find a valid target, or until there is no more target +// to snap to (within the tolerance). +// +// @tparam PolygonMesh a model of `FaceListGraph` and `MutableFaceGraph` +// @tparam ToleranceMap a model of `ReadablePropertyMap` with key type `boost::graph_traits::%vertex_descriptor` +// and value type the number type associated with the traits of the mesh. +// +// @param smesh the source mesh whose border vertices might be moved +// @param tmesh the target mesh whose vertices are potential projection targets +// @param tol_pmap a tolerance map associating to each vertex of the source range a tolerance value: +// potential projection targets are sought in a sphere centered at the vertex and +// whose radius is the tolerance value. +// +// @pre `smesh` and `tmesh` are different meshes +// +// \return the number of snapped vertices +// +template +std::size_t snap_border_vertices_onto_vertex_range(PolygonMesh& smesh, + const PolygonMesh& tmesh, + const ToleranceMap& tol_pmap) +{ + return snap_border_vertices_onto_vertex_range(smesh, halfedges(tmesh), tmesh, tol_pmap); +} + +template +std::size_t snap_border_vertices_onto_vertex_range(PolygonMesh& smesh, const PolygonMesh& tmesh) +{ + return snap_border_vertices_onto_vertex_range(smesh, halfedges(tmesh), tmesh); +} + +} // namespace experimental + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace internal { + +// Adapted from +template +class Projection_traits +{ + typedef typename AABBTraits::FT FT; + typedef typename AABBTraits::Point_3 Point; + typedef typename AABBTraits::Primitive Primitive; + typedef typename AABBTraits::Bounding_box Bounding_box; + typedef typename AABBTraits::Primitive::Id Primitive_id; + typedef typename AABBTraits::Point_and_primitive_id Point_and_primitive_id; + typedef typename AABBTraits::Object_and_primitive_id Object_and_primitive_id; + + typedef CGAL::AABB_node Node; + +public: + explicit Projection_traits(const AABBTraits& traits) + : m_traits(traits), + m_closest_point_initialized(false) + {} + + bool go_further() const { return true; } + + void intersection(const Point& query, const Primitive& primitive) + { + // skip the primitive if one of its endpoints is the query + typename Primitive::Datum s = primitive.datum(m_traits.shared_data()); + if(s[0] == query || s[1] == query) + return; + + if(!m_closest_point_initialized) + { + m_closest_point_initialized = true; + m_closest_primitive = primitive.id(); + m_closest_point = primitive.reference_point(m_traits.shared_data()); + } + + Point new_closest_point = m_traits.closest_point_object()(query, primitive, m_closest_point); + if(new_closest_point != m_closest_point) + { + m_closest_primitive = primitive.id(); + m_closest_point = new_closest_point; // this effectively shrinks the sphere + } + } + + bool do_intersect(const Point& query, const Node& node) const + { + return !m_closest_point_initialized || + m_traits.compare_distance_object()(query, node.bbox(), m_closest_point) == CGAL::SMALLER; + } + + Point closest_point() const { return m_closest_point; } + typename Primitive::Id closest_primitive_id() const { return m_closest_primitive; } + bool closest_point_initialized() const { return m_closest_point_initialized; } + +private: + Point m_closest_point; + typename Primitive::Id m_closest_primitive; + const AABBTraits& m_traits; + bool m_closest_point_initialized; +}; + +template +struct Compare_points_along_edge +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename GeomTraits::Point_3 Point; + + Compare_points_along_edge(halfedge_descriptor support, + const GeomTraits& gt, const VPM& vpm, const PolygonMesh& pm) + : gt(gt), m_src(get(vpm, source(support, pm))) + { } + + bool operator()(const Point& p1, const Point& p2) const { + return gt.less_distance_to_point_3_object()(m_src, p1, p2); + } + + const GeomTraits& gt; + Point m_src; +}; + +} // namespace internal + +namespace experimental { + +// Try to merge vertices in 'hrange' (vd = target(hd, pm)) onto the edges in the 'erange', +// non-conformingly +template +std::size_t snap_vertex_range_onto_vertex_range_non_conforming(const HalfedgeRange& source_hrange, + TriangleMesh& pms, + const HalfedgeRange& target_hrange, + TriangleMesh& pmt, + const ToleranceMap& tol_pmap, + const NamedParameters& nps, + const NamedParameters& npt) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + + typedef typename GetVertexPointMap::type VPM; + + typedef typename GetGeomTraits::type GT; + typedef typename GT::FT FT; + typedef typename GT::Point_3 Point; + typedef typename GT::Vector_3 Vector; + + typedef internal::Compare_points_along_edge Point_along_edge_comparer; + + typedef CGAL::AABB_halfedge_graph_segment_primitive Primitive; + typedef CGAL::AABB_traits AABB_Traits; + typedef CGAL::AABB_tree AABB_tree; + + using boost::get_param; + using boost::choose_param; + + // Need to have a triangle mesh to ensure that the refinement point of a border edge 'e' has visibility + // of the third p oint of the face 'f' incident to 'e' + CGAL_precondition(is_triangle_mesh(pmt)); + + std::size_t snapped_n = 0; + + VPM vpms = choose_param(get_param(nps, internal_np::vertex_point), get_property_map(vertex_point, pms)); + VPM vpmt = choose_param(get_param(npt, internal_np::vertex_point), get_property_map(vertex_point, pmt)); + + const GT gt = choose_param(get_param(nps, internal_np::geom_traits), GT()); + + const bool is_same_mesh = (&pms == &pmt); // @todo probably not optimal + + // start by snapping vertices together to simplify things + snapped_n = snap_vertex_range_onto_vertex_range(source_hrange, pms, target_hrange, pmt, tol_pmap, nps, npt); + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "Snapping vertices to edges. Range sizes: " + << std::distance(source_hrange.begin(), source_hrange.end()) << " and " + << std::distance(target_hrange.begin(), target_hrange.end()) << std::endl; +#endif + + typedef std::map > Occurrence_map; + Occurrence_map occurrences_as_target; + for(halfedge_descriptor hd : target_hrange) + { + vertex_descriptor vd = target(hd, pmt); + + std::set corresponding_vd; + corresponding_vd.insert(vd); + + std::pair is_insert_successful = + occurrences_as_target.insert(std::make_pair(get(vpmt, vd), corresponding_vd)); + if(!is_insert_successful.second) // point already existed in the map + is_insert_successful.first->second.insert(vd); + } + + // Since we're inserting primitives one by one, we can't pass this shared data in the constructor of the tree + AABB_Traits aabb_traits; + aabb_traits.set_shared_data(pmt, vpmt); + + // Fill the AABB-tree + AABB_tree aabb_tree(aabb_traits); + for(halfedge_descriptor hd : target_hrange) + { + CGAL_precondition(is_border(edge(hd, pmt), pmt)); + aabb_tree.insert(Primitive(edge(hd, pmt), pmt, vpmt)); + } + + // Collect border points that can be projected onto a border edge + std::vector > edges_to_split; + std::unordered_set unique_vertices; + for(halfedge_descriptor hd : source_hrange) + { + const vertex_descriptor vd = target(hd, pms); + if(!unique_vertices.insert(vd).second) + { + // if 'vd' appears multiple times on the source border, use it only once to snap target edges + continue; + } + + const Point& query = get(vpms, vd); + const std::set& occurrences = occurrences_as_target[query]; + + // Skip points that are already attached to another border. Keeping it in two 'continue' for clarity. + + // If we are working with a single mesh, the vertex is only blocked if another vertex has the same + // position (that is, if occurrences.size() > 1) + if(is_same_mesh && occurrences.size() > 1) + continue; + + // If it's not the same mesh, then block as soon as a vertex in the target range has already that position + if(!is_same_mesh && !occurrences.empty()) + continue; + + // Skip the source vertex if its two incident halfedges are geometrically identical (it means that + // the two halfedges are already stitchable and we don't want this common vertex to be used + // to split a halfedge somewhere else) + if(get(vpms, source(hd, pms)) == get(vpms, target(next(hd, pms), pms))) + continue; + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "Query: " << vd << " (" << query << ")" << std::endl; +#endif + + // use the current halfedge as hint + internal::Projection_traits traversal_traits(aabb_tree.traits()); + aabb_tree.traversal(query, traversal_traits); + + if(!traversal_traits.closest_point_initialized()) + continue; + + const FT sq_tolerance = CGAL::square(get(tol_pmap, vd)); + const Point& closest_p = traversal_traits.closest_point(); + const FT sq_dist_to_closest = gt.compute_squared_distance_3_object()(query, closest_p); + bool is_close_enough = (sq_dist_to_closest <= sq_tolerance); + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << " Closest point: (" << closest_p << ")" << std::endl + << " at distance " << gt.compute_squared_distance_3_object()(query, closest_p) + << " with a tolerance of " << get(tol_pmap, vd) << " at vertex (squared: " << sq_tolerance + << " && close enough? " << is_close_enough << ")" << std::endl;; +#endif + + if(is_close_enough) + { +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "\t and is thus beneath tolerance" << std::endl; +#endif + + edge_descriptor closest = traversal_traits.closest_primitive_id(); + CGAL_assertion(get(vpmt, source(closest, pmt)) != query && + get(vpmt, target(closest, pmt)) != query); + + halfedge_descriptor clos_hd = halfedge(closest, pmt); + CGAL_assertion(is_border(edge(clos_hd, pmt), pmt)); + + if(!is_border(clos_hd, pmt)) + clos_hd = opposite(clos_hd, pmt); + + Point new_pos = query; + put(vpms, vd, new_pos); + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "splitting position: " << new_pos << std::endl; +#endif + + edges_to_split.push_back(std::make_pair(new_pos, clos_hd)); + } + } + + // Sort points falling on the same edge and split the edge + std::map > points_per_edge; + typedef std::pair Pair_type; + for(const Pair_type& p : edges_to_split) + points_per_edge[p.second].push_back(p.first); + + typedef std::pair > Map_type; + for(Map_type& mt : points_per_edge) + { + const halfedge_descriptor mt_hd = mt.first; + const halfedge_descriptor mt_hd_opp = opposite(mt_hd, pmt); + CGAL_assertion(!is_border(mt_hd_opp, pmt)); + + if(mt.second.size() > 1) + { +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << " MUST SORT ON BORDER!" << std::endl; +#endif + /// \todo Sorting the projected positions is too simple (for example, this doesn't work + /// for a zigzaging polyline). Rather, points should be sorted following + /// the order along the matching border. Note that this requires identifying + /// matching polylines because a sequence of zigzaging points might not all project + /// onto the same halfedge. + Point_along_edge_comparer cmp(mt_hd, gt, vpmt, pmt); + std::sort(mt.second.begin(), mt.second.end(), cmp); + } + + halfedge_descriptor hd_to_split = mt_hd; + for(const Point& p : mt.second) + { +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "SPLIT " << edge(hd_to_split, pmt) << " |||| " + << " vs " << source(hd_to_split, pmt) << " (" << pmt.point(source(hd_to_split, pmt)) << ")" + << " --- vt " << target(hd_to_split, pmt) << " (" << pmt.point(target(hd_to_split, pmt)) << ")" << std::endl; + std::cout << " with pos " << p << std::endl; +#endif + + halfedge_descriptor res = CGAL::Euler::split_edge(hd_to_split, pmt); + put(vpmt, target(res, pmt), p); + ++snapped_n; + + // @todo ensuring hd_to_split is safe... but is it necessary? + hd_to_split = next(res, pmt); + halfedge_descriptor hd_to_split_opp = opposite(hd_to_split, pmt); + + // Look at the geometry to determine which diagonal is better to use to split this new quad face + + /* p + * / \ + * res / \ hd_to_split + * / \ + * / \ + * left right + * | / + * | / + * | / + * | / + * | / + * opp + */ + + const Point left_pt = get(vpmt, source(res, pmt)); + const Point right_pt = get(vpmt, target(hd_to_split, pmt)); + const Point opp = get(vpmt, target(next(opposite(res, pmt), pmt), pmt)); + + // Check if 'p' is "visible" from 'opp' (i.e. its projection on the plane 'Pl(left, opp, right)' + // falls in the cone with apex 'opp' and sides given by 'left' and 'right') + const Vector n = gt.construct_orthogonal_vector_3_object()(right_pt, left_pt, opp); + + const Point trans_left_pt = gt.construct_translated_point_3_object()(left_pt, n); + const Point trans_right_pt = gt.construct_translated_point_3_object()(right_pt, n); + + const bool left_of_left = (gt.orientation_3_object()(trans_left_pt, left_pt, opp, p) == CGAL::POSITIVE); + const bool right_of_right = (gt.orientation_3_object()(right_pt, trans_right_pt, opp, p) == CGAL::POSITIVE); + + const bool is_visible = (!left_of_left && !right_of_right); + +#ifdef CGAL_PMP_SNAP_DEBUG + std::cout << "Left/Right: " << left_of_left << " " << right_of_right << std::endl; + std::cout << "visible from " << opp << " ? " << is_visible << std::endl; +#endif + + if(is_visible) + { + halfedge_descriptor new_hd = CGAL::Euler::split_face(hd_to_split_opp, + prev(prev(mt_hd_opp, pmt), pmt), pmt); + hd_to_split = opposite(prev(new_hd, pmt), pmt); + } + else + { + halfedge_descriptor new_hd = CGAL::Euler::split_face(opposite(res, pmt), + prev(hd_to_split_opp, pmt), pmt); + hd_to_split = opposite(next(new_hd, pmt), pmt); + } + } + } + + return snapped_n; +} + +template +std::size_t snap_vertex_range_onto_vertex_range_non_conforming(const HalfedgeRange& source_hrange, + TriangleMesh& pms, + const HalfedgeRange& target_hrange, + TriangleMesh& pmt, + const ToleranceMap& tol_pmap) +{ + return snap_vertex_range_onto_vertex_range_non_conforming(source_hrange, pms, target_hrange, pmt, + tol_pmap, parameters::all_default(), + parameters::all_default()); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// Attempt to snap the vertices of the border of 'pm1' onto border edges of 'pm2'. + +template +std::size_t snap_border_vertices_non_conforming(TriangleMesh& pm1, + TriangleMesh& pm2) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typedef typename GetGeomTraits::type GT; + typedef typename GT::FT FT; + + typedef CGAL::dynamic_vertex_property_t Vertex_property_tag; + typedef typename boost::property_map::type Tolerance_map; + + std::vector border_vertices1; + border_halfedges(pm1, std::back_inserter(border_vertices1)); + + std::vector border_vertices2; + if(&pm1 == &pm2) + border_vertices2 = border_vertices1; + else + border_halfedges(pm2, std::back_inserter(border_vertices2)); + + Tolerance_map tol_pmap = get(Vertex_property_tag(), pm1); + const FT tol_mx(std::numeric_limits::max()); + internal::assign_tolerance_with_local_edge_length_bound(border_vertices1, tol_pmap, tol_mx, pm1); + + return snap_vertex_range_onto_vertex_range_non_conforming(border_vertices1, pm1, + border_vertices2, pm2, tol_pmap, + CGAL::parameters::all_default(), + CGAL::parameters::all_default()); +} + +template +std::size_t snap_border_vertices_non_conforming(TriangleMesh& pm1, + TriangleMesh& pm2, + const ToleranceMap& tol_pmap, + const NamedParameters& np1, + const NamedParameters& np2) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + std::vector border_vertices1; + border_halfedges(pm1, std::back_inserter(border_vertices1)); + + std::vector border_vertices2; + border_halfedges(pm2, std::back_inserter(border_vertices2)); + + return snap_vertex_range_onto_vertex_range_non_conforming(border_vertices1, pm1, + border_vertices2, pm2, + tol_pmap, np1, np2); +} + +template +std::size_t snap_border_vertices_non_conforming(TriangleMesh& pm1, + TriangleMesh& pm2, + const ToleranceMap& tol_pmap) +{ + return snap_border_vertices_non_conforming(pm1, pm2, tol_pmap, + CGAL::parameters::all_default(), CGAL::parameters::all_default()); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template +std::size_t snap_border_vertices_non_conforming(TriangleMesh& pm) +{ + return snap_border_vertices_non_conforming(pm, pm); +} + +template +std::size_t snap_border_vertices_non_conforming(TriangleMesh& pm, + const ToleranceMap& tol_pmap, + const NamedParameters& np) +{ + return snap_border_vertices_non_conforming(pm, pm, tol_pmap, np, np); +} + +template +std::size_t snap_border_vertices_non_conforming(TriangleMesh& pm, + const ToleranceMap& tol_pmap) +{ + return snap_border_vertices_non_conforming(pm, pm, tol_pmap, + CGAL::parameters::all_default(), CGAL::parameters::all_default()); +} + +} // end namespace experimental + +} // end namespace Polygon_mesh_processing + +} // end namespace CGAL + +#endif // CGAL_POLYGON_MESH_PROCESSING_INTERNAL_SNAP_H diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h index ae0d1f7a892..8d8bffc8646 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h @@ -17,7 +17,8 @@ // SPDX-License-Identifier: GPL-3.0+ // // -// Author(s) : Sebastien Loriot +// Author(s) : Sebastien Loriot, +// Mael Rouxel-Labbé #ifndef CGAL_POLYGON_MESH_PROCESSING_REPAIR_H #define CGAL_POLYGON_MESH_PROCESSING_REPAIR_H @@ -25,6 +26,7 @@ #include #include +#include #include #include #include @@ -323,13 +325,14 @@ OutputIterator degenerate_faces(const TriangleMesh& tm, OutputIterator out) return degenerate_faces(faces(tm), tm, out, CGAL::parameters::all_default()); } -// this function remove a border edge even if it does not satisfy the link condition. +// this function removes a border edge even if it does not satisfy the link condition. // null_vertex() is returned if the removal changes the topology of the input -template +template typename boost::graph_traits::vertex_descriptor remove_a_border_edge(typename boost::graph_traits::edge_descriptor ed, TriangleMesh& tm, - EdgeSet& edge_set) + EdgeSet& edge_set, + FaceSet& face_set) { typedef boost::graph_traits GT; typedef typename GT::edge_descriptor edge_descriptor; @@ -341,6 +344,7 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor if ( is_border(h,tm) ) h=opposite(h,tm); + halfedge_descriptor opp_h = opposite(h,tm); CGAL_assertion(is_border(opp_h,tm)); CGAL_assertion(!is_border(h,tm)); @@ -352,8 +356,12 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor { edge_set.erase(ed); halfedge_descriptor h=halfedge(ed, tm); - if ( is_border(h, tm) ) h = opposite(h, tm); + if ( is_border(h, tm) ) + h = opposite(h, tm); + edge_set.erase(edge(prev(h, tm), tm)); + face_set.erase(face(h, tm)); + return CGAL::Euler::collapse_edge(ed, tm); } @@ -370,6 +378,8 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor } } + CGAL_assertion(common_incident_edges.size() >=2 ); + // in the following loop, we visit define a connected component of // faces bounded by edges in common_incident_edges and h. We look // for the maximal one. This set of faces is the one that will @@ -381,7 +391,8 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor queue.push_back( opposite(prev(h,tm), tm) ); marked_faces.insert( face(h, tm) ); - do{ + do + { std::vector boundary; while(!queue.empty()) { @@ -393,11 +404,29 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor boundary.push_back(back); continue; } + if ( fback==GT::null_face() || !marked_faces.insert(fback).second ) continue; + queue.push_back( opposite(next(back,tm), tm) ); + if ( is_border(queue.back(), tm) ) + { +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Boundary reached during exploration, the region to be removed is not a topological disk, not handled for now.\n"; +#endif + return GT::null_vertex(); + } + queue.push_back( opposite(prev(back,tm), tm) ); + if ( is_border(queue.back(), tm) ) + { +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Boundary reached during exploration, the region to be removed is not a topological disk, not handled for now.\n"; +#endif + return GT::null_vertex(); + } } + CGAL_assertion( boundary.size() == 2 ); common_incident_edges.erase( edge(boundary[0], tm) ); common_incident_edges.erase( edge(boundary[1], tm) ); @@ -423,19 +452,21 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor CGAL_assertion(is_valid_polygon_mesh(tm)); if (!is_selection_a_topological_disk(marked_faces, tm)) { - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "The region to be removed is not a topological disk, not handled for now.\n"; - #endif +#endif return GT::null_vertex(); } + if (is_border(hk1, tm) && is_border(hk2, tm)) { - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "The region to be removed is an isolated region, not handled for now.\n"; - #endif +#endif return GT::null_vertex(); } + // collect vertices and edges to remove and do remove faces std::set edges_to_remove; std::set vertices_to_remove; @@ -460,11 +491,8 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor face_descriptor hk1_opp_face = face(hk2,tm); // we will remove the target of hk2, update vertex pointers - for(halfedge_descriptor hot : - halfedges_around_target(hk2, tm)) - { + for(halfedge_descriptor hot : halfedges_around_target(hk2, tm)) set_target(hot, vkept, tm); - } // update halfedge pointers since hk2 will be removed set_halfedge(vkept, opposite(hk1, tm), tm); @@ -499,15 +527,20 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor // remove vertices for(vertex_descriptor vd : vertices_to_remove) remove_vertex(vd, tm); + // remove edges for(edge_descriptor ed : edges_to_remove) { edge_set.erase(ed); remove_edge(ed, tm); } + // remove faces for(face_descriptor fd : marked_faces) + { + face_set.erase(fd); remove_face(fd, tm); + } // now update pointers set_face(opposite(hk1, tm), hk1_opp_face, tm); @@ -523,6 +556,7 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor set_next(hk1_opp_prev, opposite(hk1, tm), tm); set_next(opposite(hk1, tm), hn, tm); } + CGAL_assertion(is_valid_polygon_mesh(tm)); return vkept; } @@ -533,13 +567,16 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor TriangleMesh& tm) { std::set::edge_descriptor> edge_set; - return remove_a_border_edge(ed, tm, edge_set); + std::set::face_descriptor> face_set; + + return remove_a_border_edge(ed, tm, edge_set, face_set); } -template +template bool remove_degenerate_edges(const EdgeRange& edge_range, - TriangleMesh& tmesh, - const NamedParameters& np) + TriangleMesh& tmesh, + FaceSet& face_set, + const NamedParameters& np) { CGAL_assertion(CGAL::is_triangle_mesh(tmesh)); CGAL_assertion(CGAL::is_valid_polygon_mesh(tmesh)); @@ -563,6 +600,9 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, std::size_t nb_deg_faces = 0; bool all_removed=false; bool some_removed=true; + + bool preserve_genus = boost::choose_param(boost::get_param(np, internal_np::preserve_genus), true); + // collect edges of length 0 while(some_removed && !all_removed) { @@ -572,17 +612,18 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, degenerate_edges(edge_range, tmesh, std::inserter(degenerate_edges_to_remove, degenerate_edges_to_remove.end())); - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "Found " << degenerate_edges_to_remove.size() << " null edges.\n"; - #endif +#endif // first try to remove all collapsable edges typename std::set::iterator it = degenerate_edges_to_remove.begin(); while (it!=degenerate_edges_to_remove.end()) { - if (CGAL::Euler::does_satisfy_link_condition(*it,tmesh)) + edge_descriptor e = *it; + if (CGAL::Euler::does_satisfy_link_condition(e,tmesh)) { - halfedge_descriptor h = halfedge(*it, tmesh); + halfedge_descriptor h = halfedge(e, tmesh); degenerate_edges_to_remove.erase(it); // remove edges that could also be set for removal @@ -590,14 +631,19 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, { ++nb_deg_faces; degenerate_edges_to_remove.erase(edge(prev(h, tmesh), tmesh)); + face_set.erase(face(h, tmesh)); } + if (face(opposite(h, tmesh), tmesh)!=GT::null_face()) { ++nb_deg_faces; degenerate_edges_to_remove.erase(edge(prev(opposite(h, tmesh), tmesh), tmesh)); + face_set.erase(face(opposite(h, tmesh), tmesh)); } + //now remove the edge - CGAL::Euler::collapse_edge(edge(h, tmesh), tmesh); + CGAL::Euler::collapse_edge(e, tmesh); + // some_removed is not updated on purpose because if nothing // happens below then nothing can be done it = degenerate_edges_to_remove.begin(); @@ -607,10 +653,9 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, } CGAL_assertion( is_valid_polygon_mesh(tmesh) ); - - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "Remaining " << degenerate_edges_to_remove.size() << " null edges to be handled.\n"; - #endif +#endif while (!degenerate_edges_to_remove.empty()) { @@ -626,37 +671,61 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, { ++nb_deg_faces; degenerate_edges_to_remove.erase(edge(prev(h, tmesh), tmesh)); + face_set.erase(face(h, tmesh)); } + if (face(opposite(h, tmesh), tmesh)!=GT::null_face()) { ++nb_deg_faces; degenerate_edges_to_remove.erase(edge(prev(opposite(h, tmesh), tmesh), tmesh)); + face_set.erase(face(opposite(h, tmesh), tmesh)); } + //now remove the edge CGAL::Euler::collapse_edge(ed, tmesh); some_removed = true; } - else{ + else + { //handle the case when the edge is incident to a triangle hole //we first fill the hole and try again if ( is_border(ed, tmesh) ) { halfedge_descriptor hd = halfedge(ed,tmesh); - if (!is_border(hd,tmesh)) hd=opposite(hd,tmesh); + if (!is_border(hd,tmesh)) + hd=opposite(hd,tmesh); + if (is_triangle(hd, tmesh)) { - Euler::fill_hole(hd, tmesh); - degenerate_edges_to_remove.insert(ed); + if (!preserve_genus) + { + Euler::fill_hole(hd, tmesh); + degenerate_edges_to_remove.insert(ed); // reinsert the edge for future processing + } + else + { + all_removed=false; + } continue; } - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "Calling remove_a_border_edge\n"; - #endif - vertex_descriptor vd = remove_a_border_edge(ed, tmesh, degenerate_edges_to_remove); +#endif + + vertex_descriptor vd = remove_a_border_edge(ed, tmesh, degenerate_edges_to_remove, face_set); if (vd == GT::null_vertex()) + { + // TODO: if some border edges are later removed, the edge might be processable later + // for example if it belongs to boundary cycle of edges where the number of non-degenerate + // edges is 2. That's what happen with fused_vertices.off in the testsuite where the edges + // are not processed the same way with Polyhedron and Surface_mesh. In the case of Polyhedron + // more degenerate edges could be removed. all_removed=false; + } else some_removed=true; + continue; } else @@ -672,6 +741,7 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, break; } } + if (impossible) { impossible=false; @@ -683,6 +753,7 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, break; } } + if (impossible) { all_removed=false; @@ -709,9 +780,11 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, // mark faces of the link of each endpoints of the edge which collapse is not topologically valid std::set marked_faces; + // first endpoint for(halfedge_descriptor hd : CGAL::halfedges_around_target(halfedge(ed,tmesh), tmesh) ) if (!is_border(hd,tmesh)) marked_faces.insert( face(hd, tmesh) ); + // second endpoint for(halfedge_descriptor hd : CGAL::halfedges_around_target(opposite(halfedge(ed, tmesh), tmesh), tmesh) ) if (!is_border(hd,tmesh)) marked_faces.insert( face(hd, tmesh) ); @@ -719,6 +792,7 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, // extract the halfedges on the boundary of the marked region std::vector border; for(face_descriptor fd : marked_faces) + { for(halfedge_descriptor hd : CGAL::halfedges_around_face(halfedge(fd,tmesh), tmesh)) { halfedge_descriptor hd_opp = opposite(hd, tmesh); @@ -728,15 +802,18 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, border.push_back( hd ); } } + } + if (border.empty() ) { // a whole connected component (without boundary) got selected and will disappear (not handled for now) - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "Trying to remove a whole connected component, not handled yet\n"; - #endif +#endif all_removed=false; continue; } + // define cc of border halfedges: two halfedges are in the same cc // if they are on the border of the cc of non-marked faces. typedef CGAL::Union_find UF_ds; @@ -753,9 +830,10 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, CGAL_assertion( marked_faces.count( face( opposite(hd, tmesh), tmesh) ) == 0 ); halfedge_descriptor candidate = hd; - do{ + do { candidate = prev( opposite(candidate, tmesh), tmesh ); } while( !marked_faces.count( face( opposite(candidate, tmesh), tmesh) ) ); + uf.unify_sets( handles[hd], handles[opposite(candidate, tmesh)] ); } @@ -775,7 +853,6 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, std::vector< std::set > faces_per_cc(nb_cc); std::vector< bool > exploration_finished(nb_cc, false); - // init the stacks of halfedges using the cc of the boundary std::size_t index=0; std::map< halfedge_descriptor, std::size_t > ccs; @@ -788,7 +865,9 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, typedef typename std::map< halfedge_descriptor, std::size_t >::iterator Map_it; std::pair insert_res= ccs.insert( std::make_pair(*uf.find( p.second ), index) ); - if (insert_res.second) ++index; + + if (insert_res.second) + ++index; stacks_per_cc[ insert_res.first->second ].push_back( prev(opp_hedge, tmesh) ); stacks_per_cc[ insert_res.first->second ].push_back( next(opp_hedge, tmesh) ); @@ -798,18 +877,21 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, if (index != nb_cc) { // most probably, one cc is a cycle of border edges - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "Trying to remove a component with a cycle of halfedges (nested hole or whole component), not handled yet.\n"; - #endif +#endif all_removed=false; continue; } + std::size_t nb_ccs_to_be_explored = nb_cc; index=0; //explore the cc's - do{ + do + { // try to extract one more face for a given cc - do{ + do + { CGAL_assertion( !exploration_finished[index] ); CGAL_assertion( !stacks_per_cc.empty() ); CGAL_assertion( !stacks_per_cc[index].empty() ); @@ -828,30 +910,36 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, if (stacks_per_cc[index].empty()) break; } while(true); + // the exploration of a cc is finished when its stack is empty exploration_finished[index]=stacks_per_cc[index].empty(); - if ( exploration_finished[index] ) --nb_ccs_to_be_explored; - if ( nb_ccs_to_be_explored==1 ) break; + if ( exploration_finished[index] ) + --nb_ccs_to_be_explored; + if ( nb_ccs_to_be_explored==1 ) + break; while ( exploration_finished[(++index)%nb_cc] ); index=index%nb_cc; - }while(true); + } + while(true); /// \todo use the area criteria? this means maybe continue exploration of larger cc // mark faces of completetly explored cc for (index=0; index< nb_cc; ++index) + { if( exploration_finished[index] ) { for(face_descriptor fd : faces_per_cc[index]) marked_faces.insert(fd); } + } } // make sure the selection is a topological disk (otherwise we need another treatment) if (!is_selection_a_topological_disk(marked_faces, tmesh)) { - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG - std::cout << "Trying to handle a non-topological disk, do nothing\n"; - #endif +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Trying to handle a non-topological disk, do nothing\n"; +#endif all_removed=false; continue; } @@ -861,23 +949,27 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, std::set vertices_to_keep; std::set halfedges_to_keep; for(halfedge_descriptor hd : border) - if ( !marked_faces.count(face(opposite(hd, tmesh), tmesh)) ) + { + if ( !marked_faces.count(face(opposite(hd, tmesh), tmesh)) ) { halfedges_to_keep.insert( hd ); vertices_to_keep.insert( target(hd, tmesh) ); } + } // backup next,prev relationships to set after patch removal std::vector< std::pair > next_prev_halfedge_pairs; halfedge_descriptor first_border_hd=*( halfedges_to_keep.begin() ); halfedge_descriptor current_border_hd=first_border_hd; - do{ + do + { halfedge_descriptor prev_border_hd=current_border_hd; current_border_hd=next(current_border_hd, tmesh); while( marked_faces.count( face( opposite(current_border_hd, tmesh), tmesh) ) ) current_border_hd=next(opposite(current_border_hd, tmesh), tmesh); next_prev_halfedge_pairs.push_back( std::make_pair(prev_border_hd, current_border_hd) ); - }while(current_border_hd!=first_border_hd); + } + while(current_border_hd!=first_border_hd); // collect vertices and edges to remove and do remove faces std::set edges_to_remove; @@ -889,16 +981,21 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, { if ( !halfedges_to_keep.count(hd) ) edges_to_remove.insert( edge(hd, tmesh) ); + if ( !vertices_to_keep.count(target(hd,tmesh)) ) vertices_to_remove.insert( target(hd,tmesh) ); + hd=next(hd, tmesh); } + remove_face(fd, tmesh); + face_set.erase(fd); } // remove vertices for(vertex_descriptor vd : vertices_to_remove) remove_vertex(vd, tmesh); + // remove edges for(edge_descriptor ed : edges_to_remove) { @@ -916,15 +1013,21 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, set_next(p.first, p.second, tmesh); set_halfedge(target(p.first, tmesh), p.first, tmesh); } + set_halfedge(new_face, first_border_hd, tmesh); // triangulate the new face and update the coordinate of the central vertex halfedge_descriptor new_hd=Euler::add_center_vertex(first_border_hd, tmesh); put(vpmap, target(new_hd, tmesh), pt); for(halfedge_descriptor hd : halfedges_around_target(new_hd, tmesh)) + { if(is_degenerate_edge(edge(hd, tmesh), tmesh, np)) degenerate_edges_to_remove.insert(edge(hd, tmesh)); + if(face(hd, tmesh) != GT::null_face() && is_degenerate_triangle_face(face(hd, tmesh), tmesh)) + face_set.insert(face(hd, tmesh)); + } + CGAL_assertion( is_valid_polygon_mesh(tmesh) ); } } @@ -933,11 +1036,36 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, return all_removed; } +template +bool remove_degenerate_edges(const EdgeRange& edge_range, + TriangleMesh& tmesh, + const CGAL_PMP_NP_CLASS& np) +{ + std::set::face_descriptor> face_set; + return remove_degenerate_edges(edge_range, tmesh, face_set, np); +} + +template +bool remove_degenerate_edges(TriangleMesh& tmesh, + const CGAL_PMP_NP_CLASS& np) +{ + std::set::face_descriptor> face_set; + return remove_degenerate_edges(edges(tmesh), tmesh, face_set, np); +} + template bool remove_degenerate_edges(const EdgeRange& edge_range, - TriangleMesh& tmesh) + TriangleMesh& tmesh) { - return remove_degenerate_edges(edge_range, tmesh, parameters::all_default()); + std::set::face_descriptor> face_set; + return remove_degenerate_edges(edge_range, tmesh, face_set, parameters::all_default()); +} + +template +bool remove_degenerate_edges(TriangleMesh& tmesh) +{ + std::set::face_descriptor> face_set; + return remove_degenerate_edges(edges(tmesh), tmesh, face_set, parameters::all_default()); } // \ingroup PMP_repairing_grp @@ -974,8 +1102,9 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, // We should probably do something with the return type. // /// \return `true` if all degenerate faces were successfully removed, and `false` otherwise. -template -bool remove_degenerate_faces( TriangleMesh& tmesh, +template +bool remove_degenerate_faces(const FaceRange& face_range, + TriangleMesh& tmesh, const NamedParameters& np) { CGAL_assertion(CGAL::is_triangle_mesh(tmesh)); @@ -999,25 +1128,81 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, typedef typename boost::property_traits::value_type Point_3; typedef typename boost::property_traits::reference Point_ref; -// First remove edges of length 0 - bool all_removed = remove_degenerate_edges(edges(tmesh), tmesh, np); + std::set degenerate_face_set; + degenerate_faces(face_range, tmesh, std::inserter(degenerate_face_set, degenerate_face_set.begin()), np); - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + const std::size_t faces_size = faces(tmesh).size(); + + if(degenerate_face_set.empty()) + return true; + + if(degenerate_face_set.size() == faces_size) + { + clear(tmesh); + return true; + } + + // Sanitize the face range by adding adjacent degenerate faces + const std::size_t range_size = face_range.size(); + bool is_range_full_mesh = (range_size == faces_size); + if(!is_range_full_mesh) + { + std::list faces_to_visit(degenerate_face_set.begin(), degenerate_face_set.end()); + + while(!faces_to_visit.empty()) + { + face_descriptor fd = faces_to_visit.front(); + faces_to_visit.pop_front(); + + for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, tmesh), tmesh)) + { + for(halfedge_descriptor inc_hd : halfedges_around_target(hd, tmesh)) + { + face_descriptor adj_fd = face(inc_hd, tmesh); + if(adj_fd == GT::null_face() || adj_fd == fd) + continue; + + if(is_degenerate_triangle_face(adj_fd, tmesh)) + { + if(degenerate_face_set.insert(adj_fd).second) + { + // successful insertion means we did not know about this face before + faces_to_visit.push_back(adj_fd); + } + } + } + } + } + } + + // Note that there can't be any null edge incident to the degenerate faces range, + // otherwise we would have a null face incident to the face range, and that is not possible + // after the sanitization above + std::set edge_range; + for(face_descriptor fd : degenerate_face_set) + for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, tmesh), tmesh)) + edge_range.insert(edge(hd, tmesh)); + + // First remove edges of length 0 + bool all_removed = remove_degenerate_edges(edge_range, tmesh, degenerate_face_set, np); + + CGAL_assertion_code(for(face_descriptor fd : degenerate_face_set) {) + CGAL_assertion(is_degenerate_triangle_face(fd, tmesh)); + CGAL_assertion_code(}) + +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG { std::cout <<"Done with null edges.\n"; std::ofstream output("/tmp/no_null_edges.off"); output << std::setprecision(17) << tmesh << "\n"; output.close(); } - #endif +#endif + // Then, remove triangles made of 3 collinear points -// Then, remove triangles made of 3 collinear points - std::set degenerate_face_set; - degenerate_faces(tmesh, std::inserter(degenerate_face_set, degenerate_face_set.begin()), np); - -// start by filtering out border faces -// TODO: shall we avoid doing that in case a non-manifold vertex on the boundary or if a whole component disappear? + // start by filtering out border faces + // TODO: shall we avoid doing that in case a non-manifold vertex on the boundary or if a whole component disappear? std::set border_deg_faces; for(face_descriptor f : degenerate_face_set) { @@ -1055,21 +1240,43 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, h = next(h, tmesh); } - degenerate_face_set .erase(f_to_rm); + degenerate_face_set.erase(f_to_rm); Euler::remove_face(h, tmesh); } -// Ignore faces with null edges - if (!all_removed) + // Ignore faces with null edges + if(!all_removed) { - for(edge_descriptor ed : edges(tmesh)) + std::map are_degenerate_edges; + + for(face_descriptor fd : degenerate_face_set) { - if ( traits.equal_3_object()(get(vpmap, target(ed, tmesh)), get(vpmap, source(ed, tmesh))) ) + for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, tmesh), tmesh)) { - halfedge_descriptor h = halfedge(ed, tmesh); - if (!is_border(h, tmesh)) degenerate_face_set.erase(face(h, tmesh)); - h=opposite(h, tmesh); - if (!is_border(h, tmesh)) degenerate_face_set.erase(face(h, tmesh)); + edge_descriptor ed = edge(hd, tmesh); + std::pair::iterator, bool> is_insert_successful = + are_degenerate_edges.insert(std::make_pair(ed, false)); + + bool is_degenerate = false; + if(is_insert_successful.second) + { + // did not previously exist in the map, so actually have to check if it is degenerate + if(traits.equal_3_object()(get(vpmap, target(ed, tmesh)), get(vpmap, source(ed, tmesh)))) + is_degenerate = true; + } + + is_insert_successful.first->second = is_degenerate; + + if(is_degenerate) + { + halfedge_descriptor h = halfedge(ed, tmesh); + if(!is_border(h, tmesh)) + degenerate_face_set.erase(face(h, tmesh)); + + h = opposite(h, tmesh); + if(!is_border(h, tmesh)) + degenerate_face_set.erase(face(h, tmesh)); + } } } } @@ -1099,6 +1306,7 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, for(halfedge_descriptor hd2 : halfedges_around_target(hd, tmesh)) if (!is_border(hd2, tmesh)) degenerate_face_set.erase( face(hd2, tmesh) ); + // remove the central vertex and check if the new face is degenerated hd=CGAL::Euler::remove_center_vertex(hd, tmesh); if (is_degenerate_triangle_face(face(hd, tmesh), tmesh, np)) @@ -1106,12 +1314,14 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, degenerate_face_set.insert( face(hd, tmesh) ); } } - if (vertices_to_remove.empty()) break; + + if (vertices_to_remove.empty()) + break; } while (!degenerate_face_set.empty()) { - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << "Loop on removing deg faces\n"; // ensure the mesh is not broken { @@ -1128,14 +1338,13 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, std::cerr << "Warning: got a polygon soup (may simply be a non-manifold vertex)!\n"; } } - #endif +#endif face_descriptor fd = *degenerate_face_set.begin(); - // look whether an incident triangle is also degenerated + // look whether an incident triangle is also degenerate bool detect_cc_of_degenerate_triangles = false; - for(halfedge_descriptor hd : - halfedges_around_face(halfedge(fd, tmesh), tmesh) ) + for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, tmesh), tmesh) ) { face_descriptor adjacent_face = face( opposite(hd, tmesh), tmesh ); if ( adjacent_face!=GT::null_face() && @@ -1148,11 +1357,12 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, if (!detect_cc_of_degenerate_triangles) { - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << " no degenerate neighbors, using a flip.\n"; - #endif +#endif degenerate_face_set.erase(degenerate_face_set.begin()); - // flip the longest edge of the triangle + + // flip the longest edge of the triangle Point_ref p1 = get(vpmap, target( halfedge(fd, tmesh), tmesh) ); Point_ref p2 = get(vpmap, target(next(halfedge(fd, tmesh), tmesh), tmesh) ); Point_ref p3 = get(vpmap, source( halfedge(fd, tmesh), tmesh) ); @@ -1181,8 +1391,10 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, face_descriptor opposite_face=face( opposite(edge_to_flip, tmesh), tmesh); if ( opposite_face == GT::null_face() ) + { // simply remove the face Euler::remove_face(edge_to_flip, tmesh); + } else { // condition for the flip to be valid (the edge to be created do not already exists) @@ -1195,13 +1407,13 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, else { all_removed=false; - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << " WARNING: flip is not possible\n"; // \todo Let p and q be the vertices opposite to `edge_to_flip`, and let // r be the vertex of `edge_to_flip` that is the furthest away from // the edge `pq`. In that case I think we should remove all the triangles // so that the triangle pqr is in the mesh. - #endif +#endif } } } @@ -1221,63 +1433,69 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, { face_descriptor top=queue.back(); queue.pop_back(); - for(halfedge_descriptor hd : - halfedges_around_face(halfedge(top, tmesh), tmesh) ) + for(halfedge_descriptor hd : halfedges_around_face(halfedge(top, tmesh), tmesh) ) { face_descriptor adjacent_face = face( opposite(hd, tmesh), tmesh ); if ( adjacent_face==GT::null_face() || degenerate_face_set.count(adjacent_face)==0 ) + { boundary_hedges.push_back(hd); + } else { if (cc_faces.insert(adjacent_face).second) queue.push_back(adjacent_face); + if ( hd < opposite(hd, tmesh) ) inside_hedges.push_back(hd); } } } - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << " Deal with a cc of " << cc_faces.size() << " degenerate faces.\n"; /// dump cc_faces { - int id=0; - std::map vids; - for(face_descriptor f : cc_faces) - { - if ( vids.insert( std::make_pair( target(halfedge(f, tmesh), tmesh), id) ).second ) ++id; - if ( vids.insert( std::make_pair( target(next(halfedge(f, tmesh), tmesh), tmesh), id) ).second ) ++id; - if ( vids.insert( std::make_pair( target(next(next(halfedge(f, tmesh), tmesh), tmesh), tmesh), id) ).second ) ++id; - } - std::ofstream output("/tmp/cc_faces.off"); - output << std::setprecision(17); - output << "OFF\n" << vids.size() << " " << cc_faces.size() << " 0\n"; - std::vector points(vids.size()); - typedef std::pair Pair_type; - for(Pair_type p : vids) - points[p.second]=get(vpmap, p.first); - for(typename Traits::Point_3 p : points) - output << p << "\n"; - for(face_descriptor f : cc_faces) - { - output << "3 " - << vids[ target(halfedge(f, tmesh), tmesh) ] << " " - << vids[ target(next(halfedge(f, tmesh), tmesh), tmesh) ] << " " - << vids[ target(next(next(halfedge(f, tmesh), tmesh), tmesh), tmesh) ] << "\n"; - } + int id=0; + std::map vids; + for(face_descriptor f : cc_faces) + { + if ( vids.insert( std::make_pair( target(halfedge(f, tmesh), tmesh), id) ).second ) ++id; + if ( vids.insert( std::make_pair( target(next(halfedge(f, tmesh), tmesh), tmesh), id) ).second ) ++id; + if ( vids.insert( std::make_pair( target(next(next(halfedge(f, tmesh), tmesh), tmesh), tmesh), id) ).second ) ++id; + } - for (std::size_t pid=2; pid!=points.size(); ++pid) - { - CGAL_assertion(collinear(points[0], points[1], points[pid])); + std::ofstream output("/tmp/cc_faces.off"); + output << std::setprecision(17); + output << "OFF\n" << vids.size() << " " << cc_faces.size() << " 0\n"; + std::vector points(vids.size()); + typedef std::pair Pair_type; + for(Pair_type p : vids) + + points[p.second]=get(vpmap, p.first); + for(typename Traits::Point_3 p : points) + output << p << "\n"; + + for(face_descriptor f : cc_faces) + { + output << "3 " + << vids[ target(halfedge(f, tmesh), tmesh) ] << " " + << vids[ target(next(halfedge(f, tmesh), tmesh), tmesh) ] << " " + << vids[ target(next(next(halfedge(f, tmesh), tmesh), tmesh), tmesh) ] << "\n"; + } + + for (std::size_t pid=2; pid!=points.size(); ++pid) + { + CGAL_assertion(collinear(points[0], points[1], points[pid])); + } } - } - #endif +#endif // find vertices strictly inside the cc std::set boundary_vertices; for(halfedge_descriptor hd : boundary_hedges) boundary_vertices.insert( target(hd, tmesh) ); + std::set inside_vertices; for(halfedge_descriptor hd : inside_hedges) { @@ -1293,14 +1511,17 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, { //cc_faces does not define a topological disk /// \todo Find to way to handle that case - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << " WARNING: Cannot remove the component of degenerate faces: not a topological disk.\n"; - #endif +#endif + for(face_descriptor f : cc_faces) degenerate_face_set.erase(f); + continue; } - // preliminary step to check if the operation is possible + + // preliminary step to check if the operation is possible // sort the boundary points along the common supporting line // we first need a reference point typedef internal::Less_vertex_point Less_vertex; @@ -1332,11 +1553,13 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, // look for the outgoing border halfedge of the first extreme point for(halfedge_descriptor hd : boundary_hedges) + { if ( get(vpmap, source(hd, tmesh)) == xtrm1 ) { side_one.push_back(hd); break; } + } CGAL_assertion(side_one.size()==1); bool non_monotone_border = false; @@ -1345,56 +1568,72 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, { vertex_descriptor prev_vertex = target(side_one.back(), tmesh); for(halfedge_descriptor hd : boundary_hedges) + { if ( source(hd, tmesh) == prev_vertex ) { if ( get(vpmap, target(hd, tmesh)) < get(vpmap, prev_vertex) ) non_monotone_border = true; + side_one.push_back(hd); break; } - if (non_monotone_border) break; + } + + if (non_monotone_border) + break; } if (non_monotone_border) { - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << " WARNING: Cannot remove the component of degenerate faces: border not a monotonic cycle.\n"; - #endif +#endif + for(face_descriptor f : cc_faces) degenerate_face_set.erase(f); + continue; } // look for the outgoing border halfedge of second extreme vertex for(halfedge_descriptor hd : boundary_hedges) + { if ( source(hd, tmesh) == target(side_one.back(), tmesh) ) { side_two.push_back(hd); break; } + } CGAL_assertion(side_two.size()==1); while( target(side_two.back(), tmesh) != source(side_one.front(), tmesh) ) { vertex_descriptor prev_vertex = target(side_two.back(), tmesh); for(halfedge_descriptor hd : boundary_hedges) + { if ( source(hd, tmesh) == prev_vertex ) { if ( get(vpmap, target(hd, tmesh)) > get(vpmap, prev_vertex) ) non_monotone_border = true; + side_two.push_back(hd); break; } - if (non_monotone_border) break; + } + + if (non_monotone_border) + break; } if (non_monotone_border) { - #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG +#ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG std::cout << " WARNING: Cannot remove the component of degenerate faces: border not a monotonic cycle.\n"; - #endif +#endif + for(face_descriptor f : cc_faces) degenerate_face_set.erase(f); + continue; } @@ -1410,12 +1649,16 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, std::vector side_points; side_points.reserve(side_one.size()+1); side_points.push_back(get(vpmap,source(side_one.front(), tmesh))); + for(halfedge_descriptor h : side_one) side_points.push_back(get(vpmap,target(h, tmesh))); + CGAL_assertion(get(vpmap,source(side_one.front(), tmesh))==side_points.front()); CGAL_assertion(get(vpmap,target(side_one.back(), tmesh))==side_points.back()); - std::sort(side_points.begin(), side_points.end()); + //\todo the reordering could lead to the apparition of null edges. + std::sort(side_points.begin(), side_points.end()); + CGAL_assertion(std::unique(side_points.begin(), side_points.end())==side_points.end()); for(std::size_t i=0;i +bool remove_degenerate_faces(const FaceRange& face_range, + TriangleMesh& tmesh) +{ + return remove_degenerate_faces(face_range, tmesh, parameters::all_default()); +} + +template +bool remove_degenerate_faces(TriangleMesh& tmesh, + const CGAL_PMP_NP_CLASS& np) +{ + return remove_degenerate_faces(faces(tmesh), tmesh, np); +} + template bool remove_degenerate_faces(TriangleMesh& tmesh) { @@ -1655,45 +1951,6 @@ bool remove_degenerate_faces(TriangleMesh& tmesh) CGAL::Polygon_mesh_processing::parameters::all_default()); } -namespace internal { - -template -struct Vertex_collector -{ - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - - void collect_vertices(vertex_descriptor v1, vertex_descriptor v2) - { - std::vector& verts = collections[v1]; - if(verts.empty()) - verts.push_back(v1); - verts.push_back(v2); - } - - void dump(OutputIterator out) - { - typedef std::pair > Pair_type; - for(const Pair_type& p : collections) { - *out++ = p.second; - } - } - - std::map > collections; -}; - -template -struct Vertex_collector -{ - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - void collect_vertices(vertex_descriptor, vertex_descriptor) - {} - - void dump(Emptyset_iterator) - {} -}; - -} // end namespace internal - /// \ingroup PMP_repairing_grp /// checks whether a vertex of a polygon mesh is non-manifold. /// @@ -1710,12 +1967,19 @@ bool is_non_manifold_vertex(typename boost::graph_traits::vertex_de const PolygonMesh& pm) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - boost::unordered_set halfedges_handled; + + typedef CGAL::dynamic_halfedge_property_t Halfedge_property_tag; + typedef typename boost::property_map::const_type Visited_halfedge_map; + + // Dynamic pmaps do not have default initialization values (yet) + Visited_halfedge_map visited_halfedges = get(Halfedge_property_tag(), pm); + for(halfedge_descriptor h : halfedges(pm)) + put(visited_halfedges, h, false); std::size_t incident_null_faces_counter = 0; for(halfedge_descriptor h : halfedges_around_target(v, pm)) { - halfedges_handled.insert(h); + put(visited_halfedges, h, true); if(CGAL::is_border(h, pm)) ++incident_null_faces_counter; } @@ -1730,8 +1994,8 @@ bool is_non_manifold_vertex(typename boost::graph_traits::vertex_de { if(v == target(h, pm)) { - // More than one umbrella incident to 'v' --> non-manifold - if(halfedges_handled.count(h) == 0) + // Haven't seen that halfedge yet ==> more than one umbrella incident to 'v' ==> non-manifold + if(!get(visited_halfedges, h)) return true; } } @@ -1739,20 +2003,196 @@ bool is_non_manifold_vertex(typename boost::graph_traits::vertex_de return false; } +namespace internal { + +template +struct Vertex_collector +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + bool has_old_vertex(const vertex_descriptor v) const { return collections.count(v) != 0; } + + void collect_vertices(vertex_descriptor v1, vertex_descriptor v2) + { + std::vector& verts = collections[v1]; + if(verts.empty()) + verts.push_back(v1); + verts.push_back(v2); + } + + template + void dump(OutputIterator out) + { + typedef std::pair > Pair_type; + for(const Pair_type& p : collections) + *out++ = p.second; + } + + void dump(Emptyset_iterator) { } + + std::map > collections; +}; + +} // end namespace internal + +template +typename boost::graph_traits::vertex_descriptor +create_new_vertex_for_sector(typename boost::graph_traits::halfedge_descriptor sector_begin_h, + typename boost::graph_traits::halfedge_descriptor sector_last_h, + PolygonMesh& pm, + const VPM& vpm, + const ConstraintMap& cmap) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + vertex_descriptor old_vd = target(sector_begin_h, pm); + vertex_descriptor new_vd = add_vertex(pm); + put(vpm, new_vd, get(vpm, old_vd)); + + put(cmap, new_vd, true); + + set_halfedge(new_vd, sector_begin_h, pm); + halfedge_descriptor h = sector_begin_h; + do + { + set_target(h, new_vd, pm); + + if(h == sector_last_h) + break; + else + h = prev(opposite(h, pm), pm); + } + while(h != sector_begin_h); // for safety + CGAL_assertion(h != sector_begin_h); + + return new_vd; +} + +template +std::size_t make_umbrella_manifold(typename boost::graph_traits::halfedge_descriptor h, + PolygonMesh& pm, + internal::Vertex_collector& dmap, + const NamedParameters& np) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + using boost::get_param; + using boost::choose_param; + + typedef typename GetVertexPointMap::type VertexPointMap; + VertexPointMap vpm = choose_param(get_param(np, internal_np::vertex_point), + get_property_map(vertex_point, pm)); + + typedef typename boost::lookup_named_param_def // default (no constraint pmap) + >::type VerticesMap; + VerticesMap cmap = choose_param(get_param(np, internal_np::vertex_is_constrained), + Constant_property_map(false)); + + std::size_t nb_new_vertices = 0; + + vertex_descriptor old_v = target(h, pm); + put(cmap, old_v, true); // store the duplicates + + // count the number of borders + int border_counter = 0; + halfedge_descriptor ih = h, done = ih, border_h = h; + do + { + if(is_border(ih, pm)) + { + border_h = ih; + ++border_counter; + } + + ih = prev(opposite(ih, pm), pm); + } + while(ih != done); + + bool is_non_manifold_within_umbrella = (border_counter > 1); + + // if there is a single sector, then simply move the full umbrella to a new vertex, and we're done + if(!is_non_manifold_within_umbrella) + { + // note that since this is marked as a non-manifold vertex, we necessarily need to create + // a new vertex for this umbrella (the main umbrella is not marked as non-manifold) + halfedge_descriptor last_h = opposite(next(h, pm), pm); + vertex_descriptor new_v = create_new_vertex_for_sector(h, last_h, pm, vpm, cmap); + dmap.collect_vertices(old_v, new_v); + nb_new_vertices = 1; + } + // if there is more than one sector, look at each sector and split them away from the main one + else + { + // the first manifold sector, described by two halfedges + halfedge_descriptor sector_start_h = border_h; + CGAL_assertion(is_border(border_h, pm)); + + bool should_stop = false; + bool is_main_sector = true; + do + { + CGAL_assertion(is_border(sector_start_h, pm)); + + // collect the sector and split it away if it must be + halfedge_descriptor sector_last_h = sector_start_h; + do + { + halfedge_descriptor next_h = prev(opposite(sector_last_h, pm), pm); + + if(is_border(next_h, pm)) + break; + + sector_last_h = next_h; + } + while(sector_last_h != sector_start_h); + CGAL_assertion(!is_border(sector_last_h, pm)); + CGAL_assertion(sector_last_h != sector_start_h); + + halfedge_descriptor next_start_h = prev(opposite(sector_last_h, pm), pm); + + // there are multiple CCs incident to this particular vertex, and we should create a new vertex + // if it's not the first umbrella around 'old_v' or not the first sector, but not if it's + // the first umbrella and first sector. + bool must_create_new_vertex = (!is_main_sector || dmap.has_old_vertex(old_v)); + + // In any case, we must set up the next pointer correctly + set_next(sector_start_h, opposite(sector_last_h, pm), pm); + + if(must_create_new_vertex) + { + vertex_descriptor new_v = create_new_vertex_for_sector(sector_start_h, sector_last_h, pm, vpm, cmap); + dmap.collect_vertices(old_v, new_v); + ++nb_new_vertices; + } + + is_main_sector = false; + sector_start_h = next_start_h; + should_stop = (sector_start_h == border_h); + } + while(!should_stop); + } + + return nb_new_vertices; +} + /// \ingroup PMP_repairing_grp /// duplicates all the non-manifold vertices of the input mesh. /// -/// @tparam TriangleMesh a model of `HalfedgeListGraph` and `MutableHalfedgeGraph` +/// @tparam PolygonMesh a model of `HalfedgeListGraph` and `MutableHalfedgeGraph` /// @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" /// -/// @param tm the triangulated surface mesh to be repaired +/// @param pm the surface mesh to be repaired /// @param np optional \ref pmp_namedparameters "Named Parameters" described below /// /// \cgalNamedParamsBegin /// \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `pmesh`. /// The type of this map is model of `ReadWritePropertyMap`. /// If this parameter is omitted, an internal property map for -/// `CGAL::vertex_point_t` should be available in `TriangleMesh` +/// `CGAL::vertex_point_t` should be available in `PolygonMesh` /// \cgalParamEnd /// \cgalParamBegin{vertex_is_constrained_map} a writable property map with `vertex_descriptor` /// as key and `bool` as `value_type`. `put(pmap, v, true)` will be called for each duplicated @@ -1766,32 +2206,17 @@ bool is_non_manifold_vertex(typename boost::graph_traits::vertex_de /// \cgalNamedParamsEnd /// /// \return the number of vertices created. -template -std::size_t duplicate_non_manifold_vertices(TriangleMesh& tm, +template +std::size_t duplicate_non_manifold_vertices(PolygonMesh& pm, const NamedParameters& np) { - CGAL_assertion(CGAL::is_triangle_mesh(tm)); - using boost::get_param; using boost::choose_param; - typedef boost::graph_traits GT; + typedef boost::graph_traits GT; typedef typename GT::vertex_descriptor vertex_descriptor; typedef typename GT::halfedge_descriptor halfedge_descriptor; - typedef typename GetVertexPointMap::type VertexPointMap; - VertexPointMap vpm = choose_param(get_param(np, internal_np::vertex_point), - get_property_map(vertex_point, tm)); - - typedef typename boost::lookup_named_param_def < - internal_np::vertex_is_constrained_t, - NamedParameters, - Constant_property_map // default (no constraint pmap) - > ::type VerticesMap; - VerticesMap cmap - = choose_param(get_param(np, internal_np::vertex_is_constrained), - Constant_property_map(false)); - typedef typename boost::lookup_named_param_def < internal_np::output_iterator_t, NamedParameters, @@ -1801,70 +2226,78 @@ std::size_t duplicate_non_manifold_vertices(TriangleMesh& tm, = choose_param(get_param(np, internal_np::output_iterator), Emptyset_iterator()); - internal::Vertex_collector dmap; - boost::unordered_set vertices_handled; - boost::unordered_set halfedges_handled; + internal::Vertex_collector dmap; + + typedef CGAL::dynamic_vertex_property_t Vertex_property_tag; + typedef typename boost::property_map::type Visited_vertex_map; + typedef CGAL::dynamic_halfedge_property_t Halfedge_property_tag; + typedef typename boost::property_map::type Visited_halfedge_map; + + Visited_vertex_map visited_vertices = get(Vertex_property_tag(), pm); + Visited_halfedge_map visited_halfedges = get(Halfedge_property_tag(), pm); + + // Dynamic pmaps do not have default initialization values (yet) + for(vertex_descriptor v : vertices(pm)) + put(visited_vertices, v, false); + for(halfedge_descriptor h : halfedges(pm)) + put(visited_halfedges, h, false); std::size_t nb_new_vertices = 0; std::vector non_manifold_cones; - for(halfedge_descriptor h : halfedges(tm)) + for(halfedge_descriptor h : halfedges(pm)) { // If 'h' is not visited yet, we walk around the target of 'h' and mark these // halfedges as visited. Thus, if we are here and the target is already marked as visited, // it means that the vertex is non manifold. - if(halfedges_handled.insert(h).second) + if(!get(visited_halfedges, h)) { - vertex_descriptor vd = target(h, tm); - if(!vertices_handled.insert(vd).second) - { - put(cmap, vd, true); // store the originals - non_manifold_cones.push_back(h); - } - else - { - set_halfedge(vd, h, tm); - } + put(visited_halfedges, h, true); + bool is_non_manifold = false; - halfedge_descriptor start = opposite(next(h, tm), tm); - h = start; + vertex_descriptor vd = target(h, pm); + if(get(visited_vertices, vd)) // already seen this vertex, but not from this star + is_non_manifold = true; + + put(visited_vertices, vd, true); + + // While walking the star of this halfedge, if we meet a border halfedge more than once, + // it means the mesh is pinched and we are also in the case of a non-manifold situation + halfedge_descriptor ih = h, done = ih; + int border_counter = 0; do { - halfedges_handled.insert(h); - h = opposite(next(h, tm), tm); + put(visited_halfedges, ih, true); + if(is_border(ih, pm)) + ++border_counter; + + ih = prev(opposite(ih, pm), pm); } - while(h != start); + while(ih != done); + + if(border_counter > 1) + is_non_manifold = true; + + if(is_non_manifold) + non_manifold_cones.push_back(h); } } if(!non_manifold_cones.empty()) { for(halfedge_descriptor h : non_manifold_cones) - { - halfedge_descriptor start = h; - vertex_descriptor new_vd = add_vertex(tm); - ++nb_new_vertices; - put(cmap, new_vd, true); // store the duplicates - dmap.collect_vertices(target(h, tm), new_vd); - put(vpm, new_vd, get(vpm, target(h, tm))); - set_halfedge(new_vd, h, tm); - do - { - set_target(h, new_vd, tm); - h = opposite(next(h, tm), tm); - } - while(h != start); - } + nb_new_vertices += make_umbrella_manifold(h, pm, dmap, np); + dmap.dump(out); } return nb_new_vertices; } -template -std::size_t duplicate_non_manifold_vertices(TriangleMesh& tm) +template +std::size_t duplicate_non_manifold_vertices(PolygonMesh& pm) { - return duplicate_non_manifold_vertices(tm, parameters::all_default()); + return duplicate_non_manifold_vertices(pm, parameters::all_default()); } /// \ingroup PMP_repairing_grp diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h index 71e0ea9ebb0..27892d27aaa 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h @@ -23,6 +23,7 @@ #include +#include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h index f5d13e6937a..095a2d5e8ab 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h @@ -40,6 +40,7 @@ #include #include +#include namespace CGAL { @@ -151,6 +152,7 @@ class Polygon_mesh_slicer VertexPointMap m_vpmap; typename Traits_::Intersect_3 intersect_3; OutputIterator out; + std::pair nodes_for_orient; Polyline_visitor( TriangleMesh& tmesh, AL_graph& al_graph, @@ -167,12 +169,102 @@ class Polygon_mesh_slicer {} std::vector< Point_3 > current_poly; + + // returns true iff the polyline is not correctly oriented + // Using the first edge is oriented such that the normal induced by the face + // containing the edge, the oriented edge and the plane orthogonal vector defines + // a direct orthogonal basis + bool do_reverse_polyline() + { + if (current_poly.size() < 2) + return false; + + AL_vertex_info v1 = al_graph[nodes_for_orient.first]; + AL_vertex_info v2 = al_graph[nodes_for_orient.second]; + + if (const vertex_descriptor* vd1_ptr = boost::get(&v1) ) + { + if (const vertex_descriptor* vd2_ptr = boost::get(&v2) ) + { + CGAL_assertion( halfedge(*vd1_ptr, *vd2_ptr, m_tmesh).second ); + halfedge_descriptor h_opp = halfedge(*vd1_ptr, *vd2_ptr, m_tmesh).first; + if ( !is_border(h_opp, m_tmesh) ) + { + CGAL_assertion(source(h_opp, m_tmesh) == *vd1_ptr); + CGAL::Oriented_side os = m_plane.oriented_side( get(m_vpmap, target(next(h_opp, m_tmesh), m_tmesh) ) ); + if (os != CGAL::ON_ORIENTED_BOUNDARY) + return m_plane.oriented_side( get(m_vpmap, target(next(h_opp, m_tmesh), m_tmesh)) ) == CGAL::ON_NEGATIVE_SIDE; + } + h_opp = opposite(h_opp, m_tmesh); + if ( !is_border(h_opp, m_tmesh) ) + { + CGAL_assertion(source(h_opp, m_tmesh) == *vd2_ptr); + CGAL::Oriented_side os = m_plane.oriented_side( get(m_vpmap, target(next(h_opp, m_tmesh), m_tmesh) ) ); + if (os != CGAL::ON_ORIENTED_BOUNDARY) + return m_plane.oriented_side( get(m_vpmap, target(next(h_opp, m_tmesh), m_tmesh)) ) == CGAL::ON_POSITIVE_SIDE; + } + return false; // since coplanar edges are filtered out, we should never end up here. + } + else + { + // e2 is intersected in its interior + edge_descriptor e2 = boost::get(v2); + halfedge_descriptor h2 = halfedge(e2, m_tmesh); + if ( target(next(h2, m_tmesh), m_tmesh) != *vd1_ptr ) + h2=opposite(h2, m_tmesh); + return m_plane.oriented_side( get(m_vpmap, source(h2, m_tmesh)) ) == CGAL::ON_POSITIVE_SIDE; + } + } + else + { + edge_descriptor e1 = boost::get(v1); + halfedge_descriptor h1 = halfedge(e1, m_tmesh); + if (const vertex_descriptor* vd2_ptr = boost::get(&v2) ) + { + // e1 is intersected in its interior + if ( target(next(h1, m_tmesh), m_tmesh) != *vd2_ptr ) + h1=opposite(h1, m_tmesh); + CGAL_assertion( target(next(h1, m_tmesh), m_tmesh) == *vd2_ptr ); + } + else + { + // intersection in the interior of both edges + edge_descriptor e2 = boost::get(v2); + halfedge_descriptor h2 = halfedge(e2, m_tmesh); + if ( face(h1, m_tmesh) != face(h2,m_tmesh) ) + { + halfedge_descriptor opp_h1 = opposite(h1, m_tmesh), + opp_h2 = opposite(h2, m_tmesh); + if ( face(opp_h1, m_tmesh) == face(opp_h2, m_tmesh) ) + { + h1=opp_h1; + h2=opp_h2; + } + else + if ( face(opp_h1, m_tmesh)==face(h2,m_tmesh) ) + h1=opp_h1; + else + h2=opp_h2; + } + CGAL_assertion( face(h1, m_tmesh) == face(h2,m_tmesh) ); + } + return m_plane.oriented_side( get(m_vpmap, source(h1, m_tmesh)) ) == CGAL::ON_NEGATIVE_SIDE; + } + } + void start_new_polyline() { current_poly.clear(); } + void add_node(AL_vertex_descriptor node_id) { + if (current_poly.empty()) + nodes_for_orient.first=node_id; + else + if (current_poly.size()==1) + nodes_for_orient.second=node_id; + AL_vertex_info v = al_graph[node_id]; if (const vertex_descriptor* vd_ptr = boost::get(&v) ) { @@ -196,6 +288,8 @@ class Polygon_mesh_slicer void end_polyline() { CGAL_assertion(!current_poly.empty()); + if(do_reverse_polyline()) + std::reverse(current_poly.begin(), current_poly.end()); *out++=current_poly; } }; @@ -384,6 +478,18 @@ public: /** * Constructs the intersecting polylines of `plane` with the input triangulated surface mesh. + * + * If a polyline is closed, the first and last point of that polyline will be identical. + * + * Each resulting polyline `P` is oriented such that for two consecutive points `p` and `q` in `P`, + * the normal vector of the face(s) containing the segment `pq`, the vector `pq`, and the orthogonal vertor of `plane` + * is a direct orthogonal basis. + * The normal vector of each face is chosen to point on the side of the face + * where its sequence of vertices is seen counterclockwise. + * + * Note that an edge shared by two faces included in `plane` will not be reported. For example, + * if `plane` passes though one face of a cube, only one closed polyline will be reported (the boundary of the face) + * * @tparam OutputIterator an output iterator accepting polylines. * A polyline is provided as `std::vector`. * A polyline is closed if its first and last point are identical. diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index db345a3217e..686447f26d4 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -98,6 +98,10 @@ endif() create_single_source_cgal_program("test_repair_polygon_soup.cpp") create_single_source_cgal_program("test_shape_predicates.cpp") create_single_source_cgal_program("test_pmp_collision_detection.cpp") + create_single_source_cgal_program("test_pmp_snapping.cpp") + create_single_source_cgal_program("test_pmp_non_conforming_snapping.cpp") + create_single_source_cgal_program("remove_degeneracies_test.cpp") + create_single_source_cgal_program("test_pmp_manifoldness.cpp") if( TBB_FOUND ) CGAL_target_use_TBB(test_pmp_distance) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_degeneracies/fused_vertices.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_degeneracies/fused_vertices.off new file mode 100644 index 00000000000..0b57c46beb5 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_degeneracies/fused_vertices.off @@ -0,0 +1,87 @@ +OFF +40 45 0 +-0.026804100000000001 -0.30492799999999998 0.142542 +-0.018234400000000001 -0.28125499999999998 0.15192700000000001 +-0.074329900000000004 -0.27701599999999998 0.17852999999999999 +-0.074329900000000004 -0.27701599999999998 0.17852999999999999 +-0.092496499999999995 -0.26196000000000003 0.18681900000000001 +-0.107975 -0.220055 0.202264 +-0.098042799999999999 -0.24015500000000001 0.197738 +-0.074329900000000004 -0.27701599999999998 0.17852999999999999 +-0.10664999999999999 -0.18507100000000001 0.204627 +-0.041782300000000001 -0.28198800000000002 0.16825000000000001 +-0.10985300000000001 -0.27012399999999998 0.16877500000000001 +0.020159400000000001 -0.26358599999999999 0.11985899999999999 +-0.0820192 -0.303394 0.145977 +-0.11151800000000001 -0.28692499999999999 0.148566 +0.033791700000000001 -0.209923 0.115845 +0.019949499999999998 -0.19298699999999999 0.125832 +-0.0097084900000000002 -0.22793099999999999 0.15407299999999999 +0.0102764 -0.16375000000000001 0.13344700000000001 +0.015325999999999999 -0.12934699999999999 0.14213100000000001 +0.043303899999999999 -0.239647 0.099889199999999997 +-0.010328800000000001 -0.10643 0.14183100000000001 +-0.010328800000000001 -0.10643 0.14183100000000001 +-0.085985000000000006 -0.101282 0.15809300000000001 +-0.108849 -0.11043600000000001 0.16941700000000001 +-0.052558500000000001 -0.097836599999999996 0.13975499999999999 +-0.10316599999999999 -0.15746599999999999 0.19631499999999999 +-0.112763 -0.133107 0.183753 +-0.063495300000000005 -0.15489 0.17952499999999999 +-0.063495300000000005 -0.15489 0.17952499999999999 +-0.086169300000000004 -0.13996600000000001 0.183699 +-0.0097084900000000002 -0.22793099999999999 0.15407299999999999 +-0.023309900000000001 -0.17152600000000001 0.15354100000000001 +-0.0254547 -0.133829 0.14063300000000001 +-0.079254099999999994 -0.17391000000000001 0.197354 +-0.0458796 -0.210094 0.18626999999999999 +0.015174200000000001 -0.229959 0.128466 +0.00026201499999999999 -0.25824399999999997 0.14286599999999999 +-0.041782300000000001 -0.28198800000000002 0.16825000000000001 +-0.0218198 -0.25775500000000001 0.16445000000000001 +-0.049308200000000003 -0.25528899999999999 0.18343899999999999 +3 37 0 1 +3 2 3 4 +3 5 6 3 +3 7 5 3 +3 5 7 8 +3 0 37 9 +3 10 2 4 +3 1 36 38 +3 11 35 36 +3 12 9 2 +3 13 12 2 +3 14 15 35 +3 16 35 15 +3 37 1 38 +3 17 16 15 +3 16 31 30 +3 31 16 17 +3 17 18 32 +3 11 19 35 +3 37 2 9 +3 18 20 32 +3 20 21 32 +3 13 2 10 +3 29 28 22 +3 35 19 14 +3 23 29 22 +3 24 22 28 +3 21 24 28 +3 32 21 28 +3 33 29 25 +3 8 33 25 +3 8 7 33 +3 26 29 23 +3 34 33 7 +3 25 29 26 +3 4 3 6 +3 31 17 32 +3 29 27 28 +3 32 27 31 +3 34 27 33 +3 31 34 30 +3 39 34 3 +3 38 39 37 +3 35 30 36 +3 36 30 38 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/many_umbrellas.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/many_umbrellas.off new file mode 100644 index 00000000000..9bcb6898d0b --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/many_umbrellas.off @@ -0,0 +1,26 @@ +OFF +16 8 0 +0 0 0 +1 0 0 +2 0 0 +2 1 0 +0 1 0 +0 -1 0 +2 -1 0 +0 1 2 +0 -1 1 +1 0 0 +1 1 -1 +2 0 -1 +1 0 1 +1 1 0 +0 1 0 +1 0 0 +3 0 1 4 +3 1 2 3 +3 5 6 1 +3 7 8 9 +3 10 9 11 +3 12 14 13 +3 13 14 15 +3 15 12 13 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/nm_closed_cubes.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/nm_closed_cubes.off new file mode 100644 index 00000000000..4db8b1e9edf --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/nm_closed_cubes.off @@ -0,0 +1,44 @@ +OFF +16 24 0 +0 0 0 +1 0 0 +1 1 0 +0 1 0 +0 0 1 +1 0 1 +1 1 1 +0 1 1 +2 0 1 +2 1 1 +1 0 2 +2 0 2 +2 1 2 +1 1 2 +1 0 1 +1 1 1 +3 0 2 1 +3 0 3 2 +3 0 1 5 +3 0 5 4 +3 3 0 4 +3 3 4 7 +3 2 3 7 +3 2 7 6 +3 4 5 6 +3 4 6 7 +3 1 2 5 +3 5 2 6 +3 14 9 8 +3 15 9 14 +3 14 8 11 +3 14 11 10 +3 8 12 11 +3 8 9 12 +3 12 9 15 +3 13 12 15 +3 15 14 10 +3 15 10 13 +3 10 11 12 +3 10 12 13 + + diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/three_triangles_sharing_a_vertex.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/three_triangles_sharing_a_vertex.off new file mode 100644 index 00000000000..ea869fcf8d1 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/three_triangles_sharing_a_vertex.off @@ -0,0 +1,12 @@ +OFF +7 3 0 +0 0 0 +1 0 0 +2 0 0 +2 1 0 +0 1 0 +0 -1 0 +2 -1 0 +3 0 1 4 +3 1 2 3 +3 5 6 1 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/two_triangles_sharing_a_vertex.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/two_triangles_sharing_a_vertex.off new file mode 100644 index 00000000000..7efcb129e93 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_repair/two_triangles_sharing_a_vertex.off @@ -0,0 +1,9 @@ +OFF +5 2 0 +0 0 0 +1 0 0 +2 0 0 +2 1 0 +0 1 0 +3 0 1 4 +3 1 2 3 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_source.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_source.off new file mode 100644 index 00000000000..f5093f624dc --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_source.off @@ -0,0 +1,310 @@ +OFF +154 152 0 + +2.42679 -0.69934300000000005 0.0436987 +2.4882200000000001 -0.70206800000000003 0.049746600000000002 +2.4499 -0.69938900000000004 0.0495839 +2.4792900000000002 -0.69959800000000005 0.050254399999999998 +2.4793400000000001 -0.70200300000000004 0.050934300000000002 +2.5116800000000001 -0.70298799999999995 -0.0068175400000000004 +2.5091000000000001 -0.70299100000000003 -0.0082744600000000008 +2.5113799999999999 -0.70053200000000004 -0.0064532399999999998 +2.4440200000000001 -0.69936600000000004 0.048574199999999998 +2.4469599999999998 -0.69937700000000003 0.049116300000000002 +2.4468999999999999 -0.70185799999999998 0.049417900000000001 +2.5135800000000001 -0.70008700000000001 0.037225300000000003 +2.51749 -0.70252099999999995 0.029477199999999999 +2.5158200000000002 -0.70018899999999995 0.032005800000000001 +2.5148600000000001 -0.70013999999999998 0.034697100000000002 +2.5180199999999999 -0.70256600000000002 0.026547899999999999 +2.5178799999999999 -0.70051799999999997 0.0116977 +2.5177200000000002 -0.70056499999999999 0.0087766200000000006 +2.51877 -0.70283300000000004 0.0087047700000000006 +2.51694 -0.70066200000000001 0.0030564699999999999 +2.5179999999999998 -0.70291800000000004 0.00281131 +2.51396 -0.70298300000000002 -0.0049324399999999997 +2.4977499999999999 -0.70049499999999998 -0.0120292 +2.50352 -0.700492 -0.01043 +2.48889 -0.70049399999999995 -0.0136116 +2.4799000000000002 -0.70294100000000004 -0.014110299999999999 +2.4739599999999999 -0.700465 -0.0149255 +2.4649700000000001 -0.70043999999999995 -0.0151919 +2.46197 -0.70043 -0.0152097 +2.43201 -0.70031100000000002 -0.013349 +2.4239899999999999 -0.69934700000000005 0.042610599999999998 +2.42401 -0.70184599999999997 0.042591200000000003 +2.4410500000000002 -0.701847 0.048175999999999997 +2.51742 -0.70033000000000001 0.023438899999999999 +2.5184299999999999 -0.70261200000000001 0.023593300000000001 +2.5178500000000001 -0.70042300000000002 0.017575299999999999 +2.51769 -0.70037799999999995 0.020512200000000001 +2.5187200000000001 -0.70265699999999998 0.020624400000000001 +2.4528599999999998 -0.69940199999999997 0.049984300000000002 +2.4527999999999999 -0.701874 0.050353700000000001 +2.4617599999999999 -0.69945400000000002 0.050727300000000003 +2.4677199999999999 -0.69949600000000001 0.050862999999999998 +2.4676999999999998 -0.70193499999999998 0.051413800000000003 +2.4262100000000002 -0.70266700000000004 -0.0115887 +2.4736699999999998 -0.69955999999999996 0.0507108 +2.4379900000000001 -0.70033800000000002 -0.014079400000000001 +2.4409900000000002 -0.70035000000000003 -0.0143581 +2.4439799999999998 -0.70036200000000004 -0.0145912 +2.4410400000000001 -0.70276099999999997 -0.0136992 +2.4469799999999999 -0.70037400000000005 -0.014782999999999999 +2.44998 -0.70038500000000004 -0.0149362 +2.4470100000000001 -0.70279400000000003 -0.0141584 +2.4529700000000001 -0.70040100000000005 -0.0150422 +2.4559700000000002 -0.70040999999999998 -0.015128600000000001 +2.4529899999999998 -0.70282599999999995 -0.014431899999999999 +2.46495 -0.70288200000000001 -0.0146564 +2.4709599999999998 -0.70045599999999997 -0.015050600000000001 +2.4679500000000001 -0.70289500000000005 -0.0146204 +2.4739300000000002 -0.70291899999999996 -0.014444 +2.47994 -0.70047800000000005 -0.0145478 +2.4859200000000001 -0.70048999999999995 -0.013979399999999999 +2.4858699999999998 -0.70296000000000003 -0.013595299999999999 +2.4948199999999998 -0.70049799999999995 -0.0126605 +2.4888400000000002 -0.70296800000000004 -0.013257100000000001 +2.4977 -0.702986 -0.0118198 +2.5127600000000001 -0.70233999999999996 0.0402174 +2.5144099999999998 -0.70238199999999995 0.0377785 +2.51892 -0.70279000000000003 0.011681800000000001 +2.4910100000000002 -0.69972699999999999 0.048391700000000003 +2.4911599999999998 -0.70209200000000005 0.049190699999999997 +2.4706899999999998 -0.69952000000000003 0.050816899999999998 +2.4706899999999998 -0.70194999999999996 0.051402000000000003 +2.45879 -0.69943599999999995 0.050551100000000002 +2.4587400000000001 -0.70189500000000005 0.051000700000000003 +2.4212699999999998 -0.70185200000000003 0.041377700000000003 +2.4212199999999999 -0.69935199999999997 0.041427499999999999 +2.4589699999999999 -0.70041900000000001 -0.0151898 +2.4589699999999999 -0.70285500000000001 -0.0146255 +2.5089600000000001 -0.70050400000000002 -0.0080524900000000007 +2.5106899999999999 -0.70230400000000004 0.042327700000000003 +2.51004 -0.70003800000000005 0.041486200000000001 +2.5082100000000001 -0.70226699999999997 0.043928399999999999 +2.5076999999999998 -0.69999299999999998 0.043009100000000001 +2.5026799999999998 -0.70220000000000005 0.046086099999999998 +2.50237 -0.69987900000000003 0.045208999999999999 +2.49675 -0.69980100000000001 0.0469655 +2.4938899999999999 -0.69976400000000005 0.047720600000000002 +2.48224 -0.69962800000000003 0.049906800000000001 +2.4851800000000002 -0.699658 0.049485500000000002 +2.4881000000000002 -0.69969300000000001 0.0489746 +2.4354815481136081 -0.70050987293913247 0.046731713470926584 +2.4763299999999999 -0.69958500000000001 0.050540799999999997 +2.48231 -0.70202299999999995 0.0506179 +2.5035099999999999 -0.70299100000000003 -0.010372599999999999 +2.50631 -0.70049300000000003 -0.0093632300000000002 +2.5134300000000001 -0.70058200000000004 -0.0044698699999999999 +2.44984 -0.70186499999999996 0.049924700000000002 +2.5157600000000002 -0.70242899999999997 0.035147299999999999 +2.5167700000000002 -0.70247499999999996 0.032359100000000002 +2.5165000000000002 -0.70023899999999994 0.029208499999999998 +2.5184899999999999 -0.70287599999999995 0.00574005 +2.5174400000000001 -0.70061200000000001 0.0058845199999999999 +2.5162100000000001 -0.70068799999999998 0.000327356 +2.5158399999999999 -0.70297299999999996 -0.0026525099999999999 +2.5171999999999999 -0.70295399999999997 -4.2763899999999999e-05 +2.51505 -0.70064000000000004 -0.0021950300000000002 +2.5006599999999999 -0.70049399999999995 -0.011306 +2.5006200000000001 -0.70299 -0.0111637 +2.4829300000000001 -0.70048500000000002 -0.0142896 +2.47695 -0.70047400000000004 -0.014759899999999999 +2.4679700000000002 -0.70044799999999996 -0.0151378 +2.42916 -0.70268699999999995 -0.0121584 +2.4350000000000001 -0.70032399999999995 -0.0137439 +2.4321199999999998 -0.70270699999999997 -0.012643400000000001 +2.4267799999999999 -0.70184299999999999 0.043719599999999997 +2.4304863659162512 -0.69950709831834268 0.044914867086021514 +2.4407901449361473 -0.69904798665842549 0.048256236161062289 +2.4439600000000001 -0.70185200000000003 0.048835099999999999 +2.5170300000000001 -0.70028199999999996 0.026345 +2.5189499999999998 -0.70274599999999998 0.0146642 +2.5188799999999998 -0.70270100000000002 0.017646200000000001 +2.4557699999999998 -0.70188399999999995 0.0507173 +2.4558200000000001 -0.69941900000000001 0.050303599999999997 +2.4647100000000002 -0.70191999999999999 0.051350600000000003 +2.4647399999999999 -0.69947400000000004 0.050833700000000002 +2.4260100000000002 -0.70028900000000005 -0.012333200000000001 +2.4290099999999999 -0.700299 -0.012883500000000001 +2.4763700000000002 -0.70198499999999997 0.051240599999999997 +2.4350800000000001 -0.70272599999999996 -0.013053199999999999 +2.4380600000000001 -0.70274400000000004 -0.0134024 +2.4440200000000001 -0.70277800000000001 -0.013949700000000001 +2.4499900000000001 -0.70281000000000005 -0.0143275 +2.4619599999999999 -0.70286899999999997 -0.0146579 +2.4709400000000001 -0.70290699999999995 -0.014550799999999999 +2.4769199999999998 -0.70293000000000005 -0.0142983 +2.4828899999999998 -0.70295099999999999 -0.0138776 +2.4918100000000001 -0.70297600000000005 -0.012861300000000001 +2.49186 -0.70049700000000004 -0.0131805 +2.4947599999999999 -0.702982 -0.0123847 +2.5120200000000001 -0.70004999999999995 0.039527300000000001 +2.5179200000000002 -0.70047000000000004 0.0146347 +2.4940699999999998 -0.70211699999999999 0.048544799999999999 +2.4736799999999999 -0.70196899999999995 0.051380200000000001 +2.4617300000000002 -0.70190699999999995 0.051208700000000003 +2.4184800000000002 -0.69938800000000001 0.039955600000000001 +2.41873 -0.70186700000000002 0.039775699999999997 +2.4559799999999998 -0.70284000000000002 -0.014533000000000001 +2.5063399999999998 -0.70299100000000003 -0.0094261099999999997 +2.5051000000000001 -0.69992299999999996 0.0442035 +2.50549 -0.70223000000000002 0.045092 +2.4995799999999999 -0.69983899999999999 0.046131400000000003 +2.4998399999999998 -0.70217099999999999 0.046995700000000001 +2.4969700000000001 -0.70214299999999996 0.047812199999999999 +2.4852699999999999 -0.70204500000000003 0.050223200000000003 +3 114 115 0 +3 1 88 153 +3 69 89 1 +3 90 32 116 +3 39 2 96 +3 3 127 4 +3 4 87 3 +3 93 94 147 +3 95 5 7 +3 7 6 78 +3 117 9 8 +3 10 2 9 +3 66 14 11 +3 13 12 99 +3 14 98 13 +3 118 12 15 +3 18 16 67 +3 18 101 17 +3 20 101 100 +3 102 103 105 +3 20 102 19 +3 21 105 103 +3 22 107 64 +3 23 107 106 +3 63 60 24 +3 59 135 25 +3 26 134 58 +3 27 57 55 +3 77 28 132 +3 29 111 126 +3 112 113 29 +3 31 0 30 +3 31 75 74 +3 32 8 116 +3 37 33 34 +3 34 118 15 +3 120 140 35 +3 37 35 36 +3 39 122 38 +3 73 122 121 +3 143 124 40 +3 42 124 123 +3 42 70 41 +3 43 126 111 +3 142 91 44 +3 129 112 45 +3 48 45 46 +3 48 47 130 +3 51 47 49 +3 51 50 131 +3 54 50 52 +3 54 53 146 +3 55 28 27 +3 57 56 133 +3 58 56 26 +3 59 134 109 +3 61 108 60 +3 138 137 62 +3 63 137 136 +3 64 62 22 +3 65 80 79 +3 66 139 65 +3 67 140 119 +3 69 86 68 +3 71 44 70 +3 73 40 72 +3 75 145 74 +3 77 53 76 +3 78 147 94 +3 80 81 79 +3 82 149 81 +3 84 149 148 +3 84 151 83 +3 85 151 150 +3 86 152 85 +3 87 153 88 +3 88 1 89 +3 89 69 68 +3 2 39 38 +3 127 3 91 +3 87 4 92 +3 94 93 23 +3 5 95 21 +3 6 7 5 +3 9 117 10 +3 2 10 96 +3 14 66 97 +3 12 13 98 +3 98 14 97 +3 12 118 99 +3 16 18 17 +3 101 18 100 +3 101 20 19 +3 103 102 104 +3 102 20 104 +3 105 21 95 +3 107 22 106 +3 107 23 93 +3 60 63 61 +3 135 59 108 +3 134 26 109 +3 57 27 110 +3 28 77 76 +3 111 29 113 +3 113 112 128 +3 0 31 114 +3 75 31 30 +3 8 32 117 +3 33 37 36 +3 118 34 33 +3 140 120 119 +3 35 37 120 +3 122 39 121 +3 122 73 72 +3 124 143 123 +3 124 42 41 +3 70 42 71 +3 126 43 125 +3 91 142 127 +3 112 129 128 +3 45 48 129 +3 47 48 46 +3 47 51 130 +3 50 51 49 +3 50 54 131 +3 53 54 52 +3 28 55 132 +3 56 57 110 +3 56 58 133 +3 134 59 25 +3 108 61 135 +3 137 138 136 +3 137 63 24 +3 62 64 138 +3 80 65 139 +3 139 66 11 +3 140 67 16 +3 86 69 141 +3 44 71 142 +3 40 73 143 +3 145 75 144 +3 53 77 146 +3 147 78 6 +3 81 80 82 +3 149 82 148 +3 149 84 83 +3 151 84 150 +3 151 85 152 +3 152 86 141 +3 153 87 92 +3 90 115 114 +3 115 90 116 + diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_source_2.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_source_2.off new file mode 100644 index 00000000000..7b7b4e818de --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_source_2.off @@ -0,0 +1,8 @@ +OFF +4 2 0 +0.99580552770310071 0.6744670773646162 0.0034646732615288638 +0.95773896536930325 0.7197973714165673 -0.010590738956662181 +1.8309779220648625 1.0711975224776349 0.075815641434713907 +1.0625696235529338 0.62637362388569051 -0.0059984504520185127 +3 1 0 2 +3 2 0 3 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_target.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_target.off new file mode 100644 index 00000000000..deba30d56dc --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_target.off @@ -0,0 +1,1456 @@ +OFF +489 963 0 + +2.4403299999999999 -0.70229900000000001 0.051108099999999997 +2.4377130060246714 -0.70255268618935707 0.05051528373195658 +2.4342452202526181 -0.70242300294392002 0.049975805749293466 +2.4408999869131645 -0.70245890725909688 0.04800254861646544 +2.4351444640194564 -0.70277453025742076 0.046963610889103911 +2.4617200000000001 -0.70239700000000005 0.051305000000000003 +2.4615300000000002 -0.70236200000000004 0.053640100000000003 +2.4760599999999999 -0.70250699999999999 0.0484044 +2.4706800000000002 -0.70247999999999999 0.048526699999999999 +2.46482 -0.70245299999999999 0.048463699999999998 +2.4647100000000002 -0.70240899999999995 0.051454 +2.46773 -0.70246600000000003 0.048531900000000003 +2.4587400000000001 -0.70238599999999995 0.0510906 +2.4557600000000002 -0.70237700000000003 0.050799999999999998 +2.4560900000000001 -0.70242099999999996 0.047826199999999999 +2.4531900000000002 -0.70241299999999995 0.047462699999999997 +2.4468800000000002 -0.70235400000000003 0.0494782 +2.4474399999999998 -0.702399 0.046537500000000002 +2.4391892994896787 -0.70252057962796299 0.044004516482198434 +2.4361377592973157 -0.70230478724886236 0.043168784578978277 +2.4330610066963043 -0.70198053004675143 0.041995082851783612 +2.43050932609742 -0.70220833573946706 0.041730666453997013 +2.4267799999999999 -0.70234300000000005 0.0437238 +2.42788 -0.70238900000000004 0.040939900000000001 +2.42401 -0.70234600000000003 0.042587199999999999 +2.4212799999999999 -0.70235099999999995 0.041367500000000001 +2.4228299999999998 -0.70230099999999995 0.045337299999999997 +2.4256799999999998 -0.70229699999999995 0.046507699999999999 +2.4445800000000002 -0.70239399999999996 0.045962000000000003 +2.4439500000000001 -0.702349 0.048887300000000002 +2.4463300000000001 -0.70230899999999996 0.052418899999999997 +2.4527899999999998 -0.70236799999999999 0.050427600000000003 +2.4492799999999999 -0.70231600000000005 0.052892599999999998 +2.4522200000000001 -0.70232300000000003 0.053335899999999999 +2.4586000000000001 -0.70235000000000003 0.053554200000000003 +2.45912 -0.70231900000000003 0.055831400000000003 +2.4676999999999998 -0.70242199999999999 0.051524 +2.4678499999999999 -0.70237099999999997 0.055084399999999999 +2.47139 -0.70238599999999995 0.055208500000000001 +2.4741599999999999 -0.70239700000000005 0.0553371 +2.51457 -0.70284100000000005 0.0378883 +2.512 -0.70285200000000003 0.036359700000000002 +2.4433500000000001 -0.70230300000000001 0.051818700000000002 +2.4857399999999998 -0.70247700000000002 0.0536033 +2.47654 -0.70243100000000003 0.053767099999999998 +2.5097 -0.70269000000000004 0.046759500000000002 +2.5127100000000002 -0.70273200000000002 0.044813499999999999 +2.5129000000000001 -0.70279800000000003 0.040354899999999999 +2.4187799999999999 -0.70236299999999996 0.039738500000000003 +2.4168699999999999 -0.70232099999999997 0.042043999999999998 +2.4962399999999998 -0.70265 0.045090400000000003 +2.49342 -0.702627 0.045796799999999999 +2.48529 -0.70252199999999998 0.0503708 +2.4877400000000001 -0.70258299999999996 0.046952599999999997 +2.4848599999999998 -0.70256300000000005 0.0474095 +2.4763700000000002 -0.70246500000000001 0.051380500000000003 +2.4793500000000002 -0.702484 0.051070299999999999 +2.4619 -0.70244200000000001 0.048318300000000002 +2.4825200000000001 -0.702461 0.053646899999999997 +2.4917799999999999 -0.70252499999999996 0.0522829 +2.49411 -0.70258799999999999 0.048709700000000002 +2.49701 -0.70261200000000001 0.047981700000000002 +2.4990299999999999 -0.70267500000000005 0.044302899999999999 +2.4882499999999999 -0.70254300000000003 0.049901000000000001 +2.4998900000000002 -0.70263699999999996 0.047168799999999997 +2.5027400000000002 -0.70266399999999996 0.046261799999999999 +2.5017900000000002 -0.70270100000000002 0.043424299999999999 +2.50691 -0.70275299999999996 0.0414659 +2.50556 -0.70269199999999998 0.045270100000000001 +2.51058 -0.70281400000000005 0.038465800000000001 +2.51715 -0.70283099999999998 0.039416899999999998 +2.5186899999999999 -0.70288200000000001 0.036434800000000003 +2.5083000000000002 -0.70272100000000004 0.044112699999999998 +2.50664 -0.70265599999999995 0.048061399999999997 +2.5034999999999998 -0.70349099999999998 -0.010361199999999999 +2.5073699999999999 -0.70353699999999997 -0.0122506 +2.5138099999999999 -0.70353399999999999 -0.0099777400000000006 +2.4741399999999998 -0.70242000000000004 0.053790699999999997 +2.5187599999999999 -0.70348100000000002 -0.0047153899999999999 +2.5117400000000001 -0.70347899999999997 -0.0068911600000000003 +2.4790399999999999 -0.70252599999999998 0.048094199999999997 +2.49119 -0.702565 0.049350600000000001 +2.4905900000000001 -0.70260400000000001 0.046418300000000003 +2.4982700000000002 -0.70352800000000004 -0.014608899999999999 +2.4952399999999999 -0.70352199999999998 -0.0151609 +2.4922200000000001 -0.70351600000000003 -0.015742900000000001 +2.4918 -0.70347099999999996 -0.0127974 +2.48847 -0.70341799999999999 -0.010215699999999999 +2.4736799999999999 -0.70249399999999995 0.048521799999999997 +2.4855499999999999 -0.70340899999999995 -0.0105418 +2.4819800000000001 -0.70254399999999995 0.047788400000000002 +2.4828800000000002 -0.70344399999999996 -0.013795200000000001 +2.5043099999999998 -0.70353600000000005 -0.013195 +2.4706899999999998 -0.70243599999999995 0.051519000000000002 +2.4285600000000001 -0.702295 0.047594299999999999 +2.5012799999999999 -0.70353299999999996 -0.013965699999999999 +2.4649299999999998 -0.70332700000000004 -0.011557100000000001 +2.4619800000000001 -0.70331299999999997 -0.011555299999999999 +2.4590399999999999 -0.70329799999999998 -0.011521099999999999 +2.5036900000000002 -0.702627 0.049099299999999999 +2.4559799999999998 -0.70332600000000001 -0.014414 +2.4500000000000002 -0.703295 -0.014205799999999999 +2.4528599999999998 -0.70335099999999995 -0.017141199999999999 +2.4417399999999998 -0.70238999999999996 0.045311999999999998 +2.4407899999999998 -0.70328199999999996 -0.016288799999999999 +2.4384000000000001 -0.703183 -0.010297499999999999 +2.4440300000000001 -0.70326100000000002 -0.013821399999999999 +2.4468399999999999 -0.70331699999999997 -0.016775000000000002 +2.4947900000000001 -0.70254899999999998 0.051622500000000002 +2.4410500000000002 -0.70324299999999995 -0.0135674 +2.4740500000000001 -0.70345400000000002 -0.017337499999999999 +2.4887600000000001 -0.70250199999999996 0.052849399999999998 +2.4736799999999999 -0.70245100000000005 0.051513999999999997 +2.4380700000000002 -0.70322499999999999 -0.013266999999999999 +2.5089299999999999 -0.70278200000000002 0.040178899999999997 +2.43214 -0.70318599999999998 -0.0125022 +2.42625 -0.70314299999999996 -0.0114395 +2.4287100000000001 -0.70320099999999996 -0.014667400000000001 +2.5108199999999998 -0.70275699999999997 0.042496199999999998 +2.42334 -0.70311900000000005 -0.0107352 +2.4442599999999999 -0.70321900000000004 -0.0108383 +2.4501400000000002 -0.70325199999999999 -0.0112167 +2.45608 -0.70328299999999999 -0.0114234 +2.5152299999999999 -0.70278099999999999 0.0422441 +2.4619599999999999 -0.70335599999999998 -0.014547600000000001 +2.46495 -0.70337000000000005 -0.014549299999999999 +2.4354800000000001 -0.70316500000000004 -0.0099473400000000007 +2.47098 -0.70344099999999998 -0.017420999999999999 +2.4709300000000001 -0.70339700000000005 -0.014450899999999999 +2.4739200000000001 -0.70340999999999998 -0.014347800000000001 +2.4769100000000002 -0.70342199999999999 -0.0142059 +2.4770699999999999 -0.70346600000000004 -0.017193799999999999 +2.4826299999999999 -0.703399 -0.0108136 +2.4297200000000001 -0.703125 -0.0090685000000000002 +2.4801000000000002 -0.70347800000000005 -0.017008100000000002 +2.45309 -0.703268 -0.0113194 +2.4830899999999998 -0.703488 -0.016780300000000001 +2.44983 -0.70235999999999998 0.0499929 +2.46794 -0.70338400000000001 -0.014517 +2.4799000000000002 -0.70343299999999997 -0.0140229 +2.4589699999999999 -0.70334200000000002 -0.0145126 +2.4860500000000001 -0.70349499999999998 -0.016286200000000001 +2.4888300000000001 -0.70346299999999995 -0.0131862 +2.4890699999999999 -0.70351600000000003 -0.016713200000000001 +2.4529899999999998 -0.70330999999999999 -0.0143099 +2.4590100000000001 -0.70337300000000003 -0.0166672 +2.4347500000000002 -0.70324299999999995 -0.0156093 +2.4649700000000001 -0.70341399999999998 -0.017541500000000002 +2.4913599999999998 -0.703426 -0.0098382999999999995 +2.49424 -0.70343299999999997 -0.0093809800000000006 +2.4971000000000001 -0.70343900000000004 -0.0088459699999999999 +2.4678900000000001 -0.70333999999999997 -0.0115251 +2.50061 -0.70348900000000003 -0.0111352 +2.4999099999999999 -0.70344300000000004 -0.0082281300000000002 +2.4796900000000002 -0.70338900000000004 -0.011037699999999999 +2.4291900000000002 -0.70316500000000004 -0.0120132 +2.5091199999999998 -0.703488 -0.0083192600000000002 +2.5100799999999999 -0.70343500000000003 -0.0044005800000000003 +2.5119799999999999 -0.70342199999999999 -0.0028841600000000002 +2.4317299999999999 -0.70322300000000004 -0.015177299999999999 +2.5182099999999998 -0.70337000000000005 0.0027626399999999998 +2.5146199999999999 -0.70337799999999995 0.00099916400000000009 +2.46441 -0.70235599999999998 0.055022599999999998 +2.5160900000000002 -0.70350199999999996 -0.0070076399999999999 +2.5140699999999998 -0.70346299999999995 -0.0050260000000000001 +2.5159899999999999 -0.70343900000000004 -0.0027449800000000002 +2.4858600000000002 -0.70345400000000002 -0.013518499999999999 +2.44381 -0.70330000000000004 -0.0165533 +2.5152899999999998 -0.70334600000000003 0.0034141900000000001 +2.4613700000000001 -0.70233800000000002 0.055249800000000002 +2.51573 -0.70330899999999996 0.0061004299999999996 +2.5135200000000002 -0.703403 -0.00108537 +2.4227099999999999 -0.70239600000000002 0.038739099999999999 +2.47675 -0.70337799999999995 -0.0112181 +2.4619399999999998 -0.70340000000000003 -0.017539800000000001 +2.4242599999999999 -0.70308199999999998 -0.0078859700000000008 +2.5161699999999998 -0.70318700000000001 0.0146485 +2.4256700000000002 -0.70317799999999997 -0.0140579 +2.4225099999999999 -0.703152 -0.0132774 +2.5026600000000001 -0.70344499999999999 -0.0074918900000000002 +2.5159400000000001 -0.703102 0.020419 +2.4947499999999998 -0.70347899999999997 -0.0123295 +2.50075 -0.7026 0.050034599999999999 +2.4552900000000002 -0.70232600000000001 0.054124499999999999 +2.51566 -0.70305899999999999 0.0232757 +2.4206799999999999 -0.70240599999999997 0.037431300000000001 +2.5191599999999998 -0.70320099999999996 0.0146704 +2.5182199999999999 -0.70302299999999995 0.026588199999999999 +2.5131999999999999 -0.70289100000000004 0.034038899999999997 +2.51614 -0.70322899999999999 0.011772100000000001 +2.4350999999999998 -0.703206 -0.012914999999999999 +2.5159500000000001 -0.70288700000000004 0.035236900000000002 +2.5173999999999999 -0.70340800000000003 -0.00011731900000000001 +2.5201799999999999 -0.70343699999999998 -0.0012338 +2.5078399999999998 -0.70344300000000004 -0.0056137299999999999 +2.4194 -0.70229699999999995 0.044469700000000001 +2.5216699999999999 -0.703349 0.0053232599999999998 +2.4413200000000002 -0.70320099999999996 -0.0105881 +2.4679600000000002 -0.70342700000000002 -0.017471500000000001 +2.5186999999999999 -0.70332899999999998 0.0057118500000000001 +2.52197 -0.70330400000000004 0.0084771299999999994 +2.5063499999999999 -0.70349099999999998 -0.0094387499999999992 +2.5190899999999998 -0.70315700000000003 0.017660599999999999 +2.51898 -0.703287 0.0086910700000000004 +2.43777 -0.70326299999999997 -0.015976500000000001 +2.5220799999999999 -0.70316900000000004 0.017780899999999999 +2.5211299999999999 -0.70339300000000005 0.0021110999999999999 +2.4471699999999998 -0.70323599999999997 -0.011038299999999999 +2.4977800000000001 -0.70257400000000003 0.050872899999999999 +2.4823300000000001 -0.70250199999999996 0.050760199999999998 +2.47953 -0.70244700000000004 0.0536704 +2.5053299999999998 -0.70344499999999999 -0.0066265200000000003 +2.516 -0.70326999999999995 0.0089050199999999996 +2.50448 -0.70272699999999999 0.042478799999999997 +2.51892 -0.70311299999999999 0.020646899999999999 +2.51044 -0.70353500000000002 -0.011139899999999999 +2.5215999999999998 -0.70307699999999995 0.023972400000000001 +2.4308708719839642 -0.70233062369317445 0.049193595689942575 +2.4325899999999998 -0.70314500000000002 -0.0095441199999999997 +2.5221399999999998 -0.70321400000000001 0.0147102 +2.45899 -0.70243100000000003 0.048108999999999999 +2.4251900000000002 -0.70239200000000002 0.0398371 +2.5186299999999999 -0.70306800000000003 0.023623999999999999 +2.5211800000000002 -0.70303000000000004 0.027061600000000002 +2.49769 -0.703484 -0.011778 +2.4268900000000002 -0.70310300000000003 -0.0085163400000000007 +2.47085 -0.70335300000000001 -0.011459799999999999 +2.4502999999999999 -0.70240599999999997 0.047038499999999997 +2.4738000000000002 -0.70336600000000005 -0.011358099999999999 +2.5191300000000001 -0.70324399999999998 0.011679200000000001 +2.5221200000000001 -0.70326 0.0115917 +2.5152700000000001 -0.70301599999999997 0.026114800000000001 +2.5147599999999999 -0.70297299999999996 0.028896399999999999 +2.5176799999999999 -0.70297799999999999 0.029530500000000001 +2.52061 -0.702982 0.0301645 +2.5160999999999998 -0.70314500000000002 0.017540199999999999 +2.5219 -0.70312399999999997 0.020874899999999998 +2.4560399999999998 -0.703372 -0.0175453 +2.4470100000000001 -0.70327799999999996 -0.014033500000000001 +2.5140899999999999 -0.70293099999999997 0.0315567 +2.5169600000000001 -0.702932 0.032429199999999998 +2.5198299999999998 -0.70293300000000003 0.033284099999999997 +2.4498700000000002 -0.70333400000000001 -0.016958500000000001 +2.4240840425360202 -0.74170876038575173 0.047550387694662806 +2.4211840425360203 -0.74170576038575176 0.046824287694662813 +2.4182540425360202 -0.74170476038575173 0.045994987694662808 +2.4218940425360205 -0.74175176038575175 0.043916887694662808 +2.4190140425360203 -0.74174976038575169 0.043099187694662811 +2.4454740425360204 -0.74180676038575177 0.047747287694662813 +2.4452840425360205 -0.74177176038575177 0.050082387694662812 +2.4598140425360202 -0.74191676038575172 0.04484668769466281 +2.4544340425360205 -0.74188976038575172 0.044968987694662808 +2.4485740425360203 -0.74186276038575172 0.044905987694662808 +2.4484640425360205 -0.74181876038575167 0.047896287694662809 +2.4514840425360203 -0.74187576038575176 0.044974187694662812 +2.4424940425360204 -0.74179576038575168 0.047532887694662809 +2.4395140425360204 -0.74178676038575175 0.047242287694662807 +2.4398440425360204 -0.74183076038575169 0.044268487694662809 +2.4369440425360205 -0.74182276038575168 0.043904987694662806 +2.4306340425360204 -0.74176376038575176 0.045920487694662809 +2.4311940425360201 -0.74180876038575172 0.042979787694662812 +2.4226740425360203 -0.74179776038575174 0.041028587694662812 +2.4198640425360205 -0.74179576038575168 0.040228087694662809 +2.4171040425360202 -0.74179576038575168 0.039358287694662812 +2.4143940425360202 -0.74179676038575171 0.038378187694662808 +2.4105340425360202 -0.74175276038575177 0.04016608769466281 +2.4116340425360203 -0.74179876038575177 0.037382187694662811 +2.4077640425360203 -0.74175576038575175 0.039029487694662808 +2.4050340425360202 -0.74176076038575167 0.037809787694662811 +2.4065840425360201 -0.74171076038575168 0.041779587694662806 +2.4094340425360201 -0.74170676038575167 0.042949987694662808 +2.4133340425360204 -0.74175076038575172 0.041222487694662809 +2.4283340425360205 -0.74180376038575169 0.042404287694662812 +2.4247840425360203 -0.74175476038575172 0.044661887694662811 +2.4277040425360203 -0.74175876038575173 0.045329587694662811 +2.4300840425360204 -0.74171876038575169 0.048861187694662807 +2.4365440425360201 -0.74177776038575172 0.046869887694662812 +2.4330340425360202 -0.74172576038575178 0.049334887694662807 +2.4359740425360203 -0.74173276038575175 0.049778187694662808 +2.4423540425360204 -0.74175976038575175 0.049996487694662813 +2.4428740425360203 -0.74172876038575175 0.052273687694662813 +2.4514540425360201 -0.74183176038575172 0.04796628769466281 +2.4516040425360202 -0.74178076038575169 0.051526687694662808 +2.4551440425360203 -0.74179576038575168 0.05165078769466281 +2.4579140425360202 -0.74180676038575177 0.05177938769466281 +2.4983240425360203 -0.74225076038575177 0.034330587694662809 +2.4957540425360203 -0.74226176038575176 0.032801987694662811 +2.4271040425360204 -0.74171276038575173 0.048260987694662812 +2.4694940425360201 -0.74188676038575174 0.050045587694662809 +2.4602940425360202 -0.74184076038575175 0.050209387694662808 +2.4934540425360203 -0.74209976038575176 0.043201787694662812 +2.4964640425360205 -0.74214176038575175 0.041255787694662809 +2.4966540425360204 -0.74220776038575176 0.036797187694662808 +2.4025340425360202 -0.74177276038575168 0.036180787694662812 +2.4006240425360201 -0.7417307603857517 0.038486287694662807 +2.4799940425360201 -0.74205976038575172 0.041532687694662812 +2.4771740425360202 -0.74203676038575173 0.042239087694662808 +2.4690440425360203 -0.7419317603857517 0.04681308769466281 +2.4714940425360203 -0.74199276038575168 0.043394887694662806 +2.4686140425360201 -0.74197276038575177 0.04385178769466281 +2.4601240425360205 -0.74187476038575173 0.047822787694662812 +2.4631040425360204 -0.74189376038575172 0.047512587694662808 +2.4456540425360203 -0.74185176038575174 0.044760587694662811 +2.4662740425360203 -0.74187076038575173 0.050089187694662807 +2.4755340425360202 -0.74193476038575168 0.04872518769466281 +2.4778640425360203 -0.74199776038575171 0.045151987694662811 +2.4807640425360202 -0.74202176038575174 0.044423987694662811 +2.4827840425360201 -0.74208476038575177 0.040745187694662809 +2.4720040425360201 -0.74195276038575175 0.04634328769466281 +2.4836440425360204 -0.74204676038575168 0.043611087694662806 +2.4864940425360205 -0.74207376038575168 0.042704087694662808 +2.4855440425360205 -0.74211076038575174 0.039866587694662808 +2.4906640425360203 -0.74216276038575169 0.037908187694662809 +2.4893140425360203 -0.74210176038575171 0.04171238769466281 +2.4943340425360203 -0.74222376038575177 0.034908087694662811 +2.5009040425360203 -0.74224076038575171 0.035859187694662807 +2.5024440425360202 -0.74229176038575173 0.032877087694662813 +2.4920540425360205 -0.74213076038575176 0.040554987694662807 +2.4903940425360203 -0.74206576038575167 0.044503687694662807 +2.4872540425360201 -0.7429007603857517 -0.01391891230533719 +2.4911240425360202 -0.74294676038575169 -0.015808312305337191 +2.4975640425360202 -0.74294376038575172 -0.013535452305337191 +2.4578940425360201 -0.74182976038575177 0.050232987694662806 +2.5025140425360202 -0.74289076038575175 -0.0082731023053371905 +2.4954940425360204 -0.74288876038575169 -0.010448872305337191 +2.4627940425360202 -0.74193576038575171 0.044536487694662806 +2.4749440425360203 -0.74197476038575172 0.045792887694662811 +2.4743440425360204 -0.74201376038575173 0.042860587694662812 +2.4820240425360205 -0.74293776038575177 -0.018166612305337192 +2.4789940425360202 -0.7429317603857517 -0.018718612305337189 +2.4759740425360204 -0.74292576038575175 -0.019300612305337191 +2.4755540425360203 -0.74288076038575168 -0.016355112305337191 +2.4722240425360202 -0.74282776038575171 -0.01377341230533719 +2.4574340425360202 -0.74190376038575168 0.044964087694662806 +2.4693040425360202 -0.74281876038575168 -0.014099512305337191 +2.4657340425360204 -0.74195376038575167 0.044230687694662811 +2.4666340425360205 -0.74285376038575168 -0.017352912305337191 +2.4880640425360201 -0.74294576038575177 -0.016752712305337189 +2.4544440425360201 -0.74184576038575167 0.047961287694662812 +2.4123140425360203 -0.74170476038575173 0.044036587694662808 +2.4850340425360202 -0.74294276038575169 -0.017523412305337188 +2.4486840425360201 -0.74273676038575176 -0.015114812305337191 +2.4161640425360202 -0.74174976038575169 0.04219958769466281 +2.4457340425360203 -0.74272276038575169 -0.01511301230533719 +2.4427940425360202 -0.7427077603857517 -0.01507881230533719 +2.4874440425360205 -0.74203676038575173 0.045541587694662808 +2.4397340425360201 -0.74273576038575173 -0.01797171230533719 +2.4337540425360205 -0.74270476038575173 -0.017763512305337188 +2.4366140425360201 -0.74276076038575167 -0.020698912305337189 +2.4254940425360201 -0.74179976038575168 0.041754287694662807 +2.4245440425360201 -0.74269176038575169 -0.01984651230533719 +2.4221540425360204 -0.74259276038575173 -0.01385521230533719 +2.4277840425360204 -0.74267076038575175 -0.017379112305337188 +2.4305940425360202 -0.74272676038575169 -0.020332712305337192 +2.4785440425360203 -0.7419587603857517 0.048064787694662811 +2.4248040425360204 -0.74265276038575168 -0.017125112305337191 +2.4578040425360204 -0.74286376038575175 -0.020895212305337189 +2.4725140425360204 -0.74191176038575168 0.049291687694662807 +2.4574340425360202 -0.74186076038575177 0.047956287694662807 +2.4218240425360205 -0.74263476038575171 -0.016824712305337192 +2.4926840425360202 -0.74219176038575174 0.036621187694662806 +2.4158940425360202 -0.7425957603857517 -0.016059912305337189 +2.4100040425360203 -0.74255276038575169 -0.014997212305337191 +2.4124640425360204 -0.74261076038575169 -0.018225112305337191 +2.4945740425360201 -0.74216676038575169 0.038938487694662807 +2.4070940425360203 -0.74252876038575177 -0.014292912305337191 +2.4280140425360202 -0.74262876038575176 -0.014396012305337191 +2.4338940425360205 -0.74266176038575171 -0.01477441230533719 +2.4398340425360203 -0.74269276038575172 -0.014981112305337191 +2.4989840425360201 -0.74219076038575171 0.038686387694662809 +2.4457140425360202 -0.74276576038575171 -0.018105312305337191 +2.4487040425360203 -0.74277976038575177 -0.018107012305337192 +2.4192340425360204 -0.74257476038575176 -0.013505052305337191 +2.4547340425360202 -0.74285076038575171 -0.02097871230533719 +2.4546840425360203 -0.74280676038575177 -0.01800861230533719 +2.4576740425360204 -0.7428197603857517 -0.017905512305337191 +2.4606640425360204 -0.74283176038575172 -0.017763612305337191 +2.4608240425360202 -0.74287576038575176 -0.020751512305337189 +2.4663840425360202 -0.74280876038575172 -0.01437131230533719 +2.4134740425360204 -0.74253476038575172 -0.012626212305337191 +2.4638540425360205 -0.74288776038575177 -0.020565812305337192 +2.4368440425360203 -0.74267776038575173 -0.014877112305337191 +2.4668440425360201 -0.74289776038575173 -0.020338012305337192 +2.4335840425360202 -0.74176976038575171 0.046435187694662809 +2.4516940425360203 -0.74279376038575173 -0.018074712305337193 +2.4636540425360205 -0.7428427603857517 -0.017580612305337188 +2.4427240425360202 -0.74275176038575175 -0.018070312305337191 +2.4698040425360204 -0.74290476038575171 -0.019843912305337191 +2.4725840425360204 -0.74287276038575167 -0.016743912305337193 +2.4728240425360202 -0.74292576038575175 -0.020270912305337192 +2.4367440425360201 -0.74271976038575171 -0.017867612305337191 +2.4427640425360204 -0.74278276038575175 -0.020224912305337191 +2.4185040425360205 -0.74265276038575168 -0.01916701230533719 +2.4487240425360204 -0.74282376038575171 -0.021099212305337192 +2.4751140425360201 -0.74283576038575172 -0.01339601230533719 +2.4779940425360203 -0.7428427603857517 -0.012938692305337191 +2.4808540425360204 -0.74284876038575176 -0.012403682305337191 +2.4516440425360204 -0.74274976038575169 -0.015082812305337191 +2.4843640425360203 -0.74289876038575176 -0.01469291230533719 +2.4836640425360201 -0.74285276038575176 -0.011785842305337191 +2.4634440425360205 -0.74279876038575177 -0.01459541230533719 +2.4129440425360205 -0.74257476038575176 -0.015570912305337191 +2.4928740425360201 -0.74289776038575173 -0.011876972305337191 +2.4938340425360201 -0.74284476038575176 -0.0079582923053371918 +2.4957340425360202 -0.74283176038575172 -0.0064418723053371908 +2.4154840425360202 -0.74263276038575177 -0.018735012305337188 +2.5019640425360201 -0.74277976038575177 -0.00079507230533719083 +2.4983740425360201 -0.74278776038575167 -0.0025585483053371903 +2.4481640425360203 -0.7417657603857517 0.051464887694662807 +2.4998440425360204 -0.74291176038575168 -0.01056535230533719 +2.4978240425360201 -0.74287276038575167 -0.0085837123053371898 +2.4997440425360202 -0.74284876038575176 -0.0063026923053371908 +2.4696140425360205 -0.74286376038575175 -0.01707621230533719 +2.4275640425360203 -0.74270976038575176 -0.020111012305337191 +2.4990440425360201 -0.74275576038575175 -0.00014352230533719052 +2.4451240425360203 -0.74174776038575174 0.051692087694662811 +2.4994840425360203 -0.74271876038575169 0.0025427176946628089 +2.4972740425360205 -0.74281276038575172 -0.0046430823053371911 +2.4064640425360202 -0.74180576038575174 0.035181387694662808 +2.4605040425360203 -0.74278776038575167 -0.014775812305337191 +2.4456940425360201 -0.74280976038575175 -0.021097512305337192 +2.4080140425360201 -0.74249176038575171 -0.011443682305337191 +2.4999240425360201 -0.74259676038575173 0.011090787694662809 +2.4094240425360205 -0.74258776038575169 -0.017615612305337189 +2.4062640425360202 -0.74256176038575172 -0.016835112305337192 +2.4864140425360204 -0.74285476038575171 -0.011049602305337192 +2.4996940425360203 -0.74251176038575173 0.016861287694662809 +2.4785040425360201 -0.74288876038575169 -0.015887212305337191 +2.4845040425360203 -0.74200976038575173 0.046476887694662808 +2.4390440425360205 -0.74173576038575173 0.050566787694662808 +2.4994140425360203 -0.74246876038575171 0.019717987694662809 +2.4044340425360202 -0.7418157603857517 0.03387358769466281 +2.5029140425360201 -0.74261076038575169 0.011112687694662809 +2.5019740425360202 -0.74243276038575168 0.023030487694662809 +2.4969540425360202 -0.74230076038575177 0.030481187694662806 +2.4998940425360203 -0.74263876038575172 0.00821438769466281 +2.4188540425360201 -0.74261576038575172 -0.01647271230533719 +2.4997040425360204 -0.74229676038575176 0.031679187694662811 +2.5011540425360201 -0.74281776038575176 -0.0036750313053371905 +2.5039340425360201 -0.7428467603857517 -0.0047915123053371908 +2.4915940425360201 -0.74285276038575176 -0.0091714423053371914 +2.4031540425360203 -0.74170676038575167 0.04091198769466281 +2.5054240425360201 -0.74275876038575173 0.0017655476946628092 +2.4250740425360204 -0.74261076038575169 -0.01414581230533719 +2.4517140425360204 -0.74283676038575175 -0.021029212305337192 +2.5024540425360202 -0.74273876038575171 0.0021541376946628095 +2.5057240425360203 -0.74271376038575176 0.0049194176946628088 +2.4901040425360201 -0.7429007603857517 -0.01299646230533719 +2.5028440425360201 -0.74256676038575176 0.014102887694662808 +2.5027340425360203 -0.74269676038575172 0.0051333576946628098 +2.4215240425360203 -0.7426727603857517 -0.019534212305337192 +2.5058340425360202 -0.74257876038575177 0.014223187694662808 +2.5048840425360202 -0.74280276038575177 -0.0014466123053371908 +2.4309240425360201 -0.7426457603857517 -0.01459601230533719 +2.4815340425360204 -0.74198376038575176 0.047315187694662808 +2.4660840425360204 -0.74191176038575168 0.047202487694662808 +2.4632840425360203 -0.74185676038575177 0.050112687694662809 +2.4890840425360201 -0.74285476038575171 -0.010184232305337191 +2.4997540425360203 -0.74267976038575167 0.005347307694662809 +2.4882340425360203 -0.74213676038575171 0.038921087694662806 +2.5026740425360203 -0.74252276038575171 0.017089187694662809 +2.4941940425360203 -0.74294476038575175 -0.01469761230533719 +2.5053540425360201 -0.74248676038575168 0.020414687694662811 +2.4152240425360203 -0.7417037603857517 0.045040787694662812 +2.4163440425360201 -0.74255476038575174 -0.01310183230533719 +2.5058940425360201 -0.74262376038575173 0.011152487694662809 +2.4427440425360203 -0.74184076038575175 0.044551287694662808 +2.4089440425360205 -0.74180176038575174 0.03627938769466281 +2.5023840425360202 -0.74247776038575175 0.020066287694662809 +2.5049340425360205 -0.74243976038575177 0.023503887694662811 +2.4814440425360202 -0.74289376038575172 -0.015335712305337191 +2.4106440425360205 -0.74251276038575176 -0.012074052305337191 +2.4546040425360203 -0.74276276038575173 -0.01501751230533719 +2.4340540425360202 -0.7418157603857517 0.043480787694662806 +2.4575540425360205 -0.74277576038575177 -0.01491581230533719 +2.5028840425360204 -0.7426537603857517 0.0081214876946628101 +2.5058740425360204 -0.74266976038575172 0.0080339876946628093 +2.4990240425360204 -0.7424257603857517 0.02255708769466281 +2.4985140425360202 -0.74238276038575168 0.025338687694662809 +2.5014340425360202 -0.74238776038575172 0.025972787694662811 +2.5043640425360203 -0.74239176038575172 0.02660678769466281 +2.4998540425360201 -0.74255476038575174 0.013982487694662808 +2.5056540425360203 -0.7425337603857517 0.017317187694662808 +2.4397940425360201 -0.74278176038575172 -0.02110301230533719 +2.4307640425360204 -0.74268776038575168 -0.017591212305337191 +2.4978440425360202 -0.7423407603857517 0.027998987694662809 +2.5007140425360204 -0.74234176038575173 0.028871487694662808 +2.5035840425360201 -0.74234276038575175 0.029726387694662806 +2.4336240425360205 -0.74274376038575174 -0.020516212305337192 +3 0 42 3 +5 3 4 2 1 0 +3 13 31 183 +3 34 6 12 +3 5 6 10 +3 162 10 6 +3 10 162 36 +3 88 112 7 +3 8 11 93 +3 9 57 10 +3 9 10 11 +3 12 5 220 +3 13 12 14 +3 14 15 13 +3 31 13 15 +3 15 227 31 +3 17 28 16 +3 29 16 28 +5 3 103 18 19 4 +6 20 21 23 22 4 19 +3 23 221 22 +3 24 22 221 +3 25 24 172 +3 25 48 195 +3 26 27 24 +3 27 94 22 +3 103 3 28 +3 29 28 3 +3 29 42 16 +3 30 32 16 +3 137 16 32 +3 137 32 31 +3 33 31 32 +3 33 183 31 +3 34 12 183 +3 35 169 34 +3 6 34 169 +3 37 38 36 +3 93 36 38 +3 39 77 38 +3 112 77 55 +3 41 69 40 +3 55 7 112 +3 30 16 42 +3 61 50 60 +3 63 81 53 +3 111 63 43 +3 65 99 68 +3 72 45 118 +3 210 56 44 +3 46 118 45 +3 46 123 118 +3 47 118 123 +3 68 213 65 +3 49 195 48 +3 51 60 50 +3 51 82 60 +3 54 52 53 +3 54 90 52 +3 209 52 90 +3 55 56 7 +3 209 90 56 +3 57 220 5 +3 58 43 209 +3 59 108 81 +3 60 81 108 +3 61 60 208 +3 64 61 182 +3 61 64 50 +3 62 50 64 +3 64 65 62 +3 52 43 63 +3 65 64 99 +3 66 62 65 +3 213 68 67 +3 72 67 68 +3 69 114 47 +3 47 40 69 +3 40 47 70 +3 71 191 70 +3 71 241 191 +3 45 72 73 +3 92 74 75 +3 215 156 76 +3 44 55 77 +3 163 164 78 +3 79 164 76 +3 80 7 56 +3 25 195 24 +3 79 76 156 +3 5 10 57 +3 156 215 201 +3 82 53 81 +3 74 92 152 +3 84 181 83 +3 84 85 181 +3 85 143 86 +3 86 142 148 +3 87 148 142 +3 88 8 112 +3 142 166 87 +3 89 87 166 +3 80 56 90 +3 91 132 166 +3 130 173 139 +3 95 152 92 +3 128 138 226 +3 93 112 8 +3 83 224 95 +3 151 138 96 +3 125 96 138 +3 125 124 96 +3 97 96 124 +3 97 124 98 +3 73 68 99 +3 140 145 100 +3 100 237 144 +3 242 101 102 +3 101 242 238 +3 204 113 104 +3 113 204 190 +3 197 109 105 +3 167 106 107 +3 108 208 60 +3 106 167 109 +3 109 104 113 +3 127 128 110 +3 59 81 111 +3 52 209 43 +3 77 112 38 +3 113 105 109 +3 5 12 6 +3 67 72 114 +3 190 115 126 +3 177 116 117 +3 118 114 72 +3 36 11 10 +3 116 177 119 +3 119 175 116 +3 207 238 120 +3 101 238 121 +3 121 135 101 +3 144 101 135 +3 100 144 122 +3 122 98 100 +3 123 70 47 +3 140 124 145 +3 124 125 174 +3 109 197 106 +3 126 105 190 +3 198 138 127 +3 128 127 138 +3 129 110 128 +3 129 128 228 +3 130 129 173 +3 129 130 110 +3 131 110 130 +3 89 166 132 +3 130 139 131 +3 218 115 133 +3 134 131 139 +3 116 225 155 +3 135 122 144 +3 134 139 136 +3 137 227 16 +3 68 73 72 +3 125 138 147 +3 91 136 139 +3 140 98 124 +3 136 91 141 +3 143 141 142 +3 144 102 101 +3 237 100 145 +3 86 181 85 +3 86 148 181 +3 159 115 146 +3 147 174 125 +3 36 93 11 +3 149 181 148 +3 149 150 181 +3 150 153 224 +3 151 226 138 +3 55 44 56 +3 153 179 152 +3 154 132 139 +3 115 159 155 +3 155 133 115 +3 74 152 179 +3 79 156 157 +3 157 158 79 +3 164 79 158 +3 40 70 191 +3 158 171 164 +3 117 155 159 +3 165 171 192 +3 113 190 105 +3 192 161 160 +3 40 191 41 +3 168 160 161 +3 37 36 162 +3 160 168 199 +3 163 76 164 +3 165 78 164 +3 166 141 91 +3 22 24 27 +3 104 109 167 +3 170 199 168 +3 6 169 162 +3 170 212 199 +3 161 192 171 +3 172 185 25 +3 154 139 173 +3 174 145 124 +3 203 199 212 +3 74 179 201 +3 203 212 229 +3 225 116 175 +3 166 142 141 +3 186 176 202 +3 235 202 176 +3 63 111 81 +3 178 119 177 +3 211 201 179 +3 214 180 222 +3 184 222 180 +3 224 83 181 +3 182 99 64 +3 34 183 35 +3 184 231 222 +3 48 25 185 +3 186 229 176 +3 233 187 232 +3 156 201 194 +3 165 164 171 +3 188 41 191 +3 233 232 240 +3 189 176 229 +3 29 3 42 +3 190 146 115 +3 191 240 188 +3 193 78 192 +3 194 157 156 +3 81 60 82 +3 26 24 195 +3 206 160 196 +3 155 117 116 +3 120 106 197 +3 199 196 160 +3 198 147 138 +3 196 199 200 +3 201 75 74 +3 214 202 180 +3 203 200 199 +3 13 183 12 +3 203 229 200 +3 146 190 204 +3 140 100 98 +3 142 86 143 +3 160 206 192 +3 219 186 205 +3 165 192 78 +3 193 192 206 +3 207 121 238 +3 202 205 186 +3 93 38 112 +3 208 182 61 +3 58 209 210 +3 211 194 201 +3 118 47 114 +3 189 229 212 +3 66 65 213 +3 202 214 205 +3 224 181 150 +3 187 222 231 +3 63 53 52 +3 75 201 215 +3 91 139 132 +3 236 214 216 +3 222 216 214 +5 4 22 94 217 2 +3 218 126 115 +3 56 210 209 +3 219 230 186 +3 220 14 12 +3 221 172 24 +3 216 222 223 +3 152 95 224 +3 20 263 21 +3 133 155 225 +3 226 228 128 +3 187 223 222 +3 17 16 227 +3 228 173 129 +3 187 233 223 +3 230 200 229 +3 231 232 187 +3 106 120 238 +3 229 186 230 +3 239 240 232 +3 234 223 233 +3 235 180 202 +3 236 205 214 +3 102 144 237 +3 238 107 106 +3 239 188 240 +3 233 240 234 +3 241 234 240 +3 152 224 153 +3 107 238 242 +3 137 31 227 +3 240 191 241 +3 273 287 243 +3 244 273 243 +3 273 244 246 +3 245 246 244 +3 246 245 247 +3 429 276 256 +3 255 249 279 +3 253 249 248 +3 249 253 408 +3 281 408 253 +3 250 358 333 +3 338 254 251 +3 253 302 252 +3 254 253 252 +3 466 248 255 +3 257 255 256 +3 256 258 257 +3 258 256 276 +3 276 473 258 +3 259 272 260 +3 272 259 274 +3 261 247 262 +3 247 263 262 +3 271 263 342 +3 263 271 264 +3 271 266 264 +3 265 467 266 +3 467 265 267 +3 418 267 268 +3 441 293 268 +3 267 270 269 +3 265 339 270 +3 339 265 271 +3 342 339 271 +3 261 273 246 +3 272 273 349 +3 273 272 274 +3 247 261 246 +3 259 287 274 +3 259 277 275 +3 277 259 383 +3 276 277 383 +3 277 276 278 +3 276 429 278 +3 429 255 279 +3 279 415 280 +3 415 279 249 +3 281 283 282 +3 283 281 338 +3 283 322 284 +3 300 322 358 +3 285 314 286 +3 358 250 300 +3 287 259 275 +3 305 295 306 +3 298 326 308 +3 288 308 357 +3 313 345 310 +3 364 290 317 +3 289 301 456 +3 290 364 291 +3 364 369 291 +3 369 364 292 +3 310 459 313 +3 293 441 294 +3 295 305 296 +3 305 327 296 +3 298 297 299 +3 297 335 299 +3 335 297 455 +3 250 301 300 +3 301 335 455 +3 248 466 302 +3 455 288 303 +3 326 354 304 +3 354 326 305 +3 454 305 306 +3 428 306 309 +3 295 309 306 +3 309 295 307 +3 307 310 309 +3 308 288 297 +3 345 309 310 +3 310 307 311 +3 312 313 459 +3 313 312 317 +3 292 360 314 +3 314 285 292 +3 315 292 285 +3 315 437 316 +3 437 487 316 +3 318 317 290 +3 320 319 337 +3 321 402 461 +3 322 300 289 +3 323 410 409 +3 321 410 324 +3 301 250 325 +3 267 441 268 +3 402 321 324 +3 302 253 248 +3 447 461 402 +3 326 298 327 +3 398 337 319 +3 328 427 329 +3 427 330 329 +3 331 389 330 +3 394 388 331 +3 388 394 332 +3 358 251 333 +3 332 412 388 +3 412 332 334 +3 335 301 325 +3 412 378 336 +3 385 419 376 +3 337 398 340 +3 472 384 374 +3 251 358 338 +3 339 342 463 +3 340 470 328 +3 341 384 397 +3 384 341 371 +3 263 247 342 +3 341 370 371 +3 370 341 343 +3 344 370 343 +3 345 313 318 +3 346 391 386 +3 390 483 346 +3 348 347 488 +3 273 261 349 +3 484 488 347 +3 350 359 450 +3 436 450 359 +3 351 355 443 +3 353 352 413 +3 305 454 354 +3 355 413 352 +3 359 350 355 +3 356 374 373 +3 357 326 304 +3 288 455 297 +3 283 358 322 +3 355 351 359 +3 249 255 248 +3 360 317 312 +3 372 361 436 +3 363 362 423 +3 317 360 364 +3 253 254 281 +3 365 423 362 +3 362 421 365 +3 366 484 453 +3 367 484 347 +3 347 381 367 +3 381 347 390 +3 368 390 346 +3 346 344 368 +3 292 315 369 +3 247 463 342 +3 391 370 386 +3 420 371 370 +3 352 443 355 +3 436 351 372 +3 373 384 444 +3 384 373 374 +3 374 356 375 +3 474 374 375 +3 419 375 376 +3 356 376 375 +3 376 356 377 +3 378 412 334 +3 377 385 376 +3 379 361 464 +3 385 377 380 +3 401 471 362 +3 390 368 381 +3 382 385 380 +3 259 473 383 +3 317 318 313 +3 393 384 371 +3 385 382 336 +3 370 344 386 +3 387 336 382 +3 388 387 389 +3 347 348 390 +3 391 346 483 +3 330 427 331 +3 427 394 331 +3 392 361 405 +3 371 420 393 +3 254 338 281 +3 394 427 395 +3 427 396 395 +3 470 399 396 +3 384 472 397 +3 301 289 300 +3 398 425 399 +3 385 378 400 +3 401 405 361 +3 361 379 401 +3 425 398 319 +3 403 402 324 +3 324 404 403 +3 404 324 410 +3 437 315 285 +3 410 417 404 +3 405 401 363 +3 438 417 411 +3 351 436 359 +3 406 407 438 +3 286 437 285 +3 407 406 414 +3 408 281 282 +3 445 414 406 +3 410 321 409 +3 410 323 411 +3 336 387 412 +3 270 267 265 +3 413 355 350 +3 414 445 416 +3 408 415 249 +3 445 458 416 +3 417 438 407 +3 268 431 418 +3 419 385 400 +3 370 391 420 +3 458 445 449 +3 447 425 319 +3 475 458 449 +3 421 362 471 +3 387 388 412 +3 448 422 432 +3 422 448 481 +3 326 357 308 +3 423 365 424 +3 425 447 457 +3 468 426 460 +3 426 468 430 +3 427 328 470 +3 309 345 428 +3 280 429 279 +3 468 477 430 +3 431 268 293 +3 422 475 432 +3 478 433 479 +3 440 447 402 +3 417 410 411 +3 437 286 434 +3 486 478 479 +3 475 422 435 +3 287 273 274 +3 361 392 436 +3 434 486 437 +3 438 323 439 +3 402 403 440 +3 327 305 326 +3 441 267 269 +3 442 406 452 +3 362 363 401 +3 443 352 366 +3 406 442 445 +3 384 393 444 +3 446 445 442 +3 319 320 447 +3 426 448 460 +3 445 446 449 +3 255 429 256 +3 446 475 449 +3 450 436 392 +3 344 346 386 +3 389 331 388 +3 438 452 406 +3 451 432 465 +3 323 438 411 +3 452 438 439 +3 484 367 453 +3 432 451 448 +3 358 283 338 +3 306 428 454 +3 456 455 303 +3 447 440 457 +3 360 292 364 +3 458 475 435 +3 459 310 311 +3 451 460 448 +3 396 427 470 +3 477 468 433 +3 297 298 308 +3 461 447 320 +3 378 385 336 +3 462 460 482 +3 460 462 468 +3 463 247 245 +3 361 372 464 +3 455 456 301 +3 432 476 465 +3 255 257 466 +3 267 418 467 +3 469 468 462 +3 470 340 398 +3 266 271 265 +3 471 401 379 +3 374 474 472 +3 468 469 433 +3 473 259 260 +3 375 419 474 +3 469 479 433 +3 475 446 476 +3 433 478 477 +3 484 366 352 +3 476 432 475 +3 478 486 485 +3 479 469 480 +3 448 426 481 +3 460 451 482 +3 483 390 348 +3 352 353 484 +3 486 434 485 +3 480 486 479 +3 486 480 487 +3 399 470 398 +3 488 484 353 +3 473 276 383 +3 487 437 486 +3 243 287 42 +3 42 0 243 +3 244 243 0 +3 0 1 244 +3 245 244 1 +3 1 2 245 +3 250 333 88 +3 88 7 250 +3 251 254 11 +3 11 8 251 +3 252 302 57 +3 57 9 252 +3 254 252 9 +3 9 11 254 +3 257 258 15 +3 15 14 257 +3 258 473 227 +3 227 15 258 +3 260 272 28 +3 28 17 260 +3 261 262 19 +3 19 18 261 +3 262 263 20 +3 20 19 262 +3 263 264 21 +3 264 266 23 +3 23 21 264 +3 266 467 221 +3 221 23 266 +3 269 270 27 +3 27 26 269 +3 270 339 94 +3 94 27 270 +3 272 349 103 +3 103 28 272 +3 275 277 32 +3 32 30 275 +3 277 278 33 +3 33 32 277 +3 278 429 183 +3 183 33 278 +3 280 415 169 +3 169 35 280 +3 282 283 38 +3 38 37 282 +3 283 284 39 +3 39 38 283 +3 284 322 77 +3 77 39 284 +3 286 314 69 +3 69 41 286 +3 287 275 30 +3 30 42 287 +3 288 357 111 +3 111 43 288 +3 289 456 210 +3 210 44 289 +3 290 291 46 +3 46 45 290 +3 291 369 123 +3 123 46 291 +3 293 294 49 +3 49 48 293 +3 294 441 195 +3 195 49 294 +3 295 296 51 +3 51 50 295 +3 296 327 82 +3 82 51 296 +3 298 299 54 +3 54 53 298 +3 299 335 90 +3 90 54 299 +3 302 466 220 +3 220 57 302 +3 303 288 43 +3 43 58 303 +3 304 354 108 +3 108 59 304 +3 307 295 50 +3 50 62 307 +3 311 307 62 +3 62 66 311 +3 312 459 213 +3 213 67 312 +3 314 360 114 +3 114 69 314 +3 315 316 71 +3 71 70 315 +3 316 487 241 +3 241 71 316 +3 318 290 45 +3 45 73 318 +3 320 337 92 +3 92 75 320 +3 321 461 215 +3 215 76 321 +3 322 289 44 +3 44 77 322 +3 323 409 163 +3 163 78 323 +3 325 250 7 +3 7 80 325 +3 327 298 53 +3 53 82 327 +3 328 329 84 +3 84 83 328 +3 329 330 85 +3 85 84 329 +3 330 389 143 +3 143 85 330 +3 332 394 148 +3 148 87 332 +3 333 251 8 +3 8 88 333 +3 334 332 87 +3 87 89 334 +3 335 325 80 +3 80 90 335 +3 337 340 95 +3 95 92 337 +3 339 463 217 +3 217 94 339 +3 340 328 83 +3 83 95 340 +3 341 397 151 +3 151 96 341 +3 343 341 96 +3 96 97 343 +3 344 343 97 +3 97 98 344 +3 345 318 73 +3 73 99 345 +3 348 488 242 +3 242 102 348 +3 349 261 18 +3 18 103 349 +3 350 450 204 +3 204 104 350 +3 351 443 197 +3 197 105 351 +3 353 413 167 +3 167 107 353 +3 354 454 208 +3 208 108 354 +3 356 373 127 +3 127 110 356 +3 357 304 59 +3 59 111 357 +3 360 312 67 +3 67 114 360 +3 363 423 177 +3 177 117 363 +3 365 421 175 +3 175 119 365 +3 366 453 207 +3 207 120 366 +3 367 381 135 +3 135 121 367 +3 368 344 98 +3 98 122 368 +3 369 315 70 +3 70 123 369 +3 372 351 105 +3 105 126 372 +3 373 444 198 +3 198 127 373 +3 377 356 110 +3 110 131 377 +3 378 334 89 +3 89 132 378 +3 379 464 218 +3 218 133 379 +3 380 377 131 +3 131 134 380 +3 381 368 122 +3 122 135 381 +3 382 380 134 +3 134 136 382 +3 387 382 136 +3 136 141 387 +3 389 387 141 +3 141 143 389 +3 391 483 237 +3 237 145 391 +3 392 405 159 +3 159 146 392 +3 393 420 174 +3 174 147 393 +4 149 148 394 395 +3 395 396 150 +3 150 149 395 +3 396 399 153 +3 153 150 396 +3 397 472 226 +3 226 151 397 +3 399 425 179 +3 179 153 399 +3 400 378 132 +3 132 154 400 +3 403 404 158 +3 158 157 403 +3 404 417 171 +3 171 158 404 +3 405 363 117 +3 117 159 405 +3 407 414 168 +3 168 161 407 +3 408 282 37 +3 37 162 408 +3 409 321 76 +3 76 163 409 +3 413 350 104 +3 104 167 413 +3 414 416 170 +3 170 168 414 +3 415 408 162 +3 162 169 415 +3 416 458 212 +3 212 170 416 +3 417 407 161 +3 161 171 417 +3 418 431 185 +3 185 172 418 +4 154 173 419 400 +3 420 391 145 +3 145 174 420 +3 421 471 225 +3 225 175 421 +3 422 481 235 +3 235 176 422 +3 423 424 178 +3 178 177 423 +3 424 365 119 +3 119 178 424 +3 425 457 211 +3 211 179 425 +3 426 430 184 +3 184 180 426 +3 428 345 99 +3 99 182 428 +3 429 280 35 +3 35 183 429 +3 430 477 231 +3 231 184 430 +3 431 293 48 +3 48 185 431 +3 434 286 41 +3 41 188 434 +3 435 422 176 +3 176 189 435 +3 439 323 78 +3 78 193 439 +3 440 403 157 +3 157 194 440 +3 441 269 26 +3 26 195 441 +3 442 452 206 +3 206 196 442 +3 443 366 120 +3 120 197 443 +3 444 393 147 +3 147 198 444 +3 446 442 196 +3 196 200 446 +3 450 392 146 +3 146 204 450 +3 451 465 219 +3 219 205 451 +3 452 439 193 +3 193 206 452 +3 453 367 121 +3 121 207 453 +3 454 428 182 +3 182 208 454 +3 456 303 58 +3 58 210 456 +3 457 440 194 +3 194 211 457 +3 458 435 189 +3 189 212 458 +3 459 311 66 +3 66 213 459 +3 461 320 75 +3 75 215 461 +3 462 482 236 +3 236 216 462 +3 463 245 2 +3 2 217 463 +3 464 372 126 +3 126 218 464 +3 465 476 230 +3 230 219 465 +3 466 257 14 +3 14 220 466 +3 467 418 172 +3 172 221 467 +3 469 462 216 +3 216 223 469 +3 471 379 133 +3 133 225 471 +3 472 474 228 +3 228 226 472 +3 473 260 17 +3 17 227 473 +3 474 419 173 +3 173 228 474 +3 476 446 200 +3 200 230 476 +3 477 478 232 +3 232 231 477 +3 478 485 239 +3 239 232 478 +3 480 469 223 +3 223 234 480 +3 481 426 180 +3 180 235 481 +3 482 451 205 +3 205 236 482 +3 483 348 102 +3 102 237 483 +3 485 434 188 +3 188 239 485 +3 487 480 234 +3 234 241 487 +3 488 353 107 +3 107 242 488 + diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_target_2.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_target_2.off new file mode 100644 index 00000000000..605a3d41cf0 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/border_snapping_target_2.off @@ -0,0 +1,16 @@ +OFF +8 6 0 +1 0.66666666666666663 0 +1 0.33333333333333331 0 +0.33333333333333331 1 0 +0.66666666666666663 1 0 +0.66666666666666663 0.66666666666666663 0 +0.33333333333333331 0.33333333333333331 0 +0.33333333333333331 0.66666666666666663 0 +0.66666666666666663 0.33333333333333331 0 +3 4 1 0 +3 4 7 1 +3 2 4 3 +3 2 6 4 +3 6 7 4 +3 6 5 7 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non-conform_snapping-hole.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non-conform_snapping-hole.off new file mode 100644 index 00000000000..c07e1f4fdf1 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non-conform_snapping-hole.off @@ -0,0 +1,217 @@ +OFF +85 130 0 +4.5654600000000002e-05 -0.306423 -0.120675 +-0.163326 -0.349277 -0.162194 +0.16341800000000001 -0.349277 -0.162194 +4.5654600000000002e-05 -0.394096 -0.181065 +-0.24151300000000001 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.48294799999999999 -0.232019 +0.24160400000000001 -0.48294799999999999 -0.232019 +-0.358518 -0.47917399999999999 -0.232019 +-0.28999799999999998 -0.40378900000000001 -0.202296 +-0.19351499999999999 -0.40254099999999998 -0.19286 +-0.24032400000000001 -0.34213300000000002 -0.171629 +-0.080024700000000004 -0.329901 -0.14143500000000001 +-0.094525999999999999 -0.376139 -0.171629 +4.5654600000000002e-05 -0.34656900000000002 -0.15087 +-0.111085 -0.42947000000000002 -0.202296 +-0.12073399999999999 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.44566800000000001 -0.210788 +0.120825 -0.48294799999999999 -0.232019 +0.111177 -0.42947000000000002 -0.202296 +0.193606 -0.40254099999999998 -0.19286 +0.094617300000000001 -0.376139 -0.171629 +0.080116099999999996 -0.329901 -0.14143500000000001 +-0.21396000000000001 -0.43718400000000002 -0.210316 +-0.241948 -0.40671600000000002 -0.198994 +-0.26878299999999999 -0.44364700000000001 -0.215978 +-0.15026100000000001 -0.32579599999999997 -0.147096 +-0.18618399999999999 -0.32454300000000003 -0.152758 +-0.073473200000000002 -0.30981300000000001 -0.126337 +-0.0389071 -0.317274 -0.13011200000000001 +-0.13258400000000001 -0.36556 -0.167855 +-0.087042499999999995 -0.35214699999999999 -0.156532 +-0.12201099999999999 -0.34168100000000001 -0.152758 +-0.049964700000000001 -0.38434699999999999 -0.175404 +-0.102475 -0.40159699999999998 -0.186727 +-0.0541161 -0.40988400000000003 -0.190501 +-0.18112300000000001 -0.48294799999999999 -0.232019 +-0.11762 -0.45775399999999999 -0.217865 +-0.172206 -0.45298899999999998 -0.215978 +4.5654600000000002e-05 -0.42001100000000002 -0.196163 +0.0573216 -0.43631900000000001 -0.205599 +0.054207400000000003 -0.40988400000000003 -0.190501 +0.21405199999999999 -0.43718400000000002 -0.210316 +0.157578 -0.42026200000000002 -0.198994 +0.17229800000000001 -0.45298899999999998 -0.215978 +4.5654600000000002e-05 -0.32538299999999998 -0.135773 +0.042451299999999997 -0.33776200000000001 -0.145209 +0.038998400000000003 -0.317274 -0.13011200000000001 +0.122102 -0.34168100000000001 -0.152758 +0.20227899999999999 -0.348634 -0.167855 +0.30199399999999998 -0.48294799999999999 -0.232019 +0.268874 -0.44364700000000001 -0.215978 +-0.323133 -0.44152400000000003 -0.217865 +-0.30190299999999998 -0.48294799999999999 -0.232019 +-0.17732300000000001 -0.374303 -0.177291 +-0.20218800000000001 -0.348634 -0.167855 +-0.220222 -0.37521500000000002 -0.182953 +-0.26282699999999998 -0.370508 -0.186727 +-0.22095100000000001 -0.317193 -0.156532 +-0.112138 -0.31965399999999999 -0.13766 +4.5654600000000002e-05 -0.36956600000000001 -0.165968 +-0.046045700000000002 -0.36023500000000003 -0.16030700000000001 +-0.042360000000000002 -0.33776200000000001 -0.145209 +-0.14385500000000001 -0.39094400000000001 -0.182953 +-0.15748599999999999 -0.42026200000000002 -0.198994 +-0.060344000000000002 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.468086 -0.223527 +-0.059306299999999999 -0.46133999999999997 -0.219752 +-0.057230299999999998 -0.43631900000000001 -0.205599 +0.060435299999999997 -0.48294799999999999 -0.232019 +0.059397600000000002 -0.46133999999999997 -0.219752 +0.117711 -0.45775399999999999 -0.217865 +0.18121499999999999 -0.48294799999999999 -0.232019 +0.17741399999999999 -0.374303 -0.177291 +0.13267499999999999 -0.36556 -0.167855 +0.14394599999999999 -0.39094400000000001 -0.182953 +0.10256700000000001 -0.40159699999999998 -0.186727 +0.050056000000000003 -0.38434699999999999 -0.175404 +0.046136999999999997 -0.36023500000000003 -0.16030700000000001 +0.087133799999999997 -0.35214699999999999 -0.156532 +0.22031400000000001 -0.37521500000000002 -0.182953 +0.242039 -0.40671600000000002 -0.198994 +-0.058661507550457216 -0.43628240548359487 -0.20553425364633823 +-0.056756085107820556 -0.42516551050586449 -0.19916652155937045 +-0.054881641103820863 -0.40697135856650563 -0.18799327289353576 +-0.050196543434251263 -0.38715451816589624 -0.17533448302510549 +3 4 22 24 +3 1 25 26 +3 1 29 31 +3 3 32 34 +3 4 35 37 +3 3 38 40 +3 6 41 43 +3 0 44 46 +3 6 49 50 +3 8 51 24 +3 9 53 55 +3 9 55 23 +3 11 58 31 +3 12 32 60 +3 12 60 30 +3 11 61 28 +3 12 29 62 +3 12 62 33 +3 14 63 37 +3 15 64 66 +3 15 66 36 +3 82 14 81 +3 16 65 69 +3 16 69 39 +3 18 70 43 +3 19 72 74 +3 19 74 42 +3 18 75 40 +3 13 59 77 +3 13 77 45 +3 21 78 47 +3 22 9 23 +3 22 23 24 +3 24 23 8 +3 28 27 11 +3 29 12 30 +3 29 30 31 +3 31 30 11 +3 84 33 83 +3 83 33 14 +3 35 15 36 +3 35 36 37 +3 37 36 14 +3 38 16 39 +3 38 39 40 +3 40 39 18 +3 41 19 42 +3 41 42 43 +3 43 42 18 +3 44 13 45 +3 44 45 46 +3 46 45 21 +3 51 7 52 +3 51 52 24 +3 24 52 4 +3 53 1 54 +3 53 54 55 +3 55 54 10 +3 55 10 56 +3 55 56 23 +3 23 56 8 +3 57 10 54 +3 57 54 26 +3 26 54 1 +3 27 58 11 +3 58 25 31 +3 31 25 1 +3 32 3 59 +3 32 59 60 +3 60 59 13 +3 60 13 61 +3 60 61 30 +3 30 61 11 +3 61 13 44 +3 61 44 28 +3 28 44 0 +3 29 1 53 +3 29 53 62 +3 62 53 9 +3 62 9 63 +3 62 63 33 +3 33 63 14 +3 63 9 22 +3 63 22 37 +3 37 22 4 +3 64 5 65 +3 64 65 66 +3 66 65 16 +3 66 16 67 +3 66 67 36 +3 67 16 38 +3 67 38 34 +3 34 38 3 +3 65 5 68 +3 65 68 69 +3 69 68 17 +3 69 17 70 +3 69 70 39 +3 39 70 18 +3 70 17 71 +3 70 71 43 +3 43 71 6 +3 72 2 73 +3 72 73 74 +3 74 73 20 +3 74 20 75 +3 74 75 42 +3 42 75 18 +3 75 20 76 +3 75 76 40 +3 40 76 3 +3 59 3 76 +3 59 76 77 +3 77 76 20 +3 77 20 78 +3 77 78 45 +3 45 78 21 +3 78 20 73 +3 78 73 47 +3 47 73 2 +3 48 2 72 +3 48 72 79 +3 79 72 19 +3 79 19 80 +3 80 19 41 +3 80 41 50 +3 50 41 6 +3 81 14 36 +3 12 33 84 +3 14 82 83 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non-conform_snapping-overlap.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non-conform_snapping-overlap.off new file mode 100644 index 00000000000..596d2a38a58 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non-conform_snapping-overlap.off @@ -0,0 +1,280 @@ +OFF +111 167 0 +4.5654600000000002e-05 -0.306423 -0.120675 +-0.163326 -0.349277 -0.162194 +0.16341800000000001 -0.349277 -0.162194 +0.31587300000000001 -0.30593399999999998 -0.175424 +4.5654600000000002e-05 -0.394096 -0.181065 +-0.24151300000000001 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.48294799999999999 -0.232019 +0.24160400000000001 -0.48294799999999999 -0.232019 +0.44541900000000001 -0.44520399999999999 -0.232019 +0.386963 -0.38627400000000001 -0.21050099999999999 +-0.358518 -0.47917399999999999 -0.232019 +-0.28999799999999998 -0.40378900000000001 -0.202296 +-0.19351499999999999 -0.40254099999999998 -0.19286 +-0.24032400000000001 -0.34213300000000002 -0.171629 +-0.080024700000000004 -0.329901 -0.14143500000000001 +-0.094525999999999999 -0.376139 -0.171629 +4.5654600000000002e-05 -0.34656900000000002 -0.15087 +-0.111085 -0.42947000000000002 -0.202296 +-0.12073399999999999 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.44566800000000001 -0.210788 +0.120825 -0.48294799999999999 -0.232019 +0.111177 -0.42947000000000002 -0.202296 +0.193606 -0.40254099999999998 -0.19286 +0.094617300000000001 -0.376139 -0.171629 +0.080116099999999996 -0.329901 -0.14143500000000001 +0.23952100000000001 -0.34106500000000001 -0.170871 +0.28989700000000002 -0.40312199999999998 -0.20200899999999999 +0.35860900000000001 -0.47917399999999999 -0.232019 +0.35044199999999998 -0.34738200000000002 -0.194442 +-0.33917900000000001 -0.39718100000000001 -0.205599 +-0.30631599999999998 -0.36205300000000001 -0.190501 +-0.21396000000000001 -0.43718400000000002 -0.210316 +-0.241948 -0.40671600000000002 -0.198994 +-0.26878299999999999 -0.44364700000000001 -0.215978 +-0.0389071 -0.317274 -0.13011200000000001 +-0.13258400000000001 -0.36556 -0.167855 +-0.087042499999999995 -0.35214699999999999 -0.156532 +-0.12201099999999999 -0.34168100000000001 -0.152758 +-0.049964700000000001 -0.38434699999999999 -0.175404 +-0.102475 -0.40159699999999998 -0.186727 +-0.0541161 -0.40988400000000003 -0.190501 +-0.18112300000000001 -0.48294799999999999 -0.232019 +-0.11762 -0.45775399999999999 -0.217865 +-0.172206 -0.45298899999999998 -0.215978 +4.5654600000000002e-05 -0.42001100000000002 -0.196163 +0.0573216 -0.43631900000000001 -0.205599 +0.054207400000000003 -0.40988400000000003 -0.190501 +0.21405199999999999 -0.43718400000000002 -0.210316 +0.157578 -0.42026200000000002 -0.198994 +0.17229800000000001 -0.45298899999999998 -0.215978 +4.5654600000000002e-05 -0.32538299999999998 -0.135773 +0.042451299999999997 -0.33776200000000001 -0.145209 +0.038998400000000003 -0.317274 -0.13011200000000001 +0.15035299999999999 -0.32579599999999997 -0.147096 +0.112229 -0.31965399999999999 -0.13766 +0.122102 -0.34168100000000001 -0.152758 +0.20227899999999999 -0.348634 -0.167855 +0.219636 -0.316388 -0.155588 +0.186275 -0.32454300000000003 -0.152758 +0.27662999999999999 -0.327013 -0.17274 +0.26253399999999999 -0.369176 -0.18615300000000001 +0.30525400000000003 -0.35805500000000001 -0.18878 +0.30199399999999998 -0.48294799999999999 -0.232019 +0.32322499999999998 -0.44152400000000003 -0.217865 +0.268874 -0.44364700000000001 -0.215978 +0.42121599999999998 -0.42100100000000001 -0.223527 +0.28153800000000001 -0.28284199999999998 -0.157642 +-0.40758499999999998 -0.46784999999999999 -0.232019 +-0.374276 -0.43378699999999998 -0.219752 +-0.323133 -0.44152400000000003 -0.217865 +-0.30190299999999998 -0.48294799999999999 -0.232019 +-0.17732300000000001 -0.374303 -0.177291 +-0.20218800000000001 -0.348634 -0.167855 +-0.220222 -0.37521500000000002 -0.182953 +-0.26282699999999998 -0.370508 -0.186727 +-0.27909800000000001 -0.33181500000000003 -0.175404 +4.5654600000000002e-05 -0.36956600000000001 -0.165968 +-0.046045700000000002 -0.36023500000000003 -0.16030700000000001 +-0.042360000000000002 -0.33776200000000001 -0.145209 +-0.14385500000000001 -0.39094400000000001 -0.182953 +-0.15748599999999999 -0.42026200000000002 -0.198994 +-0.060344000000000002 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.468086 -0.223527 +-0.059306299999999999 -0.46133999999999997 -0.219752 +-0.057230299999999998 -0.43631900000000001 -0.205599 +0.060435299999999997 -0.48294799999999999 -0.232019 +0.059397600000000002 -0.46133999999999997 -0.219752 +0.117711 -0.45775399999999999 -0.217865 +0.18121499999999999 -0.48294799999999999 -0.232019 +0.17741399999999999 -0.374303 -0.177291 +0.13267499999999999 -0.36556 -0.167855 +0.14394599999999999 -0.39094400000000001 -0.182953 +0.10256700000000001 -0.40159699999999998 -0.186727 +0.050056000000000003 -0.38434699999999999 -0.175404 +0.046136999999999997 -0.36023500000000003 -0.16030700000000001 +0.087133799999999997 -0.35214699999999999 -0.156532 +0.25159500000000001 -0.30220999999999998 -0.15690200000000001 +0.22031400000000001 -0.37521500000000002 -0.182953 +0.242039 -0.40671600000000002 -0.198994 +0.40767599999999998 -0.46784999999999999 -0.232019 +0.37436700000000001 -0.43378699999999998 -0.219752 +0.33888699999999999 -0.39584799999999998 -0.20502500000000001 +0.00030729929197784449 -0.43397161290978914 -0.2039503177258282 +0.0010311949205837813 -0.42307866777410313 -0.19788209710791535 +0.0013063977261908541 -0.40932692641813878 -0.1897846968580672 +0.00091336977660507889 -0.38497717521798763 -0.17527991239605414 +0.00092745774690705088 -0.45195429047614899 -0.21327207860950795 +0.00063656794972045201 -0.46397473787481452 -0.22134850178344159 +0.0012578164534273071 -0.47352996367618283 -0.22612799889084834 +0.00049307815413980561 -0.47744300860692801 -0.22846138232259336 +-0.00083417496128053729 -0.48280712368688761 -0.23220739396553314 +3 5 31 33 +3 1 35 37 +3 5 41 43 +3 4 44 46 +3 7 47 49 +3 0 50 52 +3 2 53 55 +3 2 56 58 +3 3 59 61 +3 7 62 64 +3 11 69 33 +3 12 71 73 +3 12 73 32 +3 11 74 30 +3 15 38 77 +3 15 77 36 +3 14 78 34 +3 15 35 79 +3 15 79 39 +3 17 80 43 +3 18 81 83 +3 18 83 42 +3 17 84 40 +3 19 82 86 +3 19 86 45 +3 21 87 49 +3 22 89 91 +3 22 91 48 +3 21 92 46 +3 16 76 94 +3 16 94 51 +3 24 95 55 +3 25 59 96 +3 25 96 57 +3 25 56 97 +3 25 97 60 +3 26 98 64 +3 27 99 100 +3 27 100 63 +3 26 101 61 +3 30 29 11 +3 31 12 32 +3 31 32 33 +3 33 32 11 +3 35 15 36 +3 35 36 37 +3 37 36 14 +3 38 15 39 +3 38 39 40 +3 40 39 17 +3 41 18 42 +3 41 42 43 +3 43 42 17 +3 44 19 45 +3 44 45 46 +3 46 45 21 +3 47 22 48 +3 47 48 49 +3 49 48 21 +3 50 16 51 +3 50 51 52 +3 52 51 24 +3 53 54 55 +3 55 54 24 +3 56 25 57 +3 56 57 58 +3 59 25 60 +3 59 60 61 +3 61 60 26 +3 62 27 63 +3 62 63 64 +3 64 63 26 +3 68 67 10 +3 68 10 69 +3 68 69 29 +3 29 69 11 +3 69 10 70 +3 69 70 33 +3 33 70 5 +3 71 1 72 +3 71 72 73 +3 73 72 13 +3 73 13 74 +3 73 74 32 +3 32 74 11 +3 74 13 75 +3 74 75 30 +3 38 76 77 +3 77 76 16 +3 77 16 78 +3 77 78 36 +3 36 78 14 +3 78 16 50 +3 78 50 34 +3 34 50 0 +3 35 1 71 +3 35 71 79 +3 79 71 12 +3 79 12 80 +3 79 80 39 +3 39 80 17 +3 80 12 31 +3 80 31 43 +3 43 31 5 +3 109 81 110 +3 109 108 83 +3 107 83 108 +3 106 84 83 +3 83 84 42 +3 42 84 17 +3 102 84 106 +3 84 102 103 +3 82 6 85 +3 82 85 86 +3 86 85 20 +3 86 20 87 +3 86 87 45 +3 45 87 21 +3 87 20 88 +3 87 88 49 +3 49 88 7 +3 89 2 90 +3 89 90 91 +3 91 90 23 +3 91 23 92 +3 91 92 48 +3 48 92 21 +3 92 23 93 +3 92 93 46 +3 46 93 4 +3 76 4 93 +3 76 93 94 +3 94 93 23 +3 94 23 95 +3 94 95 51 +3 51 95 24 +3 95 23 90 +3 95 90 55 +3 55 90 2 +3 58 53 2 +3 59 3 66 +3 59 66 96 +3 56 2 89 +3 56 89 97 +3 97 89 22 +3 97 22 98 +3 97 98 60 +3 60 98 26 +3 98 22 47 +3 98 47 64 +3 64 47 7 +3 99 8 65 +3 99 65 100 +3 100 65 9 +3 100 9 101 +3 100 101 63 +3 63 101 26 +3 101 9 28 +3 101 28 61 +3 61 28 3 +3 104 40 103 +3 40 104 105 +3 76 38 105 +3 105 38 40 +3 83 107 106 +3 103 40 84 +3 83 81 109 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non_conform_snapping-multiple_ccs.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non_conform_snapping-multiple_ccs.off new file mode 100644 index 00000000000..2ad923576b2 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non_conform_snapping-multiple_ccs.off @@ -0,0 +1,803 @@ +OFF +301 500 0 +4.5654600000000002e-05 -0.306423 -0.120675 +-0.30654700000000001 0.000169333 -0.120675 +-0.231768 -0.23164399999999999 -0.120675 +-0.236591 -0.113093 -0.044732800000000003 +-0.092820100000000003 -0.24388499999999999 -0.044732800000000003 +-0.163326 -0.349277 -0.162194 +-0.34940100000000002 0.16354099999999999 -0.162194 +-0.34940100000000002 -0.16320299999999999 -0.162194 +-0.25935399999999997 -0.0067329599999999996 -0.054644900000000003 +-0.27016000000000001 -0.119246 -0.10180400000000001 +-0.18484600000000001 -0.19392499999999999 -0.054644900000000003 +-0.11937 -0.270036 -0.10180400000000001 +-0.27016000000000001 0.119585 -0.10180400000000001 +-0.31950499999999998 -0.31938100000000003 -0.181065 +-0.39422000000000001 0.000169333 -0.181065 +-0.483072 0.000169333 -0.232019 +-0.483072 -0.24138899999999999 -0.232019 +-0.445328 -0.44520399999999999 -0.232019 +-0.24151300000000001 -0.48294799999999999 -0.232019 +-0.29488500000000001 0.20399300000000001 -0.14143500000000001 +-0.30460300000000001 0.13863400000000001 -0.13199900000000001 +-0.25745400000000002 0.17595 -0.11124000000000001 +-0.23265 0.156582 -0.080757899999999994 +-0.248755 0.106499 -0.071763199999999999 +-0.25439499999999998 0.052897699999999999 -0.050245600000000001 +-0.26135399999999998 0.00084279799999999996 -0.0208402 +-0.26648699999999997 0.058646299999999998 -0.080757899999999994 +-0.29247000000000001 0.067854499999999998 -0.11124000000000001 +-0.27706199999999997 -0.0001674 -0.090194099999999999 +-0.33002399999999998 0.080239699999999997 -0.14143500000000001 +-0.37626300000000001 0.094741000000000006 -0.171629 +-0.346692 0.000169333 -0.15087 +-0.44579200000000002 0.000169333 -0.210788 +-0.483072 -0.12060999999999999 -0.232019 +-0.42959399999999998 -0.11096200000000001 -0.202296 +-0.40266400000000002 -0.19339100000000001 -0.19286 +-0.37626300000000001 -0.094402299999999995 -0.171629 +-0.33002399999999998 -0.079901100000000003 -0.14143500000000001 +-0.30460300000000001 -0.138295 -0.13199900000000001 +-0.29247000000000001 -0.067515900000000004 -0.11124000000000001 +-0.26634400000000003 -0.059838700000000002 -0.080757899999999994 +-0.24779799999999999 -0.108791 -0.071763199999999999 +-0.25143599999999999 -0.069592799999999996 -0.050245600000000001 +-0.25691999999999998 -0.053305499999999999 -0.0208402 +-0.24348400000000001 -0.104445 -0.0203378 +-0.22157299999999999 -0.15007599999999999 -0.0203378 +-0.21896199999999999 -0.14977199999999999 -0.050245600000000001 +-0.190665 -0.189722 -0.0208402 +-0.23177200000000001 -0.15740699999999999 -0.080757899999999994 +-0.25745400000000002 -0.17561099999999999 -0.11124000000000001 +-0.20507 -0.205396 -0.090194099999999999 +-0.31574490790210635 -0.22306698321771332 -0.15622495025138378 +-0.34225699999999998 -0.240201 -0.171629 +-0.26957957934662563 -0.27530712764165155 -0.15511842798773562 +-0.40391199999999999 -0.28987400000000002 -0.202296 +-0.47929699999999997 -0.35839399999999999 -0.232019 +-0.38706400000000002 -0.38694000000000001 -0.210788 +-0.358518 -0.47917399999999999 -0.232019 +-0.28999799999999998 -0.40378900000000001 -0.202296 +-0.15777371130556334 -0.38452207193852783 -0.18058983096468453 +-0.20227459271299961 -0.35096133814562164 -0.1681322413641371 +-0.20377799999999999 -0.294761 -0.14143500000000001 +-0.13841899999999999 -0.304479 -0.13199900000000001 +-0.175735 -0.25733099999999998 -0.11124000000000001 +-0.15636700000000001 -0.23252600000000001 -0.080757899999999994 +-0.106284 -0.24863199999999999 -0.071763199999999999 +-0.135661 -0.22739500000000001 -0.050245600000000001 +-0.150283 -0.22145200000000001 -0.0208402 +-0.052682699999999999 -0.25427100000000002 -0.050245600000000001 +-0.058431299999999999 -0.26636300000000002 -0.080757899999999994 +-0.067639599999999994 -0.29234700000000002 -0.11124000000000001 +0.00038238699999999998 -0.27693800000000002 -0.090194099999999999 +-0.080024700000000004 -0.329901 -0.14143500000000001 +-0.094525999999999999 -0.376139 -0.171629 +4.5654600000000002e-05 -0.34656900000000002 -0.15087 +-0.111085 -0.42947000000000002 -0.202296 +-0.12073399999999999 -0.48294799999999999 -0.232019 +0.080116099999999996 -0.329901 -0.14143500000000001 +0.067730899999999997 -0.29234700000000002 -0.11124000000000001 +-0.32591999999999999 0.150476 -0.147096 +-0.30251 0.17186899999999999 -0.13766 +-0.32466699999999998 0.18639900000000001 -0.152758 +-0.257496 0.11276799999999999 -0.086706500000000006 +-0.24254200000000001 0.13179199999999999 -0.077270699999999998 +-0.25228299999999998 0.13964699999999999 -0.092368099999999995 +-0.249357 0.075678099999999998 -0.048002000000000003 +-0.25405299999999997 0.051449799999999997 -0.035117799999999998 +-0.25786399999999998 0.025537799999999999 -0.051960199999999998 +-0.25842599999999999 0.055271300000000002 -0.065374000000000002 +-0.26288899999999998 0.0270181 -0.068001199999999998 +-0.28328900000000001 0.095748299999999995 -0.10746600000000001 +-0.27793600000000002 0.062952800000000003 -0.0961423 +-0.26944499999999999 0.089445499999999997 -0.092368099999999995 +-0.299375 0.035902099999999999 -0.11501400000000001 +-0.30993599999999999 0.073688199999999995 -0.126337 +-0.31739800000000001 0.0391221 -0.13011200000000001 +-0.36568299999999998 0.132799 -0.167855 +-0.352271 0.087257500000000002 -0.156532 +-0.34180500000000003 0.122226 -0.152758 +-0.42013499999999998 0.000169333 -0.196163 +-0.43644300000000003 -0.0571066 -0.205599 +-0.41000700000000001 -0.053992499999999999 -0.190501 +-0.437307 -0.213837 -0.210316 +-0.42038599999999998 -0.157363 -0.198994 +-0.45311299999999999 -0.17208300000000001 -0.215978 +-0.32550699999999999 0.000169333 -0.135773 +-0.33788600000000002 -0.042236299999999997 -0.145209 +-0.31739800000000001 -0.038783400000000003 -0.13011200000000001 +-0.34225417608095515 -0.16924860176876474 -0.16065609270823028 +-0.31977699999999998 -0.112014 -0.13766 +-0.35647318197941552 -0.14988587513736754 -0.16429574503487185 +-0.26670100000000002 -0.0018500999999999999 -0.0736628 +-0.27196599999999999 -0.031194199999999998 -0.084245500000000001 +-0.26260299999999998 -0.032433799999999999 -0.068001199999999998 +-0.257496 -0.11243 -0.086706500000000006 +-0.25855299999999998 -0.085917800000000003 -0.077270699999999998 +-0.26944499999999999 -0.089106900000000003 -0.092368099999999995 +-0.26536199999999999 -0.047722100000000003 -0.00555778 +-0.26017800000000002 -0.074573299999999995 -0.00555778 +-0.256434 -0.041250700000000001 -0.051960199999999998 +-0.25274799999999997 -0.059070999999999999 -0.036122700000000001 +-0.25670599999999999 -0.030620700000000001 -0.036862800000000001 +-0.22956699999999999 -0.12975900000000001 -0.048002000000000003 +-0.21790999999999999 -0.14993100000000001 -0.035117799999999998 +-0.22897799999999999 -0.12981799999999999 -0.033848200000000002 +-0.20429700000000001 -0.171293 -0.051960199999999998 +-0.22348000000000001 -0.15215799999999999 -0.065374000000000002 +-0.20945900000000001 -0.17510999999999999 -0.068001199999999998 +-0.266009 -0.14794099999999999 -0.10746600000000001 +-0.243229 -0.16520699999999999 -0.0961423 +-0.25228299999999998 -0.13930899999999999 -0.092368099999999995 +-0.24551500000000001 -0.203095 -0.11501400000000001 +-0.27477600000000002 -0.188499 -0.126337 +-0.26305400000000001 -0.218227 -0.13011200000000001 +-0.34875800000000001 -0.20206499999999999 -0.167855 +-0.31731700000000002 -0.220827 -0.156532 +-0.32466699999999998 -0.18606 -0.152758 +-0.33193899999999998 -0.278974 -0.175404 +-0.37063200000000002 -0.26270300000000002 -0.186727 +-0.36217700000000003 -0.30619200000000002 -0.190501 +-0.483072 -0.30177900000000002 -0.232019 +-0.44164799999999999 -0.32301000000000002 -0.217865 +-0.44377100000000003 -0.26865899999999998 -0.215978 +-0.35150399999999998 -0.35138000000000003 -0.196163 +-0.33917900000000001 -0.39718100000000001 -0.205599 +-0.30631599999999998 -0.36205300000000001 -0.190501 +-0.21396000000000001 -0.43718400000000002 -0.210316 +-0.241948 -0.40671600000000002 -0.198994 +-0.26878299999999999 -0.44364700000000001 -0.215978 +-0.24951899999999999 -0.24939500000000001 -0.135773 +-0.236043 -0.28318100000000002 -0.145209 +-0.21835099999999999 -0.26293 -0.13011200000000001 +-0.15026100000000001 -0.32579599999999997 -0.147096 +-0.171654 -0.30238599999999999 -0.13766 +-0.18618399999999999 -0.32454300000000003 -0.152758 +-0.194747 -0.19731499999999999 -0.0736628 +-0.180641 -0.21981899999999999 -0.084245500000000001 +-0.17111100000000001 -0.21288599999999999 -0.068001199999999998 +-0.112554 -0.25737300000000002 -0.086706500000000006 +-0.131577 -0.24241799999999999 -0.077270699999999998 +-0.139432 -0.25215900000000002 -0.092368099999999995 +-0.15928500000000001 -0.213445 -0.051960199999999998 +-0.14344399999999999 -0.22193099999999999 -0.036122700000000001 +-0.16619300000000001 -0.20696500000000001 -0.036862800000000001 +-0.075463199999999994 -0.24923300000000001 -0.048002000000000003 +-0.025322799999999999 -0.25774000000000002 -0.051960199999999998 +-0.055056300000000002 -0.25830199999999998 -0.065374000000000002 +-0.0268031 -0.262766 -0.068001199999999998 +-0.095533300000000002 -0.283165 -0.10746600000000001 +-0.062737799999999996 -0.277812 -0.0961423 +-0.089230500000000004 -0.26932099999999998 -0.092368099999999995 +-0.035687099999999999 -0.29925200000000002 -0.11501400000000001 +-0.073473200000000002 -0.30981300000000001 -0.126337 +-0.0389071 -0.317274 -0.13011200000000001 +-0.13258400000000001 -0.36556 -0.167855 +-0.087042499999999995 -0.35214699999999999 -0.156532 +-0.12201099999999999 -0.34168100000000001 -0.152758 +-0.049964700000000001 -0.38434699999999999 -0.175404 +-0.102475 -0.40159699999999998 -0.186727 +-0.18112300000000001 -0.48294799999999999 -0.232019 +-0.11762 -0.45775399999999999 -0.217865 +-0.172206 -0.45298899999999998 -0.215978 +4.5654600000000002e-05 -0.32538299999999998 -0.135773 +0.042451299999999997 -0.33776200000000001 -0.145209 +0.038998400000000003 -0.317274 -0.13011200000000001 +0.00206508 -0.26657700000000001 -0.0736628 +0.031409100000000002 -0.271843 -0.084245500000000001 +-0.28591299999999997 0.12826499999999999 -0.116901 +-0.266009 0.14828 -0.10746600000000001 +-0.282829 0.159085 -0.12256300000000001 +-0.27477600000000002 0.188837 -0.126337 +-0.243229 0.165546 -0.0961423 +-0.24434400000000001 0.099931599999999995 -0.057437799999999997 +-0.23740600000000001 0.12363300000000001 -0.062482000000000003 +-0.22695100000000001 0.14730799999999999 -0.065374000000000002 +-0.25813700000000001 -0.00225398 -0.036862800000000001 +-0.25703799999999999 0.0257427 -0.036122700000000001 +-0.26015199999999999 0.0279317 -0.020655199999999999 +-0.25209399999999998 0.079952300000000004 -0.062482000000000003 +-0.25883899999999999 0.084540400000000002 -0.077270699999999998 +-0.29035899999999998 0.000169333 -0.10557800000000001 +-0.28420499999999999 0.033147900000000001 -0.099916900000000003 +-0.27196599999999999 0.030186399999999999 -0.084245500000000001 +-0.30014400000000002 0.103449 -0.12256300000000001 +-0.31977699999999998 0.11235299999999999 -0.13766 +-0.36969000000000002 0.000169333 -0.165968 +-0.36035800000000001 0.046260599999999999 -0.16030700000000001 +-0.33788600000000002 0.042574899999999999 -0.145209 +-0.46821000000000002 0.000169333 -0.223527 +-0.483072 -0.060220299999999997 -0.232019 +-0.46146300000000001 -0.059182600000000002 -0.219752 +-0.45787800000000001 -0.117496 -0.217865 +-0.483072 -0.18099999999999999 -0.232019 +-0.37442599999999998 -0.177199 -0.177291 +-0.36568299999999998 -0.13245999999999999 -0.167855 +-0.391067 -0.143731 -0.182953 +-0.40172000000000002 -0.102352 -0.186727 +-0.38446999999999998 -0.049841000000000003 -0.175404 +-0.38098470097291526 -0.060481522777595803 -0.17436607347989447 +-0.36805894321021887 -0.1267017215147484 -0.16830017845427389 +-0.28591299999999997 -0.12792700000000001 -0.116901 +-0.28328900000000001 -0.095409599999999997 -0.10746600000000001 +-0.30014400000000002 -0.10310999999999999 -0.12256300000000001 +-0.30993599999999999 -0.073349499999999998 -0.126337 +-0.299375 -0.035563499999999998 -0.11501400000000001 +-0.28420499999999999 -0.032809199999999997 -0.099916900000000003 +-0.27793600000000002 -0.062614199999999995 -0.0961423 +-0.24089099999999999 -0.10908900000000001 -0.057437799999999997 +-0.244473 -0.093416799999999994 -0.048002000000000003 +-0.25046600000000002 -0.086878700000000003 -0.062482000000000003 +-0.25756800000000002 -0.061427099999999998 -0.065374000000000002 +-0.26822299999999999 -0.020442399999999999 -0.00555778 +-0.26035000000000003 -0.026246100000000001 -0.0210253 +-0.23857600000000001 -0.108072 -0.033848200000000002 +-0.24670500000000001 -0.084976700000000002 -0.035117799999999998 +-0.25128499999999998 -0.079792399999999999 -0.020655199999999999 +-0.252747 -0.100566 -0.00555778 +-0.24307000000000001 -0.12543499999999999 -0.00555778 +-0.23347599999999999 -0.127995 -0.020020400000000001 +-0.18637699999999999 -0.189641 -0.036862800000000001 +-0.20371 -0.16996 -0.036122700000000001 +-0.20746400000000001 -0.17048099999999999 -0.020655199999999999 +-0.23406199999999999 -0.12970100000000001 -0.062482000000000003 +-0.24168400000000001 -0.132884 -0.077270699999999998 +-0.21711800000000001 -0.21699499999999999 -0.10557800000000001 +-0.231075 -0.19075400000000001 -0.099916900000000003 +-0.21904499999999999 -0.18141499999999999 -0.084245500000000001 +-0.282829 -0.158747 -0.12256300000000001 +-0.32289216426077955 -0.18839363459728986 -0.14940144061717747 +-0.23019996591349692 -0.29851351146716271 -0.14927512020512768 +-0.30608200000000002 -0.25598300000000002 -0.16030700000000001 +-0.30311974151197918 -0.25586992737771802 -0.16120185214201549 +-0.37533899999999998 -0.22009899999999999 -0.182953 +-0.40683999999999998 -0.24182400000000001 -0.198994 +-0.467974 -0.40746100000000002 -0.232019 +-0.42112500000000003 -0.42100100000000001 -0.223527 +-0.43391099999999999 -0.37415199999999998 -0.219752 +-0.39730500000000002 -0.33905600000000002 -0.205599 +-0.40758499999999998 -0.46784999999999999 -0.232019 +-0.374276 -0.43378699999999998 -0.219752 +-0.323133 -0.44152400000000003 -0.217865 +-0.30190299999999998 -0.48294799999999999 -0.232019 +-0.17732300000000001 -0.374303 -0.177291 +-0.20218800000000001 -0.348634 -0.167855 +-0.18052891616230224 -0.37364440224846768 -0.17672041802772351 +-0.26282699999999998 -0.370508 -0.186727 +-0.27909800000000001 -0.33181500000000003 -0.175404 +-0.2219102238198887 -0.31697136585688723 -0.15756827277880672 +-0.22095100000000001 -0.317193 -0.156532 +-0.12805 -0.28578999999999999 -0.116901 +-0.148065 -0.26588600000000001 -0.10746600000000001 +-0.15887000000000001 -0.28270499999999998 -0.12256300000000001 +-0.18862200000000001 -0.27465200000000001 -0.126337 +-0.20321800000000001 -0.245391 -0.11501400000000001 +-0.19087799999999999 -0.23095099999999999 -0.099916900000000003 +-0.16533100000000001 -0.24310499999999999 -0.0961423 +-0.099716600000000002 -0.24421999999999999 -0.057437799999999997 +-0.113236 -0.23718700000000001 -0.048002000000000003 +-0.123418 -0.23728199999999999 -0.062482000000000003 +-0.147093 -0.226828 -0.065374000000000002 +-0.17166000000000001 -0.206757 -0.0210253 +-0.097563800000000006 -0.24231800000000001 -0.033848200000000002 +-0.12048 -0.23371500000000001 -0.035117799999999998 +-0.079737299999999997 -0.25197000000000003 -0.062482000000000003 +-0.084325499999999998 -0.258716 -0.077270699999999998 +4.5654600000000002e-05 -0.29023500000000002 -0.10557800000000001 +-0.032932900000000001 -0.28408099999999997 -0.099916900000000003 +-0.029971399999999999 -0.271843 -0.084245500000000001 +-0.10323400000000001 -0.30002000000000001 -0.12256300000000001 +-0.112138 -0.31965399999999999 -0.13766 +4.5654600000000002e-05 -0.36956600000000001 -0.165968 +-0.046045700000000002 -0.36023500000000003 -0.16030700000000001 +-0.042360000000000002 -0.33776200000000001 -0.145209 +-0.14385500000000001 -0.39094400000000001 -0.182953 +-0.15748599999999999 -0.42026200000000002 -0.198994 +0.046136999999999997 -0.36023500000000003 -0.16030700000000001 +0.087133799999999997 -0.35214699999999999 -0.156532 +0.073564500000000005 -0.30981300000000001 -0.126337 +0.035778499999999998 -0.29925200000000002 -0.11501400000000001 +0.033024199999999997 -0.28408099999999997 -0.099916900000000003 +0.062829200000000002 -0.277812 -0.0961423 +3 6 79 81 +3 12 82 84 +3 8 87 89 +3 12 90 92 +3 1 93 95 +3 6 96 98 +3 14 99 101 +3 16 102 104 +3 1 105 107 +3 8 111 113 +3 9 114 116 +3 8 119 121 +3 3 122 124 +3 10 125 127 +3 9 128 130 +3 2 131 133 +3 7 134 136 +3 13 137 139 +3 16 140 142 +3 13 143 145 +3 18 146 148 +3 2 149 151 +3 5 152 154 +3 10 155 157 +3 11 158 160 +3 10 161 163 +3 11 168 170 +3 0 171 173 +3 5 174 176 +3 18 179 181 +3 0 182 184 +3 20 187 189 +3 20 189 80 +3 22 191 84 +3 23 192 193 +3 23 193 83 +3 24 87 196 +3 24 196 86 +3 24 85 198 +3 24 198 88 +3 26 199 92 +3 27 93 201 +3 27 201 91 +3 26 202 89 +3 27 90 203 +3 27 203 94 +3 29 204 98 +3 30 206 97 +3 29 207 95 +3 32 208 210 +3 32 210 100 +3 34 211 104 +3 35 213 215 +3 35 215 103 +3 34 216 101 +3 31 205 218 +3 31 218 106 +3 38 220 222 +3 38 222 109 +3 37 223 107 +3 28 200 225 +3 28 225 112 +3 40 226 116 +3 41 227 229 +3 41 229 115 +3 40 230 113 +3 43 232 121 +3 42 228 234 +3 42 234 120 +3 43 235 118 +3 46 125 240 +3 46 240 123 +3 46 122 242 +3 46 242 126 +3 48 243 130 +3 49 131 245 +3 49 245 129 +3 48 246 127 +3 49 128 247 +3 49 247 132 +3 135 134 52 +3 52 134 252 +3 52 252 138 +3 54 253 142 +3 55 254 256 +3 55 256 141 +3 54 257 139 +3 56 255 259 +3 56 259 144 +3 58 260 148 +3 59 264 147 +3 58 265 145 +3 154 61 268 +3 62 269 271 +3 62 271 153 +3 61 272 151 +3 50 244 274 +3 50 274 156 +3 64 275 160 +3 65 276 278 +3 65 278 159 +3 64 279 157 +3 67 280 163 +3 66 277 282 +3 66 282 162 +3 68 164 283 +3 68 283 166 +3 69 284 170 +3 70 171 286 +3 70 286 169 +3 69 287 167 +3 70 168 288 +3 70 288 172 +3 72 289 176 +3 73 177 291 +3 73 291 175 +3 72 292 173 +3 73 174 293 +3 73 293 178 +3 75 294 181 +3 74 290 295 +3 74 295 183 +3 77 297 184 +3 71 285 299 +3 71 299 186 +3 79 20 80 +3 79 80 81 +3 81 80 19 +3 82 23 83 +3 82 83 84 +3 84 83 22 +3 85 24 86 +3 87 24 88 +3 87 88 89 +3 89 88 26 +3 90 27 91 +3 90 91 92 +3 92 91 26 +3 93 27 94 +3 93 94 95 +3 95 94 29 +3 96 30 97 +3 96 97 98 +3 98 97 29 +3 99 32 100 +3 99 100 101 +3 101 100 34 +3 102 35 103 +3 102 103 104 +3 104 103 34 +3 105 31 106 +3 105 106 107 +3 107 106 37 +3 108 38 109 +3 108 109 110 +3 111 28 112 +3 111 112 113 +3 113 112 40 +3 114 41 115 +3 114 115 116 +3 116 115 40 +3 118 117 43 +3 119 42 120 +3 119 120 121 +3 121 120 43 +3 122 46 123 +3 122 123 124 +3 124 123 45 +3 125 46 126 +3 125 126 127 +3 127 126 48 +3 128 49 129 +3 128 129 130 +3 130 129 48 +3 131 49 132 +3 131 132 133 +3 134 135 136 +3 137 52 138 +3 137 138 139 +3 139 138 54 +3 140 55 141 +3 140 141 142 +3 142 141 54 +3 143 56 144 +3 143 144 145 +3 145 144 58 +3 146 59 147 +3 146 147 148 +3 148 147 58 +3 149 53 150 +3 149 150 151 +3 151 150 61 +3 152 62 153 +3 152 153 154 +3 154 153 61 +3 155 50 156 +3 155 156 157 +3 157 156 64 +3 158 65 159 +3 158 159 160 +3 160 159 64 +3 161 66 162 +3 161 162 163 +3 163 162 67 +3 165 68 166 +3 165 166 167 +3 167 166 69 +3 168 70 169 +3 168 169 170 +3 170 169 69 +3 171 70 172 +3 171 172 173 +3 173 172 72 +3 174 73 175 +3 174 175 176 +3 176 175 72 +3 177 73 178 +3 179 76 180 +3 179 180 181 +3 181 180 75 +3 182 74 183 +3 182 183 184 +3 184 183 77 +3 185 71 186 +3 187 12 188 +3 187 188 189 +3 189 188 21 +3 189 21 190 +3 189 190 80 +3 80 190 19 +3 191 21 188 +3 191 188 84 +3 84 188 12 +3 193 194 83 +3 83 194 22 +3 87 8 195 +3 87 195 196 +3 196 195 25 +3 196 25 197 +3 196 197 86 +3 85 192 198 +3 198 192 23 +3 198 23 199 +3 198 199 88 +3 88 199 26 +3 199 23 82 +3 199 82 92 +3 92 82 12 +3 93 1 200 +3 93 200 201 +3 201 200 28 +3 201 28 202 +3 201 202 91 +3 91 202 26 +3 202 28 111 +3 202 111 89 +3 89 111 8 +3 90 12 187 +3 90 187 203 +3 203 187 20 +3 203 20 204 +3 203 204 94 +3 94 204 29 +3 204 20 79 +3 204 79 98 +3 98 79 6 +3 206 205 31 +3 206 31 207 +3 206 207 97 +3 97 207 29 +3 207 31 105 +3 207 105 95 +3 95 105 1 +3 208 15 209 +3 208 209 210 +3 210 209 33 +3 210 33 211 +3 210 211 100 +3 100 211 34 +3 211 33 212 +3 211 212 104 +3 104 212 16 +3 213 7 214 +3 215 216 103 +3 103 216 34 +3 216 36 217 +3 216 217 101 +3 101 217 14 +3 218 109 37 +3 220 9 221 +3 220 221 222 +3 222 221 39 +3 222 39 223 +3 222 223 109 +3 109 223 37 +3 223 39 224 +3 223 224 107 +3 107 224 1 +3 200 1 224 +3 200 224 225 +3 225 224 39 +3 225 39 226 +3 225 226 112 +3 112 226 40 +3 226 39 221 +3 226 221 116 +3 116 221 9 +3 227 3 228 +3 227 228 229 +3 229 228 42 +3 229 42 230 +3 229 230 115 +3 115 230 40 +3 230 42 119 +3 230 119 113 +3 113 119 8 +3 231 25 232 +3 231 232 117 +3 117 232 43 +3 232 25 195 +3 232 195 121 +3 121 195 8 +3 228 3 233 +3 228 233 234 +3 234 233 44 +3 234 44 235 +3 234 235 120 +3 120 235 43 +3 235 44 236 +3 235 236 118 +3 237 236 44 +3 237 44 238 +3 238 44 233 +3 238 233 124 +3 124 233 3 +3 125 10 239 +3 125 239 240 +3 240 239 47 +3 240 47 241 +3 240 241 123 +3 123 241 45 +3 122 3 227 +3 122 227 242 +3 242 227 41 +3 242 41 243 +3 242 243 126 +3 126 243 48 +3 243 41 114 +3 243 114 130 +3 130 114 9 +3 131 2 244 +3 131 244 245 +3 245 244 50 +3 245 50 246 +3 245 246 129 +3 129 246 48 +3 246 50 155 +3 246 155 127 +3 127 155 10 +3 128 9 220 +3 128 220 247 +3 247 220 38 +3 247 38 248 +3 247 248 132 +3 248 38 108 +3 137 13 249 +3 137 249 250 +3 132 248 51 +3 133 149 2 +3 134 7 213 +3 134 213 252 +3 252 213 35 +3 252 35 253 +3 252 253 138 +3 138 253 54 +3 253 35 102 +3 253 102 142 +3 142 102 16 +3 254 17 255 +3 254 255 256 +3 256 255 56 +3 256 56 257 +3 256 257 141 +3 141 257 54 +3 257 56 143 +3 257 143 139 +3 139 143 13 +3 255 17 258 +3 255 258 259 +3 259 258 57 +3 259 57 260 +3 259 260 144 +3 144 260 58 +3 260 57 261 +3 260 261 148 +3 148 261 18 +3 262 5 263 +3 264 60 265 +3 264 265 147 +3 147 265 58 +3 265 60 266 +3 265 266 145 +3 145 266 13 +3 249 13 266 +3 249 266 267 +3 267 266 60 +3 269 11 270 +3 269 270 271 +3 271 270 63 +3 271 63 272 +3 271 272 153 +3 153 272 61 +3 272 63 273 +3 272 273 151 +3 151 273 2 +3 244 2 273 +3 244 273 274 +3 274 273 63 +3 274 63 275 +3 274 275 156 +3 156 275 64 +3 275 63 270 +3 275 270 160 +3 160 270 11 +3 276 4 277 +3 276 277 278 +3 278 277 66 +3 278 66 279 +3 278 279 159 +3 159 279 64 +3 279 66 161 +3 279 161 157 +3 157 161 10 +3 280 47 239 +3 280 239 163 +3 163 239 10 +3 277 4 281 +3 277 281 282 +3 164 4 276 +3 164 276 283 +3 283 276 65 +3 283 65 284 +3 283 284 166 +3 166 284 69 +3 284 65 158 +3 284 158 170 +3 170 158 11 +3 171 0 285 +3 171 285 286 +3 286 285 71 +3 286 71 287 +3 286 287 169 +3 169 287 69 +3 287 71 185 +3 287 185 167 +3 168 11 269 +3 168 269 288 +3 288 269 62 +3 288 62 289 +3 288 289 172 +3 172 289 72 +3 289 62 152 +3 289 152 176 +3 176 152 5 +3 177 290 291 +3 291 290 74 +3 291 74 292 +3 291 292 175 +3 175 292 72 +3 292 74 182 +3 292 182 173 +3 173 182 0 +3 174 5 262 +3 174 262 293 +3 294 59 146 +3 294 146 181 +3 181 146 18 +3 295 296 183 +3 183 296 77 +3 297 78 298 +3 297 298 184 +3 184 298 0 +3 285 0 298 +3 285 298 299 +3 299 298 78 +3 299 78 300 +3 299 300 186 +3 149 133 251 +3 133 132 51 +3 251 53 149 +3 133 51 251 +3 219 110 109 +3 37 106 218 +3 109 218 219 +3 36 216 215 +3 213 214 36 +3 36 215 213 +3 61 150 268 +3 154 268 263 +3 263 5 154 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non_conform_snapping.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non_conform_snapping.off new file mode 100644 index 00000000000..3447e9d6326 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/non_conform_snapping.off @@ -0,0 +1,302 @@ +OFF +116 184 0 +0.33888699999999999 -0.39584799999999998 -0.20502500000000001 +0.37436700000000001 -0.43378699999999998 -0.219752 +0.40767599999999998 -0.46784999999999999 -0.232019 +0.242039 -0.40671600000000002 -0.198994 +0.22031400000000001 -0.37521500000000002 -0.182953 +0.17174600000000001 -0.30238700000000002 -0.13766 +0.033024199999999997 -0.28408099999999997 -0.099916900000000003 +0.035778499999999998 -0.29925200000000002 -0.11501400000000001 +0.073564500000000005 -0.30981300000000001 -0.126337 +4.5654600000000002e-05 -0.306423 -0.120675 +0.103325 -0.30002000000000001 -0.12256300000000001 +0.087133799999999997 -0.35214699999999999 -0.156532 +0.046136999999999997 -0.36023500000000003 -0.16030700000000001 +0.050056000000000003 -0.38434699999999999 -0.175404 +0.10256700000000001 -0.40159699999999998 -0.186727 +0.14394599999999999 -0.39094400000000001 -0.182953 +0.13267499999999999 -0.36556 -0.167855 +0.17741399999999999 -0.374303 -0.177291 +0.18121499999999999 -0.48294799999999999 -0.232019 +0.117711 -0.45775399999999999 -0.217865 +0.059397600000000002 -0.46133999999999997 -0.219752 +0.060435299999999997 -0.48294799999999999 -0.232019 +-0.057230299999999998 -0.43631900000000001 -0.205599 +-0.059306299999999999 -0.46133999999999997 -0.219752 +4.5654600000000002e-05 -0.468086 -0.223527 +-0.060344000000000002 -0.48294799999999999 -0.232019 +-0.15748599999999999 -0.42026200000000002 -0.198994 +-0.14385500000000001 -0.39094400000000001 -0.182953 +-0.042360000000000002 -0.33776200000000001 -0.145209 +-0.046045700000000002 -0.36023500000000003 -0.16030700000000001 +4.5654600000000002e-05 -0.36956600000000001 -0.165968 +-0.112138 -0.31965399999999999 -0.13766 +-0.10323400000000001 -0.30002000000000001 -0.12256300000000001 +-0.032932900000000001 -0.28408099999999997 -0.099916900000000003 +4.5654600000000002e-05 -0.29023500000000002 -0.10557800000000001 +-0.22095100000000001 -0.317193 -0.156532 +-0.26282699999999998 -0.370508 -0.186727 +-0.220222 -0.37521500000000002 -0.182953 +-0.20218800000000001 -0.348634 -0.167855 +-0.17732300000000001 -0.374303 -0.177291 +-0.30190299999999998 -0.48294799999999999 -0.232019 +-0.323133 -0.44152400000000003 -0.217865 +0.268874 -0.44364700000000001 -0.215978 +0.32322499999999998 -0.44152400000000003 -0.217865 +0.30199399999999998 -0.48294799999999999 -0.232019 +0.30525400000000003 -0.35805500000000001 -0.18878 +0.26253399999999999 -0.369176 -0.18615300000000001 +0.27662999999999999 -0.327013 -0.17274 +0.186275 -0.32454300000000003 -0.152758 +0.219636 -0.316388 -0.155588 +0.20227899999999999 -0.348634 -0.167855 +0.122102 -0.34168100000000001 -0.152758 +-0.163326 -0.349277 -0.162194 +0.112229 -0.31965399999999999 -0.13766 +0.15035299999999999 -0.32579599999999997 -0.147096 +0.038998400000000003 -0.317274 -0.13011200000000001 +0.042451299999999997 -0.33776200000000001 -0.145209 +4.5654600000000002e-05 -0.32538299999999998 -0.135773 +0.17229800000000001 -0.45298899999999998 -0.215978 +0.157578 -0.42026200000000002 -0.198994 +0.21405199999999999 -0.43718400000000002 -0.210316 +0.16341800000000001 -0.349277 -0.162194 +0.054207400000000003 -0.40988400000000003 -0.190501 +0.0573216 -0.43631900000000001 -0.205599 +4.5654600000000002e-05 -0.42001100000000002 -0.196163 +-0.172206 -0.45298899999999998 -0.215978 +-0.11762 -0.45775399999999999 -0.217865 +-0.18112300000000001 -0.48294799999999999 -0.232019 +-0.0541161 -0.40988400000000003 -0.190501 +-0.102475 -0.40159699999999998 -0.186727 +-0.049964700000000001 -0.38434699999999999 -0.175404 +-0.12201099999999999 -0.34168100000000001 -0.152758 +-0.087042499999999995 -0.35214699999999999 -0.156532 +-0.13258400000000001 -0.36556 -0.167855 +-0.0389071 -0.317274 -0.13011200000000001 +-0.073473200000000002 -0.30981300000000001 -0.126337 +-0.035687099999999999 -0.29925200000000002 -0.11501400000000001 +-0.18618399999999999 -0.32454300000000003 -0.152758 +-0.171654 -0.30238599999999999 -0.13766 +-0.15026100000000001 -0.32579599999999997 -0.147096 +-0.26878299999999999 -0.44364700000000001 -0.215978 +-0.241948 -0.40671600000000002 -0.198994 +-0.21396000000000001 -0.43718400000000002 -0.210316 +0.35860900000000001 -0.47917399999999999 -0.232019 +0.28989700000000002 -0.40312199999999998 -0.20200899999999999 +0.23952100000000001 -0.34106500000000001 -0.170871 +0.202656 -0.29407299999999997 -0.140491 +0.067730899999999997 -0.29234700000000002 -0.11124000000000001 +0.13850999999999999 -0.304479 -0.13199900000000001 +0.080116099999999996 -0.329901 -0.14143500000000001 +0.094617300000000001 -0.376139 -0.171629 +0.193606 -0.40254099999999998 -0.19286 +0.111177 -0.42947000000000002 -0.202296 +0.120825 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.44566800000000001 -0.210788 +-0.12073399999999999 -0.48294799999999999 -0.232019 +-0.111085 -0.42947000000000002 -0.202296 +4.5654600000000002e-05 -0.34656900000000002 -0.15087 +-0.094525999999999999 -0.376139 -0.171629 +-0.080024700000000004 -0.329901 -0.14143500000000001 +-0.067639599999999994 -0.29234700000000002 -0.11124000000000001 +-0.13841899999999999 -0.304479 -0.13199900000000001 +-0.20377799999999999 -0.294761 -0.14143500000000001 +-0.24032400000000001 -0.34213300000000002 -0.171629 +-0.19351499999999999 -0.40254099999999998 -0.19286 +-0.28999799999999998 -0.40378900000000001 -0.202296 +-0.358518 -0.47917399999999999 -0.232019 +0.24160400000000001 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.48294799999999999 -0.232019 +-0.24151300000000001 -0.48294799999999999 -0.232019 +4.5654600000000002e-05 -0.394096 -0.181065 +-0.18360737778758263 -0.48989531468766978 -0.23603563289391444 +-0.17704185198879943 -0.46711738388826574 -0.2241345036411547 +-0.17269194772091989 -0.45251983604093454 -0.21635105657550449 +-0.16784122550600716 -0.44260484529222738 -0.2105583143358154 +-0.16040402630209122 -0.42585767549071629 -0.202124607147222 +3 43 0 84 +3 1 0 43 +3 42 60 107 +3 3 60 42 +3 3 91 60 +3 46 3 84 +3 4 3 46 +3 4 91 3 +3 4 17 91 +3 50 17 4 +3 50 61 17 +3 48 54 61 +3 5 54 48 +3 5 88 54 +3 6 7 87 +3 34 7 6 +3 34 9 7 +3 55 7 9 +3 8 7 55 +3 8 87 7 +3 53 8 89 +3 10 8 53 +3 10 87 8 +3 51 16 61 +3 11 16 51 +3 11 90 16 +3 56 11 89 +3 12 11 56 +3 12 90 11 +3 12 13 90 +3 30 13 12 +3 30 110 13 +3 62 13 110 +3 14 13 62 +3 14 90 13 +3 59 14 92 +3 15 14 59 +3 15 90 14 +3 15 16 90 +3 17 16 15 +3 17 61 16 +3 58 18 107 +3 19 18 58 +3 19 93 18 +3 63 19 92 +3 20 19 63 +3 20 93 19 +3 20 21 93 +3 24 21 20 +3 24 108 21 +3 68 64 110 +3 22 64 68 +3 22 94 64 +3 66 22 96 +3 23 22 66 +3 23 94 22 +3 23 24 94 +3 25 24 23 +3 25 108 24 +3 109 112 113 +3 114 82 113 +3 82 114 115 +3 69 26 96 +3 27 26 69 +3 27 104 115 +3 27 39 104 +3 73 39 27 +3 73 52 39 +3 74 57 9 +3 28 57 74 +3 28 97 57 +3 72 28 99 +3 29 28 72 +3 29 97 28 +3 29 30 97 +3 70 30 29 +3 70 110 30 +3 71 79 52 +3 31 79 71 +3 31 101 79 +3 75 31 99 +3 32 31 75 +3 32 101 31 +3 76 34 33 +3 76 9 34 +3 77 38 52 +3 35 38 77 +3 35 103 38 +3 81 36 105 +3 37 36 81 +3 37 103 36 +3 37 38 103 +3 39 38 37 +3 39 52 38 +3 80 40 109 +3 41 40 80 +3 41 106 40 +3 42 43 84 +3 44 43 42 +3 44 83 43 +3 45 46 84 +3 47 46 45 +3 47 85 46 +3 48 49 86 +3 50 49 48 +3 50 85 49 +3 51 53 89 +3 54 53 51 +3 54 88 53 +3 55 56 89 +3 57 56 55 +3 57 97 56 +3 58 59 92 +3 60 59 58 +3 60 91 59 +3 62 63 92 +3 64 63 62 +3 64 94 63 +3 65 66 96 +3 67 66 65 +3 67 95 66 +3 68 69 96 +3 70 69 68 +3 70 98 69 +3 71 72 99 +3 73 72 71 +3 73 98 72 +3 74 75 99 +3 76 75 74 +3 76 100 75 +3 77 78 102 +3 79 78 77 +3 79 101 78 +3 80 81 105 +3 82 81 80 +3 82 104 81 +3 84 0 45 +3 83 1 43 +3 83 2 1 +3 84 3 42 +3 85 4 46 +3 85 50 4 +3 86 5 48 +3 89 8 55 +3 88 10 53 +3 89 11 51 +3 97 12 56 +3 97 30 12 +3 92 14 62 +3 91 15 59 +3 91 17 15 +3 92 19 58 +3 94 20 63 +3 94 24 20 +3 96 22 68 +3 95 23 66 +3 95 25 23 +3 96 26 65 +3 98 27 69 +3 98 73 27 +3 99 28 74 +3 98 29 72 +3 98 70 29 +3 99 31 71 +3 100 32 75 +3 100 76 33 +3 102 35 77 +3 104 37 81 +3 104 39 37 +3 105 41 80 +3 107 44 42 +3 61 50 48 +3 61 54 51 +3 9 57 55 +3 107 60 58 +3 110 64 62 +3 112 109 111 +3 110 70 68 +3 52 73 71 +3 9 76 74 +3 52 79 77 +3 109 82 80 +3 113 82 109 +3 115 104 82 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/pig.stl b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/pig.stl new file mode 100644 index 00000000000..6bc2a5bbe38 Binary files /dev/null and b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/pig.stl differ diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/real_data.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/real_data.off new file mode 100644 index 00000000000..ccf2b718a61 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/real_data.off @@ -0,0 +1,5570 @@ +OFF +1948 3620 0 +-2.3062999999999998 1.5057400000000001 -2.3177300000000001 +-2.3063500000000001 1.5056499999999999 -2.3177400000000001 +6.5870800000000003 7.7065000000000001 0.60919999999999996 +-2.3062900000000002 1.50576 -2.3177300000000001 +3.5280200000000002 9.3941099999999995 -0.47187400000000002 +2.7587700000000002 9.4358000000000004 1.9738199999999999 +11.122999999999999 2.9107099999999999 3.6307399999999999 +-2.26423 10.3597 -2.2676500000000002 +3.62087 9.3044399999999996 0.767625 +3.9645600000000001 9.2752400000000002 -0.29685400000000001 +4.3881800000000002 9.1298300000000001 -0.184006 +4.0258900000000004 9.1868099999999995 0.77206399999999997 +3.4469699999999999 9.2503399999999996 2.1664500000000002 +4.5718800000000002 9.0199400000000001 0.33535900000000002 +4.3598600000000003 9.0624900000000004 0.84219599999999994 +4.0806100000000001 9.0961700000000008 1.5610999999999999 +4.9053899999999997 8.8986499999999999 -0.029106799999999999 +4.7697200000000004 8.8860799999999998 0.91260200000000002 +9.3005999999999993 4.6345700000000001 2.1669100000000001 +4.4392100000000001 8.9514200000000006 1.59032 +3.9808300000000001 9.0410699999999995 2.3115399999999999 +-1.0921000000000001 9.9623500000000007 -2.06758 +10.007999999999999 -6.0113799999999999 4.3801800000000002 +10.0223 -5.88896 4.3449499999999999 +5.3135000000000003 8.6694300000000002 0.12890299999999999 +10.039199999999999 -5.7700800000000001 4.3000600000000002 +10.1037 -5.4425999999999997 4.1108099999999999 +5.1686300000000003 8.7057599999999997 0.70821999999999996 +4.9996499999999999 8.7438500000000001 1.1891700000000001 +4.7622499999999999 8.7822300000000002 1.7501599999999999 +10.08 -5.5461299999999998 4.1825900000000003 +4.3737599999999999 8.8409600000000008 2.4359500000000001 +5.5486000000000004 8.4531700000000001 1.0997300000000001 +5.27318 8.5235400000000006 1.71116 +5.7537399999999996 8.3749900000000004 0.47360099999999999 +5.3831300000000004 8.4029900000000008 1.9680899999999999 +-2.2524000000000002 10.4194 -2.1615600000000001 +4.73041 8.6495499999999996 2.49126 +6.0661199999999997 8.0845300000000009 1.2448600000000001 +5.8349200000000003 8.1714699999999993 1.6900200000000001 +6.2934799999999997 7.9531599999999996 0.78803000000000001 +6.3705100000000003 7.8109999999999999 1.5426200000000001 +6.11402 7.9470599999999996 1.82399 +5.8735200000000001 8.0356000000000005 2.1733699999999998 +5.3757999999999999 8.2805499999999999 2.44699 +6.7084000000000001 7.5625299999999998 1.2893699999999999 +-0.94663299999999995 10.1738 -1.8736900000000001 +-0.99354600000000004 10.107799999999999 -1.97017 +6.3669700000000002 7.5739999999999998 2.4695299999999998 +7.0244200000000001 7.2442799999999998 1.5649500000000001 +6.87791 7.3274100000000004 1.8527199999999999 +10.1861 -5.1741200000000003 3.8493599999999999 +10.2166 -5.1006900000000002 3.7488199999999998 +6.5129900000000003 7.5848300000000002 2.06379 +10.2811 -4.9810499999999998 3.5316999999999998 +7.1038399999999999 7.1944400000000002 1.23485 +6.8230399999999998 7.05098 2.8203999999999998 +6.1156199999999998 7.5974899999999996 2.87018 +7.1938199999999997 7.1048099999999996 0.92125199999999996 +7.5514400000000004 6.6922600000000001 1.8295600000000001 +-0.758413 10.1968 -1.6605399999999999 +7.3383500000000002 6.84964 2.0982799999999999 +7.0236299999999998 7.0855300000000003 2.2925900000000001 +6.8741000000000003 7.1222200000000004 2.5547300000000002 +7.5838000000000001 6.6855099999999998 1.4618899999999999 +7.8935500000000003 6.2352299999999996 2.38307 +7.4474999999999998 6.4930700000000003 2.8410500000000001 +10.383100000000001 -4.8752500000000003 3.17747 +10.5829 -4.94543 2.4458299999999999 +10.6129 -4.9931700000000001 2.3307000000000002 +10.551500000000001 -4.9076899999999997 2.5642299999999998 +10.2484 -5.0361900000000004 3.64269 +10.4519 -4.85656 2.9312299999999998 +10.485799999999999 -4.8631000000000002 2.8077700000000001 +7.2254500000000004 6.6088699999999996 3.0063599999999999 +12.4727 2.2297400000000001 4.5823 +10.5191 -4.8801800000000002 2.6851600000000002 +10.4176 -4.8606100000000003 3.0546700000000002 +10.7849 -5.6820700000000004 1.61632 +10.7715 -5.5713800000000004 1.6795899999999999 +10.755599999999999 -5.4664000000000001 1.7514099999999999 +10.810600000000001 -6.2935299999999996 1.44113 +10.7956 -5.7976999999999999 1.5620400000000001 +10.803599999999999 -5.9174899999999999 1.5170999999999999 +10.6934 -5.1926399999999999 2.0129600000000001 +-0.32208700000000001 10.097099999999999 -1.63358 +10.053699999999999 3.7911700000000002 2.6922999999999999 +10.478 3.40673 3.0813799999999998 +7.8457299999999996 6.3860000000000001 1.2466600000000001 +8.1092399999999998 6.0841500000000002 1.77241 +0.51086900000000002 9.7576699999999992 -1.59697 +10.7164 -5.2763799999999996 1.91866 +3.6029599999999999 9.3461599999999994 -0.57220899999999997 +10.641500000000001 -5.0505500000000003 2.2196799999999999 +8.0879799999999999 6.0901699999999996 2.0829200000000001 +7.5994299999999999 6.4556399999999998 2.60046 +5.3556600000000003 8.6205200000000008 0.0135388 +5.91378 8.2634699999999999 0.30954100000000001 +10.7639 3.0688200000000001 3.0805400000000001 +11.2879 2.6817500000000001 3.4731200000000002 +11.690200000000001 2.4308800000000002 3.7644700000000002 +10.667999999999999 -5.11599 2.1152799999999998 +12.162699999999999 2.1946500000000002 4.1045400000000001 +10.8088 -6.0406199999999997 1.4818199999999999 +10.7371 -5.3678499999999998 1.83128 +12.702299999999999 2.0127000000000002 4.4787499999999998 +13.1305 1.9513400000000001 4.8086099999999998 +4.25725 9.1593499999999999 -0.35877599999999998 +0.32631599999999999 9.9044500000000006 -1.56993 +1.75098 9.5819500000000009 -1.2212099999999999 +4.8519300000000003 8.9042999999999992 -0.167211 +6.4337499999999999 7.7772399999999999 0.37395 +7.17178 7.0544000000000002 0.71382100000000004 +9.3703699999999994 4.4473399999999996 1.99342 +10.2559 3.4742799999999998 2.5918999999999999 +5.82836 8.2452900000000007 0.106678 +7.7969499999999998 6.3521299999999998 1.0443 +10.828799999999999 2.8979400000000002 2.9550200000000002 +11.353199999999999 2.4992999999999999 3.3297400000000001 +11.7326 2.2586200000000001 3.6008 +9.9952500000000004 -6.14975 4.4076599999999999 +8.6543100000000006 5.3428300000000002 1.57277 +3.7926500000000001 9.2331500000000002 -0.61543000000000003 +4.5427999999999997 8.9636499999999995 -0.37742999999999999 +5.20261 8.6316100000000002 -0.155803 +12.2661 1.9970699999999999 3.9876200000000002 +12.7456 1.7561800000000001 4.2491700000000003 +13.2722 1.6560999999999999 4.6324899999999998 +9.2341800000000003 4.7410699999999997 2.7620100000000001 +3.6280299999999999 9.1877899999999997 -0.71850899999999995 +8.6996500000000001 5.2137099999999998 3.0643400000000001 +9.8375000000000004 3.7568800000000002 2.1642800000000002 +3.5649899999999999 9.1341599999999996 -0.76224899999999995 +1.55538 9.7389100000000006 -1.14147 +8.5942600000000002 5.2581800000000003 3.1997300000000002 +8.3372200000000003 5.6469399999999998 1.2912300000000001 +3.5099900000000002 9.3011700000000008 -0.68771300000000002 +10.532299999999999 3.0127899999999999 2.6137299999999999 +11.2042 2.42449 3.07423 +11.7974 2.05443 3.5049700000000001 +12.3261 1.7953699999999999 3.8826200000000002 +8.9290599999999998 5.0378999999999996 2.9071500000000001 +8.5769699999999993 5.1703099999999997 3.4131900000000002 +6.2693500000000002 7.7907799999999998 0.21618699999999999 +6.3041499999999999 7.5820499999999997 0.182001 +7.0429700000000004 7.0480200000000002 0.55671199999999998 +8.3857099999999996 5.4887199999999998 1.2548900000000001 +4.4823300000000001 8.8887 -0.47122700000000001 +5.4219799999999996 8.3958999999999993 -0.14072100000000001 +7.7908099999999996 6.2177600000000002 0.93257900000000005 +6.7612100000000002 7.1858899999999997 0.38184299999999999 +11.664099999999999 1.93787 3.3229799999999998 +12.3195 1.5843400000000001 3.7782200000000001 +13.063000000000001 1.37097 4.3122999999999996 +9.4830100000000002 4.4221000000000004 3.2015799999999999 +9.1588700000000003 4.6657000000000002 3.3919999999999999 +9.2983399999999996 4.6693100000000003 2.4586000000000001 +9.8425600000000006 4.0781200000000002 3.08447 +9.0908499999999997 4.5544200000000004 3.7532000000000001 +9.8926999999999996 4.0036699999999996 3.4022999999999999 +9.6362199999999998 4.1576500000000003 3.6646200000000002 +10.014900000000001 3.8831899999999999 2.90198 +10.2568 3.6553 3.5741200000000002 +4.9351000000000003 8.5050299999999996 -0.34232699999999999 +9.8169900000000005 3.8273000000000001 4.1230900000000004 +10.251799999999999 3.6719300000000001 3.2486199999999998 +10.6335 3.3291300000000001 3.5932499999999998 +10.131600000000001 3.6932499999999999 3.9122499999999998 +8.1213599999999992 5.6332399999999998 1.0462800000000001 +10.776199999999999 3.1611400000000001 3.3398400000000001 +10.653600000000001 3.30918 3.9525000000000001 +10.4796 3.3822999999999999 4.1574799999999996 +10.300599999999999 3.4265099999999999 4.3501899999999996 +10.981199999999999 3.0687000000000002 3.9240599999999999 +10.9132 3.1083099999999999 4.1552800000000003 +11.394 2.79495 4.2135100000000003 +10.762 2.58697 2.6882899999999998 +11.4445 2.70886 3.9071199999999999 +11.334199999999999 2.8360599999999998 4.4786299999999999 +11.111499999999999 2.9084099999999999 4.7378799999999996 +11.995900000000001 2.3909099999999999 4.2217399999999996 +11.8292 2.5977100000000002 4.6448600000000004 +10.0565 -5.6660000000000004 4.2512999999999996 +11.5465 2.7074799999999999 4.9411199999999997 +12.0009 2.4496600000000002 4.3949699999999998 +12.2303 2.4626100000000002 5.0407500000000001 +12.3392 2.3751500000000001 4.7945399999999996 +12.930899999999999 2.2240000000000002 5.1121400000000001 +12.8155 2.3334800000000002 5.3333599999999999 +12.4625 2.43059 5.4310299999999998 +13.0067 2.1186500000000001 4.9647199999999998 +13.2583 0.70591800000000005 4.3764000000000003 +13.1653 2.3412299999999999 5.7077499999999999 +10.622199999999999 0.68461899999999998 2.7678799999999999 +2.9718599999999999 9.3841999999999999 2.10486 +9.2701499999999992 4.2647599999999999 1.7229000000000001 +10.1608 -5.2441800000000001 3.9311699999999998 +8.7624600000000008 4.8584300000000002 1.41381 +7.4437300000000004 6.4721700000000002 0.70708000000000004 +-0.55599699999999996 1.10761 -1.8086899999999999 +0.31501099999999999 1.3714 -1.5654399999999999 +1.3434900000000001 0.80437000000000003 -1.2066300000000001 +4.0479900000000004 8.9249700000000001 -0.62879399999999996 +13.396599999999999 0.87582899999999997 4.4657200000000001 +12.236700000000001 1.2070799999999999 3.6700499999999998 +3.5666699999999998 9.1578700000000008 2.3500000000000001 +2.9832900000000002 9.2677800000000001 2.2884899999999999 +3.2562099999999998 9.0344200000000008 2.4563899999999999 +10.3147 -4.9356400000000002 3.4166099999999999 +3.8909699999999998 8.9135600000000004 2.5571899999999999 +4.3446199999999999 8.8008400000000009 2.56514 +4.1607500000000002 8.6350300000000004 2.7203599999999999 +10.348800000000001 -4.9002800000000004 3.2981699999999998 +4.7177600000000002 8.3983000000000008 2.84761 +12.7676 1.2035499999999999 4.0529400000000004 +12.065 1.07833 3.5539299999999998 +11.1342 1.3593599999999999 2.9081000000000001 +11.8576 1.49159 3.40828 +11.558999999999999 0.78865200000000002 3.2799700000000001 +10.7141 2.1508600000000002 2.5935600000000001 +5.1646999999999998 8.3260100000000001 2.7045599999999999 +4.9988400000000004 8.32118 2.8274300000000001 +10.591100000000001 1.51379 2.5331700000000001 +11.072699999999999 1.7258599999999999 2.8442500000000002 +11.3894 1.8339000000000001 3.0854900000000001 +10.523899999999999 1.1592 2.56325 +9.8410600000000006 1.3666799999999999 2.1048800000000001 +9.9146300000000007 1.71132 2.07395 +10.342000000000001 1.93702 2.3245499999999999 +10.359 2.5857199999999998 2.35595 +10.0617 3.3329900000000001 2.2290800000000002 +10.792199999999999 -6.6753900000000002 1.45617 +9.7309300000000007 1.0508200000000001 2.1397599999999999 +10.0375 2.39093 2.0996700000000001 +8.8634699999999995 1.3128299999999999 1.5783400000000001 +10.7493 -7.0429000000000004 1.5618000000000001 +8.9959900000000008 1.59633 1.56341 +9.2330799999999993 1.8975299999999999 1.63148 +9.6800800000000002 2.1306699999999998 1.8697600000000001 +9.5729199999999999 3.46652 1.8331900000000001 +9.0102200000000003 0.93432000000000004 1.7976000000000001 +9.0148799999999998 2.3440500000000002 1.43452 +9.45777 2.5295100000000001 1.69736 +9.5584600000000002 2.9540199999999999 1.76742 +8.5206800000000005 2.12818 1.19015 +8.9131900000000002 3.6112500000000001 1.34528 +5.53139 7.9741400000000002 2.9071899999999999 +8.1856299999999997 1.0085599999999999 1.3500300000000001 +10.602399999999999 -7.6388100000000003 2.0124300000000002 +7.8808400000000001 1.25583 1.1093500000000001 +7.9980599999999997 1.5627200000000001 1.0644 +8.1039300000000001 1.8722799999999999 1.0312399999999999 +8.4849700000000006 2.4818799999999999 1.11608 +8.8415999999999997 2.9932400000000001 1.28051 +8.7293900000000004 4.39473 1.30335 +7.8100899999999998 2.38062 0.78160300000000005 +8.3494899999999994 2.9608099999999999 0.99044500000000002 +8.2339199999999995 3.71902 0.90821600000000002 +7.1993400000000003 1.4672700000000001 0.72665100000000005 +7.2951300000000003 1.94889 0.63206200000000001 +7.8707099999999999 2.7998099999999999 0.75156699999999999 +10.5718 -7.7122799999999998 2.1130300000000002 +7.9456699999999998 3.42448 0.74812699999999999 +8.3022200000000002 4.2940500000000004 0.98427799999999999 +8.0371500000000005 5.4007800000000001 0.94465600000000005 +10.4428 -7.9099199999999996 2.55267 +5.0767300000000004 7.9443299999999999 3.04765 +10.367100000000001 -7.9534000000000002 2.82077 +5.6777100000000003 7.9713900000000004 2.7516500000000002 +6.9566499999999998 1.15456 0.72528199999999998 +10.708399999999999 -7.2668400000000002 1.67926 +7.2103400000000004 2.5034399999999999 0.48928199999999999 +7.3028500000000003 2.8232900000000001 0.484213 +7.4383999999999997 3.2772700000000001 0.50046900000000005 +7.5795199999999996 3.8228399999999998 0.55007200000000001 +10.4053 -7.9377599999999999 2.68458 +7.7609300000000001 4.4043200000000002 0.66075600000000001 +7.8220299999999998 5.0201399999999996 0.75116499999999997 +6.4888399999999997 1.5285 0.40888000000000002 +6.5785499999999999 1.9765200000000001 0.33178999999999997 +6.7804099999999998 2.4650599999999998 0.31386199999999997 +10.205 -7.8667499999999997 3.4181900000000001 +6.9345299999999996 3.0691299999999999 0.29660199999999998 +7.0886899999999997 3.6673499999999999 0.321432 +7.2214700000000001 4.3222800000000001 0.37443399999999999 +7.3475099999999998 4.9217899999999997 0.467779 +7.4485700000000001 5.3672399999999998 0.56256300000000004 +7.5625900000000001 5.8858499999999996 0.69649000000000005 +6.0606900000000001 1.0642100000000001 0.38405699999999998 +6.2375299999999996 2.28328 0.13586500000000001 +6.3842699999999999 2.9194399999999998 0.096152100000000004 +6.5619300000000003 3.5006699999999999 0.112072 +6.7090199999999998 4.0734199999999996 0.14941399999999999 +6.8876200000000001 4.67997 0.23005999999999999 +6.9669400000000001 5.2638299999999996 0.297848 +7.0769700000000002 5.7580400000000003 0.39509699999999998 +7.2013600000000002 6.3774100000000002 0.53959000000000001 +5.8252600000000001 1.7248600000000001 0.102214 +5.3812899999999999 2.0316200000000002 -0.120585 +5.52841 2.5511699999999999 -0.15631400000000001 +5.9594300000000002 3.03369 -0.067861599999999994 +10.117100000000001 -7.6876199999999999 3.7601800000000001 +10.0967 -7.6257099999999998 3.84232 +10.072100000000001 -7.5365900000000003 3.94319 +6.2172400000000003 3.7615599999999998 -0.032054300000000001 +10.0017 -7.1131000000000002 4.2545700000000002 +9.9916400000000003 -7.0000400000000003 4.3061600000000002 +6.3550700000000004 4.5747499999999999 0.0070416599999999999 +6.4815800000000001 5.1800800000000002 0.075578699999999999 +6.5828300000000004 5.5863300000000002 0.14113100000000001 +6.7575799999999999 6.1243699999999999 0.26398300000000002 +5.5919499999999998 1.2809999999999999 0.13167300000000001 +4.9088900000000004 1.42144 -0.15090799999999999 +5.1894099999999996 3.1145299999999998 -0.32366499999999998 +9.9810499999999998 -6.3958700000000004 4.4258499999999996 +5.5556999999999999 3.50847 -0.23841100000000001 +10.032500000000001 -7.3441700000000001 4.1122300000000003 +5.7655399999999997 4.1794900000000004 -0.19900399999999999 +5.9428599999999996 4.9815399999999999 -0.13602700000000001 +6.0501399999999999 5.5421399999999998 -0.0776197 +6.1509999999999998 5.9317700000000002 -0.018420499999999999 +6.2610700000000001 6.4013400000000003 0.059030100000000002 +6.3569899999999997 6.8238000000000003 0.13850799999999999 +5.7987299999999999 7.4675799999999999 3.2421199999999999 +4.8932599999999997 3.7550500000000002 -0.44919599999999998 +4.9531000000000001 4.2637400000000003 -0.44543899999999997 +5.3385199999999999 4.8365999999999998 -0.33414899999999997 +5.5437599999999998 5.63863 -0.25219799999999998 +10.7812 -6.79453 1.47994 +5.7233200000000002 6.3348399999999998 -0.157275 +5.8786100000000001 6.9478200000000001 -0.059395700000000003 +5.9844299999999997 7.3595499999999996 0.015554800000000001 +3.6511900000000002 0.94539399999999996 -0.47139599999999998 +4.1913600000000004 2.0087899999999999 -0.49604799999999999 +3.2542200000000001 9.1270799999999994 -0.858371 +4.8752300000000002 5.0048399999999997 -0.46566000000000002 +4.8889800000000001 5.5723599999999998 -0.450569 +5.1769800000000004 6.0904299999999996 -0.34997899999999998 +5.35684 6.8676899999999996 -0.25948199999999999 +5.4998399999999998 7.4848999999999997 -0.17369799999999999 +5.7393900000000002 8.0367200000000008 -0.047413299999999999 +3.9385400000000002 1.4649099999999999 -0.48357 +3.4415499999999999 1.63378 -0.66599200000000003 +4.6152199999999999 2.5971500000000001 -0.44381799999999999 +4.2472599999999998 3.0546500000000001 -0.58873399999999998 +4.7854200000000002 6.7147300000000003 -0.44398500000000002 +-0.283974 10.102399999999999 -1.2483200000000001 +4.9765699999999997 7.3728999999999996 -0.36210599999999998 +5.1079699999999999 7.9524699999999999 -0.29452699999999998 +-1.49034 10.317500000000001 -1.82291 +3.1571099999999999 1.0886 -0.66493500000000005 +3.8832200000000001 3.41432 -0.70316599999999996 +3.9500199999999999 3.8784399999999999 -0.70172000000000001 +2.0776599999999998 9.6703299999999999 -0.83005200000000001 +4.2839200000000002 5.2698799999999997 -0.61866200000000005 +4.09924 6.5077199999999999 -0.64034899999999995 +4.3558000000000003 7.1673 -0.55567 +4.55288 7.7784800000000001 -0.48363600000000001 +5.7494699999999996 7.6386700000000003 3.1362399999999999 +6.0538699999999999 7.5183900000000001 3.07477 +6.4457399999999998 6.8464099999999997 3.45736 +3.1375600000000001 2.2503500000000001 -0.82659300000000002 +3.9865599999999999 4.5958199999999998 -0.70043699999999998 +2.6555399999999998 5.8537800000000004 -1.0137499999999999 +3.1522199999999998 6.3528000000000002 -0.88402800000000004 +3.7069200000000002 7.8184300000000002 -0.72530499999999998 +4.2882400000000001 8.4489099999999997 -0.55376999999999998 +1.8539300000000001 1.08291 -1.07846 +2.03132 1.3350900000000001 -1.0534699999999999 +2.0791300000000001 1.5704499999999999 -1.0636399999999999 +2.3116400000000001 1.84097 -1.0213699999999999 +2.68798 2.5562800000000001 -0.97170900000000004 +1.0367200000000001 9.8690300000000004 -1.1577999999999999 +2.3557999999999999 3.3293699999999999 -1.0875600000000001 +2.4609999999999999 3.9688099999999999 -1.0702100000000001 +2.4861800000000001 4.7144700000000004 -1.06436 +3.4984999999999999 6.9649900000000002 -0.78851199999999999 +3.5434800000000002 8.4142600000000005 -0.77171699999999999 +6.9192200000000001 6.5867300000000002 3.419 +1.64272 1.9804600000000001 -1.2202500000000001 +2.02908 2.8199399999999999 -1.1553100000000001 +1.44861 3.1644999999999999 -1.3159700000000001 +10.4712 -7.8804499999999997 2.4541300000000001 +1.6752199999999999 4.03369 -1.26586 +1.73424 6.6297899999999998 -1.2535700000000001 +6.7094699999999996 6.9720300000000002 3.1495799999999998 +6.5675699999999999 6.8349000000000002 3.41818 +8.0305099999999996 4.95974 4.17394 +7.3503100000000003 6.3429099999999998 3.2732299999999999 +8.2246500000000005 5.2434099999999999 3.7708200000000001 +8.0528499999999994 5.1184200000000004 4.04779 +7.0782299999999996 5.8540900000000002 3.8503599999999998 +-2.1043099999999999 10.4123 -2.0288400000000002 +1.25101 2.23922 -1.3411500000000001 +2.1685500000000002 6.47898 -1.13615 +8.9940200000000008 -7.9088200000000004 2.6455099999999998 +1.6561900000000001 5.1074000000000002 -1.2718400000000001 +2.7281399999999998 7.3359300000000003 -0.98973 +10.336499999999999 -7.9564199999999996 2.9306299999999998 +7.8923300000000003 4.9424700000000001 4.2072399999999996 +8.0956799999999998 5.2053799999999999 3.9340700000000002 +0.85998200000000002 1.6780999999999999 -1.42445 +-2.6418699999999999 10.480700000000001 -2.1378499999999998 +0.69055100000000003 2.66839 -1.50684 +0.80368899999999999 3.5004599999999999 -1.4886999999999999 +1.1131599999999999 4.7855999999999996 -1.4129799999999999 +8.4103600000000007 5.2008999999999999 3.6057899999999998 +0.16727700000000001 3.0928800000000001 -1.6541399999999999 +0.49474400000000002 4.8777400000000002 -1.5787500000000001 +10.3027 -7.9498899999999999 3.0539100000000001 +8.6172000000000004 4.1503800000000002 4.5561100000000003 +-0.061896600000000003 1.98861 -1.69693 +-0.71730400000000005 2.40571 -1.88656 +-1.6111800000000001 10.3161 -1.21502 +8.7999700000000001 4.6067499999999999 4.0306600000000001 +8.6652299999999993 4.5179999999999998 4.2487899999999996 +9.2283600000000003 4.1700799999999996 4.2264200000000001 +-0.72505399999999998 1.6980599999999999 -1.8766099999999999 +9.0724099999999996 4.0978700000000003 4.4415300000000002 +8.7383600000000001 4.2324599999999997 4.47201 +8.5578000000000003 3.9781399999999998 4.6310700000000002 +9.4330200000000008 4.20031 3.9235000000000002 +-0.69845299999999999 3.1865600000000001 -1.89056 +9.2509599999999992 3.4959699999999998 4.90245 +9.6441099999999995 3.7802799999999999 4.4154299999999997 +9.5048200000000005 3.6800700000000002 4.6559900000000001 +9.3927099999999992 3.5976400000000002 4.7952300000000001 +-0.79466400000000004 10.1258 0.451075 +9.1590199999999999 3.3881100000000002 4.95296 +10.2234 3.35792 4.5937299999999999 +10.142899999999999 3.2871299999999999 4.7880000000000003 +-1.60971 10.2532 0.73018099999999997 +10.042899999999999 3.2169599999999998 4.9530399999999997 +9.9291300000000007 3.1217100000000002 5.1043099999999999 +9.8040900000000004 2.9990700000000001 5.2257100000000003 +10.7723 3.1421000000000001 4.4664700000000002 +10.704499999999999 3.0280499999999999 4.8611000000000004 +10.527799999999999 2.94354 5.1500599999999999 +10.3796 2.79623 5.3773 +10.0939 2.524 5.5712400000000004 +11.0252 2.84423 5.0444300000000002 +10.8573 2.7544200000000001 5.3374899999999998 +0.432923 9.9054699999999993 0.64814400000000005 +10.6922 2.6065499999999999 5.5700399999999997 +-1.9823900000000001 10.33 0.121041 +10.409800000000001 2.5701700000000001 5.5906099999999999 +11.344799999999999 2.6913499999999999 5.2366299999999999 +11.173299999999999 2.6000700000000001 5.5369700000000002 +10.9971 2.4449999999999998 5.7722499999999997 +10.879200000000001 2.3235600000000001 5.8906599999999996 +11.6751 2.56576 5.4454500000000001 +11.4948 2.4775700000000001 5.7418699999999996 +11.3171 2.3191000000000002 5.9780199999999999 +11.9161 2.5577200000000002 5.2445199999999996 +11.823 2.3820100000000002 5.96549 +-2.7600500000000001 10.4331 0.464223 +11.6374 2.2275 6.1889900000000004 +11.410299999999999 2.1250499999999999 6.2370400000000004 +11.2796 1.94303 6.3528099999999998 +1.4359900000000001 9.6904599999999999 1.58883 +12.0389 2.4847000000000001 5.6182100000000004 +-3.5379399999999999 1.0227999999999999 0.66691900000000004 +11.922499999999999 1.98888 6.6408199999999997 +12.501799999999999 2.4254699999999998 5.7821499999999997 +2.8351700000000002 9.0343400000000003 2.3486199999999999 +4.7148099999999999 8.0334500000000002 2.9424999999999999 +1.85822 9.6581299999999999 0.47842299999999999 +5.2717099999999997 7.6372 3.1368399999999999 +5.9774599999999998 7.0450100000000004 3.39778 +7.7011700000000003 4.9658699999999998 4.1798099999999998 +9.1951699999999992 3.1743899999999998 5.0431299999999997 +12.8064 2.3802599999999998 6.2133700000000003 +12.3141 2.3653200000000001 6.0881299999999996 +12.1915 2.2750400000000002 6.3027699999999998 +12.0664 2.1778400000000002 6.43947 +10.785399999999999 2.1369099999999999 6.0183900000000001 +10.4908 2.2676799999999999 5.8350499999999998 +9.6746599999999994 2.8181699999999998 5.3165300000000002 +8.8181499999999993 2.9565700000000001 4.98367 +8.7080599999999997 3.6085600000000002 4.7726300000000004 +8.13551 4.1314099999999998 4.4755500000000001 +7.6759599999999999 4.7006300000000003 4.2242899999999999 +7.0648299999999997 5.27196 3.94293 +5.8945600000000002 6.3224099999999996 3.4418000000000002 +9.98386 -6.8766600000000002 4.35093 +6.7993399999999999 6.0006399999999998 3.76126 +5.4211200000000002 6.9343700000000004 3.23448 +4.4394999999999998 7.29047 2.89723 +4.19841 8.4322099999999995 2.76552 +3.75407 8.6695700000000002 2.6243099999999999 +11.1311 1.75075 6.4165900000000002 +10.612500000000001 1.8478000000000001 6.11198 +6.6640899999999998 5.7963199999999997 3.7466599999999999 +-7.8291599999999999 1.81915 -0.52669999999999995 +-3.3424200000000002 1.3413299999999999 0.71779499999999996 +4.5736400000000001 6.5735999999999999 2.99031 +3.7629299999999999 7.2159599999999999 2.6868400000000001 +3.2565 8.88706 2.4721799999999998 +2.3993799999999998 9.13476 2.22539 +10.2637 1.9855400000000001 5.8875900000000003 +9.71129 2.2654700000000001 5.5412100000000004 +9.3142200000000006 2.5121500000000001 5.3023300000000004 +8.1811100000000003 3.2803300000000002 4.6821200000000003 +7.6244500000000004 3.8624299999999998 4.3659699999999999 +6.7913600000000001 4.5649800000000003 3.9613200000000002 +6.1982799999999996 5.18208 3.67537 +5.51586 5.6681299999999997 3.3892199999999999 +3.4327100000000002 7.6996200000000004 2.5611199999999998 +11.800700000000001 1.7602199999999999 6.7917500000000004 +5.0019299999999998 6.0160799999999997 3.1827800000000002 +-0.199465 5.6185299999999998 1.54287 +2.0743800000000001 6.7243199999999996 2.18303 +8.7178400000000007 2.6973500000000001 5.02257 +0.70852300000000001 6.83162 1.78149 +3.8666800000000001 6.3081699999999996 2.77847 +3.01092 6.1332199999999997 2.50908 +2.9347799999999999 6.9199099999999998 2.4414199999999999 +7.4525100000000002 3.5546700000000002 4.3680700000000003 +6.7745199999999999 4.1005799999999999 4.0316599999999996 +6.1093299999999999 4.5309200000000001 3.7344300000000001 +5.5869900000000001 5.1142099999999999 3.4769399999999999 +9.33385 2.23197 5.39872 +13.7936 0.93974800000000003 4.7525199999999996 +13.789099999999999 1.06721 4.76546 +7.9203799999999998 2.9338500000000001 4.6639400000000002 +4.7940800000000001 4.9291099999999997 3.2209699999999999 +4.2621200000000004 5.4852600000000002 2.9795099999999999 +13.778499999999999 1.1931400000000001 4.7869099999999998 +-2.8361800000000001 10.481999999999999 -1.13805 +13.711 1.5533300000000001 4.9005999999999998 +13.762600000000001 1.3124899999999999 4.8155599999999996 +13.7393 1.4370400000000001 4.8547099999999999 +13.677 1.6647799999999999 4.9540699999999998 +13.6378 1.7706299999999999 5.0147700000000004 +13.593400000000001 1.87016 5.0822700000000003 +13.490600000000001 2.0475699999999999 5.23583 +13.5442 1.96268 5.1561300000000001 +13.371499999999999 2.19217 5.4105400000000001 +13.306800000000001 2.2509000000000001 5.5043600000000001 +-2.9469099999999999 1.8705400000000001 0.82161899999999999 +13.2393 2.30002 5.6016500000000002 +11.6389 1.47895 6.8777799999999996 +-2.11449 3.0462600000000002 1.03973 +-9.7377400000000005 1.9428300000000001 -1.05524 +12.9613 2.3941499999999998 5.9966900000000001 +12.876099999999999 2.3922300000000001 6.1162299999999998 +-9.7372599999999991 1.9434899999999999 -1.05511 +12.7281 2.3555100000000002 6.3220400000000003 +12.515700000000001 2.2237800000000001 6.6131799999999998 +12.6555 2.32159 6.42211 +12.5845 2.2775799999999999 6.51938 +12.449400000000001 2.1605699999999999 6.7028699999999999 +12.386200000000001 2.0883600000000002 6.7878400000000001 +12.3264 2.0076700000000001 6.8675100000000002 +12.2188 1.8230500000000001 7.0087900000000003 +12.2705 1.91903 6.9413200000000002 +11.017300000000001 1.55061 6.4607599999999996 +12.132099999999999 1.6186100000000001 7.1198199999999998 +12.092700000000001 1.49787 7.1687200000000004 +12.061299999999999 1.3795299999999999 7.2066600000000003 +12.035500000000001 1.25753 7.2364300000000004 +12.013500000000001 1.11755 7.2598799999999999 +9.8002900000000004 1.96082 5.6893599999999998 +8.5498999999999992 2.43668 5.0181899999999997 +6.5052099999999999 3.6059000000000001 4.0070899999999998 +5.26959 4.4594100000000001 3.4424800000000002 +3.34429 5.4611099999999997 2.6650999999999998 +10.332700000000001 1.73905 6.0175099999999997 +13.4329 2.1242399999999999 5.3208200000000003 +1.8279300000000001 5.7362200000000003 2.1467399999999999 +1.90333 7.1832099999999999 2.1171099999999998 +1.3785700000000001 7.1882299999999999 1.9645300000000001 +9.1248100000000001 1.9882299999999999 5.3694699999999997 +3.84382 4.7193300000000002 2.89879 +1.9188000000000001 5.1650799999999997 2.2050800000000002 +5.7595999999999998 4.0575400000000004 3.6682199999999998 +9.6567299999999996 1.7467299999999999 5.6810299999999998 +7.7188499999999998 2.6089500000000001 4.6359700000000004 +7.1316699999999997 3.0665499999999999 4.3299500000000002 +13.050700000000001 2.3820199999999998 5.8706300000000002 +2.3700700000000001 5.0866300000000004 2.3591899999999999 +10.2232 1.55324 6.0196300000000003 +13.0977 2.3681800000000002 5.8039699999999996 +8.3676100000000009 2.2223999999999999 4.9778900000000004 +6.2158100000000003 3.2729900000000001 3.93485 +5.5304700000000002 3.6511 3.6256300000000001 +12.171799999999999 1.7203900000000001 7.0694499999999998 +4.9628399999999999 3.7776100000000001 3.3962599999999998 +2.8584700000000001 4.7050700000000001 2.5506000000000002 +0.65851199999999999 4.7622099999999996 1.8174699999999999 +-0.744672 4.3911899999999999 1.40581 +7.3680700000000003 2.42021 4.5066800000000002 +12.001300000000001 1.0022 7.2709700000000002 +6.1823199999999998 2.8633700000000002 3.9611700000000001 +4.3312499999999998 4.0549900000000001 3.13368 +1.651 4.0122299999999997 2.1764399999999999 +0.58416699999999999 3.9224800000000002 1.82714 +10.8728 1.31656 6.4531700000000001 +9.0143799999999992 1.6716800000000001 5.3635999999999999 +8.1866099999999999 1.9225300000000001 4.93025 +5.2643700000000004 3.2416700000000001 3.5598200000000002 +2.3888799999999999 3.9688400000000001 2.43268 +11.993600000000001 0.87265400000000004 7.2750300000000001 +-1.28077 4.7455699999999998 1.2529300000000001 +4.27698 3.3856999999999999 3.16242 +12.002800000000001 0.54027099999999995 7.24472 +11.998200000000001 0.59184099999999995 7.2539199999999999 +3.30966 3.8620199999999998 2.7705099999999998 +11.992100000000001 0.74332600000000004 7.2702999999999998 +-4.7099299999999999 10.379099999999999 0.24871399999999999 +9.4933800000000002 1.37839 5.6519199999999996 +7.4027399999999997 2.0592199999999998 4.5527600000000001 +12.0169 0.41822900000000002 7.2184600000000003 +12.0357 0.30497600000000002 7.1861499999999996 +6.38835 2.3587699999999998 4.0831299999999997 +12.075200000000001 0.12900600000000001 7.1215799999999998 +12.0806 0.115255 7.1132099999999996 +1.0875999999999999 3.8544299999999998 1.9937199999999999 +0.60889300000000002 5.3940999999999999 1.78102 +10.047499999999999 1.29098 5.9695299999999998 +12.1472 -0.079035800000000003 7.0096100000000003 +12.184799999999999 -0.16470599999999999 6.95235 +4.0731099999999998 3.00143 3.1070199999999999 +5.2577699999999998 2.7204899999999999 3.5910899999999999 +12.271699999999999 -0.32253900000000002 6.8221299999999996 +2.9372799999999999 3.2038700000000002 2.6718600000000001 +12.430300000000001 -0.51819000000000004 6.5892999999999997 +10.663399999999999 1.19974 6.3507899999999999 +12.321 -0.39394699999999999 6.7491500000000002 +12.375299999999999 -0.46085100000000001 6.6695099999999998 +7.2534599999999996 1.8221000000000001 4.4935400000000003 +6.2411300000000001 2.0335399999999999 4.0318899999999998 +-0.30573299999999998 3.3548800000000001 1.56436 +12.488200000000001 -0.56862599999999996 6.5054499999999997 +12.5548 -0.61571900000000002 6.4093900000000001 +3.1584300000000001 2.7340399999999998 2.77386 +2.16533 3.1232500000000001 2.3976799999999998 +12.6097 -0.64627400000000002 6.33087 +0.53793599999999997 3.01309 1.84545 +5.2105300000000003 2.30518 3.5904199999999999 +4.2268400000000002 2.5176400000000001 3.1885699999999999 +11.5901 1.1966000000000001 6.9480199999999996 +12.8024 -0.70282599999999995 6.0574399999999997 +8.8521199999999993 1.3828800000000001 5.2997899999999998 +8.0900700000000008 1.47743 4.9055600000000004 +7.5087799999999998 1.47007 4.6187300000000002 +4.40266 2.1170300000000002 3.2664399999999998 +3.3355000000000001 2.3083999999999998 2.8527100000000001 +2.2980800000000001 2.4891700000000001 2.46644 +1.3308899999999999 2.8823699999999999 2.1162700000000001 +-0.46897299999999997 3.8068599999999999 1.50109 +11.2323 1.024 6.7350500000000002 +13.1286 -0.63278199999999996 5.6033799999999996 +6.70817 1.56548 4.2454900000000002 +5.9530599999999998 1.6943600000000001 3.9116900000000001 +5.3699399999999997 1.7550699999999999 3.6648999999999998 +13.3691 -0.43501000000000001 5.2762200000000004 +0.028894300000000001 2.6129199999999999 1.6917500000000001 +13.478400000000001 -0.289358 5.1304699999999999 +-0.71916800000000003 2.4837500000000001 1.4595499999999999 +0.17660200000000001 9.6171299999999995 1.6030199999999999 +2.4988000000000001 9.1403700000000008 2.2525900000000001 +13.523899999999999 -0.21417600000000001 5.0704399999999996 +4.8774699999999998 1.6703600000000001 3.45913 +13.5495 -0.167462 5.0370100000000004 +13.5975 -0.069369500000000001 4.9748299999999999 +3.9036 1.80257 3.0737000000000001 +0.093862799999999996 2.1749999999999998 1.7229099999999999 +13.649900000000001 0.060734299999999998 4.9081099999999998 +13.682399999999999 0.15690599999999999 4.8675100000000002 +8.5781899999999993 0.84454300000000004 5.1498799999999996 +7.9820000000000002 0.84780900000000003 4.8406399999999996 +13.730600000000001 0.33688800000000002 4.80931 +7.4766500000000002 0.815778 4.58826 +13.7578 0.47543600000000003 4.77834 +13.773899999999999 0.58632499999999999 4.7615999999999996 +6.9085299999999998 0.83228199999999997 4.3169199999999996 +2.9394200000000001 1.8788199999999999 2.7112500000000002 +13.7919 0.811643 4.7481799999999996 +13.7818 0.65542100000000003 4.7541000000000002 +2.2381500000000001 1.95441 2.4560599999999999 +2.6716500000000001 9.2407699999999995 2.26634 +0.72820399999999996 9.6815300000000004 1.6812400000000001 +2.8596300000000001 9.3562100000000008 2.1846399999999999 +-10.8949 2.0189300000000001 -1.37571 +0.47289799999999999 9.8405000000000005 1.46312 +-0.38892500000000002 10.0312 1.1263700000000001 +-1.3153699999999999 9.9683499999999992 1.1634100000000001 +-2.6704400000000001 10.257400000000001 0.76112100000000005 +-4.5832499999999996 10.519500000000001 0.19581899999999999 +-1.3484799999999999 10.126099999999999 1.0443499999999999 +-4.6587199999999998 10.4377 0.23258999999999999 +-3.0710299999999999 10.2026 0.69450100000000003 +-3.2386200000000001 10.442 0.493284 +-1.92916 10.285600000000001 0.78048899999999999 +1.15283 2.1376300000000001 2.0749599999999999 +-16.570399999999999 -5.65245 -2.8662999999999998 +-16.709099999999999 -5.8712400000000002 -2.9902700000000002 +-16.7257 -5.9077599999999997 -3.0338699999999998 +-16.7409 -5.97323 -3.1636899999999999 +-16.733799999999999 -5.9876699999999996 -3.2288800000000002 +-4.4634299999999998 10.619300000000001 0.053466399999999997 +-4.4422100000000002 10.629099999999999 0.0061295200000000003 +-3.33595 10.507099999999999 0.31440699999999999 +-16.532 -6.0027999999999997 -3.21393 +-16.724900000000002 -5.9902199999999999 -3.2673700000000001 +-16.621500000000001 -5.7245699999999999 -2.8881899999999998 +-16.658200000000001 -5.7812099999999997 -2.9173800000000001 +9.3499199999999991 0.88653099999999996 5.5780799999999999 +-16.679400000000001 -5.8162000000000003 -2.9407800000000002 +-15.1919 -5.9663500000000003 -2.5638800000000002 +-4.5126099999999996 10.5846 0.12934499999999999 +-14.550599999999999 -6.0807399999999996 -2.46773 +-16.736699999999999 -5.9390700000000001 -3.0827 +6.24376 0.85640799999999995 4.0164200000000001 +-4.5462100000000003 10.555300000000001 0.165604 +-15.760199999999999 -6.0530900000000001 -3.0002 +5.50169 0.79545699999999997 3.6934 +-15.953099999999999 -6.0405199999999999 -3.0536300000000001 +-16.338999999999999 -6.0153699999999999 -3.1604999999999999 +-16.724699999999999 -5.9902300000000004 -3.2679999999999998 +-15.992100000000001 -6.0379699999999996 -3.0651099999999998 +-16.558800000000002 -5.9971300000000003 -3.8708900000000002 +-16.309200000000001 -6.0064599999999997 -4.7749699999999997 +-4.6226599999999998 10.478199999999999 0.21885099999999999 +-16.183199999999999 -6.0106999999999999 -5.2300599999999999 +-16.058700000000002 -6.0145499999999998 -5.6788499999999997 +-16.142299999999999 -6.0119899999999999 -5.37758 +-15.479799999999999 -6.05227 -5.5185500000000003 +-16.058499999999999 -6.0145600000000004 -5.67943 +-15.865600000000001 -6.0271299999999997 -5.6260000000000003 +-15.9734 -5.9668099999999997 -5.8451899999999997 +-15.9331 -5.9310999999999998 -5.8871900000000004 +-15.902100000000001 -5.9007500000000004 -5.9113100000000003 +-15.864599999999999 -5.8613999999999997 -5.9331899999999997 +-15.771100000000001 -5.7521599999999999 -5.9567399999999999 +-15.0938 -6.07742 -5.4122599999999998 +-4.7121399999999998 10.3735 0.240901 +-4.74979 10.325200000000001 0.23824500000000001 +-16.042899999999999 -6.0115699999999999 -5.7259500000000001 +-4.7623300000000004 10.308199999999999 0.23495099999999999 +-15.2867 -6.0648499999999999 -5.4657 +-15.672599999999999 -6.0396999999999998 -5.5725600000000002 +-16.574300000000001 -5.6577700000000002 -2.86734 +-15.6973 -4.47234 -2.637 +-13.5146 -1.52206 -2.0637400000000001 +-13.9512 -2.1121099999999999 -2.1783999999999999 +-14.824199999999999 -3.29223 -2.4077000000000002 +-15.2608 -3.8822800000000002 -2.5223499999999999 +-14.387700000000001 -2.7021700000000002 -2.29305 +-11.332000000000001 1.42822 -1.4904900000000001 +-11.7685 0.83816400000000002 -1.60514 +-12.205 0.248108 -1.7197899999999999 +-13.078099999999999 -0.93200300000000003 -1.94909 +-12.6416 -0.341947 -1.8344400000000001 +-10.8954 2.0182799999999999 -1.37584 +-10.5945 1.9986699999999999 -1.29251 +-16.0213 -6.0010700000000003 -5.7726600000000001 +2.4081399999999999 1.06473 2.5102799999999998 +-13.778700000000001 -6.12385 -5.2270300000000001 +0.98697800000000002 1.8189299999999999 2.0218500000000001 +-1.3001400000000001 2.3725700000000001 1.2865599999999999 +-13.5838 -5.9924900000000001 -5.3194900000000001 +-15.820600000000001 -5.8118299999999996 -5.9494600000000002 +-15.718400000000001 -5.6837400000000002 -5.9506399999999999 +-12.8147 -1.9382999999999999 -1.8661399999999999 +-11.935 -0.56974800000000003 -4.9569599999999996 +-13.826599999999999 -3.1266600000000002 -5.4537899999999997 +-10.647399999999999 2.35345 -1.31071 +-10.449 2.6216499999999998 -1.2585999999999999 +-12.9694 -1.96804 -5.2286599999999996 +-10.1798 1.80264 -4.4960000000000004 +-9.4644600000000008 1.9494400000000001 -4.2998399999999997 +3.1839300000000001 1.0203500000000001 2.7900800000000001 +0.72020200000000001 1.28935 1.93605 +1.1195900000000001 -0.082715700000000003 0.108335 +1.2143299999999999 0.109107 0.089994599999999994 +-8.1353799999999996 -7.0197000000000003 -2.7972700000000001 +-0.384019 1.3935999999999999 1.58246 +1.13514 -0.40515299999999999 0.037922200000000003 +1.41272 0.25523000000000001 0.075047199999999994 +1.1114599999999999 0.041004800000000001 -0.60519100000000003 +1.2008000000000001 -0.52102199999999999 -0.85020300000000004 +-2.1125600000000002 2.3494100000000002 1.0497000000000001 +6.3539300000000001 -6.4846199999999996 3.4215800000000001 +1.81291 1.07497 2.3029899999999999 +9.9414700000000007 0.94711599999999996 5.9218299999999999 +-1.9733499999999999 1.20228 1.1051200000000001 +0.85231199999999996 0.89349699999999999 1.97306 +-1.1534199999999999 1.0666199999999999 1.3447800000000001 +2.3097699999999999 0.75467399999999996 2.46231 +-11.035 0.646679 -4.7206000000000001 +-10.0433 1.98716 -4.46014 +4.75197 0.84915200000000002 3.3866100000000001 +-10.878 -4.4109999999999996 -4.6261999999999999 +-12.657999999999999 -1.54705 -5.1468600000000002 +-14.4069 -3.91099 -5.6061800000000002 +3.7871100000000002 0.87615100000000001 3.0118100000000001 +3.35121 0.72618000000000005 2.8376100000000002 +-1.1551899999999999 1.17178 1.3484 +-9.1981599999999997 -6.8333399999999997 -2.7073700000000001 +-3.5423399999999998 1.01769 0.66567699999999996 +-6.4199700000000002 -2.1216900000000001 -0.0975491 +-4.1539999999999999 0.27800799999999998 0.50420299999999996 +11.351599999999999 -0.45794899999999999 4.0987499999999999 +11.6656 -0.56922700000000004 4.5682200000000002 +9.9311699999999998 -0.40140799999999999 3.2378800000000001 +10.6614 -0.50365099999999996 3.8575900000000001 +8.4893999999999998 -0.32880399999999999 2.4040599999999999 +8.2747200000000003 -0.39213700000000001 2.4948299999999999 +7.1882299999999999 -0.31470100000000001 1.89293 +6.8413500000000003 -0.22368499999999999 1.5313399999999999 +5.4945500000000003 -0.110067 0.86325300000000005 +6.2101899999999999 -0.23691999999999999 1.3942600000000001 +4.9285699999999997 -0.10827000000000001 0.75119000000000002 +8.0863499999999995 -7.0412299999999997 3.7334800000000001 +3.1597599999999999 0.100869 -0.033157699999999998 +2.2642799999999998 0.22985900000000001 -0.41801899999999997 +1.31565 0.398835 -0.86351199999999995 +12.438599999999999 -0.54510000000000003 4.9254100000000003 +4.0646699999999996 0.030849100000000001 0.21227099999999999 +2.56216 0.227159 -0.435861 +11.313700000000001 -0.35318699999999997 3.8978000000000002 +10.1328 -0.319102 3.2010999999999998 +8.7328499999999991 -0.24134900000000001 2.37534 +7.3168800000000003 -0.18002000000000001 1.6518699999999999 +5.0096600000000002 0.0106415 0.51213200000000003 +1.7078500000000001 0.40813199999999999 -0.85699700000000001 +12.5289 -0.42604500000000001 4.7222799999999996 +12.6409 -0.28970400000000002 4.5816800000000004 +11.4636 -0.252473 3.8406400000000001 +10.271699999999999 -0.215527 3.1348400000000001 +9.1891700000000007 -0.16897699999999999 2.5154800000000002 +6.3123300000000002 -0.075179099999999999 1.09307 +10.014799999999999 -7.2256799999999997 4.19217 +2.6461000000000001 0.32155 -0.55220899999999995 +9.1729500000000002 -7.9139900000000001 2.4696699999999998 +7.5529700000000002 -0.0824931 1.63392 +5.5704700000000003 0.091997999999999996 0.62993200000000005 +3.8452899999999999 0.14080699999999999 -0.020669199999999999 +12.267200000000001 -0.10448 4.1540499999999998 +11.4771 -0.085167699999999999 3.6713499999999999 +10.3111 -0.055520199999999999 2.9967100000000002 +9.5080299999999998 -0.018359799999999999 2.5414599999999998 +8.5048700000000004 0.0085814199999999993 2.0100099999999999 +7.0652200000000001 0.070430599999999996 1.27864 +4.0888099999999996 0.214556 -0.020043100000000001 +13.006500000000001 -0.18312899999999999 4.6880499999999996 +2.1836799999999998 -7.8111800000000002 0.081645200000000001 +12.4412 0.088193800000000003 4.1047500000000001 +10.053900000000001 -7.4579300000000002 4.0193300000000001 +11.5579 0.114534 3.5647799999999998 +-8.0761800000000008 -6.9994399999999999 -3.52312 +10.412000000000001 0.13711000000000001 2.9108000000000001 +9.3370899999999999 0.15980800000000001 2.3260999999999998 +8.0958400000000008 0.20899699999999999 1.6733 +6.9219999999999997 0.315249 1.0639700000000001 +5.4735699999999996 0.24787799999999999 0.47954200000000002 +3.9638900000000001 0.37837300000000001 -0.17161899999999999 +2.6893099999999999 0.47287299999999999 -0.65485899999999997 +13.0829 -0.0085321400000000006 4.5731400000000004 +7.5269199999999996 -7.87202 1.9740800000000001 +1.22271 0.60055199999999997 -1.1511100000000001 +-5.0717800000000004 -7.4323699999999997 -2.5846900000000002 +-4.0020100000000003 -7.52475 -2.2722500000000001 +-1.6058699999999999 -7.6987500000000004 -1.3879699999999999 +12.327999999999999 0.26002999999999998 3.93316 +11.344799999999999 0.34004400000000001 3.31969 +10.5124 0.33953899999999998 2.85345 +5.8412199999999999 0.41414800000000002 0.54646899999999998 +4.7128399999999999 0.53426099999999999 0.035424400000000002 +1.4902 0.68721500000000002 -1.1240600000000001 +13.1692 0.21914 4.4759399999999996 +-6.96936 -7.1441299999999996 -3.3067199999999999 +12.7829 0.48354900000000001 4.1146200000000004 +9.3205500000000008 0.34124500000000002 2.2167300000000001 +8.2862200000000001 0.52312800000000004 1.6108800000000001 +0.111443 0.87546999999999997 -1.5749500000000001 +13.56 0.426651 4.6483800000000004 +-4.3601999999999999 10.629099999999999 -0.28217199999999998 +10.144399999999999 -7.7567500000000003 3.6520100000000002 +-2.6427499999999999 -7.59727 -1.8940699999999999 +1.07294 -7.7707300000000004 -0.46452500000000002 +-4.4274100000000001 10.631600000000001 -0.038902199999999998 +10.1717 -7.8130300000000004 3.5457000000000001 +-4.18363 10.6227 -0.92126200000000003 +11.783200000000001 0.47639700000000001 3.5129999999999999 +-4.2645200000000001 10.6256 -0.62846800000000003 +9.8491 0.60205900000000001 2.3808699999999998 +3.8184100000000001 0.62309099999999995 -0.33281899999999998 +-4.0842000000000001 10.619 -1.2811399999999999 +2.80586 0.65335799999999999 -0.69879899999999995 +-7.9437199999999999 -6.9633399999999996 -3.6246299999999998 +-5.5978300000000001 -7.33697 -2.8620100000000002 +-4.1955799999999996 -7.4688499999999998 -2.4430900000000002 +-1.08769 1.07982 -1.9336 +-1.5321499999999999 1.2665900000000001 -2.0974900000000001 +-0.68788199999999999 -7.6981200000000003 -1.1838500000000001 +-2.3363399999999999 1.45058 -2.3208299999999999 +4.1036099999999998 -7.8119199999999998 0.65646499999999997 +12.372 0.794601 3.7846600000000001 +10.2423 -7.9109400000000001 3.2773500000000002 +7.52773 -7.8459399999999997 1.7547200000000001 +7.2198200000000003 0.86628799999999995 0.95397500000000002 +5.96469 0.66117499999999996 0.49259700000000001 +-4.94557 -7.3327999999999998 -2.7766500000000001 +0.164632 0.98801799999999995 -1.58599 +6.1021400000000003 -7.83108 1.33209 +0.89378899999999994 -7.7271900000000002 -0.64621200000000001 +9.5867199999999997 -0.46834300000000001 3.2471299999999998 +13.1342 -0.63473599999999997 5.5952799999999998 +13.1929 -0.593557 5.5151000000000003 +-4.02461 10.616899999999999 -1.4968300000000001 +10.265700000000001 -7.9302999999999999 3.1903299999999999 +4.2720099999999999 -7.7870200000000001 0.60031000000000001 +-3.1547700000000001 -7.4855600000000004 -2.1867000000000001 +4.1010900000000001 -0.019342399999999999 0.38814599999999999 +-3.9247899999999998 10.613200000000001 -1.85815 +-3.8382200000000002 10.610099999999999 -2.1715200000000001 +13.2592 -0.54333399999999998 5.42469 +13.3225 -0.48502600000000001 5.3388799999999996 +9.1388499999999997 -7.8725800000000001 2.21014 +-3.7616900000000002 10.6073 -2.4485299999999999 +13.385300000000001 -0.41875899999999999 5.2542499999999999 +-7.5490300000000001 -6.9354199999999997 -3.6206700000000001 +-5.9261799999999996 -7.2114200000000004 -3.10181 +2.6424799999999999 -7.75291 -0.019868899999999998 +6.3086399999999996 -7.8056099999999997 1.2781100000000001 +13.7006 0.216696 4.8450899999999999 +-1.3793899999999999 -7.5514200000000002 -1.60242 +-1.54636 -7.6080399999999999 -1.58555 +-3.0925699999999998 1.4826900000000001 0.78283100000000005 +-6.3129200000000001 -7.0017199999999997 -3.30444 +-5.3221499999999997 -7.1534500000000003 -2.9881700000000002 +-1.0099499999999999 0.93259099999999995 1.36595 +-0.406717 0.77110800000000002 1.51434 +-3.1576599999999999 -7.3756899999999996 -2.2592400000000001 +0.026383 -7.5957699999999999 -1.1025799999999999 +0.34905199999999997 -7.6568100000000001 -0.936755 +2.86768 -7.6899199999999999 -0.056829499999999998 +-0.19214100000000001 0.93656499999999998 1.64059 +4.2941099999999999 -7.7222 0.45831899999999998 +5.6851099999999999 -7.7474299999999996 0.94492900000000002 +7.23665 -7.7913699999999997 1.49508 +0.21509300000000001 0.75913299999999995 1.7380599999999999 +8.5560500000000008 -7.8102799999999997 1.8729 +0.35943799999999998 0.57524600000000004 1.68191 +0.65405999999999997 0.64067799999999997 1.84812 +-4.0864399999999996 -7.3067700000000002 -2.5745499999999999 +-2.1096499999999998 -7.4457500000000003 -1.8959900000000001 +-3.7590300000000001 10.5266 -2.6834199999999999 +1.5099499999999999 0.37114599999999998 1.9839100000000001 +9.5965799999999994 -7.8485399999999998 2.2011799999999999 +2.2151299999999998 0.58012799999999998 2.3934099999999998 +2.7286999999999999 0.42960399999999999 2.5259900000000002 +2.1568999999999998 0.24321200000000001 2.10677 +1.9929600000000001 0.19283900000000001 1.7819499999999999 +2.2444000000000002 0.358103 2.29128 +-0.098497199999999993 -7.4668700000000001 -1.2245200000000001 +2.3181799999999999 0.170242 2.0259499999999999 +2.9380899999999999 0.063095899999999996 2.0448300000000001 +3.7330299999999998 0.53105199999999997 2.94198 +3.8225899999999999 0.079270300000000002 2.6745399999999999 +-3.7962799999999999 10.4506 -2.7648700000000002 +3.2738299999999998 0.079593200000000003 2.39357 +3.8918400000000002 -0.055732200000000003 2.25949 +4.60914 0.335036 3.2130100000000001 +4.1776999999999997 0.22476499999999999 2.9750100000000002 +4.2820400000000003 -0.078801899999999994 2.5660400000000001 +5.0384099999999998 0.45469700000000002 3.4310900000000002 +4.6770100000000001 0.61165700000000001 3.3248600000000001 +-3.8213400000000002 10.407999999999999 -2.79609 +5.3256699999999997 -0.0874365 3.1385900000000002 +4.9482100000000004 -0.172567 2.5719099999999999 +4.6071900000000001 0.082745299999999994 3.0337200000000002 +5.4421499999999998 0.13417499999999999 3.44374 +-9.5626899999999999 -6.8236299999999996 -1.26214 +6.9010600000000002 -7.35764 3.16899 +-2.37785 10.267799999999999 -2.39188 +-15.5014 -6.0699500000000004 -2.9291200000000002 +6.0801299999999996 -0.0515421 3.5598399999999999 +5.89968 0.50734699999999999 3.8085100000000001 +6.0253500000000004 0.226966 3.7572100000000002 +-8.8419500000000006 -6.8568600000000002 -3.6911800000000001 +-11.961600000000001 -6.4005599999999996 -3.1951800000000001 +8.9462700000000002 -7.5239000000000003 3.6231100000000001 +-16.418900000000001 -6.0025000000000004 -4.3781100000000004 +-11.1357 -6.5126999999999997 -3.1015899999999998 +-12.1944 -6.3390599999999999 -4.6089200000000003 +-3.7517100000000001 10.604200000000001 -2.4923099999999998 +-3.7452700000000001 10.593500000000001 -2.5446900000000001 +-3.7486999999999999 10.5566 -2.6358999999999999 +-12.656599999999999 -6.3093700000000004 -3.5901000000000001 +-13.4367 -6.2269899999999998 -3.6684100000000002 +-3.7755200000000002 10.49 -2.7278099999999998 +-14.2616 -6.15299 -3.6947000000000001 +-14.8071 -6.1076499999999996 -4.1233199999999997 +-3.8628399999999998 10.3439 -2.8293699999999999 +-3.9102100000000002 10.277100000000001 -2.8493499999999998 +8.7228100000000008 -7.6257099999999998 3.4270100000000001 +-10.004099999999999 -6.7010300000000003 -2.5839500000000002 +6.4046200000000004 -0.23330400000000001 3.41276 +6.2354500000000002 -0.275536 3.1600999999999999 +8.8471200000000003 -7.7183400000000004 3.3177500000000002 +6.58012 0.27684799999999998 4.0307500000000003 +8.0191700000000008 -0.40941100000000002 3.87182 +8.8812300000000004 -7.7970600000000001 3.1597300000000001 +6.7462799999999996 0.51939800000000003 4.1931099999999999 +7.15639 0.084245899999999999 4.1914199999999999 +10.659000000000001 -7.4674300000000002 1.83097 +2.27474 -7.5578500000000002 -0.37956299999999998 +6.7662599999999999 0.022988700000000001 3.9582299999999999 +7.1782399999999997 -0.12962399999999999 4.0087799999999998 +6.9321799999999998 -0.20121 3.7698700000000001 +7.2974600000000001 -0.38946599999999998 3.2410899999999998 +7.4652900000000004 0.43395899999999998 4.5115400000000001 +7.4089499999999999 0.18726400000000001 4.3808499999999997 +8.9721899999999994 -0.51135699999999995 3.8952800000000001 +6.9079499999999996 -7.7355299999999998 1.2982400000000001 +8.0803100000000008 0.25369199999999997 4.7552099999999999 +8.1067599999999995 0.024343199999999999 4.6315200000000001 +8.0610499999999998 -0.12877 4.4712800000000001 +8.0284200000000006 -0.27401199999999998 4.2489699999999999 +7.5757099999999999 -0.40634700000000001 3.47763 +8.3312000000000008 0.56259000000000003 4.9774599999999998 +9.7129200000000004 -0.54622700000000002 4.4447000000000001 +8.6787299999999998 0.24752299999999999 5.0688500000000003 +8.7109199999999998 0.054662200000000001 4.9774900000000004 +9.1422000000000008 0.41688599999999998 5.3859000000000004 +9.2225599999999996 0.65481 5.4806600000000003 +9.3204700000000003 0.20563400000000001 5.4077799999999998 +9.5320699999999992 0.0145956 5.4229900000000004 +8.9233399999999996 -0.10293099999999999 4.9732200000000004 +7.1737500000000001 -7.2276499999999997 3.3537300000000001 +-7.7036300000000004 -6.7628500000000003 -3.7220900000000001 +8.8933099999999996 -0.24007200000000001 4.7985899999999999 +10.507199999999999 -7.8320499999999997 2.3304299999999998 +9.8782700000000006 0.28853099999999998 5.7754500000000002 +8.4511000000000003 -0.38460100000000003 4.2501100000000003 +10.366199999999999 0.350767 6.1019500000000004 +10.1434 0.042604400000000001 5.8152699999999999 +9.7690999999999999 -0.124297 5.45303 +8.7725100000000005 -7.8491 2.95519 +8.9018700000000006 -7.8859199999999996 2.8251499999999998 +9.7972800000000007 -0.26996100000000001 5.3040000000000003 +9.4449799999999993 -0.35064299999999998 4.9483499999999996 +10.021100000000001 -7.6804899999999998 1.93726 +10.630699999999999 -7.5593700000000004 1.9207099999999999 +10.766 -6.9249099999999997 1.5172099999999999 +11.097 -0.63067899999999999 5.0323399999999996 +9.0988500000000005 -6.7671900000000003 1.01847 +9.6204000000000001 -6.9312699999999996 1.21041 +9.9288100000000004 0.730989 5.9072100000000001 +6.77644 -7.8599399999999999 1.94973 +10.870699999999999 -0.23000200000000001 6.0317699999999999 +10.1419 -0.465868 5.1508900000000004 +9.6726600000000005 -0.51022400000000001 4.6487999999999996 +10.8072 -6.4230200000000002 1.4359999999999999 +10.8018 -6.5373400000000004 1.44011 +10.8733 0.090282899999999999 6.2996600000000003 +11.0319 -0.43487199999999998 5.8294899999999998 +10.536300000000001 -7.7838500000000002 2.2319800000000001 +9.6393900000000006 -7.4985799999999996 1.6067400000000001 +10.6783 -7.39663 1.7708999999999999 +10.7317 -7.1479400000000002 1.6110599999999999 +11.2249 0.76234400000000002 6.7358099999999999 +9.6984700000000004 -7.7485799999999996 1.9879100000000001 +9.7551600000000001 -7.24918 1.4143399999999999 +10.508699999999999 0.875583 6.2769700000000004 +11.0183 0.51509899999999997 6.5653899999999998 +11.279999999999999 0.21036099999999999 6.6246700000000001 +11.722200000000001 -0.356599 6.39778 +9.3322000000000003 -7.1690699999999996 1.2529699999999999 +9.8245799999999992 -6.6104399999999996 1.17998 +9.1374099999999991 -7.6253900000000003 1.65781 +8.8381900000000009 -7.3678800000000004 1.2877400000000001 +8.9036799999999996 -7.0830299999999999 1.0978699999999999 +8.3417700000000004 -6.0284800000000001 0.74126099999999995 +6.0197399999999996 -7.1130699999999996 3.1104500000000002 +8.7759099999999997 -6.3451300000000002 0.869228 +8.4032900000000001 -7.6961300000000001 1.6128400000000001 +8.3003300000000007 -7.5069900000000001 1.3128899999999999 +8.3880099999999995 -7.28017 1.1084400000000001 +8.4035600000000006 -6.9773699999999996 0.92102799999999996 +7.8426299999999998 -7.1612799999999996 0.89504600000000001 +6.8948499999999999 -7.4774700000000003 3.0417800000000002 +7.1431899999999997 -7.5932700000000004 2.9671699999999999 +7.1930699999999996 -7.6845400000000001 2.8280099999999999 +7.2207299999999996 -7.7568799999999998 2.67204 +6.9953700000000003 -7.8071400000000004 2.4253800000000001 +7.1601100000000004 -7.8446400000000001 2.3007200000000001 +8.5141399999999994 -6.6427100000000001 0.83529399999999998 +7.5031100000000004 -6.0380700000000003 0.48394999999999999 +7.84056 -7.5794199999999998 1.29921 +7.5576299999999996 -7.3680700000000003 0.99081699999999995 +7.4513299999999996 -6.7835299999999998 0.60065299999999999 +7.7331799999999999 -6.4795699999999998 0.59261900000000001 +6.8619500000000002 -7.4612800000000004 0.909084 +6.9356 -7.26999 0.74723499999999998 +7.0302600000000002 -7.0178500000000001 0.59860999999999998 +7.0123300000000004 -6.3301400000000001 0.361786 +7.41066 -5.5847499999999997 0.47311199999999998 +6.5442299999999998 -7.5690600000000003 0.95166799999999996 +6.4759799999999998 -7.1877599999999999 0.56307799999999997 +6.0934600000000003 -6.8372999999999999 0.252583 +6.5179900000000002 -6.5938600000000003 0.27996399999999999 +6.7201399999999998 -5.8289499999999999 0.22900200000000001 +11.5623 0.54986599999999997 6.9349800000000004 +11.2875 -0.068982299999999996 6.4438199999999997 +11.7242 -0.118324 6.6702500000000002 +6.3244100000000003 -7.3606199999999999 0.664107 +5.9946400000000004 -7.10121 0.37234200000000001 +5.7983900000000004 -6.0808400000000002 -0.046178400000000001 +6.3771100000000001 -5.4283900000000003 0.12876000000000001 +6.7423200000000003 -5.2595599999999996 0.27498099999999998 +5.9568399999999997 -7.6241899999999996 0.85412600000000005 +5.3686199999999999 -7.4720300000000002 0.50824499999999995 +5.2610999999999999 -7.2615600000000002 0.28192499999999998 +5.1691799999999999 -6.9599700000000002 0.051338200000000001 +5.2790600000000003 -6.6835699999999996 -0.048539400000000003 +5.54758 -6.4027599999999998 -0.060747500000000003 +5.6618500000000003 -5.6881899999999996 -0.124107 +12.698600000000001 -0.68235199999999996 6.2041000000000004 +4.6403400000000001 -7.6114800000000002 0.43593999999999999 +4.87805 -7.1551999999999998 0.093283500000000005 +5.9457599999999999 -4.9500900000000003 0.013810100000000001 +4.2787800000000002 -7.3984199999999998 0.11072 +4.1735899999999999 -6.9946999999999999 -0.21612999999999999 +4.25366 -6.7874999999999996 -0.30488100000000001 +4.2743399999999996 -6.4920099999999996 -0.41800199999999998 +4.5209299999999999 -6.2051600000000002 -0.42504700000000001 +5.3661899999999996 -5.2345300000000003 -0.225302 +5.0144900000000003 -4.4619 -0.29032400000000003 +11.7125 0.32498700000000003 6.96441 +3.63131 -7.5592899999999998 0.061627800000000003 +3.38185 -7.3392900000000001 -0.21233099999999999 +3.82335 -7.1474700000000002 -0.22115699999999999 +4.0205799999999998 -5.7354500000000002 -0.66612700000000002 +4.1336000000000004 -5.3777299999999997 -0.65950500000000001 +3.8615699999999999 -4.9143800000000004 -0.76107000000000002 +4.6871499999999999 -4.7868199999999996 -0.451733 +4.2582199999999997 -3.6177600000000001 -0.47412100000000001 +2.40571 -7.3104100000000001 -0.531779 +2.8885900000000002 -7.04115 -0.56693899999999997 +3.16628 -6.8280099999999999 -0.60196899999999998 +3.4546800000000002 -6.6372499999999999 -0.60267999999999999 +3.55844 -6.3558000000000003 -0.67410300000000001 +5.3830299999999998 -7.2439 2.8333699999999999 +5.3872900000000001 -7.3696200000000003 2.7145700000000001 +3.6755499999999999 -6.0364500000000003 -0.72223999999999999 +5.4452800000000003 -7.4781199999999997 2.6044399999999999 +5.4625399999999997 -7.57667 2.4667500000000002 +5.5085499999999996 -7.6627999999999998 2.3216999999999999 +5.5094000000000003 -7.7336200000000002 2.1477400000000002 +3.81446 -4.5855800000000002 -0.76460899999999998 +5.5101000000000004 -7.8192700000000004 1.7953399999999999 +0.934087 -0.46060099999999998 1.2767599999999999 +11.7974 0.093947000000000003 6.8883599999999996 +2.46225 -6.4372100000000003 -0.96403799999999995 +2.69699 -6.1817099999999998 -0.97677099999999994 +2.8423099999999999 -5.8616299999999999 -1.0077 +3.00542 -5.5240900000000002 -1.0102 +3.1282000000000001 -5.1821599999999997 -1.00061 +3.60039 -4.0126400000000002 -0.79978099999999996 +11.9373 -0.40553699999999998 6.4465399999999997 +12.0999 -0.550732 6.266 +1.7806500000000001 -7.2301900000000003 -0.77747500000000003 +2.2409300000000001 -6.6789800000000001 -0.93285600000000002 +5.2223699999999997 -7.8418299999999999 1.2087399999999999 +2.9923899999999999 -4.6218700000000004 -1.05535 +1.2609300000000001 -7.4530900000000004 -0.79067699999999996 +1.4406300000000001 -6.9993499999999997 -1.0097100000000001 +1.3815200000000001 -6.4484399999999997 -1.25562 +1.55453 -6.2796500000000002 -1.2640100000000001 +1.6959500000000001 -5.99254 -1.3006 +1.8121100000000001 -5.6545800000000002 -1.33507 +1.96102 -5.2946299999999997 -1.33992 +2.0884399999999999 -4.9423000000000004 -1.3296600000000001 +4.4184000000000001 -7.1527799999999999 2.6543399999999999 +2.1962299999999999 -4.6285600000000002 -1.3059499999999999 +2.8256899999999998 -4.0508100000000002 -1.0859000000000001 +3.2376900000000002 -3.0880200000000002 -0.82183799999999996 +3.1587299999999998 -2.74817 -0.79929399999999995 +12.7431 -0.69353699999999996 6.1411100000000003 +0.88745799999999997 -7.3074199999999996 -1.00359 +0.99917199999999995 -6.6874200000000004 -1.27214 +2.0933000000000002 -4.1266299999999996 -1.3299099999999999 +2.5605099999999998 -3.44333 -1.1259300000000001 +2.5941999999999998 -3.02617 -1.0670900000000001 +11.4489 -0.58039700000000005 5.7071500000000004 +-3.2804099999999998 1.3158099999999999 0.68273499999999998 +0.316272 -7.2433100000000001 -1.21567 +0.380276 -7.0582599999999998 -1.28775 +0.53597099999999998 -6.3683899999999998 -1.50193 +0.84621599999999997 -5.7859400000000001 -1.55907 +0.966032 -5.4575100000000001 -1.57989 +1.0926499999999999 -5.1101799999999997 -1.5846499999999999 +1.2189700000000001 -4.7634499999999997 -1.5735600000000001 +1.3893899999999999 -4.2852199999999998 -1.5384100000000001 +5.17699 -7.8421000000000003 1.36622 +1.6411500000000001 -3.7422300000000002 -1.4492499999999999 +1.9943 -3.44956 -1.32101 +3.1007799999999999 -7.1044400000000003 2.3707699999999998 +1.71787 -2.5524300000000002 -1.3246599999999999 +2.3932199999999999 -2.3916499999999998 -1.0569900000000001 +-1.70645 1.0616300000000001 1.15639 +-0.78399700000000005 0.74461299999999997 1.3313900000000001 +0.30205100000000001 0.489423 1.52766 +-0.55915300000000001 -7.0118099999999997 -1.5801099999999999 +-0.118905 -6.7866499999999998 -1.5400700000000001 +0.58748400000000001 -6.0940200000000004 -1.5608599999999999 +3.9138799999999998 -7.2913800000000002 2.3975399999999998 +-0.074204699999999998 -5.57036 -1.8170200000000001 +0.099520700000000004 -5.2370700000000001 -1.8146800000000001 +3.58914 -7.4101600000000003 2.1725699999999999 +0.264513 -4.8756500000000003 -1.8038799999999999 +3.65056 -7.5098200000000004 2.04765 +0.36962 -4.5627300000000002 -1.79227 +3.39398 -7.5933099999999998 1.8262 +0.60813099999999998 -4.1436099999999998 -1.74081 +3.5259299999999998 -7.6666400000000001 1.7015499999999999 +1.0493300000000001 -3.61591 -1.6111500000000001 +3.1268799999999999 -7.7164900000000003 1.43963 +1.16675 -2.9533499999999999 -1.5371900000000001 +5.2174500000000004 -7.7841199999999997 1.87073 +1.4133899999999999 -2.58013 -1.42564 +1.63053 -1.2880799999999999 -1.19892 +-0.89110900000000004 -7.3182799999999997 -1.55291 +4.2828900000000001 -7.8266799999999996 1.24922 +-1.1795500000000001 -6.7229400000000004 -1.8489599999999999 +-0.62029999999999996 -6.4915000000000003 -1.7651399999999999 +-0.74752300000000005 -6.1589700000000001 -1.8747199999999999 +-0.37679400000000002 -5.8224900000000002 -1.84755 +0.73682300000000001 -2.6427100000000001 -1.6341399999999999 +1.0880799999999999 -1.8548800000000001 -1.456 +1.26712 -1.42933 -1.34935 +12.1106 0.019200700000000001 7.0660999999999996 +12.2111 -0.21837300000000001 6.9126399999999997 +-1.4078200000000001 -7.0013800000000002 -1.8298000000000001 +-0.99421099999999996 -5.7142999999999997 -2.0064199999999999 +-0.83189100000000005 -5.3792999999999997 -2.0091299999999999 +-1.00444 -4.9595900000000004 -2.0805099999999999 +-0.71981399999999995 -4.6670800000000003 -2.0310199999999998 +1.0672900000000001 -0.24915399999999999 -0.68390799999999996 +-0.66678700000000002 -4.2660600000000004 -2.02867 +-0.49349799999999999 -3.9180600000000001 -1.99092 +-0.416933 -3.5688 -1.9674700000000001 +0.42130899999999999 -3.1274299999999999 -1.75102 +0.62026899999999996 -2.0022799999999998 -1.6144000000000001 +0.580484 -1.4974799999999999 -1.58104 +0.79211200000000004 -0.94544099999999998 -1.46235 +6.1387099999999997 -0.28886899999999999 2.9195099999999998 +-1.8599399999999999 -7.2321299999999997 -1.8895900000000001 +-1.8937900000000001 -6.64649 -2.0653199999999998 +-1.5044 -6.4322900000000001 -2.0072700000000001 +-1.87401 -6.0287600000000001 -2.1718500000000001 +-1.90408 -5.4621300000000002 -2.2447300000000001 +-1.52813 -5.2174300000000002 -2.1774300000000002 +0.13356799999999999 -3.4992000000000001 -1.84015 +-0.131074 -1.9568300000000001 -1.8159099999999999 +-0.28952 -1.27379 -1.8131900000000001 +0.12138400000000001 -1.20583 -1.6946399999999999 +0.22969999999999999 -0.61219100000000004 -1.61717 +12.8307 -0.70559799999999995 6.0175400000000003 +-2.7852700000000001 -7.0813699999999997 -2.2161300000000002 +-1.9886699999999999 -6.9167899999999998 -2.0237599999999998 +-2.6040800000000002 -6.5942800000000004 -2.2679399999999998 +-2.4096500000000001 -6.2848699999999997 -2.26878 +-2.0226700000000002 -4.7292399999999999 -2.3096999999999999 +-2.2698800000000001 -4.3887900000000002 -2.3699400000000002 +-2.42807 -3.3658100000000002 -2.3998200000000001 +-1.0986899999999999 -2.23888 -2.0691199999999998 +-0.74370800000000004 -1.9106399999999999 -1.9671799999999999 +-0.51282499999999998 -0.57072400000000001 -1.83745 +-3.7006100000000002 -7.00258 -2.5104799999999998 +-3.1975899999999999 -6.7822899999999997 -2.4013 +1.0643499999999999 -0.108514 -0.65401399999999998 +-2.5752999999999999 -5.6725700000000003 -2.38069 +1.0778300000000001 0.16969799999999999 -0.76461599999999996 +-2.81908 -5.22994 -2.4689299999999998 +-2.5557300000000001 -4.9358000000000004 -2.4217399999999998 +-2.5878800000000002 -3.77807 -2.44042 +-1.1088199999999999 -1.2050099999999999 -2.0249999999999999 +11.529 -0.65309899999999999 5.1027399999999998 +-1.2129700000000001 0.34123900000000001 -2.0066999999999999 +-4.0851499999999996 -6.7501499999999997 -2.6620900000000001 +-3.4691100000000001 -6.3523800000000001 -2.5394299999999999 +-3.3059799999999999 -5.9709399999999997 -2.53484 +-3.5065 -5.3580300000000003 -2.62669 +-3.59965 -4.67361 -2.66913 +-3.2803800000000001 -4.4008399999999996 -2.59694 +-2.0292599999999998 -2.57219 -2.2919800000000001 +-1.79966 -1.7528300000000001 -2.2142200000000001 +-1.3809199999999999 -0.62487999999999999 -2.0771899999999999 +-0.79579500000000003 -0.10168199999999999 -1.8986799999999999 +-8.2568999999999999 -6.0039800000000003 -0.56562299999999999 +-4.6218300000000001 -6.4645700000000001 -2.84612 +-4.51858 -6.0686900000000001 -2.84735 +-4.1580399999999997 -5.6183199999999998 -2.77684 +1.3858299999999999 -7.2698400000000003 1.8062 +2.4473799999999999 -7.2980499999999999 2.0252699999999999 +-4.3264800000000001 -4.7168400000000004 -2.8456299999999999 +-3.4354499999999999 -3.7997299999999998 -2.6338499999999998 +-3.1651600000000002 -3.0146199999999999 -2.5623399999999998 +-2.8334000000000001 -2.1985999999999999 -2.4699 +-2.4437500000000001 -1.3013300000000001 -2.35886 +-2.08385 -0.37451000000000001 -2.2536 +-7.4226099999999997 -6.8780900000000003 -0.32727699999999998 +-5.0387199999999996 -6.9302099999999998 -2.92638 +-4.77468 -5.1282899999999998 -2.9513099999999999 +-4.1182400000000001 -3.8145500000000001 -2.79786 +-3.5475500000000002 -2.1787800000000002 -2.64419 +-2.83805 -0.69432700000000003 -2.4520200000000001 +-6.7664200000000001 -3.5723199999999999 -0.17822099999999999 +-2.2997200000000002 0.197348 -2.3075600000000001 +-7.1654200000000001 -5.3972199999999999 -0.26312099999999999 +-5.7445599999999999 -2.7737699999999998 0.099845500000000004 +1.3692299999999999 0.30196000000000001 -0.65279600000000004 +-2.63557 0.56077999999999995 -2.3999600000000001 +-6.4906600000000001 -4.3917000000000002 -0.082934900000000006 +-5.3961800000000002 -1.74556 0.181751 +-6.2786900000000001 -5.4176500000000001 -0.00068791700000000002 +-5.1271899999999997 -2.3149099999999998 0.27046300000000001 +1.98495 -7.8187800000000003 0.31167099999999998 +-5.7183000000000002 -3.9655300000000002 0.13922300000000001 +-5.9714 -4.9502199999999998 0.086273500000000003 +-5.7407199999999996 -6.66669 -3.1550600000000002 +-5.6006799999999997 -6.1590999999999996 -3.1416200000000001 +-5.4076399999999998 -5.6046199999999997 -3.1074199999999998 +-4.97546 -4.5113799999999999 -3.0105300000000002 +-4.7451800000000004 -3.5909300000000002 -2.9540799999999998 +-5.2915700000000001 -3.0344699999999998 -3.0980500000000002 +-7.2211999999999996 -6.3368500000000001 -0.26990500000000001 +-6.2563199999999997 -6.8315299999999999 -0.0033094000000000001 +-3.5986500000000001 -0.96470299999999998 -2.65252 +-4.2472200000000004 -1.1061099999999999 -2.8276699999999999 +1.0969100000000001 -0.36954700000000001 -0.76214199999999999 +-3.6761200000000001 -0.11409999999999999 0.64333899999999999 +-4.5569100000000002 -1.3644799999999999 0.41565800000000003 +-6.4219499999999998 -6.6367900000000004 -3.3563499999999999 +-5.89147 -4.7975599999999998 -3.2485599999999999 +-4.58568 -2.0231499999999998 0.424319 +-6.4354899999999997 -5.5485199999999999 -3.38801 +-5.2221099999999998 -3.80572 0.28884599999999999 +-5.1167699999999998 -4.5082599999999999 0.34310600000000002 +-6.3097799999999999 -6.1646700000000001 -0.0055815200000000004 +-7.1248500000000003 -6.0964200000000002 -3.5708600000000001 +-3.5024899999999999 -0.57594900000000004 0.70410399999999995 +-4.11531 -1.7596400000000001 0.55952199999999996 +-4.7743599999999997 -3.84836 0.43423800000000001 +-5.1851399999999996 -5.1096199999999996 0.334901 +-5.5993000000000004 -5.9544800000000002 0.207596 +-3.1232600000000001 0.49510199999999999 0.78720000000000001 +-3.1262500000000002 -0.862294 0.82539399999999996 +-3.5779700000000001 -1.72695 0.72479800000000005 +-4.0535500000000004 -2.8409399999999998 0.626502 +-4.3101099999999999 -3.98217 0.59176600000000001 +-4.0811799999999998 -4.5636400000000004 0.68544700000000003 +-5.0739999999999998 -5.5809699999999998 0.37212000000000001 +1.0944799999999999 -7.3691300000000002 1.6055200000000001 +2.2228699999999999 -7.4612600000000002 1.7479 +1.5881799999999999 -7.52834 1.46469 +1.0438700000000001 -7.5888499999999999 1.18666 +0.70855800000000002 -7.6493399999999996 0.93009500000000001 +-4.9113800000000003 -6.2934599999999996 0.40717300000000001 +1.0557700000000001 -7.7111999999999998 0.823017 +-5.0607699999999998 -6.66235 0.34703400000000001 +2.4092600000000002 -7.7659599999999998 1.0169699999999999 +3.1908300000000001 -7.7985100000000003 1.09144 +-2.1185499999999999 0.26310699999999998 1.0494000000000001 +-14.3827 -5.8396600000000003 -2.2600199999999999 +-2.9259300000000001 0.017087999999999999 0.85116499999999995 +-15.250999999999999 -6.0862600000000002 -2.8599199999999998 +-14.3835 -6.1556899999999999 -2.62012 +-12.327500000000001 -6.3823400000000001 -1.9730700000000001 +-11.2737 -6.5179600000000004 -1.6462300000000001 +-13.7857 -6.2118700000000002 -2.4496099999999998 +-13.1134 -6.2847 -2.2807200000000001 +-12.3521 -6.0699500000000004 -1.69678 +-8.9949600000000007 -6.6448 -0.76341899999999996 +-10.533200000000001 -6.3400800000000004 -1.1914899999999999 +-2.9337300000000002 -1.34778 0.90698699999999999 +-10.928599999999999 -6.5859699999999997 -1.6795199999999999 +-11.514799999999999 -6.4948199999999998 -1.8243400000000001 +-10.1431 -6.7174500000000004 -1.4064099999999999 +-3.2987199999999999 -2.4728699999999999 0.85474799999999995 +-3.4018999999999999 -3.2296 0.86339200000000005 +-14.443300000000001 -5.9364499999999998 -2.30416 +-14.7218 -6.1159499999999998 -2.6091299999999999 +-13.611499999999999 -6.1146700000000003 -2.1313 +-13.456 -6.2310800000000004 -2.2492100000000002 +-12.9794 -6.0806300000000002 -1.89497 +-12.430999999999999 -6.3048599999999997 -1.8742799999999999 +-12.0664 -6.2918000000000003 -1.6947700000000001 +-10.758100000000001 -6.4004399999999997 -1.2820100000000001 +-10.3759 -6.5562500000000004 -1.22742 +-10.3826 -6.6345000000000001 -1.33019 +-3.5726 -3.9241700000000002 0.838978 +-4.1886099999999997 -5.1385199999999998 0.65847900000000004 +-4.4398499999999999 -5.8856000000000002 0.56640100000000004 +-14.9436 -6.0872200000000003 -5.3700000000000001 +-14.9008 -6.0899999999999999 -5.3588300000000002 +-14.310600000000001 -6.13063 -5.2095700000000003 +0.62634699999999999 -7.7718999999999996 0.331625 +1.56776 -7.8022200000000002 0.434701 +-13.7364 -6.1783599999999996 -5.0353899999999996 +-14.3665 -6.1148400000000001 -5.29514 +-12.9443 -6.2524800000000003 -4.8513000000000002 +-1.9652499999999999 0.56536200000000003 1.06972 +-15.7262 -5.6943099999999998 -5.9527000000000001 +-10.212 -6.61897 -4.0465400000000002 +-9.6158000000000001 -6.7157600000000004 -3.9258899999999999 +-1.8183400000000001 -0.160353 1.1486099999999999 +-2.3437999999999999 -1.5771200000000001 1.10629 +-13.8416 -6.0601799999999999 -5.3237500000000004 +-13.587199999999999 -5.86836 -5.3599699999999997 +-12.370799999999999 -6.2058299999999997 -4.9147699999999999 +-12.229200000000001 -6.1042199999999998 -4.9555999999999996 +-12.0801 -6.3100199999999997 -4.7464700000000004 +-11.637 -6.2460899999999997 -4.7549400000000004 +-10.724 -6.1949500000000004 -4.5655299999999999 +-11.510199999999999 -6.4248399999999997 -4.4550400000000003 +-10.6721 -6.4315800000000003 -4.4416099999999998 +-10.599500000000001 -6.5134400000000001 -4.33249 +-9.6654699999999991 -6.5734199999999996 -4.1841100000000004 +-10.026199999999999 -6.4085000000000001 -4.3438299999999996 +-10.647 -6.5485699999999998 -4.2161400000000002 +-9.3277099999999997 -6.7251599999999998 -3.9775100000000001 +-2.5758399999999999 -2.2252100000000001 1.0782799999999999 +-3.5472800000000002 -5.56386 0.861452 +-3.64066 -6.0479399999999996 0.80728699999999998 +-3.52149 -6.3629600000000002 0.82155299999999998 +0.65623500000000001 -7.7968999999999999 -0.25541700000000001 +-4.2098300000000002 -6.6437999999999997 0.59545400000000004 +-8.3411100000000005 -6.6005700000000003 -3.9032200000000001 +-4.4883600000000001 -7.0744800000000003 0.47489799999999999 +-2.5946099999999999 -0.39932899999999999 0.95796199999999998 +-2.9066299999999998 -4.5928399999999998 1.08727 +-3.3988299999999998 -5.0118400000000003 0.92074900000000004 +-1.11954 -0.21500900000000001 1.30288 +-1.5130399999999999 -0.57482900000000003 1.2561599999999999 +-2.04379 -0.81355699999999997 1.1376200000000001 +-2.5634899999999998 -2.7760899999999999 1.12344 +-1.84857 -3.4943499999999998 1.41886 +-1.25362 -3.8427500000000001 1.6422399999999999 +-2.3174000000000001 -4.20695 1.2846900000000001 +-6.2024400000000002 -3.6359400000000002 -3.3422800000000001 +-5.5785900000000002 -2.83412 -3.1780200000000001 +-2.0231599999999998 -1.2281599999999999 1.1734100000000001 +-1.72621 -2.0784199999999999 1.34436 +-2.05315 -4.7151800000000001 1.3809100000000001 +-2.2458300000000002 -5.05891 1.30816 +-2.80809 -5.6431300000000002 1.09616 +-2.6097100000000002 -6.1860400000000002 1.1153999999999999 +-3.0799500000000002 -6.7100799999999996 0.909968 +-0.47658099999999998 -0.42991099999999999 1.44255 +-0.73304899999999995 -1.1997800000000001 1.51905 +-1.1884600000000001 -1.3817200000000001 1.42709 +-1.01536 -1.8790199999999999 1.53959 +-1.14001 -3.2753199999999998 1.6467099999999999 +-1.4023099999999999 -4.28606 1.60226 +-2.0569299999999999 -5.5608000000000004 1.3441700000000001 +-2.17516 -6.6024700000000003 1.18398 +0.038094099999999999 -0.49958900000000001 1.51891 +-0.44140499999999999 -0.85472700000000001 1.52485 +0.0044132299999999998 -1.3539600000000001 1.6953100000000001 +-0.48364099999999999 -1.6533 1.64741 +-1.0721099999999999 -4.8108300000000002 1.70824 +-1.5860399999999999 -5.2631399999999999 1.51661 +-1.2241200000000001 -5.7022700000000004 1.5936699999999999 +-1.5882799999999999 -6.0627000000000004 1.4363600000000001 +0.30241699999999999 -1.0004500000000001 1.65811 +1.2054 0.174178 -0.58267199999999997 +0.11726399999999999 -1.7742899999999999 1.80331 +-0.27362199999999998 -2.7401599999999999 1.8643099999999999 +-0.68372500000000003 -3.0153300000000001 1.77305 +-0.32833200000000001 -3.6881599999999999 1.93773 +-0.41616999999999998 -4.2798400000000001 1.9295899999999999 +-0.75603699999999996 -5.3655299999999997 1.7728299999999999 +-1.5364 -6.8226899999999997 1.31856 +0.025967899999999999 -7.4624800000000002 1.1945300000000001 +0.75788199999999994 -1.01495 1.69232 +1.58005 0.32980100000000001 -0.62908900000000001 +0.45555000000000001 -1.54948 1.81124 +0.77343600000000001 -2.83196 2.1455600000000001 +0.24837600000000001 -3.4615200000000002 2.0933799999999998 +-0.16308900000000001 -4.9364999999999997 1.9903299999999999 +-0.514957 -5.8257599999999998 1.7894699999999999 +-0.89688299999999999 -6.2529899999999996 1.6083700000000001 +-0.43045600000000001 -6.5557100000000004 1.67435 +-7.09145 -4.9775400000000003 -3.57437 +0.99186200000000002 -1.5997399999999999 1.8815599999999999 +0.27982200000000002 -2.8597000000000001 2.03146 +0.0031778700000000002 -7.7216100000000001 0.42456199999999999 +0.393841 -4.0739299999999998 2.17062 +0.15459999999999999 -4.5276199999999998 2.10066 +-0.13783699999999999 -7.7777500000000002 -0.145285 +-0.15490899999999999 -5.4294900000000004 1.9485600000000001 +-0.14929400000000001 -6.2583200000000003 1.8170299999999999 +1.83769 -1.69865 1.9175599999999999 +-0.123404 -7.7679099999999996 -0.76407999999999998 +1.18103 -2.0550899999999999 2.0359400000000001 +0.98672599999999999 -2.488 2.1182699999999999 +0.85119800000000001 -3.44869 2.2515800000000001 +0.97475599999999996 -4.1514600000000002 2.3355199999999998 +0.84198099999999998 -4.6203000000000003 2.2969499999999998 +0.70185399999999998 -5.0322899999999997 2.2376100000000001 +0.45895900000000001 -5.4654499999999997 2.1225200000000002 +2.4561899999999999 -1.9706999999999999 1.9823900000000001 +1.40167 -1.5911299999999999 1.8926099999999999 +1.42723 -3.4289399999999999 2.3767900000000002 +0.45801199999999997 -5.8692900000000003 2.06033 +-2.6913200000000002 1.0423899999999999 -2.41953 +-10.042999999999999 1.98759 -4.4600600000000004 +-7.1817900000000003 5.8550000000000004 -3.7086000000000001 +-3.9719056361455229 10.193233308054788 -2.8722476038784057 +-0.104634 -6.8478500000000002 1.6880500000000001 +-9.7953299999999999 2.3223400000000001 -4.3950100000000001 +-9.5969200000000008 2.5905300000000002 -4.3429000000000002 +2.0070700000000001 -2.3884400000000001 2.19875 +1.80765 -2.8814899999999999 2.3333599999999999 +1.77389 -3.2727599999999999 2.4199600000000001 +1.968 -3.83819 2.5397799999999999 +1.53199 -3.9445299999999999 2.4585400000000002 +1.78416 -4.45364 2.53871 +1.82576 -4.7778700000000001 2.5464099999999998 +1.44899 -5.1965599999999998 2.4240499999999998 +1.4176500000000001 -5.5916600000000001 2.3627500000000001 +1.37703 -5.9556100000000001 2.2889200000000001 +0.80760699999999996 -6.3196599999999998 2.0583499999999999 +1.3246199999999999 -6.5758099999999997 2.1242299999999998 +2.39344 -2.33291 2.1703700000000001 +-1.23926 -7.4651199999999998 0.87798100000000001 +2.2747000000000002 -4.2204499999999996 2.6356799999999998 +2.4819800000000001 -3.5358999999999998 2.57362 +2.9197799999999998 -4.0400900000000002 2.7295600000000002 +2.5693700000000002 -4.60806 2.7124700000000002 +2.3675799999999998 -5.2101300000000004 2.64594 +2.5474999999999999 -5.5358999999999998 2.6533600000000002 +2.3951799999999999 -5.7896700000000001 2.5760100000000001 +2.23603 -6.0329699999999997 2.4884300000000001 +3.0385499999999999 -2.23306 2.0237400000000001 +3.7727200000000001 -2.8470900000000001 2.26437 +2.5766 -3.2003900000000001 2.5004499999999998 +3.2665799999999998 -4.4428099999999997 2.8328199999999999 +2.8552300000000002 -4.99139 2.7688000000000001 +3.1198999999999999 -2.6711800000000001 2.2701500000000001 +3.37568 -3.1475499999999998 2.4915099999999999 +3.3652600000000001 -3.4465499999999998 2.6145299999999998 +3.5390999999999999 -4.82104 2.9043600000000001 +-1.2253499999999999 -7.7235300000000002 -0.13475899999999999 +3.4422299999999999 -5.4004700000000003 2.8699400000000002 +2.1510600000000002 -6.3134899999999998 2.4008500000000002 +4.8026600000000004 -3.49369 2.49546 +3.82592 -5.2011000000000003 2.96069 +-0.65371900000000005 -7.7660099999999996 -0.502884 +10.2064 -4.9811899999999998 2.1923599999999999 +4.1480199999999998 -3.4086500000000002 2.5566 +4.6025200000000002 -3.9849199999999998 2.8212299999999999 +4.3925299999999998 -4.0240999999999998 2.83948 +3.8420100000000001 -4.1460299999999997 2.8568799999999999 +4.2442200000000003 -4.6222399999999997 2.99335 +4.2319100000000001 -6.1166600000000004 2.95214 +4.6347800000000001 -5.0313800000000004 3.0994100000000002 +4.4913999999999996 -5.9089400000000003 3.0464500000000001 +4.6852299999999998 -6.5192199999999998 2.9771999999999998 +8.4581300000000006 -4.58338 2.3519000000000001 +6.3326700000000002 -3.80186 1.9247799999999999 +5.5614400000000002 -3.4247200000000002 1.98275 +4.8307500000000001 -3.8009200000000001 2.7080600000000001 +-1.9346399999999999 -7.65245 0.00707992 +4.9323800000000002 -4.4632100000000001 3.0165199999999999 +5.1101599999999996 -5.4615600000000004 3.2061099999999998 +4.4972599999999998 -2.7704900000000001 1.5431299999999999 +-1.9227099999999999 -7.7158800000000003 -0.63748099999999996 +2.1842800000000002 -1.27332 1.1953 +3.5728900000000001 -2.2038899999999999 1.55474 +4.5581399999999999 -6.6288200000000002 2.9134799999999998 +10.107799999999999 -4.8406799999999999 2.7557 +9.5176599999999993 -4.7870799999999996 2.6033400000000002 +8.8969000000000005 -4.6846100000000002 2.4507599999999998 +7.7851900000000001 -4.3931399999999998 2.2014800000000001 +7.0760399999999999 -4.1284000000000001 2.0624699999999998 +5.6586299999999996 -3.4436 1.64774 +3.7757000000000001 -2.3038799999999999 1.3438000000000001 +5.8517299999999999 -3.7867899999999999 2.4495100000000001 +1.16784 -0.61660000000000004 0.931315 +5.44557 -4.0770099999999996 2.8108399999999998 +-1.75969 -7.7235100000000001 -1.01739 +9.5673700000000004 -4.82003 2.36978 +-2.0953300000000001 -7.4864499999999996 0.59939399999999998 +8.5026700000000002 -4.61904 2.0323899999999999 +7.5808099999999996 -4.3321199999999997 1.8245499999999999 +6.3888699999999998 -3.8245499999999999 1.68625 +5.4060499999999996 -4.3166399999999996 2.9586600000000001 +5.32334 -4.85609 3.1612499999999999 +5.0890899999999997 -3.11727 1.5554699999999999 +5.0225299999999997 -5.7268299999999996 3.1829100000000001 +4.6067299999999998 -2.8203 1.24793 +5.7868500000000003 -3.9864700000000002 2.6784300000000001 +10.140599999999999 -4.87974 2.4856600000000002 +5.7465000000000002 -4.6475600000000004 3.1230000000000002 +4.0375699999999997 -2.4526599999999998 1.0518799999999999 +-1.85846 -7.6088699999999996 0.25564399999999998 +5.3614699999999997 -5.1769600000000002 3.2284000000000002 +5.4870299999999999 -6.0862299999999996 3.25732 +5.3028599999999999 -6.3376299999999999 3.1735500000000001 +8.9718699999999991 -4.7293799999999999 2.1451799999999999 +8.0448299999999993 -4.4911500000000002 1.9254 +7.1273799999999996 -4.15909 1.70181 +-2.8742700000000001 -7.6186199999999999 -0.26925300000000002 +6.4669999999999996 -3.8804500000000002 1.46479 +5.1951099999999997 -3.1848000000000001 1.1767300000000001 +3.18615 -1.8918200000000001 0.94165299999999996 +1.96306 -1.0916999999999999 0.86799999999999999 +6.2138200000000001 -4.2600899999999999 2.8424399999999999 +6.0782999999999996 -4.4630400000000003 3.0165899999999999 +6.1754699999999998 -5.0327299999999999 3.2970100000000002 +6.0868599999999997 -5.3165399999999998 3.3600599999999998 +6.0242300000000002 -5.6030499999999996 3.3882699999999999 +9.6214200000000005 -4.9113800000000003 2.0633900000000001 +5.8340100000000001 -5.8811999999999998 3.35398 +6.2051400000000001 -4.0481800000000003 2.6295799999999998 +6.4546900000000003 -4.7966899999999999 3.2141299999999999 +6.7048899999999998 -4.3631700000000002 2.8513500000000001 +6.9249400000000003 -4.6644500000000004 3.1157599999999999 +6.5615600000000001 -6.2951899999999998 3.5012799999999999 +7.17584 -4.4674899999999997 2.8695300000000001 +6.7153299999999998 -4.1685400000000001 2.5946600000000002 +7.1150500000000001 -4.93574 3.31508 +7.0667299999999997 -5.1946099999999999 3.4585699999999999 +6.9604799999999996 -5.4749800000000004 3.5427300000000002 +6.8643599999999996 -5.7650800000000002 3.5774300000000001 +6.8109099999999998 -6.0494700000000003 3.5795499999999998 +7.6333200000000003 -4.5800200000000002 2.91886 +1.28854 0.30060700000000001 1.4982200000000001 +7.51776 -4.7549700000000001 3.1617600000000001 +7.8682100000000004 -4.8193099999999998 3.2090100000000001 +7.6723400000000002 -5.04603 3.42469 +7.8938499999999996 -5.3538500000000004 3.6412399999999998 +7.8130899999999999 -5.6233300000000002 3.7426200000000001 +7.6915500000000003 -5.91683 3.78172 +-1.2592300000000001 -7.6062599999999998 0.47432000000000002 +7.5579900000000002 -6.1869300000000003 3.7669000000000001 +8.5279699999999998 -4.9419399999999998 3.3387699999999998 +8.1911199999999997 -5.14825 3.54203 +7.8493199999999996 -6.4362199999999996 3.8358400000000001 +8.5055300000000003 -6.3085300000000002 4.0177800000000001 +5.7648400000000004 -3.5085299999999999 1.3236300000000001 +4.6715799999999996 -2.8723999999999998 0.97821400000000003 +9.26511 -5.0461499999999999 3.5152700000000001 +1.68543 0.25818099999999999 0.75636099999999995 +8.83019 -5.2464000000000004 3.6985899999999998 +-3.3979599999999999 -7.5313100000000004 -0.032884400000000001 +8.7539200000000008 -5.4946799999999998 3.8680400000000001 +8.6689100000000003 -5.7703199999999999 3.9748999999999999 +8.6352499999999992 -6.0637499999999998 4.0350200000000003 +9.3558000000000003 -5.3664300000000003 3.88774 +9.5896500000000007 -5.1559100000000004 3.7075499999999999 +-2.9350000000000001 -7.6523000000000003 -0.65321600000000002 +9.7672899999999991 -4.9984500000000001 3.4789099999999999 +9.0240600000000004 -4.8344399999999998 1.85903 +8.5698500000000006 -4.7225700000000002 1.7533799999999999 +8.0941399999999994 -4.5888900000000001 1.63418 +7.3632900000000001 -4.3257300000000001 1.47285 +2.0740500000000002 -1.14361 0.66296500000000003 +-2.9633400000000001 -7.6609499999999997 -1.21147 +9.4385300000000001 -5.6321099999999999 4.0889199999999999 +10.1251 -5.3606699999999998 4.0445599999999997 +6.5279600000000002 -3.9641899999999999 1.23966 +4.0928300000000002 -2.5099999999999998 0.72915300000000005 +3.2359800000000001 -1.9212100000000001 0.71565100000000004 +7.4432200000000002 -4.4404599999999999 1.2845200000000001 +-2.7735799999999999 -7.6381300000000003 -1.77755 +5.7127800000000004 -3.53938 1.0221199999999999 +4.8573700000000004 -3.0351300000000001 0.75805900000000004 +10.2416 -5.1345299999999998 1.93448 +3.0560700000000001 -1.81168 0.34445500000000001 +6.5522299999999998 -4.0435100000000004 1.05697 +1.9024399999999999 -1.01298 0.25231700000000001 +4.1291900000000004 -2.5772900000000001 0.45722299999999999 +9.7194599999999998 -5.0773999999999999 1.80166 +9.0878399999999999 -4.9783400000000002 1.62259 +8.3146199999999997 -4.7680499999999997 1.4571000000000001 +5.7702600000000004 -3.6564899999999998 0.77460099999999998 +7.5786499999999997 -4.6065899999999997 1.1180699999999999 +6.9789199999999996 -4.34687 0.96431500000000003 +6.4244700000000003 -4.0577399999999999 0.85573900000000003 +-4.7037399999999998 -7.3706899999999997 0.15529699999999999 +0.89264600000000005 -0.29738799999999999 1.20547 +4.9421299999999997 -3.1615799999999998 0.53037299999999998 +1.6246100000000001 -0.82404299999999997 -0.26432699999999998 +9.9335799999999992 -5.2440600000000002 1.6879999999999999 +9.0678199999999993 -5.149 1.40097 +8.3378599999999992 -4.9238 1.2522599999999999 +0.91765200000000002 -0.077024099999999998 1.1959299999999999 +9.3237299999999994 -5.94977 4.1882299999999999 +9.9871599999999994 -6.2675900000000002 4.4210500000000001 +10.131600000000001 -5.4174699999999998 1.59063 +9.4182400000000008 -5.3036000000000003 1.41117 +0.99689899999999998 0.105083 1.2373000000000001 +7.6231200000000001 -4.81271 0.89861599999999997 +-4.4497799999999996 -7.4536199999999999 -0.157525 +3.4146100000000001 -2.0945299999999998 0.17441599999999999 +8.3671199999999999 -5.08561 1.09832 +6.5665199999999997 -4.2975500000000002 0.64198599999999995 +1.12016 0.21743399999999999 1.3187899999999999 +5.9603200000000003 -3.9565199999999998 0.46718300000000001 +4.9501999999999997 -3.2999700000000001 0.190996 +4.4104299999999999 -2.8680099999999999 0.18030499999999999 +8.8729399999999998 -5.2525399999999998 1.20974 +7.0502000000000002 -4.5896600000000003 0.70839099999999999 +5.49064 -3.6365400000000001 0.38882800000000001 +1.14392 -0.50295999999999996 0.57875500000000002 +2.3776000000000002 -1.3524499999999999 -0.14339499999999999 +-4.1182999999999996 -7.5188199999999998 -0.37459300000000001 +-6.0554600000000001 -7.0242500000000003 0.044561700000000003 +-3.7411699999999999 -7.0815200000000003 0.67771700000000001 +-3.9776400000000001 -7.5747299999999997 -0.80818699999999999 +8.2849500000000003 -5.2663500000000001 0.90909200000000001 +8.8868799999999997 -5.4642900000000001 1.06748 +-3.8750800000000001 -7.5952099999999998 -1.3034399999999999 +6.5330199999999996 -4.44773 0.43929099999999999 +4.3644999999999996 -2.9114100000000001 -0.0598881 +2.88496 -1.73322 -0.15339800000000001 +4.1993999999999998 -2.8578899999999998 2.1435200000000001 +-4.1603399999999997 -7.5291100000000002 -2.2176100000000001 +4.9721799999999998 -3.3535400000000002 2.3181500000000002 +9.4987200000000005 -5.56989 1.24644 +7.65754 -5.0095299999999998 0.75471699999999997 +5.3835899999999999 -3.7120899999999999 0.12302399999999999 +10.186 -5.6718999999999999 1.4343600000000001 +7.0786199999999999 -4.8336100000000002 0.52522599999999997 +3.5002300000000002 -2.21326 -0.12890499999999999 +3.4977100000000001 -2.26288 -0.36666399999999999 +10.305 -0.58910399999999996 4.3322500000000002 +9.0839200000000009 -0.51600000000000001 3.5583200000000001 +5.4411300000000002 -0.22650600000000001 1.8971499999999999 +4.1765100000000004 -0.086692199999999997 1.3808 +3.2212000000000001 0.034578299999999999 1.10103 +-3.7995199999999998 -7.5859800000000002 -1.7423599999999999 +8.1303699999999992 -0.45340799999999998 3.0832600000000001 +2.3063500000000001 0.16409299999999999 0.76748899999999998 +12.0907 -0.642544 5.0903200000000002 +11.7241 -0.65222400000000003 5.0040100000000001 +10.130800000000001 -0.56715199999999999 3.9645800000000002 +8.8142800000000001 -0.478321 3.0801400000000001 +7.7646699999999997 -0.40976000000000001 2.5281199999999999 +6.79481 -0.34991699999999998 2.3271899999999999 +5.4138299999999999 -0.21682100000000001 1.6051500000000001 +4.2371299999999996 -0.085785 1.0729 +3.03776 0.067766199999999999 0.634301 +10.8109 -0.56218699999999999 4.1306200000000004 +9.8132300000000008 -0.52431399999999995 3.5861499999999999 +6.2241299999999997 -0.27488099999999999 1.6746399999999999 +5.2664499999999999 -0.183029 1.2508900000000001 +4.30016 -0.076059100000000004 0.80314600000000003 +3.40083 0.0363034 0.45165 +2.4420500000000001 0.167798 0.080134700000000003 +12.918900000000001 -0.70174499999999995 5.8940000000000001 +12.995799999999999 -0.68638600000000005 5.7869200000000003 +1.0665199999999999 -0.30615399999999998 0.499164 +0.70605399999999996 -0.22436 1.2687200000000001 +0.76207599999999998 0.036583699999999997 1.2529399999999999 +0.83046500000000001 0.26343499999999997 1.3923000000000001 +0.87948000000000004 0.36776900000000001 1.5641799999999999 +0.28787699999999999 -0.236734 1.37734 +0.35924800000000001 0.21531800000000001 1.3279700000000001 +-5.1369499999999997 -7.4196099999999996 -0.417684 +0.51946899999999996 0.319934 1.4007400000000001 +-2.3145600000000002 1.4912000000000001 -2.3198500000000002 +-5.0243900000000004 -7.4609100000000002 -0.71268100000000001 +0.26747500000000002 0.00135187 1.29369 +-4.9294700000000002 -7.4903500000000003 -1.02474 +-0.046803400000000002 0.44789699999999999 1.37381 +-0.32721800000000001 0.410408 1.2944100000000001 +1.2742100000000001 -0.62410600000000005 0.44272800000000001 +-2.3063500000000001 1.5056499999999999 -2.3177400000000001 +-2.30633 1.50569 -2.3177400000000001 +-2.2843258837287554 1.5006042858070121 -2.3204289455955238 +-0.34174500000000002 0.061557300000000002 1.31429 +-2.3063699999999998 1.5056099999999999 -2.3177500000000002 +-8.4097100000000005 -7.0177899999999998 -1.4894799999999999 +1.10046 -0.25987300000000002 0.0962364 +-0.34340700000000002 0.235952 1.27091 +-2.2976183248533832 1.4628332276994986 -2.3196731146685239 +-4.6486400000000003 -7.5273300000000001 -1.4878199999999999 +-1.07697 0.53602700000000003 1.1841999999999999 +-0.94766399999999995 0.63774699999999995 1.21932 +-2.5521699999999998 1.16452 -2.33141 +0.91978700000000002 -0.31065999999999999 -1.05945 +1.13422 0.330683 -0.85115499999999999 +0.90303199999999995 0.074990600000000004 -0.89269100000000001 +0.86824400000000002 -0.086221000000000006 -0.94379599999999997 +1.0751200000000001 -0.093914200000000003 0.54275099999999998 +0.82468699999999995 0.51475499999999996 -1.13137 +1.16971 0.097915100000000005 0.54315999999999998 +0.49145100000000003 0.28879100000000002 -1.1717599999999999 +0.442687 0.100619 -1.23404 +1.3400000000000001 0.22769 0.58409500000000003 +-0.94111900000000004 0.33653499999999997 1.21915 +1.53172 0.27339799999999997 0.51857799999999998 +0.66642199999999996 0.354381 -1.1000099999999999 +0.039011700000000003 0.46827099999999999 -1.4121900000000001 +-0.030186500000000002 0.31609799999999999 -1.46851 +0.151592 0.65908299999999997 -1.41771 +-0.430174 0.56726100000000002 -1.6213200000000001 +-0.377801 0.38971899999999998 -1.6422099999999999 +-0.44512299999999999 0.80998300000000001 -1.65523 +-0.87622100000000003 0.82206000000000001 -1.7941499999999999 +-1.0876999999999999 0.70392699999999997 -1.8851800000000001 +-4.6131000000000002 -7.5091200000000002 -2.0284200000000001 +-1.79013 0.96190900000000001 -2.10521 +-1.71784 1.15062 -2.0949499999999999 +-2.4583499999999998 1.30687 -2.3017099999999999 +-1.61466 0.60729500000000003 1.0916399999999999 +-1.85415 0.977522 1.0629500000000001 +-2.04982 0.90758899999999998 0.99208099999999999 +-2.4319099999999998 0.89155399999999996 0.91418600000000005 +-3.38551 1.1918 0.65929300000000002 +0.58455299999999999 -0.37964900000000001 1.38706 +-2.6882999999999999 -7.0574500000000002 0.965279 +-1.34941 -7.0521799999999999 1.3137000000000001 +-6.0053200000000002 -7.3340100000000001 -0.52059200000000005 +1.62415 0.28321600000000002 0.102413 +1.2467600000000001 -0.57991499999999996 0.0052355700000000002 +-8.6853200000000008 -6.8064799999999996 -0.71431 +9.9777500000000003 -6.5270400000000004 4.4200999999999997 +9.2733000000000008 -4.8632499999999999 3.1726899999999998 +0.205016 -0.044867900000000002 -1.55199 +0.41361999999999999 -0.010467000000000001 -1.3407 +8.2101100000000002 -5.7669300000000003 0.71921000000000002 +5.9664999999999999 -4.1269600000000004 0.25947700000000001 +10.811299999999999 -6.1912799999999999 1.45241 +9.0652000000000008 -5.7236000000000002 1.02318 +9.8432700000000004 -4.9104700000000001 3.2779199999999999 +8.6929499999999997 -4.77989 3.0493199999999998 +8.1236599999999992 -4.6460999999999997 2.9151500000000001 +3.3912800000000001 -2.3390300000000002 1.99505 +-2.8562599999999998 0.88732900000000003 0.84965199999999996 +-3.4991099999999999 1.0669299999999999 0.67467299999999997 +5.5303500000000003 -3.48272 2.1858 +-5.8748699999999996 -7.3706500000000004 -0.78905400000000003 +0.26601900000000001 -0.46992200000000001 1.5228999999999999 +-5.8125499999999999 -7.3941999999999997 -1.1449400000000001 +-1.3468599999999999 0.33447300000000002 1.20564 +6.8262499999999999 -4.0974500000000003 2.38828 +6.0446499999999999 -3.73644 2.2472500000000002 +-5.6147200000000002 -7.4232699999999996 -1.5608900000000001 +0.93142100000000005 -0.81582399999999999 1.6257699999999999 +-0.41020899999999999 -0.115068 1.40178 +8.2786399999999993 -4.5686900000000001 2.6181399999999999 +-5.4224899999999998 -7.4299499999999998 -2.10107 +1.48851 -0.98666100000000001 1.5978300000000001 +1.0636099999999999 -0.79583000000000004 1.59273 +-1.4810099999999999 0.66836700000000004 -2.0782099999999999 +5.4036 -4.3302199999999997 -0.107985 +8.8664500000000004 -4.7043299999999997 2.7475299999999998 +-0.53995499999999996 0.25966400000000001 -1.80667 +0.547925 -0.388687 -1.49468 +2.3970199999999999 -1.7167399999999999 -0.95057199999999997 +5.6688200000000002 -4.2295699999999998 0.0190134 +6.5782800000000003 -4.8739499999999998 0.27165699999999998 +7.4931299999999998 -5.3266999999999998 0.53987700000000005 +9.54392 -6.1975899999999999 1.08849 +1.59985 -1.01132 -1.16309 +3.3576199999999998 -2.4376000000000002 -0.65695899999999996 +4.5028600000000001 -3.3324699999999998 -0.31492700000000001 +0.86204899999999995 -0.38471100000000003 -1.31932 +2.97058 -2.0198299999999998 -0.73651299999999997 +6.3875500000000001 -4.5507200000000001 0.27247500000000002 +9.4144500000000004 -5.98109 1.0786800000000001 +1.3793500000000001 -0.68694299999999997 -1.1048899999999999 +4.44564 -3.1521499999999998 -0.27271800000000002 +5.5230100000000002 -3.9508999999999999 0.039372799999999999 +7.1349600000000004 -5.02529 0.46747499999999997 +-6.8007900000000001 -7.2595599999999996 -0.90957100000000002 +9.9568700000000003 -5.9123200000000002 1.26528 +-6.6684099999999997 -7.2856500000000004 -1.27678 +2.5912199999999999 -1.5639799999999999 -0.69027300000000003 +-6.5371499999999996 -7.30396 -1.61033 +2.14452 -1.28616 -0.92775799999999997 +3.3816899999999999 -2.2403300000000002 -0.53989699999999996 +4.5990000000000002 -3.17069 -0.14316899999999999 +7.7449000000000003 -5.2340200000000001 0.66847199999999996 +-6.36327 -7.3171499999999998 -2.1324999999999998 +8.4287799999999997 -5.5724299999999998 0.831202 +1.49244 -0.72232399999999997 -0.94796899999999995 +1.89192 -1.02088 -0.877861 +2.8469699999999998 -1.84016 1.77098 +4.9161299999999999 -3.1314700000000002 2.0756999999999999 +3.98847 -2.5625900000000001 1.9141699999999999 +9.4005500000000008 -4.7878800000000004 2.8673799999999998 +7.6878000000000002 -4.3983299999999996 2.49533 +7.0073299999999996 -4.12392 2.2557700000000001 +-6.3191600000000001 -7.2806300000000004 -2.97783 +6.3416399999999999 -3.8331200000000001 2.13652 +1.6909799999999999 -1.03087 1.5126500000000001 +1.0198 -0.592696 1.35826 +4.72858 -2.9496500000000001 1.8468199999999999 +3.8046000000000002 -2.3783799999999999 1.7338499999999999 +1.76068 -1.04271 1.4201600000000001 +7.4494800000000003 -4.4328099999999999 2.7289300000000001 +9.9188399999999994 -4.8431199999999999 3.0058799999999999 +-3.5244 1.0380400000000001 0.66997099999999998 +-8.6965699999999995 -6.9854599999999998 -1.0239 +8.2758000000000003 -6.8874300000000002 3.8603000000000001 +6.7022000000000004 -6.9001599999999996 3.4209999999999998 +4.8900100000000002 -6.9424799999999998 2.9229099999999999 +-3.97879 -7.3886599999999998 0.34668199999999999 +-7.7505199999999999 -7.1293100000000003 -0.75303200000000003 +-6.6978600000000004 -7.2484999999999999 -0.43068099999999998 +-8.7279999999999998 -6.9689399999999999 -0.93259099999999995 +-7.5225400000000002 -7.1608499999999999 -1.36642 +0.032067999999999999 -7.2619999999999996 1.5239499999999999 +-3.1258599999999999 -7.3856200000000003 0.61331800000000003 +-7.4074400000000002 -7.1729900000000004 -1.8073600000000001 +2.5128499999999998 -7.0486599999999999 2.2657500000000002 +-0.93531900000000001 -7.3195300000000003 1.2398199999999999 +-2.1470600000000002 -7.3650399999999996 0.893204 +-7.1285400000000001 -7.1947599999999996 -2.4817499999999999 +-1.8057000000000001 -7.2616800000000001 1.10212 +0.63899499999999998 6.78186 -1.55721 +-3.46834 -7.3097000000000003 0.63163400000000003 +-5.8773999999999997 -7.3061800000000003 -0.148616 +-5.9999399999999996 1.7241299999999999 -3.3404099999999999 +-4.6006999999999998 -7.3264699999999996 0.28085199999999999 +-2.2522700000000002 1.59914 -2.3037999999999998 +-6.93804 -7.1901099999999998 -3.1564700000000001 +-7.4845699999999997 -7.13375 -0.540933 +-6.5840500000000004 -7.1813900000000004 -0.223691 +-8.6270900000000008 -6.9232300000000002 -0.77966500000000005 +9.9791100000000004 -6.75047 4.3850800000000003 +7.8257300000000001 -6.7076799999999999 3.78775 +5.8493000000000004 -6.7693599999999998 3.2314500000000002 +2.3466 -6.9744200000000003 2.2562500000000001 +-4.8161399999999999 -7.1936200000000001 0.34305999999999998 +3.7258200000000001 -6.8349200000000003 2.6507299999999998 +-1.8496600000000001 -7.1702599999999999 1.1416999999999999 +-5.3858199999999998 -7.2570300000000003 0.119644 +-6.4389099999999999 -7.1152300000000004 -0.110254 +9.9771900000000002 -6.6266299999999996 4.4087199999999998 +2.47451 -6.8022299999999998 2.3385099999999999 +-8.5221800000000005 -6.9866099999999998 -1.8954 +-3.5132500000000002 -7.1922600000000001 0.70209500000000002 +-8.8856300000000008 1.9117200000000001 -4.1395400000000002 +-8.8853100000000005 1.91215 -4.1394599999999997 +-7.5648799999999996 -6.9989600000000003 -0.412385 +3 3 0 1 +3 3 1770 0 +3 1696 120 22 +3 786 1052 1069 +3 1039 1037 1059 +3 1108 1059 1040 +3 1041 1054 1108 +3 1071 1054 1044 +3 1060 1071 1044 +3 1165 1060 1055 +3 1189 1165 1055 +3 1696 22 23 +3 1122 1189 1056 +3 1044 1045 1060 +3 1040 1031 1041 +3 1037 1030 1040 +3 1039 1052 1029 +3 1005 1025 1056 +3 1056 1055 1038 +3 1044 1041 1032 +3 1032 1041 1031 +3 1029 1028 1037 +3 1031 1030 1026 +3 1026 1030 1028 +3 1028 1029 1024 +3 1045 1022 1038 +3 1022 1045 1035 +3 1021 1035 1032 +3 1032 1027 1020 +3 1026 1019 1027 +3 1019 1026 1024 +3 1019 1016 1020 +3 1015 1019 1024 +3 978 90 21 +3 1014 1741 1017 +3 36 46 7 +3 46 47 7 +3 1038 1022 1001 +3 1021 1012 1022 +3 1008 1011 1021 +3 1023 1014 1017 +3 1004 1016 1015 +3 1007 1015 673 +3 980 1012 1011 +3 1251 1023 1002 +3 980 972 1013 +3 1600 68 1556 +3 1002 1005 1001 +3 975 1011 982 +3 981 969 1004 +3 973 1251 1002 +3 974 980 975 +3 966 982 969 +3 980 974 962 +3 967 975 966 +3 968 1001 964 +3 1061 1046 261 +3 962 964 972 +3 969 970 961 +3 954 966 961 +3 815 305 306 +3 960 965 968 +3 954 957 967 +3 961 798 953 +3 968 964 959 +3 957 951 974 +3 951 955 962 +3 956 960 959 +3 959 964 955 +3 952 382 265 +3 836 267 398 +3 1765 956 959 +3 1207 1765 959 +3 951 1207 955 +3 957 954 947 +3 944 947 953 +3 947 946 957 +3 946 947 944 +3 60 85 36 +3 935 1206 946 +3 935 940 934 +3 1069 1039 1070 +3 978 47 90 +3 1107 1065 1068 +3 1133 1107 1069 +3 1070 1059 1108 +3 214 523 522 +3 1071 1109 1054 +3 1107 606 1065 +3 1133 1070 1157 +3 1109 1157 1108 +3 1060 1165 1164 +3 1065 608 602 +3 190 568 535 +3 1779 1927 896 +3 1071 1164 1237 +3 187 538 537 +3 1122 1049 1183 +3 896 898 1785 +3 200 199 896 +3 47 46 108 +3 47 108 109 +3 1049 1283 1263 +3 931 539 494 +3 1190 787 931 +3 1808 895 877 +3 872 878 928 +3 1808 877 862 +3 787 1190 1205 +3 787 1205 799 +3 508 586 554 +3 1805 1808 862 +3 1205 1816 789 +3 789 799 1205 +3 789 934 940 +3 46 85 133 +3 818 1795 821 +3 1795 827 821 +3 1816 934 789 +3 935 934 1816 +3 817 1482 818 +3 1206 935 1816 +3 192 579 582 +3 1207 946 1206 +3 133 85 372 +3 946 944 935 +3 108 133 136 +3 944 788 940 +3 829 847 658 +3 828 923 920 +3 860 665 847 +3 819 828 919 +3 828 920 919 +3 805 1752 807 +3 910 805 819 +3 910 819 911 +3 909 807 1752 +3 896 1785 1779 +3 1207 951 946 +3 788 944 790 +3 1635 956 1765 +3 877 895 199 +3 906 201 877 +3 891 871 201 +3 856 869 904 +3 876 856 903 +3 900 191 874 +3 1024 670 671 +3 92 133 4 +3 896 1814 898 +3 1029 708 670 +3 201 871 877 +3 886 218 874 +3 1024 671 673 +3 673 676 1007 +3 889 870 858 +3 875 888 868 +3 867 868 193 +3 878 872 874 +3 877 871 862 +3 859 891 858 +3 876 875 855 +3 874 872 866 +3 862 871 859 +3 856 857 869 +3 853 854 875 +3 851 853 868 +3 849 851 866 +3 90 109 129 +3 872 849 866 +3 786 708 1052 +3 872 860 849 +3 613 612 1107 +3 606 612 605 +3 615 1236 616 +3 1133 613 1107 +3 615 1157 1236 +3 1157 1109 1236 +3 1133 1157 615 +3 1109 620 1236 +3 1237 620 1109 +3 793 797 970 +3 846 835 859 +3 857 838 846 +3 845 838 857 +3 855 844 845 +3 854 843 844 +3 842 843 854 +3 634 633 1165 +3 841 842 853 +3 840 841 851 +3 849 860 840 +3 797 798 970 +3 860 847 840 +3 862 827 1795 +3 835 827 862 +3 845 837 833 +3 832 837 844 +3 831 832 843 +3 830 831 842 +3 829 830 841 +3 840 847 829 +3 717 1007 714 +3 838 833 826 +3 837 832 824 +3 821 827 835 +3 835 839 821 +3 837 824 825 +3 824 832 823 +3 831 822 823 +3 822 830 828 +3 923 828 829 +3 812 820 826 +3 679 191 678 +3 833 811 812 +3 808 811 825 +3 808 824 806 +3 804 806 823 +3 1007 676 714 +3 828 819 804 +3 717 793 970 +3 693 701 711 +3 981 717 970 +3 821 817 818 +3 817 821 816 +3 122 129 109 +3 820 916 816 +3 820 812 814 +3 811 813 812 +3 811 808 810 +3 808 806 909 +3 806 804 807 +3 804 819 805 +3 1237 1164 624 +3 1164 628 624 +3 693 715 689 +3 1165 626 1164 +3 802 1320 803 +3 1352 801 803 +3 1315 1313 1295 +3 1337 803 1320 +3 1332 1315 1295 +3 1307 1332 1295 +3 392 36 402 +3 1337 1371 803 +3 1338 1337 1320 +3 1316 1320 1313 +3 1319 1316 1313 +3 1315 1319 1313 +3 1332 1345 1315 +3 1333 1332 1307 +3 1338 1320 1322 +3 1320 1316 1322 +3 1322 1316 1324 +3 1324 1316 1319 +3 1351 1321 1315 +3 1313 802 1295 +3 1341 1338 1322 +3 1324 1343 1322 +3 1344 1324 1325 +3 1321 1358 1325 +3 1366 1345 1332 +3 802 1313 1320 +3 1347 1337 1338 +3 1338 1341 1348 +3 1343 1349 1341 +3 1353 1347 1348 +3 1355 1348 1349 +3 1344 1357 1349 +3 1344 1350 1398 +3 1399 1358 1351 +3 1364 1351 1345 +3 1366 1333 1716 +3 493 494 539 +3 1412 1369 1352 +3 1839 1352 1369 +3 1352 1371 1412 +3 1371 1337 1436 +3 392 349 60 +3 778 789 940 +3 1381 1353 1354 +3 1355 1385 1354 +3 1397 1355 1356 +3 1438 1357 1344 +3 788 774 940 +3 1430 1399 1351 +3 1366 1433 1364 +3 798 773 790 +3 790 785 788 +3 1839 1369 1408 +3 1436 1440 1371 +3 590 542 539 +3 1353 1381 1448 +3 1385 1428 1381 +3 703 702 701 +3 1397 1356 1437 +3 693 711 715 +3 787 799 761 +3 778 799 789 +3 790 758 785 +3 774 778 940 +3 785 774 788 +3 783 590 539 +3 1431 1430 1364 +3 797 773 798 +3 758 790 773 +3 1369 1439 1408 +3 1448 1457 1441 +3 1428 1449 1413 +3 1442 1428 1385 +3 1438 1398 1429 +3 1430 1429 1399 +3 1435 1717 1433 +3 1436 1441 1456 +3 1443 1442 1386 +3 1386 1397 1444 +3 1454 1431 1433 +3 1439 1455 1845 +3 1779 1785 898 +3 1741 1746 1736 +3 1412 1440 1464 +3 1441 1457 1456 +3 1458 1448 1413 +3 1458 1413 1449 +3 1428 1442 1459 +3 1450 1445 1437 +3 1437 1438 1451 +3 1429 1452 1451 +3 1453 1452 1430 +3 1453 1430 1431 +3 1475 1449 1428 +3 1444 1445 1460 +3 1451 1452 1461 +3 1462 1453 1454 +3 1455 1463 1850 +3 1464 1471 1455 +3 1456 1465 1464 +3 1466 1457 1458 +3 1475 1474 1458 +3 1467 1460 1450 +3 1451 1468 1450 +3 1469 1468 1461 +3 1453 1470 1461 +3 1464 1465 1483 +3 1456 1466 1473 +3 1458 1474 1492 +3 1476 1475 1459 +3 1476 1459 1444 +3 1477 1444 1460 +3 1478 1467 1468 +3 1488 1470 1462 +3 1821 1479 1462 +3 1849 1843 1481 +3 590 571 513 +3 1483 1491 1471 +3 346 372 60 +3 1483 1465 1473 +3 1484 1502 1473 +3 1492 1484 1466 +3 1485 1474 1475 +3 513 571 498 +3 661 498 571 +3 1475 1476 1485 +3 1486 1477 1467 +3 1487 1478 1469 +3 372 353 4 +3 1470 1488 1469 +3 467 487 486 +3 485 468 486 +3 571 464 661 +3 465 487 467 +3 468 467 486 +3 641 651 561 +3 1489 1488 1479 +3 1849 1481 1509 +3 1491 1509 1481 +3 1485 1503 1492 +3 1494 1485 1476 +3 1494 1476 1477 +3 1497 1486 1478 +3 1488 1498 1487 +3 1509 1499 1849 +3 479 420 480 +3 485 492 482 +3 481 469 482 +3 482 469 485 +3 481 480 420 +3 1485 1494 1504 +3 1505 1494 1495 +3 1506 1495 1486 +3 1486 1497 1507 +3 1511 1497 1487 +3 1519 1491 1501 +3 1483 1502 1520 +3 1510 1484 1503 +3 1529 1511 1498 +3 1498 1489 1516 +3 1519 1531 1509 +3 977 1085 985 +3 1520 1543 1501 +3 1523 1522 1510 +3 1085 1086 999 +3 1086 1087 1003 +3 1087 1088 1006 +3 1088 1089 1042 +3 1504 1505 1525 +3 1089 1090 1043 +3 1505 1506 1526 +3 1506 1507 1527 +3 1511 1528 1507 +3 1516 1530 1529 +3 1531 1546 1499 +3 1521 1534 1520 +3 1533 1522 1523 +3 1521 1522 1535 +3 1536 1533 1524 +3 1525 1526 1537 +3 1526 1527 1539 +3 1528 1540 1527 +3 1528 1529 1552 +3 1529 1530 1552 +3 1546 1542 1508 +3 1560 1543 1534 +3 1544 1535 1533 +3 1545 1536 1525 +3 1838 1541 1542 +3 1549 1544 1536 +3 1551 1545 1537 +3 129 132 90 +3 1542 1546 1553 +3 136 122 109 +3 1546 1547 1557 +3 1547 1548 1559 +3 1554 1549 1545 +3 651 1065 602 +3 1515 21 132 +3 1542 1553 1725 +3 1561 1560 1544 +3 783 931 787 +3 761 783 787 +3 1065 651 1068 +3 132 334 1515 +3 1538 1539 1562 +3 1540 1552 1577 +3 1577 1552 1530 +3 1553 1557 1569 +3 1563 1561 1549 +3 1551 1538 1564 +3 1565 1562 1540 +3 774 785 760 +3 666 797 793 +3 793 717 663 +3 60 349 413 +3 714 654 717 +3 786 1068 619 +3 1577 1565 1540 +3 1559 1560 1571 +3 778 659 761 +3 774 667 778 +3 1147 1148 977 +3 695 760 758 +3 1148 1150 1085 +3 1150 1151 1086 +3 346 60 413 +3 758 773 680 +3 773 797 677 +3 793 663 666 +3 717 654 655 +3 1151 1152 1087 +3 1152 1153 1088 +3 1089 1153 1224 +3 1224 1155 1089 +3 653 654 714 +3 708 786 610 +3 1572 1563 1554 +3 1553 1599 1585 +3 1727 1553 1585 +3 1553 1569 1587 +3 1594 1569 1558 +3 1595 1571 1561 +3 1597 1572 1551 +3 657 667 760 +3 676 673 645 +3 645 673 671 +3 671 670 644 +3 610 643 670 +3 651 627 1068 +3 1601 1594 1571 +3 1604 1595 1563 +3 1605 1597 1564 +3 1564 1562 1606 +3 1622 1585 1599 +3 659 667 657 +3 1622 1599 1615 +3 1599 1587 1615 +3 1587 1594 1616 +3 1617 1601 1595 +3 1595 1604 1618 +3 1619 1604 1572 +3 1572 1597 1621 +3 783 761 590 +3 657 632 659 +3 657 695 638 +3 695 680 649 +3 680 677 648 +3 677 666 647 +3 646 666 663 +3 651 641 597 +3 650 590 761 +3 632 650 761 +3 1624 1622 1615 +3 1623 1616 1601 +3 657 638 596 +3 648 647 635 +3 646 640 647 +3 646 655 639 +3 655 654 639 +3 631 654 653 +3 645 630 653 +3 638 649 617 +3 635 625 636 +3 640 622 635 +3 610 598 643 +3 596 589 632 +3 640 639 623 +3 623 639 631 +3 614 631 630 +3 611 630 644 +3 636 625 601 +3 581 619 597 +3 590 650 618 +3 589 618 650 +3 607 625 622 +3 604 622 623 +3 1624 1615 1616 +3 1625 1624 1616 +3 595 574 617 +3 614 593 623 +3 614 611 591 +3 591 611 599 +3 581 576 610 +3 1621 1605 1626 +3 576 572 598 +3 541 556 597 +3 597 641 541 +3 1624 1627 1628 +3 1627 1624 1625 +3 1629 1625 1623 +3 1623 1617 1630 +3 588 601 607 +3 600 587 604 +3 583 599 598 +3 1617 1618 1631 +3 1618 1619 1632 +3 1619 1621 1633 +3 1902 1627 1634 +3 1211 1214 1148 +3 1634 1627 1636 +3 1214 1216 1150 +3 574 569 596 +3 588 580 595 +3 1627 1625 1636 +3 466 372 442 +3 1216 1218 1151 +3 594 573 607 +3 600 593 585 +3 591 578 593 +3 577 591 583 +3 618 571 590 +3 567 581 556 +3 1636 1637 1634 +3 1837 1634 1637 +3 1218 1220 1152 +3 392 402 528 +3 1637 1636 1638 +3 569 511 589 +3 566 588 573 +3 1220 1222 1153 +3 594 587 525 +3 1224 1153 1222 +3 587 585 565 +3 575 585 584 +3 1368 1228 1155 +3 578 564 584 +3 1202 1300 1178 +3 1636 1629 1638 +3 1629 1630 1639 +3 566 515 580 +3 524 577 563 +3 563 583 572 +3 567 562 576 +3 1630 1631 1640 +3 1631 1632 1641 +3 1632 1633 1643 +3 525 526 573 +3 521 572 562 +3 571 618 570 +3 1367 1368 1224 +3 511 570 618 +3 515 516 574 +3 556 491 567 +3 514 566 526 +3 519 575 564 +3 518 564 578 +3 524 517 578 +3 521 512 563 +3 567 491 499 +3 490 556 541 +3 519 520 565 +3 499 500 562 +3 686 459 442 +3 525 509 526 +3 427 686 442 +3 502 524 512 +3 509 495 526 +3 431 427 444 +3 525 520 506 +3 521 500 501 +3 508 490 541 +3 1644 1637 1645 +3 1637 1638 1645 +3 520 505 506 +3 519 504 505 +3 504 518 503 +3 444 427 346 +3 1214 1300 1360 +3 503 517 502 +3 478 512 501 +3 515 514 496 +3 514 495 487 +3 507 489 511 +3 507 516 496 +3 1836 1837 1644 +3 346 413 444 +3 1837 1637 1644 +3 1641 1643 1647 +3 413 392 444 +3 571 570 497 +3 489 497 570 +3 492 483 509 +3 504 481 505 +3 480 481 504 +3 479 502 478 +3 501 500 477 +3 499 491 476 +3 1828 1836 1644 +3 1650 1644 1652 +3 1644 1645 1652 +3 1218 1361 1362 +3 1362 1363 1220 +3 1363 1365 1222 +3 1367 1222 1365 +3 1654 1652 1639 +3 1639 1640 1655 +3 1640 1641 1656 +3 1647 1656 1641 +3 1828 1644 1650 +3 1658 1652 1657 +3 1658 1650 1652 +3 1667 1657 1654 +3 487 465 496 +3 483 486 495 +3 479 480 503 +3 458 490 508 +3 1657 1652 1654 +3 1696 1667 1655 +3 1667 1654 1655 +3 1696 1655 1656 +3 1650 1658 1660 +3 1658 1657 1668 +3 482 492 506 +3 481 482 505 +3 491 490 475 +3 1668 1657 1667 +3 1696 1656 1697 +3 571 497 464 +3 465 488 507 +3 486 483 485 +3 477 470 478 +3 439 500 476 +3 508 462 458 +3 472 471 463 +3 463 471 544 +3 470 428 479 +3 470 477 428 +3 420 479 428 +3 469 481 420 +3 469 391 485 +3 1697 120 1696 +3 1697 1647 314 +3 1371 1352 803 +3 1439 1845 1408 +3 1843 1463 1471 +3 1499 1508 1849 +3 802 1379 1295 +3 1307 1295 1379 +3 468 485 391 +3 468 266 467 +3 467 266 465 +3 207 497 489 +3 497 207 464 +3 488 266 207 +3 207 661 464 +3 1822 1516 1489 +3 1822 1489 1479 +3 1821 1822 1479 +3 1821 1454 1717 +3 1433 1717 1454 +3 459 466 442 +3 1725 1838 1542 +3 1727 1725 1553 +3 1585 1622 1628 +3 1627 1902 1628 +3 1828 1660 1835 +3 1605 1606 1626 +3 1633 1626 1646 +3 784 1646 1626 +3 1646 1643 1633 +3 1565 1606 1562 +3 1606 1565 784 +3 784 1626 1606 +3 1646 1647 1643 +3 457 458 462 +3 703 455 392 +3 457 462 456 +3 474 456 462 +3 392 528 703 +3 473 454 456 +3 474 473 456 +3 454 473 472 +3 472 460 454 +3 472 463 460 +3 452 456 454 +3 451 454 460 +3 1367 1365 1493 +3 1493 1403 1367 +3 1404 1368 1403 +3 460 453 450 +3 475 458 449 +3 449 457 452 +3 448 452 451 +3 447 451 450 +3 183 446 450 +3 453 183 450 +3 476 475 445 +3 445 449 448 +3 443 448 447 +3 441 447 446 +3 440 446 183 +3 183 179 440 +3 445 439 476 +3 438 443 441 +3 1590 1642 1363 +3 1493 1365 1642 +3 437 441 440 +3 436 440 179 +3 1404 1403 1496 +3 179 435 436 +3 477 439 445 +3 434 445 438 +3 433 438 437 +3 430 437 436 +3 429 436 435 +3 435 172 429 +3 1658 1668 196 +3 477 434 428 +3 423 434 433 +3 426 433 432 +3 1532 1590 1362 +3 425 432 430 +3 430 429 424 +3 424 429 172 +3 164 424 172 +3 1647 1646 314 +3 428 423 420 +3 410 423 426 +3 419 426 425 +3 418 425 424 +3 416 424 421 +3 424 164 421 +3 415 418 416 +3 414 416 158 +3 421 158 416 +3 410 469 420 +3 410 419 387 +3 387 399 410 +3 419 415 390 +3 415 414 400 +3 1496 1550 1574 +3 1574 1588 1555 +3 406 389 414 +3 158 406 414 +3 1744 1283 1735 +3 1017 1736 1735 +3 1741 1736 1017 +3 387 391 399 +3 387 390 360 +3 389 406 388 +3 386 390 400 +3 1550 1610 1659 +3 400 389 378 +3 385 378 389 +3 1748 1014 1251 +3 387 360 323 +3 1251 973 1737 +3 1737 1748 1251 +3 973 965 1737 +3 965 1738 1737 +3 965 960 1739 +3 1742 1739 960 +3 385 359 378 +3 323 468 391 +3 323 360 386 +3 359 358 386 +3 359 385 57 +3 1744 1735 1745 +3 1741 1014 1748 +3 266 468 323 +3 246 359 268 +3 359 57 268 +3 213 323 358 +3 1603 1688 1653 +3 246 221 358 +3 268 220 246 +3 1745 1736 1746 +3 1747 1746 1741 +3 1610 1570 1653 +3 1748 1737 1749 +3 1738 1750 1749 +3 1751 1750 1739 +3 1751 1739 1742 +3 1758 1751 1742 +3 1743 1744 1752 +3 1745 1753 1752 +3 1747 1748 1754 +3 1574 1659 1666 +3 213 221 210 +3 221 220 210 +3 220 37 210 +3 37 31 210 +3 1755 1754 1749 +3 1750 1756 1755 +3 1751 1757 1756 +3 211 207 266 +3 213 210 209 +3 1758 1757 1751 +3 207 211 209 +3 1653 1702 1715 +3 20 205 210 +3 1610 1715 1718 +3 210 31 20 +3 1824 1482 1758 +3 1659 1718 1721 +3 206 209 205 +3 20 12 205 +3 1666 1721 1740 +3 206 681 207 +3 205 683 206 +3 194 683 205 +3 205 12 194 +3 1735 1049 1017 +3 1049 1735 1283 +3 1283 1744 1263 +3 1744 1759 1263 +3 1760 1759 1744 +3 960 956 1742 +3 1742 956 1651 +3 1771 1715 1768 +3 956 1635 1651 +3 1718 1771 1773 +3 460 189 453 +3 1718 1773 1786 +3 1744 1743 1760 +3 1743 910 1760 +3 1752 805 1743 +3 1740 1786 1811 +3 909 1753 1746 +3 1742 1651 1824 +3 1758 1742 1824 +3 809 1746 1747 +3 810 1747 1754 +3 813 1754 1755 +3 814 1755 1756 +3 916 1756 1757 +3 1758 816 1757 +3 910 1743 805 +3 1756 916 814 +3 1771 1842 1844 +3 816 916 1757 +3 1773 1844 1848 +3 1762 1695 1763 +3 1772 1766 1762 +3 1786 1848 1852 +3 142 406 158 +3 1763 1767 1772 +3 1764 1769 1763 +3 1764 1765 1207 +3 1769 1774 1767 +3 1772 1784 1780 +3 1767 1775 1772 +3 1800 1780 1784 +3 1842 1876 1878 +3 1774 1207 1206 +3 1844 1878 1880 +3 1800 1784 1787 +3 1848 1880 1885 +3 1784 1775 1788 +3 1788 1775 1774 +3 1788 1816 1787 +3 1895 1852 1885 +3 1816 1788 1206 +3 1815 1787 1817 +3 86 161 87 +3 1816 1817 1787 +3 1876 1910 1913 +3 156 18 88 +3 1878 1913 1916 +3 1190 1817 1816 +3 1816 1205 1190 +3 1920 1885 1916 +3 1818 1817 1190 +3 220 44 37 +3 1898 1156 1820 +3 1928 1895 1920 +3 1820 1156 1689 +3 1689 1695 1762 +3 1766 1854 1820 +3 1910 1905 1782 +3 1689 1762 1820 +3 1700 1706 1764 +3 385 388 74 +3 852 1928 1920 +3 74 56 385 +3 1943 1782 1905 +3 1706 1635 1764 +3 1763 1695 1700 +3 1764 1763 1700 +3 1635 1765 1764 +3 1736 1745 1735 +3 1752 1753 909 +3 1739 1738 965 +3 1656 1647 1697 +3 1746 809 909 +3 810 809 1747 +3 931 494 1190 +3 406 142 388 +3 88 58 64 +3 2 45 55 +3 1850 1463 1843 +3 55 58 2 +3 1849 1508 1541 +3 1839 1840 1904 +3 1628 1846 1585 +3 1819 1840 1839 +3 1841 1585 1847 +3 1727 1841 1890 +3 1727 1890 1725 +3 1716 1333 1307 +3 1854 1849 1541 +3 1780 1843 1849 +3 1835 1903 1892 +3 1828 1892 1857 +3 1836 1857 1851 +3 1837 1851 1893 +3 1902 1893 1846 +3 192 189 463 +3 189 192 188 +3 460 463 189 +3 188 185 189 +3 185 188 186 +3 187 186 188 +3 186 187 190 +3 185 453 189 +3 1849 1854 1780 +3 183 453 185 +3 185 181 183 +3 185 186 181 +3 1516 1822 1942 +3 1942 1577 1516 +3 181 186 184 +3 183 181 178 +3 178 179 183 +3 175 178 181 +3 184 180 175 +3 180 177 175 +3 435 179 178 +3 178 174 435 +3 178 173 174 +3 177 6 173 +3 171 172 435 +3 170 171 174 +3 174 171 435 +3 173 166 170 +3 6 169 166 +3 167 171 170 +3 162 167 170 +3 172 171 164 +3 166 169 165 +3 1889 1853 1838 +3 167 160 164 +3 167 159 160 +3 157 159 162 +3 161 157 165 +3 165 87 161 +3 421 164 160 +3 154 159 157 +3 1854 1853 1820 +3 160 155 158 +3 158 421 160 +3 155 160 154 +3 156 128 157 +3 156 161 86 +3 128 141 154 +3 155 134 142 +3 142 158 155 +3 141 130 155 +3 141 128 65 +3 142 134 66 +3 4 353 466 +3 134 130 95 +3 95 130 65 +3 94 128 89 +3 88 89 156 +3 388 142 74 +3 66 74 142 +3 784 1565 1577 +3 59 61 65 +3 59 94 64 +3 88 64 89 +3 63 56 66 +3 56 74 66 +3 66 95 63 +3 61 62 95 +3 49 50 61 +3 55 49 59 +3 64 58 55 +3 48 57 56 +3 385 56 57 +3 56 63 48 +3 48 63 62 +3 50 53 62 +3 1307 1947 1716 +3 1820 1853 1897 +3 50 45 41 +3 1846 1894 1896 +3 48 43 268 +3 268 57 48 +3 43 48 53 +3 1936 1944 1435 +3 41 42 53 +3 45 40 41 +3 40 45 2 +3 1847 1896 1568 +3 1841 1568 1899 +3 44 220 268 +3 43 44 268 +3 39 42 41 +3 44 43 35 +3 37 44 35 +3 35 43 39 +3 32 33 39 +3 34 32 38 +3 40 97 34 +3 1891 1900 1897 +3 37 29 31 +3 33 28 29 +3 32 27 28 +3 27 32 24 +3 20 31 29 +3 29 19 20 +3 19 29 17 +3 17 27 16 +3 15 19 14 +3 17 13 14 +3 20 15 12 +3 1379 1826 1947 +3 12 15 11 +3 13 10 11 +3 10 13 16 +3 1901 1898 1897 +3 194 12 8 +3 11 8 12 +3 11 9 8 +3 1902 1634 1837 +3 8 4 194 +3 4 5 194 +3 801 1839 1904 +3 4 8 9 +3 466 5 4 +3 1894 1582 1896 +3 1408 1845 1815 +3 1839 1818 1819 +3 1822 1821 1938 +3 1818 1839 1408 +3 1897 1898 1820 +3 1800 1815 1845 +3 1815 1818 1408 +3 1780 1854 1766 +3 1800 1845 1850 +3 1532 1919 1915 +3 1910 1929 1912 +3 1915 1926 1909 +3 1921 1923 1919 +3 1933 1934 1907 +3 1202 1917 1921 +3 1923 1926 1915 +3 1937 1935 1908 +3 1935 1938 1917 +3 163 366 202 +3 1939 1926 1923 +3 1944 1936 1923 +3 1930 1940 1947 +3 1646 1933 1941 +3 1940 1939 1936 +3 1933 1646 784 +3 1944 1938 1821 +3 1947 1940 1716 +3 1307 1379 1947 +3 1821 1717 1944 +3 1717 1435 1944 +3 1936 1435 1716 +3 484 815 306 +3 1906 815 484 +3 40 2 97 +3 100 99 177 +3 100 177 180 +3 1936 1716 1940 +3 102 180 75 +3 105 102 75 +3 75 190 106 +3 92 4 107 +3 16 110 10 +3 16 24 96 +3 96 24 97 +3 5 466 459 +3 87 169 98 +3 98 169 6 +3 106 105 75 +3 97 2 111 +3 2 58 112 +3 112 58 88 +3 88 18 121 +3 98 114 86 +3 1935 1942 1822 +3 122 136 92 +3 88 121 116 +3 86 113 18 +3 124 110 96 +3 1577 1942 1937 +3 124 96 115 +3 117 98 99 +3 118 99 100 +3 1934 784 1577 +3 100 102 119 +3 125 102 105 +3 126 105 106 +3 135 116 121 +3 135 121 113 +3 147 129 122 +3 148 124 115 +3 116 135 149 +3 1480 1918 1919 +3 131 113 114 +3 114 117 137 +3 117 118 138 +3 138 118 119 +3 119 125 139 +3 126 140 125 +3 148 115 143 +3 112 145 111 +3 145 112 149 +3 131 146 135 +3 147 132 129 +3 145 150 143 +3 1359 1914 1918 +3 1702 1688 1924 +3 340 148 143 +3 131 195 146 +3 126 127 153 +3 148 340 163 +3 145 198 150 +3 198 145 149 +3 137 230 131 +3 139 140 151 +3 153 152 140 +3 147 163 202 +3 149 146 168 +3 146 197 168 +3 1905 1912 976 +3 1933 1932 1941 +3 1941 1827 1646 +3 137 138 176 +3 138 151 176 +3 1530 1516 1577 +3 1716 1435 1366 +3 1920 777 852 +3 777 1920 1916 +3 1943 777 1916 +3 1943 1916 1913 +3 191 204 203 +3 191 900 215 +3 1913 1782 1943 +3 1910 1782 1913 +3 1885 1920 1895 +3 1880 1916 1885 +3 1916 1880 1878 +3 1913 1878 1876 +3 1910 1876 1911 +3 1895 863 1852 +3 1885 1852 1848 +3 888 875 240 +3 875 876 240 +3 247 876 903 +3 240 232 888 +3 883 703 879 +3 193 888 232 +3 240 876 247 +3 240 234 232 +3 890 885 703 +3 889 311 870 +3 889 891 332 +3 350 332 891 +3 269 903 904 +3 904 288 269 +3 904 870 288 +3 311 288 870 +3 218 215 900 +3 218 216 215 +3 1880 1848 1844 +3 1878 1844 1842 +3 703 885 887 +3 224 151 152 +3 528 890 703 +3 1876 1842 1823 +3 224 176 151 +3 1823 1911 1876 +3 218 193 225 +3 1726 1811 863 +3 863 1811 1852 +3 1852 1811 1786 +3 1848 1786 1773 +3 1844 1773 1771 +3 1842 1771 1768 +3 1768 1823 1842 +3 1911 1823 1768 +3 239 230 176 +3 176 229 239 +3 784 1934 1933 +3 195 230 239 +3 1924 1911 1768 +3 1768 1702 1924 +3 1673 1740 1726 +3 1740 1811 1726 +3 1721 1786 1740 +3 1786 1721 1718 +3 1947 1826 1931 +3 1715 1771 1718 +3 264 168 197 +3 197 254 264 +3 1702 1768 1715 +3 168 264 287 +3 287 198 168 +3 150 296 310 +3 198 296 150 +3 1666 1740 1673 +3 1721 1666 1659 +3 1718 1659 1610 +3 144 331 340 +3 1715 1610 1653 +3 340 348 163 +3 1688 1702 1653 +3 1688 1642 1909 +3 200 906 199 +3 896 417 200 +3 1673 865 1588 +3 1588 1666 1673 +3 1588 1574 1666 +3 1603 1653 1570 +3 1935 1822 1938 +3 1642 1688 1603 +3 1642 1590 1915 +3 1659 1574 1550 +3 1550 1570 1610 +3 1588 1500 1555 +3 1496 1574 1555 +3 890 528 912 +3 1493 1570 1550 +3 1570 1493 1603 +3 412 896 1927 +3 412 417 896 +3 1532 1480 1919 +3 1500 1432 1555 +3 1496 1555 1432 +3 528 917 912 +3 1550 1496 1403 +3 1493 1550 1403 +3 1577 1937 1934 +3 1642 1603 1493 +3 1480 1532 1362 +3 412 1927 422 +3 1480 1359 1918 +3 918 402 922 +3 1432 1500 848 +3 1432 1323 1496 +3 1496 1323 1404 +3 1365 1363 1642 +3 1363 1362 1590 +3 1359 1299 1914 +3 1323 1432 848 +3 1367 1403 1368 +3 1361 1480 1362 +3 1480 1361 1360 +3 1359 1480 1360 +3 1222 1220 1363 +3 1220 1218 1362 +3 1360 1361 1218 +3 1300 1359 1360 +3 1300 1299 1359 +3 1202 1299 1300 +3 1323 1228 1404 +3 1368 1404 1228 +3 1218 1216 1360 +3 1216 1214 1360 +3 7 950 991 +3 1214 1211 1300 +3 1323 1199 1228 +3 1222 1367 1224 +3 202 377 334 +3 1300 1211 1178 +3 1199 1053 1228 +3 1053 1155 1228 +3 1224 1368 1155 +3 1153 1152 1220 +3 1152 1151 1218 +3 1151 1150 1216 +3 1150 1148 1214 +3 1148 1147 1211 +3 1178 1211 1147 +3 1178 1908 1202 +3 1178 1147 1078 +3 1908 1178 1078 +3 1053 1199 861 +3 1053 1090 1155 +3 1090 1089 1155 +3 1089 1088 1153 +3 1088 1087 1152 +3 1087 1086 1151 +3 1086 1085 1150 +3 214 203 204 +3 1085 977 1148 +3 977 1033 1147 +3 989 402 36 +3 1078 1147 1033 +3 1078 1907 1908 +3 815 1906 1907 +3 815 1907 1078 +3 1921 1938 1944 +3 395 1053 861 +3 1053 395 1090 +3 395 1043 1090 +3 1042 1089 1043 +3 1006 1088 1042 +3 1006 1003 1087 +3 1003 999 1086 +3 985 1085 999 +3 153 214 152 +3 989 922 402 +3 214 204 217 +3 217 204 215 +3 217 224 152 +3 217 215 216 +3 36 990 989 +3 216 223 217 +3 1033 815 1078 +3 216 218 225 +3 223 216 222 +3 36 991 990 +3 223 219 224 +3 836 395 861 +3 1043 913 1042 +3 222 228 223 +3 219 223 228 +3 176 224 229 +3 224 219 229 +3 193 232 225 +3 222 225 226 +3 228 233 219 +3 229 219 233 +3 227 238 228 +3 233 243 229 +3 239 229 243 +3 226 232 234 +3 227 226 236 +3 238 242 233 +3 7 978 994 +3 234 240 247 +3 244 241 237 +3 978 963 994 +3 253 242 241 +3 243 242 253 +3 243 245 239 +3 247 249 234 +3 236 234 250 +3 998 997 21 +3 1515 998 21 +3 978 997 971 +3 236 251 244 +3 241 256 253 +3 254 239 245 +3 254 197 195 +3 195 239 254 +3 247 903 249 +3 244 255 252 +3 253 257 245 +3 263 254 245 +3 903 269 249 +3 250 249 258 +3 259 251 250 +3 259 255 251 +3 256 262 257 +3 254 263 264 +3 260 255 271 +3 260 273 262 +3 257 262 274 +3 263 257 276 +3 263 277 264 +3 834 1033 316 +3 1033 977 316 +3 815 1033 834 +3 258 269 278 +3 1939 1940 1930 +3 259 258 278 +3 280 271 259 +3 271 280 272 +3 282 273 272 +3 273 283 274 +3 1936 1939 1923 +3 284 276 274 +3 276 285 277 +3 264 277 286 +3 287 264 286 +3 1923 1921 1944 +3 311 278 288 +3 278 297 279 +3 289 280 279 +3 290 282 280 +3 282 291 283 +3 283 292 284 +3 284 293 285 +3 285 294 286 +3 295 287 286 +3 287 295 296 +3 198 287 296 +3 298 289 297 +3 289 299 290 +3 290 300 291 +3 291 304 292 +3 307 293 292 +3 293 308 294 +3 294 309 295 +3 310 296 295 +3 297 311 312 +3 1935 1937 1942 +3 315 304 300 +3 304 317 307 +3 307 318 308 +3 308 319 309 +3 309 320 310 +3 310 322 150 +3 150 322 144 +3 889 332 311 +3 312 311 332 +3 312 341 298 +3 299 298 333 +3 299 343 313 +3 315 324 317 +3 326 318 317 +3 327 319 318 +3 319 327 320 +3 329 321 320 +3 330 322 321 +3 331 144 322 +3 313 343 344 +3 313 344 324 +3 326 335 327 +3 327 337 329 +3 338 330 329 +3 339 331 330 +3 340 331 339 +3 341 342 333 +3 324 344 351 +3 325 324 352 +3 1931 1929 1947 +3 325 362 335 +3 335 354 336 +3 1929 1930 1947 +3 345 338 337 +3 338 347 339 +3 348 340 339 +3 350 367 341 +3 341 368 342 +3 333 342 369 +3 333 370 343 +3 371 344 361 +3 336 355 345 +3 356 347 345 +3 357 348 347 +3 163 348 357 +3 891 201 350 +3 371 380 351 +3 373 352 351 +3 362 352 374 +3 354 362 363 +3 354 364 355 +3 355 376 356 +3 356 365 357 +3 357 366 163 +3 1043 395 409 +3 370 379 361 +3 361 393 371 +3 375 363 362 +3 377 366 357 +3 366 377 202 +3 201 906 367 +3 367 906 368 +3 368 200 369 +3 369 401 370 +3 380 381 373 +3 373 381 374 +3 374 383 375 +3 394 376 364 +3 397 365 376 +3 1006 1042 901 +3 901 1042 913 +3 393 403 380 +3 375 383 396 +3 363 375 396 +3 394 363 396 +3 884 1006 901 +3 397 384 377 +3 365 397 377 +3 884 901 281 +3 884 880 1006 +3 880 1003 1006 +3 301 1003 880 +3 301 999 1003 +3 301 850 985 +3 401 411 393 +3 383 381 404 +3 405 396 383 +3 396 405 384 +3 384 394 396 +3 384 397 394 +3 985 999 301 +3 401 200 417 +3 412 403 393 +3 407 404 403 +3 408 405 404 +3 405 408 384 +3 977 985 850 +3 408 407 422 +3 850 316 977 +3 412 411 417 +3 834 305 815 +3 777 1943 800 +3 1500 1588 865 +3 1905 976 1943 +3 1532 1915 1590 +3 1915 1909 1642 +3 1299 1202 1914 +3 1323 848 1168 +3 1199 1323 1168 +3 1199 1168 861 +3 1754 813 810 +3 913 1043 409 +3 301 302 850 +3 1755 814 813 +3 1650 1660 1828 +3 1656 1655 1640 +3 1655 1654 1639 +3 1758 817 816 +3 1645 1639 1652 +3 422 1927 1925 +3 493 769 768 +3 765 493 543 +3 765 754 753 +3 765 752 754 +3 751 765 750 +3 765 756 750 +3 765 751 752 +3 748 765 747 +3 765 749 747 +3 765 746 749 +3 765 753 745 +3 745 746 765 +3 756 765 543 +3 756 755 750 +3 743 765 744 +3 765 748 744 +3 1370 765 743 +3 1370 1378 765 +3 1380 493 765 +3 802 493 1379 +3 493 802 801 +3 493 609 769 +3 609 737 738 +3 609 692 737 +3 692 688 691 +3 688 724 691 +3 693 703 701 +3 738 737 740 +3 692 691 737 +3 688 693 689 +3 724 688 689 +3 703 883 702 +3 493 768 684 +3 203 678 191 +3 679 675 674 +3 928 669 668 +3 672 679 674 +3 878 679 672 +3 872 928 668 +3 664 662 658 +3 860 668 665 +3 847 664 658 +3 920 923 656 +3 923 829 658 +3 819 919 911 +3 910 911 652 +3 191 679 878 +3 878 672 928 +3 872 668 860 +3 664 847 665 +3 1263 642 1183 +3 626 1165 633 +3 1122 637 634 +3 1189 1122 634 +3 1938 1921 1917 +3 626 629 628 +3 1164 626 628 +3 1165 1189 634 +3 1237 621 620 +3 615 613 1133 +3 1263 1183 1049 +3 606 1107 612 +3 1065 606 608 +3 651 592 561 +3 557 586 508 +3 190 187 568 +3 541 559 558 +3 541 560 559 +3 541 641 560 +3 602 592 651 +3 641 561 560 +3 541 558 557 +3 508 554 555 +3 462 555 553 +3 1929 1931 1912 +3 462 508 555 +3 462 553 552 +3 552 551 474 +3 550 549 472 +3 474 551 548 +3 472 547 471 +3 472 549 547 +3 493 461 494 +3 1929 1924 1930 +3 473 548 550 +3 192 463 579 +3 508 541 557 +3 472 473 550 +3 1939 1930 1924 +3 473 474 548 +3 474 462 552 +3 463 544 579 +3 544 471 545 +3 192 540 188 +3 188 540 538 +3 187 188 538 +3 190 535 536 +3 660 609 498 +3 106 536 534 +3 106 190 536 +3 187 537 568 +3 533 532 127 +3 529 531 153 +3 527 523 153 +3 203 522 678 +3 106 534 533 +3 127 532 529 +3 214 153 523 +3 203 214 522 +3 153 127 529 +3 530 153 531 +3 127 106 533 +3 153 530 527 +3 1932 1933 484 +3 498 609 513 +3 1646 1827 314 +3 850 302 303 +3 513 609 510 +3 590 510 603 +3 395 398 409 +3 836 921 275 +3 395 836 398 +3 1064 270 1063 +3 921 265 275 +3 952 1036 382 +3 836 275 267 +3 1046 248 261 +3 1062 1009 1047 +3 1048 235 1051 +3 1064 1051 235 +3 231 1073 1058 +3 1833 1877 103 +3 1692 1676 91 +3 1698 1692 104 +3 1676 101 84 +3 1877 1731 82 +3 1833 81 1864 +3 1731 1698 79 +3 1600 1578 76 +3 1578 1903 72 +3 1903 1835 212 +3 1864 81 1057 +3 590 603 542 +3 82 83 1877 +3 1731 78 82 +3 1877 83 103 +3 79 78 1731 +3 1698 104 80 +3 1676 84 91 +3 1692 91 104 +3 1698 80 79 +3 1556 69 93 +3 1556 68 69 +3 1556 93 101 +3 1600 70 68 +3 1903 67 77 +3 1660 71 54 +3 76 70 1600 +3 1578 72 73 +3 1903 212 67 +3 1903 77 72 +3 1835 208 212 +3 1660 1658 52 +3 1835 1660 54 +3 208 1835 54 +3 1924 1688 1939 +3 1660 52 71 +3 1658 51 52 +3 1688 1926 1939 +3 1578 73 76 +3 196 51 1658 +3 609 493 539 +3 1668 1667 26 +3 1667 182 30 +3 182 1667 25 +3 542 609 539 +3 1667 1696 25 +3 781 1278 1472 +3 1667 30 26 +3 493 546 543 +3 1696 23 25 +3 609 603 510 +3 1482 1317 818 +3 661 660 498 +3 47 978 7 +3 36 392 60 +3 46 36 85 +3 109 90 47 +3 85 60 372 +3 108 46 133 +3 109 108 136 +3 133 92 136 +3 133 372 4 +3 90 132 21 +3 392 413 349 +3 372 466 353 +3 346 442 372 +3 686 427 431 +3 442 346 427 +3 455 444 392 +3 431 444 455 +3 879 703 887 +3 528 402 917 +3 402 918 917 +3 36 7 991 +3 978 21 997 +3 950 7 994 +3 978 971 963 +3 1278 781 1276 +3 1278 1317 1472 +3 1695 1689 1761 +3 1700 1695 1794 +3 1706 1700 1796 +3 1799 1635 1706 +3 1586 1776 1713 +3 1761 1783 1794 +3 1794 775 1796 +3 1799 1796 776 +3 780 1801 1799 +3 1713 1776 1825 +3 779 1761 1713 +3 1783 1761 779 +3 1317 780 776 +3 1825 782 1336 +3 1908 1934 1937 +3 779 1336 1783 +3 776 775 781 +3 542 603 609 +3 1884 1875 1732 +3 1874 1873 1883 +3 1888 1879 1881 +3 1872 1868 1830 +3 1834 1877 1871 +3 1884 1886 1863 +3 1861 1874 1870 +3 1867 1873 1874 +3 1882 1873 1869 +3 1868 1872 1881 +3 1831 1886 1871 +3 1862 1870 1875 +3 1867 1866 1869 +3 1866 1860 1865 +3 1865 1859 1829 +3 1813 895 1809 +3 1810 1812 1809 +3 1806 1807 1810 +3 1809 1808 1806 +3 1808 1809 895 +3 1806 1803 1804 +3 1798 1804 1797 +3 1797 1803 1805 +3 660 661 207 +3 1805 1795 1802 +3 1790 1830 1793 +3 1792 1793 1798 +3 1797 1802 1792 +3 459 194 5 +3 692 609 660 +3 1888 1887 1724 +3 1733 1734 1879 +3 194 459 686 +3 431 694 686 +3 431 455 694 +3 1732 1729 1884 +3 1724 1733 1888 +3 1883 1723 1708 +3 1722 1711 1732 +3 206 682 681 +3 194 685 683 +3 207 681 660 +3 206 683 682 +3 681 682 687 +3 682 683 690 +3 683 685 690 +3 686 694 685 +3 660 687 692 +3 694 693 690 +3 694 455 703 +3 693 694 703 +3 709 706 707 +3 706 743 696 +3 710 709 697 +3 699 716 1372 +3 710 697 698 +3 705 704 700 +3 713 712 698 +3 1707 1832 1730 +3 699 700 719 +3 986 721 722 +3 721 720 722 +3 725 986 723 +3 725 727 728 +3 1400 725 728 +3 728 727 726 +3 732 733 762 +3 739 1401 736 +3 739 1406 1401 +3 757 1406 739 +3 759 1406 757 +3 739 730 729 +3 757 731 759 +3 1415 762 763 +3 1409 1415 735 +3 734 762 733 +3 1409 735 764 +3 739 741 742 +3 732 759 731 +3 1711 1701 1729 +3 1887 1714 1724 +3 1708 1712 1730 +3 1707 1705 1722 +3 1710 1720 1719 +3 1709 1723 1733 +3 1704 1719 1701 +3 794 1490 1434 +3 1699 1728 1710 +3 1698 1731 1728 +3 1420 1415 794 +3 1415 1409 794 +3 794 795 766 +3 1708 1690 1712 +3 791 794 766 +3 796 794 1409 +3 794 796 767 +3 794 767 770 +3 1925 771 1945 +3 1945 771 772 +3 771 792 772 +3 1690 1684 1712 +3 1705 1707 1687 +3 1694 1704 1701 +3 1710 1704 1693 +3 1686 1685 1701 +3 1677 1703 1714 +3 1699 1693 1692 +3 1692 1698 1699 +3 1714 1691 1677 +3 1694 1682 1693 +3 1680 1675 1690 +3 1683 1694 1685 +3 1678 1687 1684 +3 1672 1685 1686 +3 1681 1692 1693 +3 1677 1670 1680 +3 1686 1687 1678 +3 1677 1691 1671 +3 1674 1684 1675 +3 800 1943 976 +3 800 983 777 +3 852 777 983 +3 1670 1649 1675 +3 1669 1678 1674 +3 1683 1672 1663 +3 1682 1683 1661 +3 1620 1681 1682 +3 1556 1676 1681 +3 1675 1649 1612 +3 1664 1672 1669 +3 1671 1602 1670 +3 1908 1907 1934 +3 1611 1669 1674 +3 1420 1434 1034 +3 1612 1648 1674 +3 1664 1669 1609 +3 1608 1663 1664 +3 1662 1663 1591 +3 1607 1661 1662 +3 1602 1598 1649 +3 1598 1596 1612 +3 921 952 265 +3 1584 1602 1613 +3 1573 1598 1602 +3 1593 1611 1648 +3 1607 1589 1620 +3 929 1227 958 +3 1596 1583 1648 +3 938 937 1010 +3 1901 1614 1586 +3 1567 1593 1583 +3 1582 1609 1593 +3 1581 1592 1609 +3 1608 1592 1581 +3 1591 1608 1566 +3 1929 1911 1924 +3 1607 1591 1580 +3 1579 1589 1607 +3 1600 1589 1578 +3 1018 943 942 +3 941 1123 942 +3 1614 1575 1576 +3 1576 1584 1614 +3 1568 1583 1596 +3 1576 1575 1901 +3 1728 1731 1877 +3 1900 1576 1901 +3 1900 1573 1576 +3 1568 1596 1899 +3 1567 1896 1582 +3 1581 1582 1893 +3 1580 1566 1851 +3 1579 1580 1857 +3 1789 1512 1814 +3 1423 1422 1424 +3 1423 1427 1411 +3 1419 1417 1425 +3 1424 1422 1419 +3 1418 1423 1421 +3 1726 864 1673 +3 1418 1416 1422 +3 1415 1420 1417 +3 1416 762 1419 +3 759 1418 1407 +3 759 1414 1416 +3 1895 1928 873 +3 984 988 1421 +3 1402 1406 1405 +3 1923 1915 1919 +3 1396 1375 1384 +3 1393 1395 1394 +3 1919 1918 1921 +3 1393 1392 1396 +3 1374 1375 1392 +3 1378 1391 1394 +3 1389 1393 1391 +3 1392 1390 1374 +3 1389 712 1392 +3 1370 1387 1391 +3 852 892 873 +3 894 864 863 +3 1388 1390 712 +3 710 1389 1387 +3 848 899 1168 +3 861 1168 907 +3 894 881 864 +3 1935 1917 1908 +3 865 1673 881 +3 882 1500 897 +3 882 899 848 +3 905 894 893 +3 865 881 897 +3 1327 1346 1342 +3 1329 1340 1331 +3 873 892 924 +3 924 925 873 +3 914 899 882 +3 1312 1334 1314 +3 1301 1329 1330 +3 1309 1298 1328 +3 1328 1297 1327 +3 926 914 882 +3 1327 1296 1326 +3 1312 1305 1311 +3 897 881 930 +3 1311 1303 1310 +3 1289 1301 1310 +3 1301 1288 1309 +3 1328 1298 1287 +3 1327 1297 1296 +3 914 927 907 +3 902 907 927 +3 915 929 930 +3 938 908 897 +3 1314 1318 1294 +3 1314 1273 1306 +3 1293 1305 1306 +3 1292 1304 1305 +3 1304 1291 1303 +3 1281 1302 1303 +3 1301 1289 1279 +3 925 924 932 +3 905 925 933 +3 915 905 948 +3 1286 1297 1287 +3 1286 1296 1297 +3 902 927 943 +3 1293 1282 1292 +3 921 902 943 +3 1292 1271 1291 +3 1269 1268 1290 +3 1289 1290 1280 +3 1277 1288 1279 +3 1298 1288 1277 +3 1034 932 924 +3 930 929 938 +3 926 908 939 +3 914 926 941 +3 1275 1285 1286 +3 927 914 941 +3 942 943 927 +3 943 945 921 +3 1261 1260 1293 +3 1292 1282 1272 +3 1270 1291 1246 +3 1688 1909 1926 +3 1270 1244 1281 +3 949 929 915 +3 1268 1257 1280 +3 1256 1279 1280 +3 1277 1255 1287 +3 1267 1286 1287 +3 1266 1265 1275 +3 1264 1274 1275 +3 1258 1246 1271 +3 1244 1242 1269 +3 1241 1268 1269 +3 1921 1918 1914 +3 1256 1239 1277 +3 1255 1254 1267 +3 1202 1921 1914 +3 1253 1266 1267 +3 1260 1261 1249 +3 1248 1259 1260 +3 1247 1271 1272 +3 1247 1258 1271 +3 1241 1240 1257 +3 1239 1256 1257 +3 1239 1231 1255 +3 1254 1229 1253 +3 1238 1265 1253 +3 948 933 1274 +3 1234 1248 1249 +3 1233 1247 1259 +3 1245 1246 1219 +3 1244 1245 1217 +3 1215 1242 1244 +3 1241 1242 1213 +3 1212 1240 1241 +3 1232 1239 1240 +3 1907 1906 1933 +3 1231 1230 1254 +3 1229 1208 1238 +3 1227 1252 1238 +3 929 958 937 +3 1248 1234 1203 +3 1233 1248 1225 +3 1933 1906 484 +3 1247 1233 1223 +3 1258 1247 1221 +3 1210 1232 1212 +3 1210 1231 1232 +3 1231 1193 1230 +3 1209 1229 1230 +3 1226 1204 1203 +3 1203 1223 1225 +3 1200 1221 1223 +3 1198 1219 1221 +3 1197 1217 1219 +3 1912 1905 1910 +3 1215 1217 1196 +3 1213 1215 1195 +3 1212 1213 1194 +3 1193 1185 1209 +3 1929 1910 1911 +3 1192 1208 1209 +3 1187 1201 1203 +3 1186 1198 1200 +3 1177 1197 1198 +3 1383 987 1382 +3 987 1383 1374 +3 1176 1196 1197 +3 1175 1195 1196 +3 1174 1194 1195 +3 1173 1210 1194 +3 1172 1193 1210 +3 1384 1000 976 +3 1000 800 976 +3 1374 1377 992 +3 1376 993 1377 +3 1372 995 1373 +3 992 984 1374 +3 993 1376 1373 +3 996 995 1372 +3 979 721 986 +3 1185 1171 1192 +3 1184 1191 1192 +3 986 996 979 +3 1180 1186 1201 +3 1000 1384 1382 +3 992 1377 993 +3 1372 979 996 +3 1172 1167 1185 +3 1171 1166 1184 +3 1163 1180 1187 +3 1000 1411 983 +3 1177 1179 1162 +3 1410 1411 1000 +3 1407 988 992 +3 1407 993 1405 +3 1405 995 1402 +3 1402 996 1400 +3 995 996 1402 +3 1176 1177 1161 +3 1175 1176 1160 +3 1159 1174 1175 +3 1158 1173 1174 +3 1167 1172 1173 +3 1382 987 1410 +3 986 725 1400 +3 996 986 1400 +3 983 800 1000 +3 987 1426 1410 +3 984 1421 987 +3 992 988 984 +3 1407 992 993 +3 995 1405 993 +3 1167 1143 1171 +3 1166 1142 1170 +3 1169 1180 1154 +3 1158 1144 1167 +3 1066 952 945 +3 1139 1138 1162 +3 1161 1162 1137 +3 1160 1161 1149 +3 1159 1160 1146 +3 1158 1159 1145 +3 952 1066 1036 +3 943 1018 1080 +3 1140 1154 1163 +3 1080 945 943 +3 1137 1130 1149 +3 1129 1146 1149 +3 1128 1145 1146 +3 1127 1144 1145 +3 1136 1143 1144 +3 1136 1142 1143 +3 1131 1139 1140 +3 1121 1138 1139 +3 1137 1138 1112 +3 1124 1135 1136 +3 1112 1120 1130 +3 1129 1130 1119 +3 1128 1129 1118 +3 1124 1127 1128 +3 1124 1117 1126 +3 1112 1105 1120 +3 1119 1120 1104 +3 1118 1119 1111 +3 1111 1117 1118 +3 1110 1116 1117 +3 1104 1103 1111 +3 1103 1110 1111 +3 1100 1095 1105 +3 1104 1105 1099 +3 1099 1103 1104 +3 1110 1103 1098 +3 1097 1102 1110 +3 1092 1096 1100 +3 1095 1084 1099 +3 1084 1098 1099 +3 1094 1097 1098 +3 1083 1095 1096 +3 1094 1084 1082 +3 937 1170 1010 +3 1076 1083 1091 +3 1076 1082 1083 +3 1075 1081 1082 +3 1072 1076 1050 +3 1072 1075 1076 +3 939 938 1010 +3 1075 1072 1067 +3 1073 231 328 +3 1000 1382 1410 +3 1115 942 1123 +3 995 993 1373 +3 1115 1018 942 +3 1374 984 987 +3 1102 1018 1115 +3 941 939 1134 +3 1101 1077 1092 +3 1864 1058 1077 +3 1339 932 1034 +3 1077 1831 1864 +3 1101 1831 1077 +3 1058 1864 1057 +3 936 949 915 +3 1862 1114 1125 +3 1132 1856 1861 +3 1125 1132 1861 +3 945 952 921 +3 941 942 927 +3 1141 1867 1856 +3 939 941 926 +3 938 939 908 +3 929 937 938 +3 948 936 915 +3 1182 1866 1141 +3 1182 1860 1866 +3 933 948 905 +3 1264 936 948 +3 932 933 925 +3 897 930 938 +3 881 915 930 +3 915 894 905 +3 902 921 836 +3 882 908 926 +3 1346 1034 1434 +3 914 907 899 +3 915 881 894 +3 1314 1334 1318 +3 897 908 882 +3 1858 1859 1262 +3 925 905 893 +3 1855 1858 1284 +3 907 902 861 +3 899 907 1168 +3 1908 1917 1202 +3 1284 1512 1855 +3 925 893 873 +3 836 861 902 +3 865 897 1500 +3 893 1895 873 +3 1331 1335 1334 +3 1500 882 848 +3 881 1673 864 +3 863 893 894 +3 863 1895 893 +3 852 873 1928 +3 1046 1062 248 +3 1063 1009 1062 +3 1062 1047 248 +3 863 864 1726 +3 795 794 770 +3 1713 1898 1586 +3 1050 1073 328 +3 1048 1050 328 +3 771 794 791 +3 763 735 1415 +3 739 742 730 +3 739 736 741 +3 762 734 763 +3 700 704 719 +3 718 699 719 +3 699 718 716 +3 699 712 713 +3 712 710 698 +3 1066 1061 1036 +3 1062 1046 1066 +3 1046 1061 1066 +3 1062 1067 1063 +3 1051 1064 1067 +3 1064 1063 1067 +3 1051 1050 1048 +3 1074 1075 1062 +3 1066 1074 1062 +3 1062 1075 1067 +3 1051 1067 1072 +3 1074 1066 1080 +3 1066 945 1080 +3 1050 1051 1072 +3 1050 1079 1073 +3 1058 1073 1079 +3 1080 1081 1074 +3 1075 1074 1081 +3 1075 1082 1076 +3 1076 1091 1050 +3 1091 1079 1050 +3 1079 1077 1058 +3 688 690 693 +3 1093 1094 1081 +3 1080 1093 1081 +3 1081 1094 1082 +3 1082 1084 1083 +3 1091 1092 1079 +3 1092 1077 1079 +3 1093 1080 1102 +3 1018 1102 1080 +3 1713 1761 1689 +3 1084 1095 1083 +3 1091 1083 1096 +3 1092 1091 1096 +3 1102 1097 1093 +3 1094 1093 1097 +3 1901 1897 1900 +3 1084 1094 1098 +3 1095 1100 1096 +3 1097 1110 1098 +3 1098 1103 1099 +3 1099 1105 1095 +3 1106 1092 1100 +3 1890 1899 1900 +3 1101 1092 1106 +3 1106 1113 1101 +3 1115 1116 1102 +3 1102 1116 1110 +3 1105 1112 1100 +3 1106 1100 1112 +3 688 692 687 +3 1101 1113 1114 +3 1110 1117 1111 +3 1111 1119 1104 +3 1104 1120 1105 +3 1112 1121 1106 +3 1106 1121 1113 +3 1125 1114 1113 +3 1116 1115 1123 +3 1117 1124 1118 +3 1121 1131 1113 +3 1794 1695 1761 +3 1125 1113 1131 +3 1796 1700 1794 +3 694 690 685 +3 1116 1123 1126 +3 1796 1799 1706 +3 1134 1126 1123 +3 1801 1635 1799 +3 1116 1126 1117 +3 1118 1124 1128 +3 1118 1129 1119 +3 1119 1130 1120 +3 690 688 682 +3 688 687 682 +3 1123 941 1134 +3 1134 1135 1126 +3 1126 1135 1124 +3 1124 1136 1127 +3 1130 1137 1112 +3 1121 1112 1138 +3 1131 1121 1139 +3 1125 1131 1140 +3 1125 1140 1132 +3 660 681 687 +3 685 194 686 +3 1132 1141 1856 +3 1134 939 1010 +3 1010 1135 1134 +3 1135 1142 1136 +3 1127 1136 1144 +3 1128 1127 1145 +3 1128 1146 1129 +3 1129 1149 1130 +3 1139 1154 1140 +3 1163 1132 1140 +3 1181 1141 1132 +3 1010 1142 1135 +3 1144 1158 1145 +3 1145 1159 1146 +3 1146 1160 1149 +3 1149 1161 1137 +3 1137 1162 1138 +3 1188 1181 1163 +3 1181 1132 1163 +3 1143 1142 1166 +3 1144 1143 1167 +3 1169 1139 1162 +3 1154 1139 1169 +3 1163 1154 1180 +3 1181 1182 1141 +3 1010 1170 1142 +3 1143 1166 1171 +3 1167 1173 1158 +3 1158 1174 1159 +3 1159 1175 1160 +3 1889 1891 1897 +3 1160 1176 1161 +3 1161 1177 1162 +3 1162 1179 1169 +3 1187 1188 1163 +3 937 1184 1170 +3 1170 1184 1166 +3 1171 1185 1167 +3 1169 1179 1186 +3 1169 1186 1180 +3 1201 1187 1180 +3 1182 1181 1188 +3 1182 1188 1204 +3 1182 1204 1860 +3 937 1191 1184 +3 1184 1192 1171 +3 1185 1193 1172 +3 1173 1172 1210 +3 1174 1173 1194 +3 1175 1174 1195 +3 1175 1196 1176 +3 1176 1197 1177 +3 1198 1179 1177 +3 1179 1198 1186 +3 1186 1200 1201 +3 1188 1187 1203 +3 1203 1204 1188 +3 1226 1860 1204 +3 937 958 1191 +3 412 422 407 +3 1227 1191 958 +3 1227 1208 1191 +3 1191 1208 1192 +3 1192 1209 1185 +3 1210 1212 1194 +3 1194 1213 1195 +3 1195 1215 1196 +3 1196 1217 1197 +3 1219 1198 1197 +3 1221 1200 1198 +3 1201 1200 1223 +3 1201 1223 1203 +3 404 407 408 +3 412 407 403 +3 393 411 412 +3 417 411 401 +3 1208 1229 1209 +3 1209 1230 1193 +3 1210 1193 1231 +3 1219 1258 1221 +3 1221 1247 1223 +3 1223 1233 1225 +3 1203 1225 1248 +3 1203 1234 1226 +3 1226 1234 1235 +3 383 404 405 +3 381 403 404 +3 1227 929 949 +3 949 1252 1227 +3 1238 1208 1227 +3 1229 1254 1230 +3 1231 1239 1232 +3 1232 1240 1212 +3 1212 1241 1213 +3 1213 1242 1215 +3 1215 1244 1217 +3 1219 1217 1245 +3 1219 1246 1258 +3 1890 1900 1891 +3 1234 1249 1235 +3 1250 1235 1249 +3 1250 1226 1235 +3 1252 1265 1238 +3 1890 1841 1899 +3 1238 1253 1229 +3 1254 1255 1231 +3 1841 1847 1568 +3 1239 1257 1240 +3 1846 1896 1847 +3 1272 1259 1247 +3 1248 1233 1259 +3 1248 1260 1249 +3 1893 1894 1846 +3 1249 1261 1250 +3 1250 1261 1262 +3 1262 1859 1250 +3 403 381 380 +3 1252 949 936 +3 393 379 401 +3 1264 1252 936 +3 1252 1264 1265 +3 1265 1266 1253 +3 1253 1267 1254 +3 1255 1277 1239 +3 1257 1268 1241 +3 1241 1269 1242 +3 1270 1245 1244 +3 1245 1270 1246 +3 1282 1260 1259 +3 1889 1897 1853 +3 1273 1262 1261 +3 394 397 376 +3 364 363 394 +3 1858 1262 1273 +3 374 381 383 +3 1265 1264 1275 +3 1266 1286 1267 +3 1267 1287 1255 +3 1277 1279 1256 +3 1256 1280 1257 +3 1269 1281 1244 +3 1291 1271 1246 +3 1271 1292 1272 +3 1282 1259 1272 +3 1261 1293 1273 +3 1273 1294 1858 +3 371 393 380 +3 401 379 370 +3 200 401 369 +3 906 200 368 +3 357 365 377 +3 1274 1264 948 +3 1274 1285 1275 +3 1286 1266 1275 +3 1287 1298 1277 +3 1279 1289 1280 +3 1280 1290 1268 +3 1260 1282 1293 +3 1273 1314 1294 +3 355 364 376 +3 1294 1284 1858 +3 362 374 375 +3 1296 1286 1285 +3 1288 1301 1279 +3 1302 1269 1290 +3 1269 1302 1281 +3 1270 1281 1303 +3 1270 1303 1291 +3 1291 1304 1292 +3 1292 1305 1293 +3 1293 1306 1273 +3 1294 1318 1284 +3 379 393 361 +3 365 356 376 +3 933 1308 1274 +3 1296 1285 1308 +3 1285 1274 1308 +3 1297 1328 1287 +3 1298 1309 1288 +3 1310 1290 1289 +3 1310 1302 1290 +3 1302 1310 1303 +3 1311 1304 1303 +3 1304 1311 1305 +3 1305 1312 1306 +3 1314 1306 1312 +3 354 363 364 +3 352 373 374 +3 380 373 351 +3 932 1326 1308 +3 933 932 1308 +3 1308 1326 1296 +3 1329 1301 1309 +3 1330 1310 1301 +3 1330 1311 1310 +3 1311 1330 1334 +3 1334 1312 1311 +3 201 367 350 +3 357 347 356 +3 356 345 355 +3 336 354 355 +3 344 371 351 +3 361 343 370 +3 369 370 333 +3 368 369 342 +3 367 368 341 +3 339 347 348 +3 338 345 347 +3 337 336 345 +3 362 354 335 +3 325 352 362 +3 352 324 351 +3 343 361 344 +3 332 350 341 +3 330 338 339 +3 338 329 337 +3 336 337 327 +3 327 335 336 +3 326 325 335 +3 1783 775 1794 +3 322 330 331 +3 776 1796 775 +3 321 329 330 +3 320 327 329 +3 780 1799 776 +3 318 326 327 +3 325 326 317 +3 324 325 317 +3 315 313 324 +3 333 343 299 +3 333 298 341 +3 312 332 341 +3 310 321 322 +3 1284 1318 1512 +3 321 310 320 +3 309 319 320 +3 308 318 319 +3 307 317 318 +3 304 315 317 +3 313 315 300 +3 300 299 313 +3 298 297 312 +3 310 295 309 +3 1713 1825 779 +3 294 308 309 +3 293 307 308 +3 292 304 307 +3 304 291 300 +3 299 300 290 +3 289 298 299 +3 286 294 295 +3 285 293 294 +3 284 292 293 +3 283 291 292 +3 282 290 291 +3 280 289 290 +3 279 297 289 +3 278 311 297 +3 277 285 286 +3 276 284 285 +3 1339 1326 932 +3 1326 1339 1327 +3 1327 1342 1328 +3 1340 1309 1328 +3 1309 1340 1329 +3 1331 1330 1329 +3 1330 1331 1334 +3 284 274 283 +3 273 282 283 +3 780 1824 1801 +3 272 280 282 +3 259 279 280 +3 259 278 279 +3 269 288 278 +3 263 276 277 +3 257 274 276 +3 262 273 274 +3 260 272 273 +3 260 271 272 +3 255 259 271 +3 1327 1339 1346 +3 1328 1342 1340 +3 1339 1034 1346 +3 256 260 262 +3 258 259 250 +3 269 258 249 +3 245 257 263 +3 253 256 257 +3 260 256 252 +3 255 260 252 +3 244 251 255 +3 241 252 256 +3 241 244 252 +3 250 251 236 +3 249 250 234 +3 253 245 243 +3 237 236 244 +3 242 238 241 +3 238 237 241 +3 243 233 242 +3 237 238 227 +3 236 237 227 +3 234 236 226 +3 233 228 238 +3 228 222 227 +3 226 227 222 +3 232 226 225 +3 225 222 216 +3 224 217 223 +3 152 214 217 +3 215 204 191 +3 176 230 137 +3 195 197 146 +3 149 168 198 +3 1370 743 706 +3 1388 712 699 +3 1372 1388 699 +3 1388 1372 1373 +3 1373 1376 1388 +3 1390 1388 1376 +3 1374 1390 1377 +3 1374 1383 1375 +3 1377 1390 1376 +3 132 202 334 +3 765 1378 1380 +3 493 1380 1379 +3 152 151 140 +3 138 139 151 +3 1375 1383 1382 +3 1384 1375 1382 +3 230 195 131 +3 1384 976 1912 +3 1387 1370 706 +3 706 709 1387 +3 709 710 1387 +3 1389 710 712 +3 1389 1391 1387 +3 1390 1392 712 +3 1392 1393 1389 +3 1391 1378 1370 +3 1393 1394 1391 +3 1394 1380 1378 +3 1396 1395 1393 +3 1375 1396 1392 +3 1379 1380 1394 +3 1826 1379 1394 +3 1394 1395 1826 +3 1395 1931 1826 +3 147 148 163 +3 1396 1931 1395 +3 202 132 147 +3 1912 1931 1396 +3 1396 1384 1912 +3 1407 1405 1406 +3 1400 1401 1406 +3 988 1407 1421 +3 987 1421 1426 +3 759 732 1414 +3 762 1414 732 +3 1411 1410 1426 +3 852 983 1411 +3 924 892 1424 +3 1420 794 1434 +3 140 126 153 +3 1406 1402 1400 +3 759 1407 1406 +3 762 1416 1414 +3 1415 1417 762 +3 1416 1418 759 +3 762 1417 1419 +3 1418 1421 1407 +3 1416 1419 1422 +3 1422 1423 1418 +3 1425 1424 1419 +3 1420 1425 1417 +3 1423 1426 1421 +3 1426 1423 1411 +3 1424 1427 1423 +3 852 1411 1427 +3 1427 892 852 +3 892 1427 1424 +3 779 1825 1336 +3 1424 1425 924 +3 1034 924 1425 +3 1425 1420 1034 +3 144 340 143 +3 794 771 1446 +3 150 144 143 +3 771 1925 1447 +3 1446 1331 1490 +3 1490 794 1446 +3 1331 1446 1447 +3 1446 771 1447 +3 1335 1447 1925 +3 135 146 149 +3 1434 1490 1346 +3 145 143 111 +3 1331 1447 1335 +3 1340 1342 1490 +3 1490 1342 1346 +3 1331 1340 1490 +3 125 140 139 +3 139 138 119 +3 138 137 117 +3 137 131 114 +3 113 131 135 +3 112 116 149 +3 124 148 147 +3 147 123 124 +3 122 123 147 +3 1512 1318 1335 +3 86 114 113 +3 111 143 115 +3 1334 1335 1318 +3 106 127 126 +3 105 126 125 +3 102 125 119 +3 100 119 118 +3 99 118 117 +3 98 117 114 +3 110 124 123 +3 110 123 107 +3 123 122 107 +3 113 121 18 +3 1925 1512 1335 +3 88 116 112 +3 92 107 122 +3 1925 1513 1517 +3 1482 1824 1317 +3 780 1317 1824 +3 1514 1925 1518 +3 1925 1517 1518 +3 1512 1927 1814 +3 111 2 112 +3 97 111 115 +3 96 97 115 +3 180 102 100 +3 99 98 6 +3 86 87 98 +3 96 110 16 +3 107 10 110 +3 4 9 107 +3 6 177 99 +3 1336 1243 1783 +3 34 97 24 +3 775 1783 1276 +3 1276 781 775 +3 9 10 107 +3 781 1472 776 +3 10 9 11 +3 776 1472 1317 +3 11 14 13 +3 11 15 14 +3 16 13 17 +3 17 14 19 +3 15 20 19 +3 24 16 27 +3 1892 1903 1579 +3 17 28 27 +3 1893 1851 1566 +3 1578 1579 1903 +3 1857 1892 1579 +3 1851 1857 1580 +3 1581 1893 1566 +3 1582 1894 1893 +3 28 17 29 +3 1896 1567 1568 +3 1900 1899 1573 +3 32 34 24 +3 1838 1853 1854 +3 33 32 28 +3 29 37 33 +3 37 35 33 +3 34 38 40 +3 38 32 39 +3 33 35 39 +3 40 38 41 +3 41 38 39 +3 43 42 39 +3 53 42 43 +3 45 49 55 +3 50 49 45 +3 53 50 41 +3 1898 1901 1586 +3 53 48 62 +3 59 64 55 +3 59 49 61 +3 62 61 50 +3 62 63 95 +3 64 94 89 +3 95 65 61 +3 94 59 65 +3 128 156 89 +3 1891 1889 1725 +3 128 94 65 +3 95 66 134 +3 141 65 130 +3 1556 101 1676 +3 134 155 130 +3 155 154 141 +3 86 18 156 +3 157 161 156 +3 157 128 154 +3 160 159 154 +3 1719 1720 1886 +3 1834 1720 1728 +3 1728 1877 1834 +3 1720 1834 1886 +3 1723 1883 1734 +3 1879 1888 1733 +3 162 165 157 +3 167 162 159 +3 169 87 165 +3 162 166 165 +3 164 171 167 +3 166 162 170 +3 166 173 6 +3 170 174 173 +3 175 177 173 +3 178 175 173 +3 175 181 184 +3 180 184 75 +3 186 75 184 +3 782 1825 1691 +3 186 190 75 +3 207 209 206 +3 205 209 210 +3 209 211 213 +3 1596 1573 1899 +3 213 211 266 +3 246 220 221 +3 221 213 358 +3 1568 1567 1583 +3 1573 1584 1576 +3 213 266 323 +3 358 359 246 +3 1589 1579 1578 +3 1607 1580 1579 +3 1580 1591 1566 +3 1608 1581 1566 +3 1609 1582 1581 +3 1593 1567 1582 +3 1901 1575 1614 +3 1573 1596 1598 +3 1648 1583 1593 +3 1584 1573 1602 +3 358 323 386 +3 1609 1611 1593 +3 1648 1612 1596 +3 1614 1584 1613 +3 386 378 359 +3 1620 1589 1600 +3 1614 1665 1776 +3 1776 1586 1614 +3 391 387 323 +3 1602 1671 1613 +3 1665 1614 1613 +3 400 378 386 +3 386 360 390 +3 388 385 389 +3 391 469 399 +3 414 389 400 +3 400 390 415 +3 387 419 390 +3 469 410 399 +3 1556 1620 1600 +3 1838 1725 1889 +3 1612 1649 1598 +3 416 414 415 +3 1891 1725 1890 +3 419 418 415 +3 424 416 418 +3 425 418 419 +3 419 410 426 +3 423 410 420 +3 424 425 430 +3 425 426 432 +3 1898 1713 1156 +3 426 423 433 +3 434 423 428 +3 436 429 430 +3 430 432 437 +3 437 432 433 +3 433 434 438 +3 434 477 445 +3 440 436 437 +3 441 437 438 +3 445 443 438 +3 1689 1156 1713 +3 446 440 441 +3 447 441 443 +3 448 443 445 +3 449 445 475 +3 450 446 447 +3 451 447 448 +3 452 448 449 +3 458 457 449 +3 460 450 451 +3 454 451 452 +3 457 456 452 +3 1620 1661 1607 +3 1607 1662 1591 +3 1663 1608 1591 +3 1664 1592 1608 +3 1609 1592 1664 +3 489 488 207 +3 465 266 488 +3 1611 1609 1669 +3 478 470 479 +3 1649 1670 1602 +3 1671 1679 1613 +3 1679 1665 1613 +3 1893 1902 1837 +3 1674 1648 1611 +3 1837 1836 1851 +3 1674 1675 1612 +3 1620 1556 1681 +3 1682 1661 1620 +3 1683 1662 1661 +3 1683 1663 1662 +3 1857 1836 1828 +3 1672 1664 1663 +3 1828 1835 1892 +3 1677 1671 1670 +3 1665 1679 1776 +3 1678 1669 1672 +3 1825 1776 1679 +3 1680 1670 1675 +3 1780 1850 1843 +3 1684 1674 1678 +3 1691 1679 1671 +3 1683 1685 1672 +3 1672 1686 1678 +3 1690 1675 1684 +3 1681 1676 1692 +3 1682 1681 1693 +3 1694 1683 1682 +3 1680 1703 1677 +3 492 485 483 +3 489 507 488 +3 458 475 490 +3 1694 1701 1685 +3 475 476 491 +3 506 505 482 +3 1704 1694 1693 +3 1686 1705 1687 +3 1684 1687 1707 +3 1709 1680 1690 +3 1691 1825 1679 +3 495 486 487 +3 1693 1699 1710 +3 1701 1711 1686 +3 1707 1712 1684 +3 1724 1714 1703 +3 1541 1838 1854 +3 507 496 465 +3 1635 1801 1651 +3 500 499 476 +3 500 439 477 +3 478 501 477 +3 502 479 503 +3 503 480 504 +3 509 506 492 +3 495 509 483 +3 1711 1705 1686 +3 1703 1680 1709 +3 1724 1703 1709 +3 1728 1699 1698 +3 1690 1708 1709 +3 1709 1733 1724 +3 570 511 489 +3 1704 1710 1719 +3 502 512 478 +3 1728 1720 1710 +3 1711 1722 1705 +3 1719 1729 1701 +3 1712 1707 1730 +3 496 514 487 +3 516 515 496 +3 511 516 507 +3 517 503 518 +3 519 518 504 +3 520 519 505 +3 1847 1585 1846 +3 512 521 501 +3 1722 1832 1707 +3 1723 1709 1708 +3 1723 1734 1733 +3 517 524 502 +3 1691 1714 1887 +3 506 509 525 +3 495 514 526 +3 1729 1732 1711 +3 1887 782 1691 +3 1884 1729 1719 +3 1730 1883 1708 +3 491 556 490 +3 500 521 562 +3 524 563 512 +3 518 578 517 +3 518 519 564 +3 525 565 520 +3 515 566 514 +3 562 567 499 +3 565 575 519 +3 511 569 516 +3 563 572 521 +3 566 573 526 +3 516 569 574 +3 572 576 562 +3 578 577 524 +3 573 594 525 +3 574 580 515 +3 1814 1927 898 +3 576 581 567 +3 583 563 577 +3 564 575 584 +3 575 565 585 +3 565 525 587 +3 588 566 580 +3 1801 1824 1651 +3 618 589 511 +3 591 577 578 +3 584 593 578 +3 593 584 585 +3 587 600 585 +3 607 573 588 +3 574 595 580 +3 589 596 569 +3 597 556 581 +3 572 583 598 +3 599 583 591 +3 594 604 587 +3 595 601 588 +3 607 604 594 +3 598 610 576 +3 1727 1585 1841 +3 593 614 591 +3 600 623 593 +3 623 600 604 +3 596 617 574 +3 610 619 581 +3 622 604 607 +3 607 601 625 +3 636 601 595 +3 619 627 597 +3 599 644 598 +3 1846 1628 1902 +3 644 599 611 +3 630 611 614 +3 631 614 623 +3 622 640 623 +3 650 632 589 +3 644 643 598 +3 622 625 635 +3 636 595 649 +3 649 595 617 +3 596 638 617 +3 1777 0 1778 +3 1778 1781 1777 +3 0 1777 1 +3 1781 3 1 +3 1927 1779 898 +3 630 645 644 +3 631 653 630 +3 654 631 639 +3 640 646 639 +3 635 647 640 +3 635 636 648 +3 649 648 636 +3 632 657 596 +3 1756 1750 1751 +3 1750 1755 1749 +3 1750 1738 1739 +3 1749 1754 1748 +3 3 1781 1778 +3 1746 1753 1745 +3 597 627 651 +3 1749 1737 1738 +3 1744 1745 1752 +3 1748 1747 1741 +3 646 663 655 +3 666 646 647 +3 648 677 647 +3 680 648 649 +3 649 638 695 +3 761 659 632 +3 1317 1791 818 +3 1278 1791 1317 +3 1243 1793 1792 +3 1276 1792 1278 +3 1276 1243 1792 +3 782 1790 1336 +3 1243 1336 1793 +3 1790 1793 1336 +3 1813 896 895 +3 1813 1814 896 +3 619 1068 627 +3 1243 1276 1783 +3 670 643 644 +3 644 645 671 +3 653 676 645 +3 695 657 760 +3 619 610 786 +3 1812 1789 1814 +3 670 708 610 +3 1789 1812 1512 +3 655 663 717 +3 1795 818 1791 +3 1802 1795 1791 +3 1791 1278 1802 +3 1792 1802 1278 +3 1798 1797 1792 +3 1830 1798 1793 +3 666 677 797 +3 677 680 773 +3 758 680 695 +3 1802 1797 1805 +3 1804 1803 1797 +3 1798 1830 1804 +3 774 760 667 +3 1807 1804 1830 +3 1808 1805 1803 +3 1803 1806 1808 +3 1804 1807 1806 +3 1806 1810 1809 +3 1812 1813 1809 +3 667 659 778 +3 676 653 714 +3 785 758 760 +3 1813 1812 1814 +3 761 799 778 +3 931 783 539 +3 590 513 510 +3 801 802 803 +3 804 805 807 +3 909 806 807 +3 909 809 808 +3 808 809 810 +3 810 813 811 +3 813 814 812 +3 916 820 814 +3 821 820 816 +3 828 804 822 +3 823 822 804 +3 823 806 824 +3 825 824 808 +3 833 825 811 +3 812 826 833 +3 820 839 826 +3 839 820 821 +3 829 828 830 +3 831 830 822 +3 832 831 823 +3 833 837 825 +3 846 838 826 +3 826 839 846 +3 1639 1645 1638 +3 1758 1482 817 +3 841 840 829 +3 842 841 830 +3 843 842 831 +3 832 844 843 +3 837 845 844 +3 833 838 845 +3 1800 1850 1780 +3 846 839 835 +3 1795 1805 862 +3 851 849 840 +3 853 851 841 +3 854 853 842 +3 855 854 844 +3 856 855 845 +3 857 856 845 +3 846 858 857 +3 858 846 859 +3 859 835 862 +3 875 854 855 +3 851 867 866 +3 868 867 851 +3 868 853 875 +3 870 869 857 +3 858 870 857 +3 866 886 874 +3 867 886 866 +3 876 855 856 +3 193 886 867 +3 193 868 888 +3 891 889 858 +3 891 859 871 +3 874 191 878 +3 874 218 900 +3 218 886 193 +3 903 856 904 +3 904 869 870 +3 199 906 877 +3 895 896 199 +3 1855 1512 1812 +3 1810 1858 1855 +3 1190 1819 1818 +3 1812 1810 1855 +3 1810 1829 1858 +3 1810 1807 1829 +3 1868 1829 1807 +3 1830 1868 1807 +3 1830 1790 1872 +3 1790 1887 1872 +3 1790 782 1887 +3 951 957 946 +3 953 790 944 +3 954 953 947 +3 959 955 1207 +3 964 962 955 +3 790 953 798 +3 962 974 951 +3 1882 1879 1734 +3 1883 1730 1874 +3 1870 1874 1832 +3 1870 1722 1732 +3 1832 1722 1870 +3 1883 1882 1734 +3 968 959 960 +3 1730 1832 1874 +3 953 954 961 +3 1864 1871 1833 +3 974 967 957 +3 1884 1719 1886 +3 961 970 798 +3 1925 1945 1946 +3 967 966 954 +3 965 973 968 +3 966 969 961 +3 974 975 967 +3 1001 972 964 +3 1002 968 973 +3 970 969 981 +3 972 980 962 +3 1226 1250 1859 +3 966 975 982 +3 968 1002 1001 +3 982 1004 969 +3 981 1007 717 +3 980 1011 975 +3 1013 972 1001 +3 1007 981 1004 +3 982 1008 1004 +3 1011 1008 982 +3 1005 1002 1023 +3 1251 1014 1023 +3 1013 1012 980 +3 1015 1007 1004 +3 1008 1016 1004 +3 1021 1011 1012 +3 1012 1013 1022 +3 1013 1001 1022 +3 673 1015 1024 +3 1019 1015 1016 +3 1016 1008 1020 +3 1021 1020 1008 +3 1005 1038 1001 +3 1125 1861 1862 +3 1023 1025 1005 +3 1019 1020 1027 +3 1032 1020 1021 +3 1021 1022 1035 +3 1017 1025 1023 +3 1024 1029 670 +3 1026 1028 1024 +3 1026 1027 1031 +3 1031 1027 1032 +3 1045 1044 1035 +3 1030 1037 1028 +3 1859 1865 1226 +3 1865 1860 1226 +3 1032 1035 1044 +3 1866 1867 1141 +3 1861 1856 1867 +3 1005 1056 1038 +3 1114 1862 1863 +3 1863 1101 1114 +3 1049 1025 1017 +3 1052 708 1029 +3 1037 1039 1029 +3 1031 1040 1030 +3 1829 1859 1858 +3 1101 1863 1831 +3 1817 1818 1815 +3 1871 1864 1831 +3 1829 1868 1865 +3 1865 1869 1866 +3 1831 1863 1886 +3 1865 1868 1881 +3 1865 1881 1869 +3 1861 1870 1862 +3 1875 1863 1862 +3 1881 1882 1869 +3 1873 1867 1869 +3 1874 1861 1867 +3 1884 1863 1875 +3 1886 1834 1871 +3 1871 1877 1833 +3 1872 1888 1881 +3 1887 1888 1872 +3 1882 1881 1879 +3 1873 1882 1883 +3 1870 1732 1875 +3 1045 1038 1055 +3 1025 1122 1056 +3 1060 1045 1055 +3 1122 1025 1049 +3 1044 1054 1041 +3 1069 1068 786 +3 1039 1069 1052 +3 1037 1040 1059 +3 1040 1041 1108 +3 1056 1189 1055 +3 1059 1070 1039 +3 1069 1107 1068 +3 1070 1133 1069 +3 1109 1108 1054 +3 1108 1157 1070 +3 1164 1071 1060 +3 1237 1109 1071 +3 940 935 944 +3 1319 1315 1321 +3 1319 1325 1324 +3 1815 1800 1787 +3 1325 1319 1321 +3 1345 1351 1315 +3 1341 1322 1343 +3 1344 1343 1324 +3 1350 1344 1325 +3 1333 1366 1332 +3 1839 801 1352 +3 1925 1927 1512 +3 1338 1348 1347 +3 1348 1341 1349 +3 1349 1343 1344 +3 1358 1350 1325 +3 1358 1321 1351 +3 1436 1337 1347 +3 1348 1354 1353 +3 1348 1355 1354 +3 1349 1356 1355 +3 1356 1349 1357 +3 1358 1429 1350 +3 1925 1514 1515 +3 1345 1366 1364 +3 1515 1922 1925 +3 1441 1436 1347 +3 1347 1353 1441 +3 1381 1354 1385 +3 1355 1386 1385 +3 1355 1397 1386 +3 1344 1398 1438 +3 1429 1398 1350 +3 422 1925 1922 +3 1351 1364 1430 +3 1440 1412 1371 +3 1441 1353 1448 +3 1381 1428 1413 +3 1356 1357 1437 +3 1429 1358 1399 +3 1433 1431 1364 +3 1433 1366 1435 +3 1439 1369 1412 +3 1381 1413 1448 +3 1442 1385 1386 +3 1437 1357 1438 +3 1456 1440 1436 +3 1922 408 422 +3 1444 1443 1386 +3 1397 1445 1444 +3 1437 1445 1397 +3 1451 1438 1429 +3 1430 1452 1429 +3 1455 1850 1845 +3 1464 1439 1412 +3 1442 1443 1459 +3 1788 1787 1784 +3 1450 1437 1451 +3 1431 1454 1453 +3 1455 1439 1464 +3 1922 384 408 +3 1464 1440 1456 +3 1457 1466 1456 +3 1457 1448 1458 +3 1206 1788 1774 +3 1449 1475 1458 +3 1459 1475 1428 +3 1443 1444 1459 +3 1450 1460 1445 +3 1461 1468 1451 +3 1461 1452 1453 +3 1454 1821 1462 +3 1471 1463 1455 +3 1467 1450 1468 +3 1470 1469 1461 +3 1453 1462 1470 +3 1471 1464 1483 +3 1465 1456 1473 +3 1466 1484 1473 +3 1466 1458 1492 +3 1444 1477 1476 +3 1467 1477 1460 +3 377 1922 334 +3 1469 1478 1468 +3 1462 1479 1488 +3 1471 1481 1843 +3 1481 1471 1491 +3 1483 1473 1502 +3 1492 1474 1485 +3 1478 1486 1467 +3 1487 1469 1488 +3 1922 377 384 +3 1483 1501 1491 +3 1477 1495 1494 +3 1486 1495 1477 +3 1497 1478 1487 +3 1489 1498 1488 +3 1521 1502 1484 +3 1484 1492 1503 +3 1503 1485 1504 +3 1504 1494 1505 +3 1506 1505 1495 +3 1506 1486 1507 +3 1511 1507 1497 +3 1487 1498 1511 +3 1509 1491 1519 +3 1501 1483 1520 +3 1521 1520 1502 +3 1521 1484 1510 +3 1774 1775 1767 +3 1503 1523 1510 +3 1504 1523 1503 +3 1784 1772 1775 +3 1516 1529 1498 +3 1499 1509 1531 +3 1519 1501 1543 +3 1521 1510 1522 +3 1504 1524 1523 +3 1780 1766 1772 +3 1525 1524 1504 +3 1526 1525 1505 +3 1526 1506 1527 +3 1528 1527 1507 +3 1511 1529 1528 +3 1508 1499 1546 +3 1547 1531 1519 +3 1519 1548 1547 +3 1543 1548 1519 +3 1534 1543 1520 +3 1524 1533 1523 +3 1546 1531 1547 +3 1535 1534 1521 +3 1522 1533 1535 +3 1524 1525 1536 +3 1526 1538 1537 +3 1539 1538 1526 +3 1207 1774 1769 +3 1540 1539 1527 +3 1552 1540 1528 +3 1542 1541 1508 +3 1535 1560 1534 +3 1533 1536 1544 +3 1525 1537 1545 +3 1560 1548 1543 +3 1536 1545 1549 +3 1538 1551 1537 +3 1553 1546 1557 +3 1558 1557 1547 +3 1559 1558 1547 +3 1560 1559 1548 +3 1560 1535 1544 +3 1551 1554 1545 +3 1544 1549 1561 +3 1539 1540 1562 +3 1558 1569 1557 +3 1549 1554 1563 +3 1562 1564 1538 +3 334 1922 1515 +3 1558 1559 1571 +3 1560 1561 1571 +3 1554 1551 1572 +3 1587 1599 1553 +3 1594 1587 1569 +3 1207 1769 1764 +3 1571 1594 1558 +3 1561 1563 1595 +3 1769 1767 1763 +3 1551 1564 1597 +3 1571 1595 1601 +3 1563 1572 1604 +3 1606 1605 1564 +3 1772 1762 1763 +3 1616 1615 1587 +3 1601 1616 1594 +3 1820 1762 1766 +3 1618 1617 1595 +3 1619 1618 1604 +3 1621 1619 1572 +3 1605 1621 1597 +3 1617 1623 1601 +3 1628 1622 1624 +3 1616 1623 1625 +3 1630 1629 1623 +3 1631 1630 1617 +3 1632 1631 1618 +3 1633 1632 1619 +3 1621 1626 1633 +3 1625 1629 1636 +3 1639 1638 1629 +3 1640 1639 1630 +3 1641 1640 1631 +3 1643 1641 1632 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/real_data_2.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/real_data_2.off new file mode 100644 index 00000000000..e46f6ab58b2 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_snapping/real_data_2.off @@ -0,0 +1,24094 @@ +OFF +7906 16184 0 + +1.5882365703582764 8 3.2977163791656494 +0.93232095241546631 8 4.3680744171142578 +0.45192241668701172 8 5.5278615951538086 +6.8088994026184082 8 0.098492950201034546 +5.5882372856140137 8 0.39154663681983948 +10.655548095703125 8 2.436302661895752 +2.4035201072692871 8 2.3431441783905029 +2.3239552974700928 8 2.436302661895752 +2.6082656383514404 8 2.1682753562927246 +2.6082656383514404 8 2.436302661895752 +3.3580920696258545 8 1.5278607606887817 +4.4284501075744629 8 0.87194514274597168 +88.532508850097656 8 0.39154663681983948 +87.311851501464844 8 0.098492950201034546 +89.692291259765625 8 0.87194514274597168 +86.060371398925781 8 0 +90.762657165527344 8 1.5278607606887817 +91.717231750488281 8 2.3431441783905029 +91.796791076660156 8 2.436302661895752 +78.404930114746094 8 2.436302661895752 +84.994972229003906 8 7.2199029922485352 +84.964591979980469 8 6.8726053237915039 +78.404930114746094 8 10.14332103729248 +84.994972229003906 8 6.5253114700317383 +85.085197448730469 8 6.1885676383972168 +85.2325439453125 8 5.8726072311401367 +87.964584350585938 8 8.6046571731567383 +87.648628234863281 8 8.7519922256469727 +94.060379028320312 8 10.14332103729248 +87.3118896484375 8 8.8422222137451172 +86.964591979980469 8 8.8726062774658203 +86.617294311523438 8 8.8422222137451172 +86.280548095703125 8 8.7519922256469727 +85.432502746582031 8 5.5870304107666016 +85.679008483886719 8 5.3405165672302246 +85.964591979980469 8 5.1405539512634277 +85.964591979980469 8 8.6046571731567383 +85.679008483886719 8 8.4046945571899414 +85.432502746582031 8 8.1581811904907227 +88.696640014648438 8 7.8726077079772949 +88.496681213378906 8 8.1581811904907227 +88.250160217285156 8 8.4046945571899414 +85.2325439453125 8 7.8726077079772949 +85.085197448730469 8 7.5566473007202148 +86.280548095703125 8 4.993222713470459 +86.617294311523438 8 4.9029922485351562 +86.964591979980469 8 4.8726053237915039 +87.3118896484375 8 4.9029922485351562 +87.648628234863281 8 4.993222713470459 +87.964584350585938 8 5.1405539512634277 +88.250160217285156 8 5.3405165672302246 +88.496681213378906 8 5.5870304107666016 +92.532516479492188 8 3.2977163791656494 +88.696640014648438 8 5.8726072311401367 +93.188430786132812 8 4.3680744171142578 +88.843971252441406 8 6.1885676383972168 +93.6688232421875 8 5.5278615951538086 +88.9342041015625 8 6.5253114700317383 +93.961875915527344 8 6.7485237121582031 +88.964591979980469 8 6.8726053237915039 +94.060379028320312 8 7.999997615814209 +88.9342041015625 8 7.2199029922485352 +88.843971252441406 8 7.5566473007202148 +78.404930114746094 8 94 +81.299888610839844 8 83.763275146484375 +80.904937744140625 8 83.5791015625 +84.654945373535156 8 81.414039611816406 +84.964591979980469 8 87.127388000488281 +84.994972229003906 8 86.78009033203125 +86.060371398925781 8 94 +86.280548095703125 8 89.00677490234375 +85.964591979980469 8 88.85943603515625 +85.432502746582031 8 85.841819763183594 +84.616958618164062 8 80.979911804199219 +85.2325439453125 8 86.127388000488281 +85.085197448730469 8 86.443351745605469 +84.319999694824219 8 82.664031982421875 +84.994972229003906 8 87.474685668945312 +84.504173278808594 8 82.269088745117188 +84.616958618164062 8 81.848159790039062 +85.679008483886719 8 88.659477233886719 +85.432502746582031 8 88.412971496582031 +85.2325439453125 8 88.127388000488281 +79.692916870117188 8 80.979911804199219 +79.805702209472656 8 80.558982849121094 +78.404930114746094 8 77.664031982421875 +84.070045471191406 8 83.021003723144531 +83.761909484863281 8 83.329139709472656 +85.085197448730469 8 87.811424255371094 +83.404945373535156 8 83.5791015625 +83.009986877441406 8 83.763275146484375 +82.589057922363281 8 83.876060485839844 +82.154937744140625 8 83.914031982421875 +81.720817565917969 8 83.876060485839844 +80.5479736328125 8 83.329139709472656 +80.239830017089844 8 83.021003723144531 +79.989883422851562 8 82.664031982421875 +82.154937744140625 8 78.914031982421875 +82.589057922363281 8 78.952011108398438 +94.060379028320312 8 77.664031982421875 +83.009986877441406 8 79.064804077148438 +83.404945373535156 8 79.248970031738281 +83.761909484863281 8 79.498924255371094 +84.070045471191406 8 79.80706787109375 +84.319999694824219 8 80.164031982421875 +86.280548095703125 8 85.248008728027344 +84.504173278808594 8 80.558982849121094 +85.964591979980469 8 85.395339965820312 +85.679008483886719 8 85.595298767089844 +88.250160217285156 8 85.595298767089844 +87.964584350585938 8 85.395339965820312 +87.648628234863281 8 85.248008728027344 +79.989883422851562 8 80.164031982421875 +80.239830017089844 8 79.80706787109375 +80.5479736328125 8 79.498924255371094 +88.496681213378906 8 85.841819763183594 +88.696640014648438 8 86.127388000488281 +94.060379028320312 8 85.999992370605469 +90.762657165527344 8 92.472137451171875 +87.964584350585938 8 88.85943603515625 +89.692291259765625 8 93.1280517578125 +87.648628234863281 8 89.00677490234375 +88.532508850097656 8 93.608451843261719 +87.3118896484375 8 89.097007751464844 +87.311851501464844 8 93.901496887207031 +86.964591979980469 8 89.127388000488281 +86.617294311523438 8 89.097007751464844 +80.904937744140625 8 79.248970031738281 +81.299888610839844 8 79.064804077148438 +81.720817565917969 8 78.952011108398438 +86.617294311523438 8 85.15777587890625 +86.964591979980469 8 85.127388000488281 +87.3118896484375 8 85.15777587890625 +79.805702209472656 8 82.269088745117188 +79.692916870117188 8 81.848159790039062 +79.654937744140625 8 81.414039611816406 +88.843971252441406 8 86.443351745605469 +88.9342041015625 8 86.78009033203125 +93.961875915527344 8 87.251472473144531 +88.964591979980469 8 87.127388000488281 +93.6688232421875 8 88.472137451171875 +88.9342041015625 8 87.474685668945312 +93.188430786132812 8 89.631919860839844 +88.843971252441406 8 87.811424255371094 +92.532516479492188 8 90.702278137207031 +88.696640014648438 8 88.127388000488281 +91.717231750488281 8 91.656845092773438 +88.496681213378906 8 88.412971496582031 +88.250160217285156 8 88.659477233886719 +5.4241085052490234 8 88.127388000488281 +5.2767729759216309 8 87.811424255371094 +2.6082656383514404 8 91.818550109863281 +9.1257762908935547 8 87.474685668945312 +9.0355463027954102 8 87.811424255371094 +10.655548095703125 8 94 +8.1561613082885742 8 85.395339965820312 +8.4417352676391602 8 85.595298767089844 +10.655548095703125 8 77.664031982421875 +8.6882486343383789 8 85.841819763183594 +8.8882112503051758 8 86.127388000488281 +6.6711902618408203 8 93.878463745117188 +6.8088622093200684 8 89.097007751464844 +5.3242149353027344 8 93.517539978027344 +6.4721183776855469 8 89.00677490234375 +4.0603728294372559 8 92.928199768066406 +6.1561613082885742 8 88.85943603515625 +2.918071985244751 8 92.128349304199219 +5.8705844879150391 8 88.659477233886719 +5.6240706443786621 8 88.412971496582031 +6.8088622093200684 8 85.15777587890625 +7.1561598777770996 8 85.127388000488281 +9.0355463027954102 8 86.443351745605469 +9.1257762908935547 8 86.78009033203125 +9.1561603546142578 8 87.127388000488281 +8.8882112503051758 8 88.127388000488281 +8.6882486343383789 8 88.412971496582031 +8.4417352676391602 8 88.659477233886719 +5.1865429878234863 8 87.474685668945312 +5.1561594009399414 8 87.127388000488281 +2.6082656383514404 8 77.664031982421875 +5.1865429878234863 8 86.78009033203125 +5.2767729759216309 8 86.443351745605469 +5.4241085052490234 8 86.127388000488281 +5.6240706443786621 8 85.841819763183594 +7.5034575462341309 8 85.15777587890625 +7.8402013778686523 8 85.248008728027344 +8.1561613082885742 8 88.85943603515625 +7.8402013778686523 8 89.00677490234375 +8.0603733062744141 8 94 +7.5034575462341309 8 89.097007751464844 +7.1561598777770996 8 89.127388000488281 +5.8705844879150391 8 85.595298767089844 +6.1561613082885742 8 85.395339965820312 +6.4721183776855469 8 85.248008728027344 +1.9320175647735596 8 91.142295837402344 +1.132171630859375 8 90 +0.18191337585449219 8 87.389183044433594 +0.54283440113067627 8 88.736160278320312 +84.070045471191406 8 72.30706787109375 +84.319999694824219 8 72.664039611816406 +94.060379028320312 8 70.164039611816406 +84.070045471191406 8 75.521003723144531 +83.761909484863281 8 75.829147338867188 +83.404945373535156 8 76.0791015625 +83.009986877441406 8 76.263267517089844 +82.589057922363281 8 76.376052856445312 +83.761909484863281 8 71.998924255371094 +84.504173278808594 8 73.058982849121094 +84.616958618164062 8 73.479911804199219 +84.654945373535156 8 73.914039611816406 +84.616958618164062 8 74.348152160644531 +84.504173278808594 8 74.769088745117188 +84.319999694824219 8 75.164031982421875 +79.692916870117188 8 73.479911804199219 +79.805702209472656 8 73.058982849121094 +78.404930114746094 8 70.164039611816406 +80.239830017089844 8 75.521003723144531 +79.989883422851562 8 75.164031982421875 +79.989883422851562 8 72.664039611816406 +80.239830017089844 8 72.30706787109375 +80.5479736328125 8 71.998924255371094 +82.154937744140625 8 71.414039611816406 +82.589057922363281 8 71.452011108398438 +80.904937744140625 8 71.748970031738281 +81.299888610839844 8 71.564811706542969 +81.720817565917969 8 71.452011108398438 +83.009986877441406 8 71.564811706542969 +83.404945373535156 8 71.748970031738281 +82.154937744140625 8 76.414031982421875 +81.720817565917969 8 76.376052856445312 +81.299888610839844 8 76.263267517089844 +80.904937744140625 8 76.0791015625 +80.5479736328125 8 75.829147338867188 +79.805702209472656 8 74.769088745117188 +79.692916870117188 8 74.348152160644531 +79.654937744140625 8 73.914039611816406 +83.009986877441406 8 64.064804077148438 +83.404945373535156 8 64.248970031738281 +94.060379028320312 8 62.664031982421875 +84.070045471191406 8 68.021003723144531 +83.761909484863281 8 68.329147338867188 +83.404945373535156 8 68.5791015625 +83.009986877441406 8 68.763267517089844 +82.589057922363281 8 68.876060485839844 +83.761909484863281 8 64.498924255371094 +84.070045471191406 8 64.80706787109375 +84.319999694824219 8 65.164039611816406 +84.504173278808594 8 65.558982849121094 +84.616958618164062 8 65.979911804199219 +84.654945373535156 8 66.414039611816406 +84.616958618164062 8 66.848159790039062 +84.504173278808594 8 67.269088745117188 +84.319999694824219 8 67.664031982421875 +80.239830017089844 8 68.021003723144531 +79.989883422851562 8 67.664031982421875 +79.692916870117188 8 65.979911804199219 +79.805702209472656 8 65.558982849121094 +78.404930114746094 8 62.664031982421875 +79.989883422851562 8 65.164039611816406 +80.239830017089844 8 64.80706787109375 +80.5479736328125 8 64.498924255371094 +80.904937744140625 8 64.248970031738281 +81.299888610839844 8 64.064804077148438 +82.154937744140625 8 68.914031982421875 +81.720817565917969 8 68.876060485839844 +81.299888610839844 8 68.763267517089844 +80.904937744140625 8 68.5791015625 +80.5479736328125 8 68.329147338867188 +79.805702209472656 8 67.269088745117188 +79.692916870117188 8 66.848159790039062 +79.654937744140625 8 66.414039611816406 +81.720817565917969 8 63.952014923095703 +82.154937744140625 8 63.914039611816406 +82.589057922363281 8 63.952014923095703 +84.504173278808594 8 59.769084930419922 +84.319999694824219 8 60.164035797119141 +83.009986877441406 8 56.564804077148438 +83.404945373535156 8 56.748970031738281 +94.060379028320312 8 55.164035797119141 +83.761909484863281 8 56.998924255371094 +84.070045471191406 8 57.307064056396484 +84.319999694824219 8 57.664035797119141 +84.504173278808594 8 58.058982849121094 +79.805702209472656 8 58.058982849121094 +79.989883422851562 8 57.664035797119141 +78.404930114746094 8 55.164035797119141 +80.239830017089844 8 57.307064056396484 +84.616958618164062 8 58.479915618896484 +84.654945373535156 8 58.914035797119141 +84.616958618164062 8 59.348155975341797 +84.070045471191406 8 60.521007537841797 +83.761909484863281 8 60.829147338867188 +83.404945373535156 8 61.0791015625 +83.009986877441406 8 61.263267517089844 +82.589057922363281 8 61.376052856445312 +82.154937744140625 8 61.414035797119141 +81.720817565917969 8 61.376052856445312 +81.299888610839844 8 61.263267517089844 +80.904937744140625 8 61.0791015625 +80.5479736328125 8 60.829147338867188 +80.239830017089844 8 60.521007537841797 +79.989883422851562 8 60.164035797119141 +79.805702209472656 8 59.769084930419922 +80.5479736328125 8 56.998924255371094 +80.904937744140625 8 56.748970031738281 +81.299888610839844 8 56.564804077148438 +79.692916870117188 8 59.348155975341797 +79.654937744140625 8 58.914035797119141 +79.692916870117188 8 58.479915618896484 +81.720817565917969 8 56.452018737792969 +82.154937744140625 8 56.414035797119141 +82.589057922363281 8 56.452018737792969 +79.654937744140625 8 51.414035797119141 +79.692916870117188 8 50.979915618896484 +78.404930114746094 8 47.664035797119141 +81.720817565917969 8 53.876052856445312 +81.299888610839844 8 53.763267517089844 +80.904937744140625 8 53.579097747802734 +80.5479736328125 8 53.329147338867188 +79.692916870117188 8 51.848155975341797 +80.239830017089844 8 53.021007537841797 +79.989883422851562 8 52.664035797119141 +79.805702209472656 8 52.269084930419922 +79.805702209472656 8 50.558982849121094 +79.989883422851562 8 50.164035797119141 +80.239830017089844 8 49.80706787109375 +94.060379028320312 8 47.664035797119141 +84.654945373535156 8 51.414035797119141 +84.319999694824219 8 50.164035797119141 +84.504173278808594 8 50.558982849121094 +84.616958618164062 8 50.979915618896484 +84.616958618164062 8 51.848155975341797 +84.504173278808594 8 52.269084930419922 +84.319999694824219 8 52.664035797119141 +80.5479736328125 8 49.498924255371094 +80.904937744140625 8 49.248970031738281 +81.299888610839844 8 49.064804077148438 +84.070045471191406 8 53.021007537841797 +83.761909484863281 8 53.329147338867188 +83.404945373535156 8 53.579097747802734 +83.009986877441406 8 53.763267517089844 +82.589057922363281 8 53.876052856445312 +82.154937744140625 8 53.914035797119141 +81.720817565917969 8 48.952018737792969 +82.154937744140625 8 48.914035797119141 +82.589057922363281 8 48.952018737792969 +83.009986877441406 8 49.064804077148438 +83.404945373535156 8 49.248970031738281 +83.761909484863281 8 49.498924255371094 +84.070045471191406 8 49.80706787109375 +79.654937744140625 8 36.414035797119141 +79.692916870117188 8 35.979915618896484 +78.404930114746094 8 32.664035797119141 +84.504173278808594 8 35.558982849121094 +84.616958618164062 8 35.979915618896484 +94.060379028320312 8 32.664035797119141 +79.692916870117188 8 36.848155975341797 +79.989883422851562 8 45.164031982421875 +79.805702209472656 8 44.769084930419922 +79.692916870117188 8 43.479915618896484 +80.239830017089844 8 38.021007537841797 +79.989883422851562 8 37.664031982421875 +81.720817565917969 8 46.376052856445312 +81.299888610839844 8 46.263267517089844 +80.904937744140625 8 46.079097747802734 +80.5479736328125 8 45.829147338867188 +80.239830017089844 8 45.521007537841797 +79.692916870117188 8 44.348155975341797 +79.654937744140625 8 43.914035797119141 +79.805702209472656 8 37.269084930419922 +79.805702209472656 8 35.558982849121094 +79.989883422851562 8 35.164035797119141 +80.239830017089844 8 34.80706787109375 +84.319999694824219 8 37.664031982421875 +84.070045471191406 8 38.021007537841797 +84.504173278808594 8 43.058982849121094 +84.616958618164062 8 43.479915618896484 +84.654945373535156 8 43.914035797119141 +84.319999694824219 8 35.164035797119141 +80.239830017089844 8 42.30706787109375 +82.154937744140625 8 38.914035797119141 +79.989883422851562 8 42.664035797119141 +81.720817565917969 8 38.876056671142578 +79.805702209472656 8 43.058982849121094 +81.299888610839844 8 38.763267517089844 +80.904937744140625 8 38.579097747802734 +80.5479736328125 8 38.329147338867188 +80.5479736328125 8 34.498924255371094 +80.904937744140625 8 34.248970031738281 +81.299888610839844 8 34.064804077148438 +84.654945373535156 8 36.414035797119141 +84.616958618164062 8 36.848155975341797 +84.504173278808594 8 37.269084930419922 +81.720817565917969 8 33.952014923095703 +82.154937744140625 8 33.914035797119141 +82.589057922363281 8 33.952014923095703 +83.009986877441406 8 34.064804077148438 +83.404945373535156 8 34.248970031738281 +83.761909484863281 8 34.498924255371094 +84.070045471191406 8 34.80706787109375 +84.616958618164062 8 44.348155975341797 +84.504173278808594 8 44.769084930419922 +84.319999694824219 8 45.164031982421875 +84.070045471191406 8 45.521007537841797 +83.761909484863281 8 45.829147338867188 +83.404945373535156 8 46.079097747802734 +83.009986877441406 8 46.263267517089844 +82.589057922363281 8 46.376052856445312 +82.154937744140625 8 46.414035797119141 +83.404945373535156 8 41.748970031738281 +83.761909484863281 8 38.329147338867188 +83.761909484863281 8 41.998924255371094 +84.070045471191406 8 42.30706787109375 +84.319999694824219 8 42.664035797119141 +80.5479736328125 8 41.998924255371094 +80.904937744140625 8 41.748970031738281 +81.299888610839844 8 41.564804077148438 +82.589057922363281 8 38.876056671142578 +83.009986877441406 8 41.564804077148438 +83.009986877441406 8 38.763267517089844 +83.404945373535156 8 38.579097747802734 +81.720817565917969 8 41.452014923095703 +82.154937744140625 8 41.414035797119141 +82.589057922363281 8 41.452014923095703 +79.989883422851562 8 30.164035797119141 +79.805702209472656 8 29.769084930419922 +79.692916870117188 8 29.348155975341797 +79.654937744140625 8 28.914035797119141 +79.692916870117188 8 28.479915618896484 +79.805702209472656 8 28.058984756469727 +78.404930114746094 8 25.164035797119141 +79.989883422851562 8 27.664035797119141 +80.239830017089844 8 27.30706787109375 +94.060379028320312 8 25.164035797119141 +84.654945373535156 8 28.914035797119141 +81.720817565917969 8 31.376056671142578 +81.299888610839844 8 31.263269424438477 +80.904937744140625 8 31.079097747802734 +80.5479736328125 8 30.829147338867188 +80.239830017089844 8 30.521005630493164 +84.616958618164062 8 29.348155975341797 +84.504173278808594 8 29.769084930419922 +84.319999694824219 8 30.164035797119141 +84.319999694824219 8 27.664035797119141 +84.504173278808594 8 28.058984756469727 +84.616958618164062 8 28.479915618896484 +84.070045471191406 8 30.521005630493164 +83.761909484863281 8 30.829147338867188 +83.404945373535156 8 31.079097747802734 +83.009986877441406 8 31.263269424438477 +82.589057922363281 8 31.376056671142578 +82.154937744140625 8 31.414035797119141 +80.5479736328125 8 26.998924255371094 +80.904937744140625 8 26.748971939086914 +81.299888610839844 8 26.564804077148438 +81.720817565917969 8 26.452016830444336 +82.154937744140625 8 26.414035797119141 +82.589057922363281 8 26.452016830444336 +83.009986877441406 8 26.564804077148438 +83.404945373535156 8 26.748971939086914 +83.761909484863281 8 26.998924255371094 +84.070045471191406 8 27.30706787109375 +80.5479736328125 8 23.329145431518555 +80.239830017089844 8 23.021005630493164 +79.989883422851562 8 22.664033889770508 +79.805702209472656 8 22.269084930419922 +79.692916870117188 8 21.848155975341797 +78.404930114746094 8 17.664035797119141 +79.654937744140625 8 21.414035797119141 +79.692916870117188 8 20.979915618896484 +81.720817565917969 8 23.876054763793945 +81.299888610839844 8 23.763267517089844 +80.904937744140625 8 23.579097747802734 +83.009986877441406 8 19.064804077148438 +83.404945373535156 8 19.248971939086914 +94.060379028320312 8 17.664035797119141 +83.761909484863281 8 23.329145431518555 +83.404945373535156 8 23.579097747802734 +79.805702209472656 8 20.558984756469727 +79.989883422851562 8 20.164035797119141 +80.239830017089844 8 19.807065963745117 +80.5479736328125 8 19.498924255371094 +80.904937744140625 8 19.248971939086914 +81.299888610839844 8 19.064804077148438 +84.319999694824219 8 20.164035797119141 +84.504173278808594 8 20.558984756469727 +84.616958618164062 8 20.979915618896484 +84.654945373535156 8 21.414035797119141 +84.616958618164062 8 21.848155975341797 +84.504173278808594 8 22.269084930419922 +83.009986877441406 8 23.763267517089844 +82.589057922363281 8 23.876054763793945 +82.154937744140625 8 23.914035797119141 +81.720817565917969 8 18.952014923095703 +82.154937744140625 8 18.914033889770508 +82.589057922363281 8 18.952014923095703 +83.761909484863281 8 19.498924255371094 +84.070045471191406 8 19.807065963745117 +84.319999694824219 8 22.664033889770508 +84.070045471191406 8 23.021005630493164 +79.805702209472656 8 13.058986663818359 +79.989883422851562 8 12.664034843444824 +80.239830017089844 8 12.307066917419434 +84.616958618164062 8 14.348156929016113 +84.504173278808594 8 14.769084930419922 +83.761909484863281 8 15.829145431518555 +83.404945373535156 8 16.079099655151367 +82.154937744140625 8 16.414035797119141 +82.589057922363281 8 16.376056671142578 +83.009986877441406 8 16.263267517089844 +80.904937744140625 8 16.079099655151367 +80.5479736328125 8 15.829145431518555 +84.319999694824219 8 15.164036750793457 +84.070045471191406 8 15.521004676818848 +81.720817565917969 8 16.376056671142578 +81.299888610839844 8 16.263267517089844 +80.239830017089844 8 15.521004676818848 +79.989883422851562 8 15.164036750793457 +79.805702209472656 8 14.769084930419922 +80.5479736328125 8 11.99892520904541 +80.904937744140625 8 11.74897289276123 +81.299888610839844 8 11.564802169799805 +79.692916870117188 8 14.348156929016113 +79.654937744140625 8 13.914033889770508 +79.692916870117188 8 13.479914665222168 +83.009986877441406 8 11.564802169799805 +83.404945373535156 8 11.74897289276123 +83.761909484863281 8 11.99892520904541 +84.070045471191406 8 12.307066917419434 +84.319999694824219 8 12.664034843444824 +81.720817565917969 8 11.45201587677002 +82.154937744140625 8 11.414035797119141 +82.589057922363281 8 11.45201587677002 +84.504173278808594 8 13.058986663818359 +84.616958618164062 8 13.479914665222168 +84.654945373535156 8 13.914033889770508 +73.799888610839844 8 83.763275146484375 +73.404937744140625 8 83.5791015625 +70.904937744140625 8 94 +77.004173278808594 8 82.269088745117188 +76.819999694824219 8 82.664031982421875 +76.570045471191406 8 83.021003723144531 +76.261909484863281 8 79.498924255371094 +76.570045471191406 8 79.80706787109375 +76.819999694824219 8 80.164031982421875 +77.004173278808594 8 80.558982849121094 +77.116958618164062 8 80.979911804199219 +77.154937744140625 8 81.414039611816406 +77.116958618164062 8 81.848159790039062 +76.261909484863281 8 83.329139709472656 +75.904937744140625 8 83.5791015625 +75.509986877441406 8 83.763275146484375 +75.089057922363281 8 83.876060485839844 +74.654937744140625 8 83.914031982421875 +74.220817565917969 8 83.876060485839844 +72.489875793457031 8 82.664031982421875 +72.305709838867188 8 82.269088745117188 +72.192924499511719 8 81.848159790039062 +73.047966003417969 8 83.329139709472656 +72.739822387695312 8 83.021003723144531 +72.154937744140625 8 81.414039611816406 +72.192924499511719 8 80.979911804199219 +70.904937744140625 8 77.664031982421875 +72.305709838867188 8 80.558982849121094 +72.489875793457031 8 80.164031982421875 +72.739822387695312 8 79.80706787109375 +73.047966003417969 8 79.498924255371094 +73.404937744140625 8 79.248970031738281 +75.089057922363281 8 78.952011108398438 +75.509986877441406 8 79.064804077148438 +75.904937744140625 8 79.248970031738281 +73.799888610839844 8 79.064804077148438 +74.220817565917969 8 78.952011108398438 +74.654937744140625 8 78.914031982421875 +76.570045471191406 8 72.30706787109375 +76.819999694824219 8 72.664039611816406 +72.192924499511719 8 73.479911804199219 +72.305709838867188 8 73.058982849121094 +70.904937744140625 8 70.164039611816406 +72.489875793457031 8 72.664039611816406 +76.261909484863281 8 71.998924255371094 +76.570045471191406 8 75.521003723144531 +76.261909484863281 8 75.829147338867188 +75.904937744140625 8 76.0791015625 +75.509986877441406 8 76.263267517089844 +77.004173278808594 8 73.058982849121094 +77.116958618164062 8 73.479911804199219 +77.154937744140625 8 73.914039611816406 +77.116958618164062 8 74.348152160644531 +77.004173278808594 8 74.769088745117188 +76.819999694824219 8 75.164031982421875 +73.799888610839844 8 76.263267517089844 +73.404937744140625 8 76.0791015625 +75.089057922363281 8 76.376052856445312 +74.654937744140625 8 76.414031982421875 +74.220817565917969 8 76.376052856445312 +72.739822387695312 8 72.30706787109375 +73.047966003417969 8 71.998924255371094 +73.404937744140625 8 71.748970031738281 +75.089057922363281 8 71.452011108398438 +75.509986877441406 8 71.564811706542969 +75.904937744140625 8 71.748970031738281 +73.047966003417969 8 75.829147338867188 +72.739822387695312 8 75.521003723144531 +72.489875793457031 8 75.164031982421875 +72.305709838867188 8 74.769088745117188 +72.192924499511719 8 74.348152160644531 +72.154937744140625 8 73.914039611816406 +73.799888610839844 8 71.564811706542969 +74.220817565917969 8 71.452011108398438 +74.654937744140625 8 71.414039611816406 +76.570045471191406 8 64.80706787109375 +76.819999694824219 8 65.164039611816406 +72.192924499511719 8 65.979911804199219 +72.305709838867188 8 65.558982849121094 +70.904937744140625 8 62.664031982421875 +72.489875793457031 8 65.164039611816406 +76.261909484863281 8 64.498924255371094 +76.570045471191406 8 68.021003723144531 +76.261909484863281 8 68.329147338867188 +75.904937744140625 8 68.5791015625 +75.509986877441406 8 68.763267517089844 +77.004173278808594 8 65.558982849121094 +77.116958618164062 8 65.979911804199219 +77.154937744140625 8 66.414039611816406 +77.116958618164062 8 66.848159790039062 +77.004173278808594 8 67.269088745117188 +76.819999694824219 8 67.664031982421875 +73.799888610839844 8 68.763267517089844 +73.404937744140625 8 68.5791015625 +75.089057922363281 8 68.876060485839844 +74.654937744140625 8 68.914031982421875 +74.220817565917969 8 68.876060485839844 +72.739822387695312 8 64.80706787109375 +73.047966003417969 8 64.498924255371094 +73.404937744140625 8 64.248970031738281 +75.089057922363281 8 63.952014923095703 +75.509986877441406 8 64.064804077148438 +75.904937744140625 8 64.248970031738281 +73.047966003417969 8 68.329147338867188 +72.739822387695312 8 68.021003723144531 +72.489875793457031 8 67.664031982421875 +72.305709838867188 8 67.269088745117188 +72.192924499511719 8 66.848159790039062 +72.154937744140625 8 66.414039611816406 +73.799888610839844 8 64.064804077148438 +74.220817565917969 8 63.952014923095703 +74.654937744140625 8 63.914039611816406 +72.489875793457031 8 60.164035797119141 +72.305709838867188 8 59.769084930419922 +72.192924499511719 8 59.348155975341797 +77.116958618164062 8 58.479915618896484 +77.154937744140625 8 58.914035797119141 +72.154937744140625 8 58.914035797119141 +72.192924499511719 8 58.479915618896484 +70.904937744140625 8 55.164035797119141 +72.305709838867188 8 58.058982849121094 +72.489875793457031 8 57.664035797119141 +72.739822387695312 8 57.307064056396484 +77.116958618164062 8 59.348155975341797 +77.004173278808594 8 59.769084930419922 +76.819999694824219 8 60.164035797119141 +76.570045471191406 8 60.521007537841797 +76.261909484863281 8 60.829147338867188 +75.904937744140625 8 61.0791015625 +74.220817565917969 8 61.376052856445312 +73.799888610839844 8 61.263267517089844 +73.404937744140625 8 61.0791015625 +73.047966003417969 8 60.829147338867188 +72.739822387695312 8 60.521007537841797 +76.570045471191406 8 57.307064056396484 +76.819999694824219 8 57.664035797119141 +77.004173278808594 8 58.058982849121094 +75.509986877441406 8 61.263267517089844 +75.089057922363281 8 61.376052856445312 +74.654937744140625 8 61.414035797119141 +73.047966003417969 8 56.998924255371094 +73.404937744140625 8 56.748970031738281 +73.799888610839844 8 56.564804077148438 +74.220817565917969 8 56.452018737792969 +74.654937744140625 8 56.414035797119141 +75.089057922363281 8 56.452018737792969 +75.509986877441406 8 56.564804077148438 +75.904937744140625 8 56.748970031738281 +76.261909484863281 8 56.998924255371094 +72.489875793457031 8 52.664035797119141 +72.305709838867188 8 52.269084930419922 +72.192924499511719 8 51.848155975341797 +72.154937744140625 8 51.414035797119141 +70.904937744140625 8 47.664035797119141 +72.192924499511719 8 50.979915618896484 +77.116958618164062 8 50.979915618896484 +77.154937744140625 8 51.414035797119141 +72.305709838867188 8 50.558982849121094 +72.489875793457031 8 50.164035797119141 +72.739822387695312 8 49.80706787109375 +77.116958618164062 8 51.848155975341797 +77.004173278808594 8 52.269084930419922 +76.819999694824219 8 52.664035797119141 +76.570045471191406 8 53.021007537841797 +76.261909484863281 8 53.329147338867188 +75.904937744140625 8 53.579097747802734 +74.220817565917969 8 53.876052856445312 +73.799888610839844 8 53.763267517089844 +73.404937744140625 8 53.579097747802734 +73.047966003417969 8 53.329147338867188 +72.739822387695312 8 53.021007537841797 +76.570045471191406 8 49.80706787109375 +76.819999694824219 8 50.164035797119141 +77.004173278808594 8 50.558982849121094 +75.509986877441406 8 53.763267517089844 +75.089057922363281 8 53.876052856445312 +74.654937744140625 8 53.914035797119141 +73.047966003417969 8 49.498924255371094 +73.404937744140625 8 49.248970031738281 +73.799888610839844 8 49.064804077148438 +74.220817565917969 8 48.952018737792969 +74.654937744140625 8 48.914035797119141 +75.089057922363281 8 48.952018737792969 +75.509986877441406 8 49.064804077148438 +75.904937744140625 8 49.248970031738281 +76.261909484863281 8 49.498924255371094 +77.154937744140625 8 36.414035797119141 +77.116958618164062 8 36.848155975341797 +72.489875793457031 8 45.164031982421875 +72.305709838867188 8 44.769084930419922 +72.192924499511719 8 43.479915618896484 +70.904937744140625 8 32.664035797119141 +72.154937744140625 8 43.914035797119141 +72.192924499511719 8 44.348155975341797 +74.220817565917969 8 46.376052856445312 +73.799888610839844 8 46.263267517089844 +73.404937744140625 8 46.079097747802734 +73.047966003417969 8 45.829147338867188 +72.739822387695312 8 45.521007537841797 +72.739822387695312 8 38.021007537841797 +72.489875793457031 8 37.664031982421875 +77.154937744140625 8 43.914035797119141 +77.116958618164062 8 43.479915618896484 +77.004173278808594 8 37.269084930419922 +72.739822387695312 8 42.30706787109375 +74.654937744140625 8 38.914035797119141 +72.489875793457031 8 42.664035797119141 +74.220817565917969 8 38.876056671142578 +72.305709838867188 8 43.058982849121094 +72.305709838867188 8 37.269084930419922 +72.192924499511719 8 36.848155975341797 +72.154937744140625 8 36.414035797119141 +72.192924499511719 8 35.979915618896484 +77.116958618164062 8 44.348155975341797 +77.004173278808594 8 44.769084930419922 +76.819999694824219 8 45.164031982421875 +72.305709838867188 8 35.558982849121094 +72.489875793457031 8 35.164035797119141 +72.739822387695312 8 34.80706787109375 +76.570045471191406 8 45.521007537841797 +76.261909484863281 8 45.829147338867188 +75.904937744140625 8 46.079097747802734 +75.509986877441406 8 46.263267517089844 +75.089057922363281 8 46.376052856445312 +74.654937744140625 8 46.414035797119141 +73.799888610839844 8 38.763267517089844 +73.404937744140625 8 38.579097747802734 +73.047966003417969 8 38.329147338867188 +76.819999694824219 8 35.164035797119141 +77.004173278808594 8 35.558982849121094 +77.116958618164062 8 35.979915618896484 +76.819999694824219 8 37.664031982421875 +76.570045471191406 8 38.021007537841797 +77.004173278808594 8 43.058982849121094 +76.819999694824219 8 42.664035797119141 +73.047966003417969 8 34.498924255371094 +73.404937744140625 8 34.248970031738281 +73.799888610839844 8 34.064804077148438 +75.904937744140625 8 41.748970031738281 +76.261909484863281 8 38.329147338867188 +76.261909484863281 8 41.998924255371094 +76.570045471191406 8 42.30706787109375 +74.220817565917969 8 33.952014923095703 +74.654937744140625 8 33.914035797119141 +75.089057922363281 8 33.952014923095703 +75.509986877441406 8 34.064804077148438 +75.904937744140625 8 34.248970031738281 +76.261909484863281 8 34.498924255371094 +76.570045471191406 8 34.80706787109375 +73.047966003417969 8 41.998924255371094 +73.404937744140625 8 41.748970031738281 +73.799888610839844 8 41.564804077148438 +75.089057922363281 8 38.876056671142578 +75.509986877441406 8 41.564804077148438 +75.509986877441406 8 38.763267517089844 +75.904937744140625 8 38.579097747802734 +74.220817565917969 8 41.452014923095703 +74.654937744140625 8 41.414035797119141 +75.089057922363281 8 41.452014923095703 +72.305709838867188 8 29.769084930419922 +72.192924499511719 8 29.348155975341797 +77.154937744140625 8 28.914035797119141 +72.489875793457031 8 30.164035797119141 +72.154937744140625 8 28.914035797119141 +72.192924499511719 8 28.479915618896484 +70.904937744140625 8 25.164035797119141 +72.305709838867188 8 28.058984756469727 +77.116958618164062 8 29.348155975341797 +77.004173278808594 8 29.769084930419922 +76.819999694824219 8 30.164035797119141 +74.220817565917969 8 31.376056671142578 +73.799888610839844 8 31.263269424438477 +73.404937744140625 8 31.079097747802734 +73.047966003417969 8 30.829147338867188 +72.739822387695312 8 30.521005630493164 +72.489875793457031 8 27.664035797119141 +72.739822387695312 8 27.30706787109375 +73.047966003417969 8 26.998924255371094 +76.570045471191406 8 30.521005630493164 +76.261909484863281 8 30.829147338867188 +75.904937744140625 8 31.079097747802734 +75.509986877441406 8 31.263269424438477 +75.089057922363281 8 31.376056671142578 +74.654937744140625 8 31.414035797119141 +76.819999694824219 8 27.664035797119141 +77.004173278808594 8 28.058984756469727 +77.116958618164062 8 28.479915618896484 +73.404937744140625 8 26.748971939086914 +73.799888610839844 8 26.564804077148438 +74.220817565917969 8 26.452016830444336 +74.654937744140625 8 26.414035797119141 +75.089057922363281 8 26.452016830444336 +75.509986877441406 8 26.564804077148438 +75.904937744140625 8 26.748971939086914 +76.261909484863281 8 26.998924255371094 +76.570045471191406 8 27.30706787109375 +76.261909484863281 8 23.329145431518555 +75.904937744140625 8 23.579097747802734 +75.509986877441406 8 23.763267517089844 +75.089057922363281 8 23.876054763793945 +72.739822387695312 8 23.021005630493164 +72.489875793457031 8 22.664033889770508 +72.489875793457031 8 20.164035797119141 +70.904937744140625 8 17.664035797119141 +72.305709838867188 8 20.558984756469727 +72.192924499511719 8 20.979915618896484 +77.004173278808594 8 22.269084930419922 +76.819999694824219 8 22.664033889770508 +76.570045471191406 8 23.021005630493164 +72.305709838867188 8 22.269084930419922 +72.192924499511719 8 21.848155975341797 +72.154937744140625 8 21.414035797119141 +75.904937744140625 8 19.248971939086914 +75.509986877441406 8 19.064804077148438 +75.089057922363281 8 18.952014923095703 +76.819999694824219 8 20.164035797119141 +77.004173278808594 8 20.558984756469727 +74.654937744140625 8 23.914035797119141 +74.220817565917969 8 23.876054763793945 +73.799888610839844 8 23.763267517089844 +73.404937744140625 8 23.579097747802734 +73.047966003417969 8 23.329145431518555 +72.739822387695312 8 19.807065963745117 +73.047966003417969 8 19.498924255371094 +73.404937744140625 8 19.248971939086914 +73.799888610839844 8 19.064804077148438 +74.220817565917969 8 18.952014923095703 +74.654937744140625 8 18.914033889770508 +77.116958618164062 8 20.979915618896484 +77.154937744140625 8 21.414035797119141 +77.116958618164062 8 21.848155975341797 +76.261909484863281 8 19.498924255371094 +76.570045471191406 8 19.807065963745117 +72.305709838867188 8 13.058986663818359 +72.489875793457031 8 12.664034843444824 +70.904937744140625 8 10.14332103729248 +77.116958618164062 8 14.348156929016113 +77.004173278808594 8 14.769084930419922 +76.261909484863281 8 15.829145431518555 +75.904937744140625 8 16.079099655151367 +75.509986877441406 8 16.263267517089844 +75.089057922363281 8 16.376056671142578 +74.654937744140625 8 16.414035797119141 +74.220817565917969 8 16.376056671142578 +76.819999694824219 8 15.164036750793457 +76.570045471191406 8 15.521004676818848 +75.904937744140625 8 11.74897289276123 +75.509986877441406 8 11.564802169799805 +75.089057922363281 8 11.45201587677002 +73.799888610839844 8 16.263267517089844 +73.404937744140625 8 16.079099655151367 +73.047966003417969 8 15.829145431518555 +72.739822387695312 8 12.307066917419434 +73.047966003417969 8 11.99892520904541 +73.404937744140625 8 11.74897289276123 +73.799888610839844 8 11.564802169799805 +74.220817565917969 8 11.45201587677002 +74.654937744140625 8 11.414035797119141 +72.739822387695312 8 15.521004676818848 +72.489875793457031 8 15.164036750793457 +72.305709838867188 8 14.769084930419922 +72.192924499511719 8 14.348156929016113 +72.154937744140625 8 13.914033889770508 +72.192924499511719 8 13.479914665222168 +76.819999694824219 8 12.664034843444824 +77.004173278808594 8 13.058986663818359 +77.116958618164062 8 13.479914665222168 +77.154937744140625 8 13.914033889770508 +76.261909484863281 8 11.99892520904541 +76.570045471191406 8 12.307066917419434 +65.239830017089844 8 79.80706787109375 +65.5479736328125 8 79.498924255371094 +63.404941558837891 8 77.664031982421875 +67.154937744140625 8 83.914031982421875 +63.404941558837891 8 94 +66.720809936523438 8 83.876060485839844 +65.904937744140625 8 79.248970031738281 +66.299888610839844 8 79.064804077148438 +66.720809936523438 8 78.952011108398438 +64.654937744140625 8 81.414039611816406 +64.692916870117188 8 80.979911804199219 +65.5479736328125 8 83.329139709472656 +65.239830017089844 8 83.021003723144531 +64.805709838867188 8 80.558982849121094 +64.989875793457031 8 80.164031982421875 +67.154937744140625 8 78.914031982421875 +67.589057922363281 8 78.952011108398438 +68.009986877441406 8 79.064804077148438 +68.404945373535156 8 79.248970031738281 +68.761909484863281 8 79.498924255371094 +69.070045471191406 8 79.80706787109375 +69.319999694824219 8 80.164031982421875 +69.654937744140625 8 81.414039611816406 +66.299888610839844 8 83.763275146484375 +65.904937744140625 8 83.5791015625 +69.504173278808594 8 80.558982849121094 +69.616958618164062 8 80.979911804199219 +64.989875793457031 8 82.664031982421875 +64.805709838867188 8 82.269088745117188 +64.692916870117188 8 81.848159790039062 +69.616958618164062 8 81.848159790039062 +69.504173278808594 8 82.269088745117188 +69.319999694824219 8 82.664031982421875 +69.070045471191406 8 83.021003723144531 +68.761909484863281 8 83.329139709472656 +68.404945373535156 8 83.5791015625 +68.009986877441406 8 83.763275146484375 +67.589057922363281 8 83.876060485839844 +67.154937744140625 8 76.414031982421875 +69.070045471191406 8 75.521003723144531 +68.761909484863281 8 75.829147338867188 +68.404945373535156 8 76.0791015625 +69.616958618164062 8 74.348152160644531 +69.504173278808594 8 74.769088745117188 +69.319999694824219 8 75.164031982421875 +68.009986877441406 8 76.263267517089844 +67.589057922363281 8 76.376052856445312 +66.720809936523438 8 76.376052856445312 +66.299888610839844 8 76.263267517089844 +65.904937744140625 8 76.0791015625 +65.5479736328125 8 75.829147338867188 +65.239830017089844 8 75.521003723144531 +64.989875793457031 8 75.164031982421875 +64.692916870117188 8 73.479911804199219 +64.805709838867188 8 73.058982849121094 +63.404941558837891 8 70.164039611816406 +64.989875793457031 8 72.664039611816406 +64.805709838867188 8 74.769088745117188 +64.692916870117188 8 74.348152160644531 +64.654937744140625 8 73.914039611816406 +65.239830017089844 8 72.30706787109375 +65.5479736328125 8 71.998924255371094 +65.904937744140625 8 71.748970031738281 +66.299888610839844 8 71.564811706542969 +66.720809936523438 8 71.452011108398438 +67.154937744140625 8 71.414039611816406 +67.589057922363281 8 71.452011108398438 +68.009986877441406 8 71.564811706542969 +68.404945373535156 8 71.748970031738281 +68.761909484863281 8 71.998924255371094 +69.070045471191406 8 72.30706787109375 +69.319999694824219 8 72.664039611816406 +69.504173278808594 8 73.058982849121094 +69.616958618164062 8 73.479911804199219 +69.654937744140625 8 73.914039611816406 +69.070045471191406 8 68.021003723144531 +68.761909484863281 8 68.329147338867188 +68.404945373535156 8 68.5791015625 +68.009986877441406 8 68.763267517089844 +65.5479736328125 8 68.329147338867188 +65.239830017089844 8 68.021003723144531 +69.616958618164062 8 66.848159790039062 +69.504173278808594 8 67.269088745117188 +69.319999694824219 8 67.664031982421875 +66.720809936523438 8 68.876060485839844 +67.154937744140625 8 68.914031982421875 +67.589057922363281 8 68.876060485839844 +66.299888610839844 8 68.763267517089844 +65.904937744140625 8 68.5791015625 +64.692916870117188 8 66.848159790039062 +64.654937744140625 8 66.414039611816406 +63.404941558837891 8 62.664031982421875 +64.692916870117188 8 65.979911804199219 +64.805709838867188 8 65.558982849121094 +64.989875793457031 8 65.164039611816406 +65.239830017089844 8 64.80706787109375 +65.5479736328125 8 64.498924255371094 +64.989875793457031 8 67.664031982421875 +64.805709838867188 8 67.269088745117188 +65.904937744140625 8 64.248970031738281 +66.299888610839844 8 64.064804077148438 +66.720809936523438 8 63.952014923095703 +67.154937744140625 8 63.914039611816406 +67.589057922363281 8 63.952014923095703 +68.009986877441406 8 64.064804077148438 +68.404945373535156 8 64.248970031738281 +68.761909484863281 8 64.498924255371094 +69.070045471191406 8 64.80706787109375 +69.319999694824219 8 65.164039611816406 +69.504173278808594 8 65.558982849121094 +69.616958618164062 8 65.979911804199219 +69.654937744140625 8 66.414039611816406 +66.720809936523438 8 61.376052856445312 +66.299888610839844 8 61.263267517089844 +65.904937744140625 8 61.0791015625 +64.654937744140625 8 58.914035797119141 +64.692916870117188 8 58.479915618896484 +63.404941558837891 8 55.164035797119141 +64.805709838867188 8 58.058982849121094 +67.154937744140625 8 61.414035797119141 +65.5479736328125 8 60.829147338867188 +65.239830017089844 8 60.521007537841797 +64.989875793457031 8 60.164035797119141 +64.805709838867188 8 59.769084930419922 +64.692916870117188 8 59.348155975341797 +69.616958618164062 8 58.479915618896484 +69.654937744140625 8 58.914035797119141 +69.616958618164062 8 59.348155975341797 +69.504173278808594 8 59.769084930419922 +69.319999694824219 8 60.164035797119141 +69.070045471191406 8 57.307064056396484 +69.319999694824219 8 57.664035797119141 +69.504173278808594 8 58.058982849121094 +69.070045471191406 8 60.521007537841797 +68.761909484863281 8 60.829147338867188 +68.404945373535156 8 61.0791015625 +68.009986877441406 8 56.564804077148438 +68.404945373535156 8 56.748970031738281 +68.761909484863281 8 56.998924255371094 +68.009986877441406 8 61.263267517089844 +67.589057922363281 8 61.376052856445312 +64.989875793457031 8 57.664035797119141 +65.239830017089844 8 57.307064056396484 +65.5479736328125 8 56.998924255371094 +66.720809936523438 8 56.452018737792969 +67.154937744140625 8 56.414035797119141 +67.589057922363281 8 56.452018737792969 +65.904937744140625 8 56.748970031738281 +66.299888610839844 8 56.564804077148438 +66.720809936523438 8 53.876052856445312 +66.299888610839844 8 53.763267517089844 +67.154937744140625 8 53.914035797119141 +65.904937744140625 8 53.579097747802734 +65.5479736328125 8 53.329147338867188 +65.239830017089844 8 53.021007537841797 +64.692916870117188 8 51.848155975341797 +64.654937744140625 8 51.414035797119141 +63.404941558837891 8 47.664035797119141 +64.692916870117188 8 50.979915618896484 +64.805709838867188 8 50.558982849121094 +64.989875793457031 8 50.164035797119141 +64.989875793457031 8 52.664035797119141 +64.805709838867188 8 52.269084930419922 +69.616958618164062 8 50.979915618896484 +69.654937744140625 8 51.414035797119141 +68.761909484863281 8 49.498924255371094 +69.070045471191406 8 49.80706787109375 +69.616958618164062 8 51.848155975341797 +69.504173278808594 8 52.269084930419922 +69.319999694824219 8 52.664035797119141 +69.319999694824219 8 50.164035797119141 +69.504173278808594 8 50.558982849121094 +69.070045471191406 8 53.021007537841797 +68.761909484863281 8 53.329147338867188 +68.404945373535156 8 53.579097747802734 +67.589057922363281 8 48.952018737792969 +68.009986877441406 8 49.064804077148438 +68.404945373535156 8 49.248970031738281 +68.009986877441406 8 53.763267517089844 +67.589057922363281 8 53.876052856445312 +65.239830017089844 8 49.80706787109375 +65.5479736328125 8 49.498924255371094 +65.904937744140625 8 49.248970031738281 +66.299888610839844 8 49.064804077148438 +66.720809936523438 8 48.952018737792969 +67.154937744140625 8 48.914035797119141 +69.504173278808594 8 37.269084930419922 +69.319999694824219 8 37.664031982421875 +68.761909484863281 8 34.498924255371094 +69.070045471191406 8 34.80706787109375 +69.319999694824219 8 35.164035797119141 +69.504173278808594 8 35.558982849121094 +66.720809936523438 8 46.376052856445312 +66.299888610839844 8 46.263267517089844 +65.904937744140625 8 46.079097747802734 +65.5479736328125 8 45.829147338867188 +65.239830017089844 8 45.521007537841797 +66.720809936523438 8 41.452014923095703 +67.154937744140625 8 41.414035797119141 +67.154937744140625 8 38.914035797119141 +64.989875793457031 8 45.164031982421875 +64.805709838867188 8 44.769084930419922 +64.692916870117188 8 44.348155975341797 +65.904937744140625 8 38.579097747802734 +65.5479736328125 8 38.329147338867188 +65.239830017089844 8 38.021007537841797 +64.989875793457031 8 37.664031982421875 +64.805709838867188 8 37.269084930419922 +64.692916870117188 8 36.848155975341797 +63.404941558837891 8 32.664035797119141 +64.654937744140625 8 36.414035797119141 +64.692916870117188 8 35.979915618896484 +65.239830017089844 8 34.80706787109375 +65.5479736328125 8 34.498924255371094 +65.904937744140625 8 34.248970031738281 +66.299888610839844 8 34.064804077148438 +67.589057922363281 8 33.952014923095703 +67.154937744140625 8 33.914035797119141 +66.720809936523438 8 33.952014923095703 +68.009986877441406 8 34.064804077148438 +68.404945373535156 8 34.248970031738281 +69.616958618164062 8 35.979915618896484 +69.654937744140625 8 36.414035797119141 +69.616958618164062 8 36.848155975341797 +68.404945373535156 8 41.748970031738281 +68.761909484863281 8 41.998924255371094 +68.761909484863281 8 38.329147338867188 +69.070045471191406 8 42.30706787109375 +69.319999694824219 8 42.664035797119141 +69.616958618164062 8 43.479915618896484 +69.654937744140625 8 43.914035797119141 +65.239830017089844 8 42.30706787109375 +65.5479736328125 8 41.998924255371094 +64.805709838867188 8 35.558982849121094 +64.989875793457031 8 35.164035797119141 +67.589057922363281 8 38.876056671142578 +69.504173278808594 8 43.058982849121094 +69.070045471191406 8 38.021007537841797 +64.989875793457031 8 42.664035797119141 +66.720809936523438 8 38.876056671142578 +66.299888610839844 8 38.763267517089844 +66.299888610839844 8 41.564804077148438 +65.904937744140625 8 41.748970031738281 +69.616958618164062 8 44.348155975341797 +69.504173278808594 8 44.769084930419922 +69.319999694824219 8 45.164031982421875 +69.070045471191406 8 45.521007537841797 +68.761909484863281 8 45.829147338867188 +68.404945373535156 8 46.079097747802734 +67.589057922363281 8 41.452014923095703 +68.009986877441406 8 41.564804077148438 +68.009986877441406 8 38.763267517089844 +68.404945373535156 8 38.579097747802734 +68.009986877441406 8 46.263267517089844 +67.589057922363281 8 46.376052856445312 +67.154937744140625 8 46.414035797119141 +64.654937744140625 8 43.914035797119141 +64.692916870117188 8 43.479915618896484 +64.805709838867188 8 43.058982849121094 +68.761909484863281 8 26.998924255371094 +69.070045471191406 8 27.30706787109375 +69.319999694824219 8 27.664035797119141 +69.504173278808594 8 28.058984756469727 +69.616958618164062 8 28.479915618896484 +66.720809936523438 8 31.376056671142578 +66.299888610839844 8 31.263269424438477 +65.904937744140625 8 31.079097747802734 +65.5479736328125 8 30.829147338867188 +65.239830017089844 8 30.521005630493164 +64.989875793457031 8 30.164035797119141 +64.805709838867188 8 29.769084930419922 +69.654937744140625 8 28.914035797119141 +65.239830017089844 8 27.30706787109375 +65.5479736328125 8 26.998924255371094 +63.404941558837891 8 25.164035797119141 +67.589057922363281 8 26.452016830444336 +67.154937744140625 8 26.414035797119141 +66.720809936523438 8 26.452016830444336 +68.009986877441406 8 26.564804077148438 +68.404945373535156 8 26.748971939086914 +69.616958618164062 8 29.348155975341797 +69.504173278808594 8 29.769084930419922 +69.319999694824219 8 30.164035797119141 +69.070045471191406 8 30.521005630493164 +68.761909484863281 8 30.829147338867188 +68.404945373535156 8 31.079097747802734 +64.692916870117188 8 28.479915618896484 +64.654937744140625 8 28.914035797119141 +64.692916870117188 8 29.348155975341797 +68.009986877441406 8 31.263269424438477 +67.589057922363281 8 31.376056671142578 +67.154937744140625 8 31.414035797119141 +65.904937744140625 8 26.748971939086914 +66.299888610839844 8 26.564804077148438 +64.805709838867188 8 28.058984756469727 +64.989875793457031 8 27.664035797119141 +68.761909484863281 8 23.329145431518555 +68.404945373535156 8 23.579097747802734 +68.009986877441406 8 23.763267517089844 +67.589057922363281 8 23.876054763793945 +67.154937744140625 8 23.914035797119141 +66.720809936523438 8 23.876054763793945 +65.5479736328125 8 23.329145431518555 +65.239830017089844 8 23.021005630493164 +64.989875793457031 8 22.664033889770508 +69.504173278808594 8 22.269084930419922 +69.319999694824219 8 22.664033889770508 +69.070045471191406 8 23.021005630493164 +64.805709838867188 8 22.269084930419922 +64.692916870117188 8 21.848155975341797 +63.404941558837891 8 17.664035797119141 +64.654937744140625 8 21.414035797119141 +64.692916870117188 8 20.979915618896484 +64.805709838867188 8 20.558984756469727 +64.989875793457031 8 20.164035797119141 +65.239830017089844 8 19.807065963745117 +66.299888610839844 8 19.064804077148438 +66.720809936523438 8 18.952014923095703 +69.504173278808594 8 20.558984756469727 +69.616958618164062 8 20.979915618896484 +69.654937744140625 8 21.414035797119141 +69.616958618164062 8 21.848155975341797 +66.299888610839844 8 23.763267517089844 +65.904937744140625 8 23.579097747802734 +65.5479736328125 8 19.498924255371094 +65.904937744140625 8 19.248971939086914 +67.154937744140625 8 18.914033889770508 +67.589057922363281 8 18.952014923095703 +68.009986877441406 8 19.064804077148438 +68.404945373535156 8 19.248971939086914 +68.761909484863281 8 19.498924255371094 +69.070045471191406 8 19.807065963745117 +69.319999694824219 8 20.164035797119141 +69.504173278808594 8 13.058986663818359 +69.616958618164062 8 13.479914665222168 +68.404945373535156 8 16.079099655151367 +68.009986877441406 8 16.263267517089844 +69.616958618164062 8 14.348156929016113 +69.504173278808594 8 14.769084930419922 +68.761909484863281 8 15.829145431518555 +67.589057922363281 8 16.376056671142578 +64.805709838867188 8 14.769084930419922 +64.989875793457031 8 15.164036750793457 +65.239830017089844 8 15.521004676818848 +69.654937744140625 8 13.914033889770508 +69.319999694824219 8 15.164036750793457 +69.070045471191406 8 15.521004676818848 +67.154937744140625 8 16.414035797119141 +66.720809936523438 8 16.376056671142578 +66.299888610839844 8 16.263267517089844 +65.904937744140625 8 16.079099655151367 +65.5479736328125 8 15.829145431518555 +64.692916870117188 8 14.348156929016113 +64.654937744140625 8 13.914033889770508 +63.404941558837891 8 10.14332103729248 +64.692916870117188 8 13.479914665222168 +64.805709838867188 8 13.058986663818359 +64.989875793457031 8 12.664034843444824 +65.239830017089844 8 12.307066917419434 +68.009986877441406 8 11.564802169799805 +68.404945373535156 8 11.74897289276123 +68.761909484863281 8 11.99892520904541 +65.5479736328125 8 11.99892520904541 +65.904937744140625 8 11.74897289276123 +66.299888610839844 8 11.564802169799805 +66.720809936523438 8 11.45201587677002 +67.154937744140625 8 11.414035797119141 +67.589057922363281 8 11.45201587677002 +69.070045471191406 8 12.307066917419434 +69.319999694824219 8 12.664034843444824 +57.305709838867188 8 82.269088745117188 +57.192916870117188 8 81.848159790039062 +55.904941558837891 8 94 +59.654937744140625 8 83.914031982421875 +59.220817565917969 8 83.876060485839844 +58.799888610839844 8 83.763275146484375 +58.404937744140625 8 83.5791015625 +58.047969818115234 8 83.329139709472656 +57.739826202392578 8 83.021003723144531 +57.489875793457031 8 82.664031982421875 +57.154937744140625 8 81.414039611816406 +57.192916870117188 8 80.979911804199219 +55.904941558837891 8 77.664031982421875 +57.305709838867188 8 80.558982849121094 +57.489875793457031 8 80.164031982421875 +57.739826202392578 8 79.80706787109375 +58.047969818115234 8 79.498924255371094 +58.404937744140625 8 79.248970031738281 +59.654937744140625 8 78.914031982421875 +59.220817565917969 8 78.952011108398438 +58.799888610839844 8 79.064804077148438 +60.089057922363281 8 78.952011108398438 +60.509986877441406 8 79.064804077148438 +60.904937744140625 8 79.248970031738281 +61.261905670166016 8 79.498924255371094 +61.570049285888672 8 79.80706787109375 +61.819999694824219 8 80.164031982421875 +62.154937744140625 8 81.414039611816406 +62.004169464111328 8 80.558982849121094 +62.116958618164062 8 80.979911804199219 +62.116958618164062 8 81.848159790039062 +62.004169464111328 8 82.269088745117188 +61.819999694824219 8 82.664031982421875 +61.570049285888672 8 83.021003723144531 +61.261905670166016 8 83.329139709472656 +60.904937744140625 8 83.5791015625 +60.509986877441406 8 83.763275146484375 +60.089057922363281 8 83.876060485839844 +57.192916870117188 8 73.479911804199219 +57.305709838867188 8 73.058982849121094 +55.904941558837891 8 70.164039611816406 +58.047969818115234 8 71.998924255371094 +58.404937744140625 8 71.748970031738281 +58.799888610839844 8 71.564811706542969 +57.489875793457031 8 72.664039611816406 +57.739826202392578 8 72.30706787109375 +60.509986877441406 8 71.564811706542969 +60.904937744140625 8 71.748970031738281 +58.799888610839844 8 76.263267517089844 +58.404937744140625 8 76.0791015625 +58.047969818115234 8 75.829147338867188 +57.739826202392578 8 75.521003723144531 +57.489875793457031 8 75.164031982421875 +57.305709838867188 8 74.769088745117188 +57.192916870117188 8 74.348152160644531 +57.154937744140625 8 73.914039611816406 +61.261905670166016 8 71.998924255371094 +61.570049285888672 8 72.30706787109375 +61.819999694824219 8 72.664039611816406 +60.509986877441406 8 76.263267517089844 +60.089057922363281 8 76.376052856445312 +59.654937744140625 8 76.414031982421875 +59.220817565917969 8 76.376052856445312 +59.220817565917969 8 71.452011108398438 +59.654937744140625 8 71.414039611816406 +60.089057922363281 8 71.452011108398438 +62.004169464111328 8 73.058982849121094 +62.116958618164062 8 73.479911804199219 +62.154937744140625 8 73.914039611816406 +62.116958618164062 8 74.348152160644531 +62.004169464111328 8 74.769088745117188 +61.819999694824219 8 75.164031982421875 +61.570049285888672 8 75.521003723144531 +61.261905670166016 8 75.829147338867188 +60.904937744140625 8 76.0791015625 +57.192916870117188 8 66.848159790039062 +57.154937744140625 8 66.414039611816406 +55.904941558837891 8 62.664031982421875 +57.192916870117188 8 65.979911804199219 +57.305709838867188 8 65.558982849121094 +62.116958618164062 8 66.848159790039062 +62.004169464111328 8 67.269088745117188 +61.819999694824219 8 67.664031982421875 +61.570049285888672 8 68.021003723144531 +60.509986877441406 8 68.763267517089844 +60.089057922363281 8 68.876060485839844 +61.261905670166016 8 68.329147338867188 +60.904937744140625 8 68.5791015625 +59.654937744140625 8 68.914031982421875 +59.220817565917969 8 68.876060485839844 +58.799888610839844 8 68.763267517089844 +58.404937744140625 8 68.5791015625 +58.047969818115234 8 68.329147338867188 +57.739826202392578 8 68.021003723144531 +57.489875793457031 8 67.664031982421875 +57.305709838867188 8 67.269088745117188 +58.047969818115234 8 64.498924255371094 +58.404937744140625 8 64.248970031738281 +58.799888610839844 8 64.064804077148438 +59.220817565917969 8 63.952014923095703 +57.489875793457031 8 65.164039611816406 +57.739826202392578 8 64.80706787109375 +62.154937744140625 8 66.414039611816406 +59.654937744140625 8 63.914039611816406 +60.089057922363281 8 63.952014923095703 +60.509986877441406 8 64.064804077148438 +60.904937744140625 8 64.248970031738281 +61.261905670166016 8 64.498924255371094 +61.570049285888672 8 64.80706787109375 +61.819999694824219 8 65.164039611816406 +62.004169464111328 8 65.558982849121094 +62.116958618164062 8 65.979911804199219 +57.489875793457031 8 60.164035797119141 +57.305709838867188 8 59.769084930419922 +57.192916870117188 8 59.348155975341797 +57.154937744140625 8 58.914035797119141 +60.089057922363281 8 61.376052856445312 +59.654937744140625 8 61.414035797119141 +57.192916870117188 8 58.479915618896484 +55.904941558837891 8 55.164035797119141 +57.305709838867188 8 58.058982849121094 +57.489875793457031 8 57.664035797119141 +57.739826202392578 8 57.307064056396484 +59.220817565917969 8 61.376052856445312 +58.799888610839844 8 61.263267517089844 +58.404937744140625 8 61.0791015625 +58.047969818115234 8 60.829147338867188 +57.739826202392578 8 60.521007537841797 +58.047969818115234 8 56.998924255371094 +58.404937744140625 8 56.748970031738281 +58.799888610839844 8 56.564804077148438 +59.220817565917969 8 56.452018737792969 +59.654937744140625 8 56.414035797119141 +60.089057922363281 8 56.452018737792969 +60.509986877441406 8 56.564804077148438 +60.904937744140625 8 56.748970031738281 +61.261905670166016 8 56.998924255371094 +61.570049285888672 8 57.307064056396484 +61.819999694824219 8 57.664035797119141 +62.154937744140625 8 58.914035797119141 +62.116958618164062 8 59.348155975341797 +62.004169464111328 8 58.058982849121094 +62.116958618164062 8 58.479915618896484 +61.570049285888672 8 60.521007537841797 +61.261905670166016 8 60.829147338867188 +62.004169464111328 8 59.769084930419922 +61.819999694824219 8 60.164035797119141 +60.904937744140625 8 61.0791015625 +60.509986877441406 8 61.263267517089844 +57.489875793457031 8 52.664035797119141 +57.305709838867188 8 52.269084930419922 +57.192916870117188 8 51.848155975341797 +60.089057922363281 8 53.876052856445312 +59.654937744140625 8 53.914035797119141 +57.154937744140625 8 51.414035797119141 +57.192916870117188 8 50.979915618896484 +55.904941558837891 8 47.664035797119141 +57.305709838867188 8 50.558982849121094 +57.489875793457031 8 50.164035797119141 +59.220817565917969 8 53.876052856445312 +58.799888610839844 8 53.763267517089844 +58.404937744140625 8 53.579097747802734 +58.047969818115234 8 53.329147338867188 +57.739826202392578 8 53.021007537841797 +57.739826202392578 8 49.80706787109375 +58.047969818115234 8 49.498924255371094 +58.404937744140625 8 49.248970031738281 +58.799888610839844 8 49.064804077148438 +59.220817565917969 8 48.952018737792969 +59.654937744140625 8 48.914035797119141 +60.089057922363281 8 48.952018737792969 +60.509986877441406 8 49.064804077148438 +60.904937744140625 8 49.248970031738281 +61.261905670166016 8 49.498924255371094 +61.570049285888672 8 49.80706787109375 +61.819999694824219 8 50.164035797119141 +62.154937744140625 8 51.414035797119141 +62.116958618164062 8 51.848155975341797 +62.004169464111328 8 50.558982849121094 +62.116958618164062 8 50.979915618896484 +61.570049285888672 8 53.021007537841797 +61.261905670166016 8 53.329147338867188 +62.004169464111328 8 52.269084930419922 +61.819999694824219 8 52.664035797119141 +60.904937744140625 8 53.579097747802734 +60.509986877441406 8 53.763267517089844 +62.004169464111328 8 37.269084930419922 +61.819999694824219 8 37.664031982421875 +59.654937744140625 8 46.414035797119141 +61.261905670166016 8 34.498924255371094 +61.570049285888672 8 34.80706787109375 +61.819999694824219 8 35.164035797119141 +62.004169464111328 8 35.558982849121094 +62.116958618164062 8 35.979915618896484 +62.154937744140625 8 36.414035797119141 +62.116958618164062 8 36.848155975341797 +61.570049285888672 8 38.021007537841797 +61.261905670166016 8 38.329147338867188 +60.904937744140625 8 38.579097747802734 +59.220817565917969 8 46.376052856445312 +58.799888610839844 8 46.263267517089844 +58.404937744140625 8 46.079097747802734 +58.047969818115234 8 45.829147338867188 +57.739826202392578 8 45.521007537841797 +57.489875793457031 8 45.164031982421875 +57.192916870117188 8 43.479915618896484 +55.904941558837891 8 32.664035797119141 +57.154937744140625 8 43.914035797119141 +59.654937744140625 8 38.914035797119141 +59.220817565917969 8 38.876056671142578 +57.489875793457031 8 42.664035797119141 +57.305709838867188 8 43.058982849121094 +57.739826202392578 8 42.30706787109375 +58.047969818115234 8 41.998924255371094 +58.404937744140625 8 41.748970031738281 +60.089057922363281 8 38.876056671142578 +59.654937744140625 8 41.414035797119141 +57.305709838867188 8 44.769084930419922 +57.192916870117188 8 44.348155975341797 +58.799888610839844 8 41.564804077148438 +59.220817565917969 8 41.452014923095703 +60.089057922363281 8 41.452014923095703 +60.509986877441406 8 41.564804077148438 +60.904937744140625 8 41.748970031738281 +61.261905670166016 8 41.998924255371094 +61.570049285888672 8 42.30706787109375 +60.509986877441406 8 38.763267517089844 +61.819999694824219 8 42.664035797119141 +62.004169464111328 8 43.058982849121094 +62.116958618164062 8 43.479915618896484 +62.154937744140625 8 43.914035797119141 +62.116958618164062 8 44.348155975341797 +62.004169464111328 8 44.769084930419922 +61.819999694824219 8 45.164031982421875 +61.570049285888672 8 45.521007537841797 +61.261905670166016 8 45.829147338867188 +60.904937744140625 8 46.079097747802734 +57.739826202392578 8 38.021007537841797 +57.489875793457031 8 37.664031982421875 +60.509986877441406 8 46.263267517089844 +60.089057922363281 8 46.376052856445312 +58.799888610839844 8 38.763267517089844 +58.404937744140625 8 38.579097747802734 +58.047969818115234 8 38.329147338867188 +57.154937744140625 8 36.414035797119141 +57.192916870117188 8 36.848155975341797 +57.305709838867188 8 37.269084930419922 +57.192916870117188 8 35.979915618896484 +57.305709838867188 8 35.558982849121094 +57.489875793457031 8 35.164035797119141 +57.739826202392578 8 34.80706787109375 +58.047969818115234 8 34.498924255371094 +58.404937744140625 8 34.248970031738281 +58.799888610839844 8 34.064804077148438 +59.220817565917969 8 33.952014923095703 +59.654937744140625 8 33.914035797119141 +60.089057922363281 8 33.952014923095703 +60.509986877441406 8 34.064804077148438 +60.904937744140625 8 34.248970031738281 +62.116958618164062 8 28.479915618896484 +62.154937744140625 8 28.914035797119141 +62.004169464111328 8 29.769084930419922 +61.819999694824219 8 30.164035797119141 +59.654937744140625 8 31.414035797119141 +62.116958618164062 8 29.348155975341797 +57.305709838867188 8 28.058984756469727 +57.489875793457031 8 27.664035797119141 +55.904941558837891 8 25.164035797119141 +61.261905670166016 8 26.998924255371094 +61.570049285888672 8 27.30706787109375 +61.819999694824219 8 27.664035797119141 +62.004169464111328 8 28.058984756469727 +61.570049285888672 8 30.521005630493164 +61.261905670166016 8 30.829147338867188 +60.904937744140625 8 31.079097747802734 +60.509986877441406 8 31.263269424438477 +60.089057922363281 8 31.376056671142578 +57.154937744140625 8 28.914035797119141 +57.192916870117188 8 28.479915618896484 +59.220817565917969 8 31.376056671142578 +58.799888610839844 8 31.263269424438477 +58.404937744140625 8 31.079097747802734 +58.047969818115234 8 30.829147338867188 +57.739826202392578 8 30.521005630493164 +57.489875793457031 8 30.164035797119141 +60.089057922363281 8 26.452016830444336 +60.509986877441406 8 26.564804077148438 +60.904937744140625 8 26.748971939086914 +57.305709838867188 8 29.769084930419922 +57.192916870117188 8 29.348155975341797 +57.739826202392578 8 27.30706787109375 +58.047969818115234 8 26.998924255371094 +58.404937744140625 8 26.748971939086914 +58.799888610839844 8 26.564804077148438 +59.220817565917969 8 26.452016830444336 +59.654937744140625 8 26.414035797119141 +57.305709838867188 8 20.558984756469727 +57.489875793457031 8 20.164035797119141 +55.904941558837891 8 17.664035797119141 +61.819999694824219 8 20.164035797119141 +62.004169464111328 8 20.558984756469727 +57.739826202392578 8 19.807065963745117 +58.047969818115234 8 19.498924255371094 +58.404937744140625 8 19.248971939086914 +62.116958618164062 8 20.979915618896484 +62.154937744140625 8 21.414035797119141 +62.116958618164062 8 21.848155975341797 +62.004169464111328 8 22.269084930419922 +61.819999694824219 8 22.664033889770508 +61.570049285888672 8 23.021005630493164 +61.261905670166016 8 23.329145431518555 +60.904937744140625 8 23.579097747802734 +60.509986877441406 8 23.763267517089844 +59.654937744140625 8 18.914033889770508 +59.220817565917969 8 18.952014923095703 +58.799888610839844 8 19.064804077148438 +60.089057922363281 8 18.952014923095703 +60.509986877441406 8 19.064804077148438 +60.904937744140625 8 19.248971939086914 +60.089057922363281 8 23.876054763793945 +59.654937744140625 8 23.914035797119141 +59.220817565917969 8 23.876054763793945 +58.799888610839844 8 23.763267517089844 +57.739826202392578 8 23.021005630493164 +57.489875793457031 8 22.664033889770508 +57.305709838867188 8 22.269084930419922 +57.192916870117188 8 21.848155975341797 +57.154937744140625 8 21.414035797119141 +57.192916870117188 8 20.979915618896484 +61.261905670166016 8 19.498924255371094 +61.570049285888672 8 19.807065963745117 +58.404937744140625 8 23.579097747802734 +58.047969818115234 8 23.329145431518555 +60.509986877441406 8 11.564802169799805 +60.904937744140625 8 11.74897289276123 +61.261905670166016 8 15.829145431518555 +60.904937744140625 8 16.079099655151367 +57.305709838867188 8 13.058986663818359 +57.489875793457031 8 12.664034843444824 +55.904941558837891 8 10.14332103729248 +57.739826202392578 8 12.307066917419434 +58.047969818115234 8 11.99892520904541 +58.404937744140625 8 11.74897289276123 +58.799888610839844 8 11.564802169799805 +60.509986877441406 8 16.263267517089844 +60.089057922363281 8 16.376056671142578 +59.654937744140625 8 16.414035797119141 +59.220817565917969 8 16.376056671142578 +59.220817565917969 8 11.45201587677002 +59.654937744140625 8 11.414035797119141 +60.089057922363281 8 11.45201587677002 +61.261905670166016 8 11.99892520904541 +61.570049285888672 8 12.307066917419434 +61.819999694824219 8 12.664034843444824 +62.116958618164062 8 14.348156929016113 +62.004169464111328 8 14.769084930419922 +61.819999694824219 8 15.164036750793457 +61.570049285888672 8 15.521004676818848 +58.799888610839844 8 16.263267517089844 +58.404937744140625 8 16.079099655151367 +58.047969818115234 8 15.829145431518555 +57.739826202392578 8 15.521004676818848 +57.489875793457031 8 15.164036750793457 +57.305709838867188 8 14.769084930419922 +62.004169464111328 8 13.058986663818359 +62.116958618164062 8 13.479914665222168 +62.154937744140625 8 13.914033889770508 +57.192916870117188 8 14.348156929016113 +57.154937744140625 8 13.914033889770508 +57.192916870117188 8 13.479914665222168 +52.154937744140625 8 83.914031982421875 +48.404937744140625 8 94 +51.720817565917969 8 83.876060485839844 +49.654937744140625 8 81.414039611816406 +49.692916870117188 8 80.979911804199219 +48.404937744140625 8 77.664031982421875 +50.547969818115234 8 83.329139709472656 +50.239826202392578 8 83.021003723144531 +52.154937744140625 8 78.914031982421875 +52.589057922363281 8 78.952011108398438 +53.009986877441406 8 79.064804077148438 +53.404937744140625 8 79.248970031738281 +53.761905670166016 8 79.498924255371094 +54.070049285888672 8 79.80706787109375 +54.319999694824219 8 80.164031982421875 +54.654937744140625 8 81.414039611816406 +51.299888610839844 8 83.763275146484375 +50.904937744140625 8 83.5791015625 +54.504169464111328 8 80.558982849121094 +54.616958618164062 8 80.979911804199219 +49.989875793457031 8 82.664031982421875 +49.805709838867188 8 82.269088745117188 +49.692916870117188 8 81.848159790039062 +50.239826202392578 8 79.80706787109375 +50.547969818115234 8 79.498924255371094 +54.616958618164062 8 81.848159790039062 +54.504169464111328 8 82.269088745117188 +54.319999694824219 8 82.664031982421875 +54.070049285888672 8 83.021003723144531 +53.761905670166016 8 83.329139709472656 +53.404937744140625 8 83.5791015625 +49.805709838867188 8 80.558982849121094 +49.989875793457031 8 80.164031982421875 +53.009986877441406 8 83.763275146484375 +52.589057922363281 8 83.876060485839844 +50.904937744140625 8 79.248970031738281 +51.299888610839844 8 79.064804077148438 +51.720817565917969 8 78.952011108398438 +53.761905670166016 8 71.998924255371094 +54.070049285888672 8 72.30706787109375 +54.319999694824219 8 72.664039611816406 +54.504169464111328 8 73.058982849121094 +53.761905670166016 8 75.829147338867188 +53.404937744140625 8 76.0791015625 +52.154937744140625 8 76.414031982421875 +54.504169464111328 8 74.769088745117188 +54.319999694824219 8 75.164031982421875 +54.070049285888672 8 75.521003723144531 +53.009986877441406 8 76.263267517089844 +52.589057922363281 8 76.376052856445312 +54.616958618164062 8 73.479911804199219 +54.654937744140625 8 73.914039611816406 +54.616958618164062 8 74.348152160644531 +50.239826202392578 8 72.30706787109375 +50.547969818115234 8 71.998924255371094 +48.404937744140625 8 70.164039611816406 +50.904937744140625 8 71.748970031738281 +51.299888610839844 8 71.564811706542969 +51.720817565917969 8 71.452011108398438 +52.154937744140625 8 71.414039611816406 +52.589057922363281 8 71.452011108398438 +53.009986877441406 8 71.564811706542969 +53.404937744140625 8 71.748970031738281 +51.720817565917969 8 76.376052856445312 +51.299888610839844 8 76.263267517089844 +50.904937744140625 8 76.0791015625 +50.547969818115234 8 75.829147338867188 +50.239826202392578 8 75.521003723144531 +49.989875793457031 8 75.164031982421875 +49.692916870117188 8 73.479911804199219 +49.805709838867188 8 73.058982849121094 +49.989875793457031 8 72.664039611816406 +49.805709838867188 8 74.769088745117188 +49.692916870117188 8 74.348152160644531 +49.654937744140625 8 73.914039611816406 +54.654937744140625 8 66.414039611816406 +54.616958618164062 8 66.848159790039062 +54.504169464111328 8 67.269088745117188 +53.761905670166016 8 68.329147338867188 +53.404937744140625 8 68.5791015625 +53.009986877441406 8 68.763267517089844 +54.616958618164062 8 65.979911804199219 +51.720817565917969 8 68.876060485839844 +52.154937744140625 8 68.914031982421875 +52.589057922363281 8 68.876060485839844 +50.547969818115234 8 68.329147338867188 +50.239826202392578 8 68.021003723144531 +49.692916870117188 8 66.848159790039062 +48.404937744140625 8 62.664031982421875 +49.654937744140625 8 66.414039611816406 +49.692916870117188 8 65.979911804199219 +53.009986877441406 8 64.064804077148438 +53.404937744140625 8 64.248970031738281 +53.761905670166016 8 64.498924255371094 +54.070049285888672 8 64.80706787109375 +54.319999694824219 8 65.164039611816406 +54.504169464111328 8 65.558982849121094 +54.319999694824219 8 67.664031982421875 +54.070049285888672 8 68.021003723144531 +51.299888610839844 8 68.763267517089844 +50.904937744140625 8 68.5791015625 +49.989875793457031 8 67.664031982421875 +49.805709838867188 8 67.269088745117188 +49.805709838867188 8 65.558982849121094 +49.989875793457031 8 65.164039611816406 +50.239826202392578 8 64.80706787109375 +50.547969818115234 8 64.498924255371094 +50.904937744140625 8 64.248970031738281 +51.299888610839844 8 64.064804077148438 +51.720817565917969 8 63.952014923095703 +52.154937744140625 8 63.914039611816406 +52.589057922363281 8 63.952014923095703 +54.616958618164062 8 58.479915618896484 +54.654937744140625 8 58.914035797119141 +51.299888610839844 8 61.263267517089844 +50.904937744140625 8 61.0791015625 +54.616958618164062 8 59.348155975341797 +50.547969818115234 8 60.829147338867188 +50.239826202392578 8 60.521007537841797 +49.989875793457031 8 60.164035797119141 +54.504169464111328 8 59.769084930419922 +54.319999694824219 8 60.164035797119141 +54.070049285888672 8 60.521007537841797 +53.761905670166016 8 60.829147338867188 +53.404937744140625 8 61.0791015625 +53.009986877441406 8 61.263267517089844 +52.589057922363281 8 61.376052856445312 +52.154937744140625 8 61.414035797119141 +51.720817565917969 8 61.376052856445312 +49.805709838867188 8 59.769084930419922 +49.692916870117188 8 59.348155975341797 +49.654937744140625 8 58.914035797119141 +53.761905670166016 8 56.998924255371094 +54.070049285888672 8 57.307064056396484 +49.692916870117188 8 58.479915618896484 +48.404937744140625 8 55.164035797119141 +49.805709838867188 8 58.058982849121094 +49.989875793457031 8 57.664035797119141 +50.239826202392578 8 57.307064056396484 +50.547969818115234 8 56.998924255371094 +50.904937744140625 8 56.748970031738281 +51.299888610839844 8 56.564804077148438 +52.589057922363281 8 56.452018737792969 +52.154937744140625 8 56.414035797119141 +51.720817565917969 8 56.452018737792969 +53.009986877441406 8 56.564804077148438 +53.404937744140625 8 56.748970031738281 +54.319999694824219 8 57.664035797119141 +54.504169464111328 8 58.058982849121094 +50.547969818115234 8 53.329147338867188 +50.239826202392578 8 53.021007537841797 +51.720817565917969 8 53.876052856445312 +51.299888610839844 8 53.763267517089844 +50.904937744140625 8 53.579097747802734 +53.009986877441406 8 49.064804077148438 +53.404937744140625 8 49.248970031738281 +53.761905670166016 8 49.498924255371094 +54.070049285888672 8 49.80706787109375 +54.319999694824219 8 50.164035797119141 +54.654937744140625 8 51.414035797119141 +49.989875793457031 8 52.664035797119141 +49.805709838867188 8 52.269084930419922 +49.692916870117188 8 51.848155975341797 +48.404937744140625 8 47.664035797119141 +52.154937744140625 8 48.914035797119141 +52.589057922363281 8 48.952018737792969 +54.504169464111328 8 50.558982849121094 +54.616958618164062 8 50.979915618896484 +54.616958618164062 8 51.848155975341797 +54.504169464111328 8 52.269084930419922 +54.319999694824219 8 52.664035797119141 +54.070049285888672 8 53.021007537841797 +53.761905670166016 8 53.329147338867188 +53.404937744140625 8 53.579097747802734 +49.654937744140625 8 51.414035797119141 +49.692916870117188 8 50.979915618896484 +49.805709838867188 8 50.558982849121094 +49.989875793457031 8 50.164035797119141 +50.239826202392578 8 49.80706787109375 +50.547969818115234 8 49.498924255371094 +50.904937744140625 8 49.248970031738281 +53.009986877441406 8 53.763267517089844 +52.589057922363281 8 53.876052856445312 +52.154937744140625 8 53.914035797119141 +51.299888610839844 8 49.064804077148438 +51.720817565917969 8 48.952018737792969 +54.504169464111328 8 37.269084930419922 +54.319999694824219 8 37.664031982421875 +53.761905670166016 8 34.498924255371094 +54.070049285888672 8 34.80706787109375 +54.319999694824219 8 35.164035797119141 +54.504169464111328 8 35.558982849121094 +52.154937744140625 8 38.914035797119141 +51.720817565917969 8 38.876056671142578 +49.989875793457031 8 42.664035797119141 +49.805709838867188 8 43.058982849121094 +54.616958618164062 8 35.979915618896484 +54.654937744140625 8 36.414035797119141 +54.616958618164062 8 36.848155975341797 +49.654937744140625 8 43.914035797119141 +49.692916870117188 8 43.479915618896484 +48.404937744140625 8 32.664035797119141 +52.589057922363281 8 33.952014923095703 +53.009986877441406 8 34.064804077148438 +53.404937744140625 8 34.248970031738281 +54.070049285888672 8 38.021007537841797 +53.761905670166016 8 38.329147338867188 +53.404937744140625 8 38.579097747802734 +54.616958618164062 8 43.479915618896484 +54.654937744140625 8 43.914035797119141 +51.720817565917969 8 46.376052856445312 +51.299888610839844 8 46.263267517089844 +50.904937744140625 8 46.079097747802734 +50.547969818115234 8 45.829147338867188 +50.239826202392578 8 45.521007537841797 +49.989875793457031 8 45.164031982421875 +50.239826202392578 8 42.30706787109375 +50.547969818115234 8 41.998924255371094 +50.904937744140625 8 41.748970031738281 +52.589057922363281 8 41.452014923095703 +52.589057922363281 8 38.876056671142578 +52.154937744140625 8 41.414035797119141 +49.805709838867188 8 44.769084930419922 +49.692916870117188 8 44.348155975341797 +54.504169464111328 8 43.058982849121094 +54.319999694824219 8 42.664035797119141 +53.009986877441406 8 38.763267517089844 +54.070049285888672 8 42.30706787109375 +53.761905670166016 8 41.998924255371094 +54.616958618164062 8 44.348155975341797 +54.504169464111328 8 44.769084930419922 +54.319999694824219 8 45.164031982421875 +54.070049285888672 8 45.521007537841797 +53.761905670166016 8 45.829147338867188 +53.404937744140625 8 46.079097747802734 +51.299888610839844 8 41.564804077148438 +51.720817565917969 8 41.452014923095703 +53.009986877441406 8 41.564804077148438 +53.404937744140625 8 41.748970031738281 +50.239826202392578 8 38.021007537841797 +49.989875793457031 8 37.664031982421875 +53.009986877441406 8 46.263267517089844 +52.589057922363281 8 46.376052856445312 +52.154937744140625 8 46.414035797119141 +51.299888610839844 8 38.763267517089844 +50.904937744140625 8 38.579097747802734 +50.547969818115234 8 38.329147338867188 +49.654937744140625 8 36.414035797119141 +49.692916870117188 8 36.848155975341797 +49.805709838867188 8 37.269084930419922 +49.692916870117188 8 35.979915618896484 +49.805709838867188 8 35.558982849121094 +49.989875793457031 8 35.164035797119141 +50.239826202392578 8 34.80706787109375 +50.547969818115234 8 34.498924255371094 +50.904937744140625 8 34.248970031738281 +51.299888610839844 8 34.064804077148438 +51.720817565917969 8 33.952014923095703 +52.154937744140625 8 33.914035797119141 +49.692916870117188 8 28.479915618896484 +49.805709838867188 8 28.058984756469727 +48.404937744140625 8 25.164035797119141 +49.989875793457031 8 27.664035797119141 +50.239826202392578 8 27.30706787109375 +54.070049285888672 8 27.30706787109375 +54.319999694824219 8 27.664035797119141 +54.504169464111328 8 28.058984756469727 +53.009986877441406 8 31.263269424438477 +52.589057922363281 8 31.376056671142578 +52.154937744140625 8 31.414035797119141 +51.720817565917969 8 31.376056671142578 +51.299888610839844 8 31.263269424438477 +50.904937744140625 8 31.079097747802734 +50.547969818115234 8 30.829147338867188 +50.239826202392578 8 30.521005630493164 +49.989875793457031 8 30.164035797119141 +50.547969818115234 8 26.998924255371094 +50.904937744140625 8 26.748971939086914 +51.299888610839844 8 26.564804077148438 +54.504169464111328 8 29.769084930419922 +54.319999694824219 8 30.164035797119141 +54.070049285888672 8 30.521005630493164 +53.761905670166016 8 30.829147338867188 +53.404937744140625 8 31.079097747802734 +49.805709838867188 8 29.769084930419922 +49.692916870117188 8 29.348155975341797 +49.654937744140625 8 28.914035797119141 +51.720817565917969 8 26.452016830444336 +52.154937744140625 8 26.414035797119141 +52.589057922363281 8 26.452016830444336 +53.009986877441406 8 26.564804077148438 +53.404937744140625 8 26.748971939086914 +53.761905670166016 8 26.998924255371094 +54.616958618164062 8 28.479915618896484 +54.654937744140625 8 28.914035797119141 +54.616958618164062 8 29.348155975341797 +53.761905670166016 8 23.329145431518555 +53.404937744140625 8 23.579097747802734 +53.009986877441406 8 23.763267517089844 +48.404937744140625 8 17.664035797119141 +49.989875793457031 8 20.164035797119141 +50.239826202392578 8 19.807065963745117 +53.009986877441406 8 19.064804077148438 +53.404937744140625 8 19.248971939086914 +50.547969818115234 8 23.329145431518555 +50.239826202392578 8 23.021005630493164 +49.989875793457031 8 22.664033889770508 +52.589057922363281 8 23.876054763793945 +52.154937744140625 8 23.914035797119141 +51.720817565917969 8 23.876054763793945 +49.654937744140625 8 21.414035797119141 +49.692916870117188 8 21.848155975341797 +49.805709838867188 8 22.269084930419922 +49.692916870117188 8 20.979915618896484 +49.805709838867188 8 20.558984756469727 +50.547969818115234 8 19.498924255371094 +50.904937744140625 8 19.248971939086914 +51.299888610839844 8 19.064804077148438 +51.720817565917969 8 18.952014923095703 +52.154937744140625 8 18.914033889770508 +52.589057922363281 8 18.952014923095703 +53.761905670166016 8 19.498924255371094 +54.070049285888672 8 19.807065963745117 +54.319999694824219 8 20.164035797119141 +54.616958618164062 8 21.848155975341797 +54.504169464111328 8 22.269084930419922 +51.299888610839844 8 23.763267517089844 +50.904937744140625 8 23.579097747802734 +54.319999694824219 8 22.664033889770508 +54.070049285888672 8 23.021005630493164 +54.504169464111328 8 20.558984756469727 +54.616958618164062 8 20.979915618896484 +54.654937744140625 8 21.414035797119141 +53.009986877441406 8 11.564802169799805 +53.404937744140625 8 11.74897289276123 +49.805709838867188 8 13.058986663818359 +49.989875793457031 8 12.664034843444824 +48.404937744140625 8 10.14332103729248 +53.761905670166016 8 15.829145431518555 +53.404937744140625 8 16.079099655151367 +53.009986877441406 8 16.263267517089844 +52.589057922363281 8 16.376056671142578 +52.154937744140625 8 16.414035797119141 +51.720817565917969 8 16.376056671142578 +51.299888610839844 8 16.263267517089844 +50.904937744140625 8 16.079099655151367 +50.547969818115234 8 15.829145431518555 +50.904937744140625 8 11.74897289276123 +51.299888610839844 8 11.564802169799805 +50.239826202392578 8 12.307066917419434 +50.547969818115234 8 11.99892520904541 +51.720817565917969 8 11.45201587677002 +52.154937744140625 8 11.414035797119141 +52.589057922363281 8 11.45201587677002 +53.761905670166016 8 11.99892520904541 +54.070049285888672 8 12.307066917419434 +54.319999694824219 8 12.664034843444824 +54.616958618164062 8 14.348156929016113 +54.504169464111328 8 14.769084930419922 +50.239826202392578 8 15.521004676818848 +49.989875793457031 8 15.164036750793457 +49.805709838867188 8 14.769084930419922 +54.319999694824219 8 15.164036750793457 +54.070049285888672 8 15.521004676818848 +49.692916870117188 8 14.348156929016113 +49.654937744140625 8 13.914033889770508 +49.692916870117188 8 13.479914665222168 +54.504169464111328 8 13.058986663818359 +54.616958618164062 8 13.479914665222168 +54.654937744140625 8 13.914033889770508 +44.654937744140625 8 83.914031982421875 +44.220817565917969 8 83.876060485839844 +34.805706024169922 8 82.269088745117188 +34.692920684814453 8 81.848159790039062 +33.404937744140625 8 94 +43.799888610839844 8 83.763275146484375 +43.404937744140625 8 83.5791015625 +43.047969818115234 8 83.329139709472656 +42.739826202392578 8 83.021003723144531 +42.489875793457031 8 82.664031982421875 +36.720821380615234 8 83.876060485839844 +36.299888610839844 8 83.763275146484375 +35.904937744140625 8 83.5791015625 +35.5479736328125 8 83.329139709472656 +35.239826202392578 8 83.021003723144531 +34.989875793457031 8 82.664031982421875 +34.654937744140625 8 81.414039611816406 +34.692920684814453 8 80.979911804199219 +33.404937744140625 8 77.664031982421875 +34.805706024169922 8 80.558982849121094 +34.989875793457031 8 80.164031982421875 +35.239826202392578 8 79.80706787109375 +35.5479736328125 8 79.498924255371094 +35.904937744140625 8 79.248970031738281 +37.589057922363281 8 78.952011108398438 +37.154937744140625 8 78.914031982421875 +36.299888610839844 8 79.064804077148438 +36.720821380615234 8 78.952011108398438 +39.616958618164062 8 81.848159790039062 +42.305709838867188 8 82.269088745117188 +42.192920684814453 8 81.848159790039062 +38.009990692138672 8 79.064804077148438 +38.404937744140625 8 79.248970031738281 +44.220817565917969 8 78.952011108398438 +38.761905670166016 8 79.498924255371094 +39.070049285888672 8 79.80706787109375 +39.320003509521484 8 80.164031982421875 +44.654937744140625 8 78.914031982421875 +39.320003509521484 8 82.664031982421875 +39.070049285888672 8 83.021003723144531 +38.761905670166016 8 83.329139709472656 +38.404937744140625 8 83.5791015625 +39.654941558837891 8 81.414039611816406 +42.154937744140625 8 81.414039611816406 +39.616958618164062 8 80.979911804199219 +39.504169464111328 8 82.269088745117188 +38.009990692138672 8 83.763275146484375 +37.589057922363281 8 83.876060485839844 +37.154937744140625 8 83.914031982421875 +45.089057922363281 8 78.952011108398438 +45.509990692138672 8 79.064804077148438 +45.904937744140625 8 79.248970031738281 +46.261905670166016 8 79.498924255371094 +46.570049285888672 8 79.80706787109375 +46.820003509521484 8 80.164031982421875 +47.154937744140625 8 81.414039611816406 +42.192920684814453 8 80.979911804199219 +42.305709838867188 8 80.558982849121094 +42.489875793457031 8 80.164031982421875 +42.739826202392578 8 79.80706787109375 +43.047969818115234 8 79.498924255371094 +39.504169464111328 8 80.558982849121094 +43.404937744140625 8 79.248970031738281 +43.799888610839844 8 79.064804077148438 +47.004169464111328 8 80.558982849121094 +47.116958618164062 8 80.979911804199219 +47.116958618164062 8 81.848159790039062 +47.004169464111328 8 82.269088745117188 +46.820003509521484 8 82.664031982421875 +46.570049285888672 8 83.021003723144531 +46.261905670166016 8 83.329139709472656 +45.904937744140625 8 83.5791015625 +45.509990692138672 8 83.763275146484375 +45.089057922363281 8 83.876060485839844 +46.820003509521484 8 72.664039611816406 +46.570049285888672 8 72.30706787109375 +46.261905670166016 8 71.998924255371094 +39.070049285888672 8 75.521003723144531 +38.761905670166016 8 75.829147338867188 +38.404937744140625 8 76.0791015625 +46.570049285888672 8 75.521003723144531 +46.261905670166016 8 75.829147338867188 +43.404937744140625 8 76.0791015625 +43.047969818115234 8 75.829147338867188 +42.192920684814453 8 74.348152160644531 +42.154937744140625 8 73.914039611816406 +39.654941558837891 8 73.914039611816406 +37.154937744140625 8 76.414031982421875 +37.589057922363281 8 76.376052856445312 +38.009990692138672 8 76.263267517089844 +42.489875793457031 8 72.664039611816406 +42.739826202392578 8 72.30706787109375 +39.504169464111328 8 73.058982849121094 +43.047969818115234 8 71.998924255371094 +36.299888610839844 8 71.564811706542969 +36.720821380615234 8 71.452011108398438 +33.404937744140625 8 70.164039611816406 +47.004169464111328 8 73.058982849121094 +47.116958618164062 8 73.479911804199219 +47.154937744140625 8 73.914039611816406 +47.116958618164062 8 74.348152160644531 +47.004169464111328 8 74.769088745117188 +46.820003509521484 8 75.164031982421875 +45.904937744140625 8 76.0791015625 +45.509990692138672 8 76.263267517089844 +45.089057922363281 8 76.376052856445312 +45.089057922363281 8 71.452011108398438 +45.509990692138672 8 71.564811706542969 +45.904937744140625 8 71.748970031738281 +44.654937744140625 8 76.414031982421875 +44.220817565917969 8 76.376052856445312 +43.799888610839844 8 76.263267517089844 +42.739826202392578 8 75.521003723144531 +42.489875793457031 8 75.164031982421875 +42.305709838867188 8 74.769088745117188 +39.616958618164062 8 73.479911804199219 +42.192920684814453 8 73.479911804199219 +42.305709838867188 8 73.058982849121094 +36.720821380615234 8 76.376052856445312 +36.299888610839844 8 76.263267517089844 +35.904937744140625 8 76.0791015625 +35.5479736328125 8 75.829147338867188 +35.239826202392578 8 75.521003723144531 +34.989875793457031 8 75.164031982421875 +34.692920684814453 8 73.479911804199219 +34.805706024169922 8 73.058982849121094 +34.989875793457031 8 72.664039611816406 +35.239826202392578 8 72.30706787109375 +35.5479736328125 8 71.998924255371094 +35.904937744140625 8 71.748970031738281 +43.404937744140625 8 71.748970031738281 +43.799888610839844 8 71.564811706542969 +39.320003509521484 8 72.664039611816406 +44.220817565917969 8 71.452011108398438 +34.805706024169922 8 74.769088745117188 +34.692920684814453 8 74.348152160644531 +34.654937744140625 8 73.914039611816406 +37.154937744140625 8 71.414039611816406 +44.654937744140625 8 71.414039611816406 +37.589057922363281 8 71.452011108398438 +38.009990692138672 8 71.564811706542969 +38.404937744140625 8 71.748970031738281 +38.761905670166016 8 71.998924255371094 +39.070049285888672 8 72.30706787109375 +39.616958618164062 8 74.348152160644531 +39.504169464111328 8 74.769088745117188 +39.320003509521484 8 75.164031982421875 +39.616958618164062 8 66.848159790039062 +39.504169464111328 8 67.269088745117188 +42.192920684814453 8 66.848159790039062 +43.047969818115234 8 68.329147338867188 +42.739826202392578 8 68.021003723144531 +42.489875793457031 8 67.664031982421875 +42.305709838867188 8 67.269088745117188 +39.320003509521484 8 67.664031982421875 +39.070049285888672 8 68.021003723144531 +38.761905670166016 8 68.329147338867188 +38.404937744140625 8 68.5791015625 +38.761905670166016 8 64.498924255371094 +39.070049285888672 8 64.80706787109375 +42.305709838867188 8 65.558982849121094 +39.320003509521484 8 65.164039611816406 +39.504169464111328 8 65.558982849121094 +39.616958618164062 8 65.979911804199219 +39.654941558837891 8 66.414039611816406 +42.154937744140625 8 66.414039611816406 +42.192920684814453 8 65.979911804199219 +38.009990692138672 8 68.763267517089844 +37.589057922363281 8 68.876060485839844 +37.154937744140625 8 68.914031982421875 +36.720821380615234 8 68.876060485839844 +35.904937744140625 8 64.248970031738281 +36.299888610839844 8 64.064804077148438 +33.404937744140625 8 62.664031982421875 +36.720821380615234 8 63.952014923095703 +47.004169464111328 8 67.269088745117188 +46.820003509521484 8 67.664031982421875 +46.570049285888672 8 68.021003723144531 +46.261905670166016 8 68.329147338867188 +45.904937744140625 8 68.5791015625 +45.509990692138672 8 68.763267517089844 +45.089057922363281 8 68.876060485839844 +44.654937744140625 8 68.914031982421875 +44.220817565917969 8 68.876060485839844 +43.799888610839844 8 68.763267517089844 +43.404937744140625 8 68.5791015625 +45.089057922363281 8 63.952014923095703 +45.509990692138672 8 64.064804077148438 +45.904937744140625 8 64.248970031738281 +46.261905670166016 8 64.498924255371094 +46.570049285888672 8 64.80706787109375 +46.820003509521484 8 65.164039611816406 +47.004169464111328 8 65.558982849121094 +47.116958618164062 8 65.979911804199219 +47.154937744140625 8 66.414039611816406 +47.116958618164062 8 66.848159790039062 +42.489875793457031 8 65.164039611816406 +42.739826202392578 8 64.80706787109375 +43.047969818115234 8 64.498924255371094 +43.404937744140625 8 64.248970031738281 +43.799888610839844 8 64.064804077148438 +44.220817565917969 8 63.952014923095703 +44.654937744140625 8 63.914039611816406 +36.299888610839844 8 68.763267517089844 +35.904937744140625 8 68.5791015625 +35.5479736328125 8 68.329147338867188 +34.805706024169922 8 65.558982849121094 +34.989875793457031 8 65.164039611816406 +35.239826202392578 8 68.021003723144531 +34.989875793457031 8 67.664031982421875 +34.805706024169922 8 67.269088745117188 +35.239826202392578 8 64.80706787109375 +35.5479736328125 8 64.498924255371094 +34.692920684814453 8 66.848159790039062 +34.654937744140625 8 66.414039611816406 +34.692920684814453 8 65.979911804199219 +37.154937744140625 8 63.914039611816406 +37.589057922363281 8 63.952014923095703 +38.009990692138672 8 64.064804077148438 +38.404937744140625 8 64.248970031738281 +38.761905670166016 8 56.998924255371094 +42.154937744140625 8 58.914035797119141 +38.404937744140625 8 56.748970031738281 +42.192920684814453 8 58.479915618896484 +38.009990692138672 8 56.564804077148438 +43.047969818115234 8 60.829147338867188 +42.739826202392578 8 60.521007537841797 +39.504169464111328 8 59.769084930419922 +37.589057922363281 8 61.376052856445312 +37.154937744140625 8 61.414035797119141 +36.720821380615234 8 61.376052856445312 +47.116958618164062 8 59.348155975341797 +47.004169464111328 8 59.769084930419922 +46.820003509521484 8 60.164035797119141 +46.570049285888672 8 60.521007537841797 +46.261905670166016 8 60.829147338867188 +45.904937744140625 8 61.0791015625 +45.509990692138672 8 61.263267517089844 +38.009990692138672 8 61.263267517089844 +44.220817565917969 8 61.376052856445312 +44.654937744140625 8 61.414035797119141 +45.089057922363281 8 61.376052856445312 +39.070049285888672 8 60.521007537841797 +38.761905670166016 8 60.829147338867188 +38.404937744140625 8 61.0791015625 +39.070049285888672 8 57.307064056396484 +39.320003509521484 8 57.664035797119141 +39.504169464111328 8 58.058982849121094 +39.616958618164062 8 58.479915618896484 +39.654941558837891 8 58.914035797119141 +42.192920684814453 8 59.348155975341797 +39.616958618164062 8 59.348155975341797 +42.305709838867188 8 59.769084930419922 +42.489875793457031 8 60.164035797119141 +39.320003509521484 8 60.164035797119141 +43.799888610839844 8 61.263267517089844 +43.404937744140625 8 61.0791015625 +36.299888610839844 8 61.263267517089844 +35.904937744140625 8 61.0791015625 +35.5479736328125 8 60.829147338867188 +44.220817565917969 8 56.452018737792969 +33.404937744140625 8 55.164035797119141 +43.799888610839844 8 56.564804077148438 +43.404937744140625 8 56.748970031738281 +35.239826202392578 8 60.521007537841797 +34.989875793457031 8 60.164035797119141 +34.805706024169922 8 59.769084930419922 +34.692920684814453 8 59.348155975341797 +34.654937744140625 8 58.914035797119141 +34.692920684814453 8 58.479915618896484 +34.805706024169922 8 58.058982849121094 +42.489875793457031 8 57.664035797119141 +42.739826202392578 8 57.307064056396484 +43.047969818115234 8 56.998924255371094 +44.654937744140625 8 56.414035797119141 +45.089057922363281 8 56.452018737792969 +45.509990692138672 8 56.564804077148438 +45.904937744140625 8 56.748970031738281 +46.261905670166016 8 56.998924255371094 +46.570049285888672 8 57.307064056396484 +46.820003509521484 8 57.664035797119141 +47.154937744140625 8 58.914035797119141 +47.004169464111328 8 58.058982849121094 +47.116958618164062 8 58.479915618896484 +34.989875793457031 8 57.664035797119141 +35.239826202392578 8 57.307064056396484 +35.5479736328125 8 56.998924255371094 +35.904937744140625 8 56.748970031738281 +36.299888610839844 8 56.564804077148438 +36.720821380615234 8 56.452018737792969 +37.154937744140625 8 56.414035797119141 +37.589057922363281 8 56.452018737792969 +42.305709838867188 8 58.058982849121094 +37.589057922363281 8 53.876052856445312 +37.154937744140625 8 53.914035797119141 +44.654937744140625 8 53.914035797119141 +44.220817565917969 8 53.876052856445312 +43.799888610839844 8 53.763267517089844 +43.404937744140625 8 53.579097747802734 +43.047969818115234 8 53.329147338867188 +42.739826202392578 8 53.021007537841797 +42.489875793457031 8 52.664035797119141 +36.720821380615234 8 53.876052856445312 +36.299888610839844 8 53.763267517089844 +35.904937744140625 8 53.579097747802734 +38.009990692138672 8 53.763267517089844 +42.305709838867188 8 52.269084930419922 +37.154937744140625 8 48.914035797119141 +37.589057922363281 8 48.952018737792969 +35.5479736328125 8 53.329147338867188 +35.239826202392578 8 53.021007537841797 +34.989875793457031 8 52.664035797119141 +34.654937744140625 8 51.414035797119141 +33.404937744140625 8 47.664035797119141 +34.692920684814453 8 51.848155975341797 +34.805706024169922 8 52.269084930419922 +45.089057922363281 8 48.952018737792969 +45.509990692138672 8 49.064804077148438 +45.904937744140625 8 49.248970031738281 +46.261905670166016 8 49.498924255371094 +46.570049285888672 8 49.80706787109375 +46.820003509521484 8 50.164035797119141 +47.154937744140625 8 51.414035797119141 +38.761905670166016 8 49.498924255371094 +42.154937744140625 8 51.414035797119141 +38.404937744140625 8 49.248970031738281 +42.192920684814453 8 50.979915618896484 +38.009990692138672 8 49.064804077148438 +47.004169464111328 8 50.558982849121094 +47.116958618164062 8 50.979915618896484 +47.116958618164062 8 51.848155975341797 +47.004169464111328 8 52.269084930419922 +46.820003509521484 8 52.664035797119141 +46.570049285888672 8 53.021007537841797 +46.261905670166016 8 53.329147338867188 +45.904937744140625 8 53.579097747802734 +39.320003509521484 8 52.664035797119141 +39.070049285888672 8 53.021007537841797 +34.692920684814453 8 50.979915618896484 +34.805706024169922 8 50.558982849121094 +34.989875793457031 8 50.164035797119141 +45.509990692138672 8 53.763267517089844 +45.089057922363281 8 53.876052856445312 +39.070049285888672 8 49.80706787109375 +39.320003509521484 8 50.164035797119141 +39.504169464111328 8 50.558982849121094 +38.761905670166016 8 53.329147338867188 +38.404937744140625 8 53.579097747802734 +35.239826202392578 8 49.80706787109375 +35.5479736328125 8 49.498924255371094 +35.904937744140625 8 49.248970031738281 +39.616958618164062 8 50.979915618896484 +39.654941558837891 8 51.414035797119141 +42.192920684814453 8 51.848155975341797 +39.616958618164062 8 51.848155975341797 +39.504169464111328 8 52.269084930419922 +36.299888610839844 8 49.064804077148438 +36.720821380615234 8 48.952018737792969 +43.047969818115234 8 49.498924255371094 +43.404937744140625 8 49.248970031738281 +42.305709838867188 8 50.558982849121094 +42.489875793457031 8 50.164035797119141 +42.739826202392578 8 49.80706787109375 +43.799888610839844 8 49.064804077148438 +44.220817565917969 8 48.952018737792969 +44.654937744140625 8 48.914035797119141 +37.154937744140625 8 38.914035797119141 +36.720821380615234 8 38.876056671142578 +34.989875793457031 8 42.664035797119141 +34.805706024169922 8 43.058982849121094 +37.154937744140625 8 46.414035797119141 +36.720821380615234 8 46.376052856445312 +34.805706024169922 8 37.269084930419922 +34.692920684814453 8 36.848155975341797 +34.805706024169922 8 35.558982849121094 +34.989875793457031 8 35.164035797119141 +33.404937744140625 8 32.664035797119141 +35.239826202392578 8 34.80706787109375 +35.5479736328125 8 34.498924255371094 +35.904937744140625 8 34.248970031738281 +36.299888610839844 8 34.064804077148438 +36.720821380615234 8 33.952014923095703 +37.154937744140625 8 33.914035797119141 +37.589057922363281 8 33.952014923095703 +38.009990692138672 8 34.064804077148438 +38.404937744140625 8 34.248970031738281 +38.761905670166016 8 34.498924255371094 +39.070049285888672 8 34.80706787109375 +39.320003509521484 8 35.164035797119141 +42.192920684814453 8 35.979915618896484 +39.504169464111328 8 35.558982849121094 +39.616958618164062 8 35.979915618896484 +42.489875793457031 8 42.664035797119141 +44.654937744140625 8 38.914035797119141 +44.220817565917969 8 38.876056671142578 +36.299888610839844 8 46.263267517089844 +35.904937744140625 8 46.079097747802734 +35.5479736328125 8 45.829147338867188 +34.654937744140625 8 36.414035797119141 +34.692920684814453 8 35.979915618896484 +43.799888610839844 8 38.763267517089844 +43.404937744140625 8 38.579097747802734 +39.320003509521484 8 37.664031982421875 +43.047969818115234 8 38.329147338867188 +42.739826202392578 8 38.021007537841797 +35.239826202392578 8 45.521007537841797 +34.989875793457031 8 45.164031982421875 +34.805706024169922 8 44.769084930419922 +34.692920684814453 8 44.348155975341797 +34.654937744140625 8 43.914035797119141 +34.692920684814453 8 43.479915618896484 +34.989875793457031 8 37.664031982421875 +35.239826202392578 8 38.021007537841797 +42.489875793457031 8 35.164035797119141 +42.739826202392578 8 34.80706787109375 +43.047969818115234 8 34.498924255371094 +42.305709838867188 8 44.769084930419922 +42.192920684814453 8 44.348155975341797 +37.589057922363281 8 38.876056671142578 +42.154937744140625 8 43.914035797119141 +42.192920684814453 8 43.479915618896484 +36.299888610839844 8 38.763267517089844 +35.904937744140625 8 38.579097747802734 +35.5479736328125 8 38.329147338867188 +42.192920684814453 8 36.848155975341797 +39.504169464111328 8 37.269084930419922 +42.305709838867188 8 37.269084930419922 +42.489875793457031 8 37.664031982421875 +42.154937744140625 8 36.414035797119141 +39.654941558837891 8 36.414035797119141 +39.616958618164062 8 36.848155975341797 +35.239826202392578 8 42.30706787109375 +35.5479736328125 8 41.998924255371094 +35.904937744140625 8 41.748970031738281 +37.589057922363281 8 41.452014923095703 +37.154937744140625 8 41.414035797119141 +42.305709838867188 8 35.558982849121094 +39.070049285888672 8 38.021007537841797 +38.761905670166016 8 38.329147338867188 +42.305709838867188 8 43.058982849121094 +38.404937744140625 8 38.579097747802734 +38.009990692138672 8 38.763267517089844 +36.299888610839844 8 41.564804077148438 +36.720821380615234 8 41.452014923095703 +43.404937744140625 8 34.248970031738281 +43.799888610839844 8 34.064804077148438 +44.220817565917969 8 33.952014923095703 +44.654937744140625 8 33.914035797119141 +45.089057922363281 8 33.952014923095703 +45.509990692138672 8 34.064804077148438 +45.904937744140625 8 34.248970031738281 +46.261905670166016 8 34.498924255371094 +46.570049285888672 8 34.80706787109375 +46.820003509521484 8 35.164035797119141 +47.154937744140625 8 36.414035797119141 +47.116958618164062 8 36.848155975341797 +39.070049285888672 8 42.30706787109375 +39.320003509521484 8 42.664035797119141 +43.047969818115234 8 45.829147338867188 +38.009990692138672 8 41.564804077148438 +38.404937744140625 8 41.748970031738281 +38.761905670166016 8 41.998924255371094 +39.616958618164062 8 44.348155975341797 +43.799888610839844 8 46.263267517089844 +43.404937744140625 8 46.079097747802734 +37.589057922363281 8 46.376052856445312 +47.004169464111328 8 35.558982849121094 +47.116958618164062 8 35.979915618896484 +39.504169464111328 8 43.058982849121094 +39.616958618164062 8 43.479915618896484 +39.654941558837891 8 43.914035797119141 +42.739826202392578 8 45.521007537841797 +42.489875793457031 8 45.164031982421875 +47.004169464111328 8 37.269084930419922 +46.820003509521484 8 37.664031982421875 +47.116958618164062 8 43.479915618896484 +46.570049285888672 8 38.021007537841797 +46.261905670166016 8 38.329147338867188 +45.904937744140625 8 38.579097747802734 +47.154937744140625 8 43.914035797119141 +42.739826202392578 8 42.30706787109375 +43.047969818115234 8 41.998924255371094 +43.404937744140625 8 41.748970031738281 +45.089057922363281 8 38.876056671142578 +44.654937744140625 8 41.414035797119141 +44.220817565917969 8 46.376052856445312 +38.761905670166016 8 45.829147338867188 +38.404937744140625 8 46.079097747802734 +43.799888610839844 8 41.564804077148438 +44.220817565917969 8 41.452014923095703 +45.089057922363281 8 41.452014923095703 +45.509990692138672 8 41.564804077148438 +45.904937744140625 8 41.748970031738281 +39.504169464111328 8 44.769084930419922 +39.320003509521484 8 45.164031982421875 +39.070049285888672 8 45.521007537841797 +44.654937744140625 8 46.414035797119141 +38.009990692138672 8 46.263267517089844 +47.116958618164062 8 44.348155975341797 +47.004169464111328 8 44.769084930419922 +46.820003509521484 8 45.164031982421875 +46.570049285888672 8 45.521007537841797 +46.261905670166016 8 45.829147338867188 +45.904937744140625 8 46.079097747802734 +46.261905670166016 8 41.998924255371094 +46.570049285888672 8 42.30706787109375 +45.509990692138672 8 38.763267517089844 +46.820003509521484 8 42.664035797119141 +47.004169464111328 8 43.058982849121094 +45.509990692138672 8 46.263267517089844 +45.089057922363281 8 46.376052856445312 +37.154937744140625 8 31.414035797119141 +36.720821380615234 8 31.376056671142578 +47.004169464111328 8 29.769084930419922 +46.820003509521484 8 30.164035797119141 +46.570049285888672 8 30.521005630493164 +46.261905670166016 8 30.829147338867188 +36.299888610839844 8 31.263269424438477 +35.904937744140625 8 31.079097747802734 +35.5479736328125 8 30.829147338867188 +37.589057922363281 8 31.376056671142578 +38.009990692138672 8 31.263269424438477 +45.089057922363281 8 26.452016830444336 +45.509990692138672 8 26.564804077148438 +45.904937744140625 8 26.748971939086914 +46.261905670166016 8 26.998924255371094 +46.570049285888672 8 27.30706787109375 +46.820003509521484 8 27.664035797119141 +47.004169464111328 8 28.058984756469727 +47.116958618164062 8 28.479915618896484 +47.154937744140625 8 28.914035797119141 +47.116958618164062 8 29.348155975341797 +45.904937744140625 8 31.079097747802734 +45.509990692138672 8 31.263269424438477 +45.089057922363281 8 31.376056671142578 +35.239826202392578 8 30.521005630493164 +34.989875793457031 8 30.164035797119141 +34.805706024169922 8 29.769084930419922 +33.404937744140625 8 25.164035797119141 +34.805706024169922 8 28.058984756469727 +34.989875793457031 8 27.664035797119141 +36.720821380615234 8 26.452016830444336 +36.299888610839844 8 26.564804077148438 +35.904937744140625 8 26.748971939086914 +35.239826202392578 8 27.30706787109375 +35.5479736328125 8 26.998924255371094 +37.154937744140625 8 26.414035797119141 +44.220817565917969 8 26.452016830444336 +44.654937744140625 8 26.414035797119141 +39.070049285888672 8 30.521005630493164 +38.761905670166016 8 30.829147338867188 +38.404937744140625 8 31.079097747802734 +34.692920684814453 8 29.348155975341797 +34.654937744140625 8 28.914035797119141 +34.692920684814453 8 28.479915618896484 +43.404937744140625 8 31.079097747802734 +43.047969818115234 8 30.829147338867188 +42.192920684814453 8 28.479915618896484 +39.504169464111328 8 28.058984756469727 +39.616958618164062 8 28.479915618896484 +37.589057922363281 8 26.452016830444336 +38.009990692138672 8 26.564804077148438 +38.404937744140625 8 26.748971939086914 +44.654937744140625 8 31.414035797119141 +44.220817565917969 8 31.376056671142578 +43.799888610839844 8 31.263269424438477 +42.489875793457031 8 27.664035797119141 +42.739826202392578 8 27.30706787109375 +39.320003509521484 8 27.664035797119141 +42.154937744140625 8 28.914035797119141 +39.654941558837891 8 28.914035797119141 +42.192920684814453 8 29.348155975341797 +39.616958618164062 8 29.348155975341797 +39.504169464111328 8 29.769084930419922 +42.305709838867188 8 29.769084930419922 +39.320003509521484 8 30.164035797119141 +42.489875793457031 8 30.164035797119141 +42.739826202392578 8 30.521005630493164 +39.070049285888672 8 27.30706787109375 +43.047969818115234 8 26.998924255371094 +43.404937744140625 8 26.748971939086914 +38.761905670166016 8 26.998924255371094 +43.799888610839844 8 26.564804077148438 +42.305709838867188 8 28.058984756469727 +46.261905670166016 8 23.329145431518555 +45.904937744140625 8 23.579097747802734 +45.509990692138672 8 23.763267517089844 +42.489875793457031 8 20.164035797119141 +38.404937744140625 8 19.248971939086914 +38.761905670166016 8 19.498924255371094 +42.739826202392578 8 19.807065963745117 +33.404937744140625 8 17.664035797119141 +43.047969818115234 8 19.498924255371094 +43.404937744140625 8 19.248971939086914 +47.004169464111328 8 22.269084930419922 +46.820003509521484 8 22.664033889770508 +46.570049285888672 8 23.021005630493164 +37.589057922363281 8 23.876054763793945 +37.154937744140625 8 23.914035797119141 +36.720821380615234 8 23.876054763793945 +34.805706024169922 8 20.558984756469727 +34.989875793457031 8 20.164035797119141 +35.239826202392578 8 19.807065963745117 +35.5479736328125 8 19.498924255371094 +35.904937744140625 8 19.248971939086914 +36.299888610839844 8 19.064804077148438 +36.720821380615234 8 18.952014923095703 +35.5479736328125 8 23.329145431518555 +35.239826202392578 8 23.021005630493164 +34.989875793457031 8 22.664033889770508 +34.805706024169922 8 22.269084930419922 +37.154937744140625 8 18.914033889770508 +37.589057922363281 8 18.952014923095703 +38.009990692138672 8 19.064804077148438 +42.739826202392578 8 23.021005630493164 +42.489875793457031 8 22.664033889770508 +43.799888610839844 8 19.064804077148438 +44.220817565917969 8 18.952014923095703 +44.654937744140625 8 18.914033889770508 +45.089057922363281 8 18.952014923095703 +47.004169464111328 8 20.558984756469727 +47.116958618164062 8 20.979915618896484 +47.154937744140625 8 21.414035797119141 +47.116958618164062 8 21.848155975341797 +45.089057922363281 8 23.876054763793945 +44.654937744140625 8 23.914035797119141 +44.220817565917969 8 23.876054763793945 +43.799888610839844 8 23.763267517089844 +39.070049285888672 8 19.807065963745117 +39.320003509521484 8 20.164035797119141 +42.305709838867188 8 20.558984756469727 +42.192920684814453 8 20.979915618896484 +45.509990692138672 8 19.064804077148438 +45.904937744140625 8 19.248971939086914 +46.261905670166016 8 19.498924255371094 +36.299888610839844 8 23.763267517089844 +35.904937744140625 8 23.579097747802734 +34.692920684814453 8 21.848155975341797 +34.654937744140625 8 21.414035797119141 +34.692920684814453 8 20.979915618896484 +43.404937744140625 8 23.579097747802734 +43.047969818115234 8 23.329145431518555 +38.009990692138672 8 23.763267517089844 +42.305709838867188 8 22.269084930419922 +39.320003509521484 8 22.664033889770508 +39.070049285888672 8 23.021005630493164 +38.761905670166016 8 23.329145431518555 +38.404937744140625 8 23.579097747802734 +46.570049285888672 8 19.807065963745117 +46.820003509521484 8 20.164035797119141 +39.504169464111328 8 20.558984756469727 +39.616958618164062 8 20.979915618896484 +42.154937744140625 8 21.414035797119141 +39.654941558837891 8 21.414035797119141 +42.192920684814453 8 21.848155975341797 +39.616958618164062 8 21.848155975341797 +39.504169464111328 8 22.269084930419922 +45.904937744140625 8 16.079099655151367 +45.509990692138672 8 16.263267517089844 +46.261905670166016 8 15.829145431518555 +45.089057922363281 8 16.376056671142578 +44.654937744140625 8 16.414035797119141 +44.220817565917969 8 16.376056671142578 +43.799888610839844 8 16.263267517089844 +37.154937744140625 8 16.414035797119141 +36.720821380615234 8 16.376056671142578 +37.589057922363281 8 16.376056671142578 +38.009990692138672 8 16.263267517089844 +43.404937744140625 8 11.74897289276123 +38.404937744140625 8 11.74897289276123 +38.761905670166016 8 11.99892520904541 +44.654937744140625 8 11.414035797119141 +44.220817565917969 8 11.45201587677002 +33.404937744140625 8 10.14332103729248 +43.799888610839844 8 11.564802169799805 +45.089057922363281 8 11.45201587677002 +45.509990692138672 8 11.564802169799805 +45.904937744140625 8 11.74897289276123 +46.261905670166016 8 11.99892520904541 +46.570049285888672 8 12.307066917419434 +46.820003509521484 8 12.664034843444824 +47.116958618164062 8 14.348156929016113 +47.004169464111328 8 14.769084930419922 +36.299888610839844 8 16.263267517089844 +35.904937744140625 8 16.079099655151367 +35.5479736328125 8 15.829145431518555 +34.805706024169922 8 13.058986663818359 +34.989875793457031 8 12.664034843444824 +35.239826202392578 8 12.307066917419434 +35.5479736328125 8 11.99892520904541 +35.904937744140625 8 11.74897289276123 +36.299888610839844 8 11.564802169799805 +36.720821380615234 8 11.45201587677002 +46.820003509521484 8 15.164036750793457 +46.570049285888672 8 15.521004676818848 +38.404937744140625 8 16.079099655151367 +43.404937744140625 8 16.079099655151367 +43.047969818115234 8 15.829145431518555 +42.739826202392578 8 15.521004676818848 +42.489875793457031 8 15.164036750793457 +42.305709838867188 8 14.769084930419922 +35.239826202392578 8 15.521004676818848 +34.989875793457031 8 15.164036750793457 +34.805706024169922 8 14.769084930419922 +37.154937744140625 8 11.414035797119141 +37.589057922363281 8 11.45201587677002 +38.009990692138672 8 11.564802169799805 +39.616958618164062 8 14.348156929016113 +39.504169464111328 8 14.769084930419922 +42.192920684814453 8 13.479914665222168 +39.070049285888672 8 12.307066917419434 +39.320003509521484 8 12.664034843444824 +43.047969818115234 8 11.99892520904541 +42.739826202392578 8 12.307066917419434 +34.692920684814453 8 14.348156929016113 +34.654937744140625 8 13.914033889770508 +34.692920684814453 8 13.479914665222168 +42.192920684814453 8 14.348156929016113 +42.154937744140625 8 13.914033889770508 +39.070049285888672 8 15.521004676818848 +39.320003509521484 8 15.164036750793457 +47.004169464111328 8 13.058986663818359 +47.116958618164062 8 13.479914665222168 +47.154937744140625 8 13.914033889770508 +38.761905670166016 8 15.829145431518555 +42.489875793457031 8 12.664034843444824 +39.504169464111328 8 13.058986663818359 +42.305709838867188 8 13.058986663818359 +39.616958618164062 8 13.479914665222168 +39.654941558837891 8 13.914033889770508 +25.904937744140625 8 94 +29.654939651489258 8 83.914031982421875 +29.220817565917969 8 83.876060485839844 +28.799888610839844 8 83.763275146484375 +28.404937744140625 8 83.5791015625 +28.047969818115234 8 83.329139709472656 +27.739826202392578 8 83.021003723144531 +27.489873886108398 8 82.664031982421875 +27.19291877746582 8 80.979911804199219 +27.305707931518555 8 80.558982849121094 +25.904937744140625 8 77.664031982421875 +27.489873886108398 8 80.164031982421875 +27.739826202392578 8 79.80706787109375 +27.305707931518555 8 82.269088745117188 +27.19291877746582 8 81.848159790039062 +27.154939651489258 8 81.414039611816406 +28.047969818115234 8 79.498924255371094 +28.404937744140625 8 79.248970031738281 +28.799888610839844 8 79.064804077148438 +29.220817565917969 8 78.952011108398438 +29.654939651489258 8 78.914031982421875 +30.089057922363281 8 78.952011108398438 +30.509988784790039 8 79.064804077148438 +30.904937744140625 8 79.248970031738281 +31.261905670166016 8 79.498924255371094 +31.570051193237305 8 79.80706787109375 +31.820003509521484 8 80.164031982421875 +32.154941558837891 8 81.414039611816406 +32.004169464111328 8 80.558982849121094 +32.116958618164062 8 80.979911804199219 +32.116958618164062 8 81.848159790039062 +32.004169464111328 8 82.269088745117188 +31.820003509521484 8 82.664031982421875 +31.570051193237305 8 83.021003723144531 +31.261905670166016 8 83.329139709472656 +30.904937744140625 8 83.5791015625 +30.509988784790039 8 83.763275146484375 +30.089057922363281 8 83.876060485839844 +30.509988784790039 8 76.263267517089844 +30.089057922363281 8 76.376052856445312 +29.654939651489258 8 76.414031982421875 +29.220817565917969 8 71.452011108398438 +29.654939651489258 8 71.414039611816406 +30.089057922363281 8 71.452011108398438 +30.509988784790039 8 71.564811706542969 +30.904937744140625 8 71.748970031738281 +31.261905670166016 8 71.998924255371094 +31.570051193237305 8 72.30706787109375 +31.820003509521484 8 72.664039611816406 +29.220817565917969 8 76.376052856445312 +28.799888610839844 8 76.263267517089844 +28.404937744140625 8 76.0791015625 +27.739826202392578 8 72.30706787109375 +28.047969818115234 8 71.998924255371094 +25.904937744140625 8 70.164039611816406 +28.404937744140625 8 71.748970031738281 +28.799888610839844 8 71.564811706542969 +28.047969818115234 8 75.829147338867188 +27.739826202392578 8 75.521003723144531 +27.489873886108398 8 75.164031982421875 +27.305707931518555 8 74.769088745117188 +27.19291877746582 8 74.348152160644531 +27.154939651489258 8 73.914039611816406 +27.19291877746582 8 73.479911804199219 +27.305707931518555 8 73.058982849121094 +27.489873886108398 8 72.664039611816406 +32.004169464111328 8 73.058982849121094 +32.116958618164062 8 73.479911804199219 +32.154941558837891 8 73.914039611816406 +32.116958618164062 8 74.348152160644531 +32.004169464111328 8 74.769088745117188 +31.820003509521484 8 75.164031982421875 +31.570051193237305 8 75.521003723144531 +31.261905670166016 8 75.829147338867188 +30.904937744140625 8 76.0791015625 +30.509988784790039 8 68.763267517089844 +30.089057922363281 8 68.876060485839844 +29.654939651489258 8 68.914031982421875 +30.089057922363281 8 63.952014923095703 +30.509988784790039 8 64.064804077148438 +30.904937744140625 8 64.248970031738281 +31.261905670166016 8 64.498924255371094 +31.570051193237305 8 64.80706787109375 +31.820003509521484 8 65.164039611816406 +29.220817565917969 8 68.876060485839844 +28.799888610839844 8 68.763267517089844 +28.404937744140625 8 68.5791015625 +27.739826202392578 8 64.80706787109375 +28.047969818115234 8 64.498924255371094 +25.904937744140625 8 62.664031982421875 +28.404937744140625 8 64.248970031738281 +28.799888610839844 8 64.064804077148438 +29.220817565917969 8 63.952014923095703 +29.654939651489258 8 63.914039611816406 +28.047969818115234 8 68.329147338867188 +27.739826202392578 8 68.021003723144531 +27.489873886108398 8 67.664031982421875 +27.305707931518555 8 67.269088745117188 +27.19291877746582 8 66.848159790039062 +27.154939651489258 8 66.414039611816406 +27.19291877746582 8 65.979911804199219 +27.305707931518555 8 65.558982849121094 +27.489873886108398 8 65.164039611816406 +32.004169464111328 8 65.558982849121094 +32.116958618164062 8 65.979911804199219 +32.154941558837891 8 66.414039611816406 +32.116958618164062 8 66.848159790039062 +32.004169464111328 8 67.269088745117188 +31.820003509521484 8 67.664031982421875 +31.570051193237305 8 68.021003723144531 +31.261905670166016 8 68.329147338867188 +30.904937744140625 8 68.5791015625 +31.261905670166016 8 60.829147338867188 +30.904937744140625 8 61.0791015625 +30.089057922363281 8 56.452018737792969 +29.654939651489258 8 56.414035797119141 +25.904937744140625 8 55.164035797119141 +32.004169464111328 8 59.769084930419922 +31.820003509521484 8 60.164035797119141 +31.570051193237305 8 60.521007537841797 +30.509988784790039 8 61.263267517089844 +30.089057922363281 8 61.376052856445312 +29.654939651489258 8 61.414035797119141 +29.220817565917969 8 61.376052856445312 +28.799888610839844 8 61.263267517089844 +28.404937744140625 8 61.0791015625 +28.047969818115234 8 60.829147338867188 +30.509988784790039 8 56.564804077148438 +30.904937744140625 8 56.748970031738281 +31.261905670166016 8 56.998924255371094 +27.739826202392578 8 60.521007537841797 +27.489873886108398 8 60.164035797119141 +27.305707931518555 8 59.769084930419922 +27.19291877746582 8 59.348155975341797 +27.154939651489258 8 58.914035797119141 +31.570051193237305 8 57.307064056396484 +31.820003509521484 8 57.664035797119141 +32.004169464111328 8 58.058982849121094 +32.116958618164062 8 58.479915618896484 +32.154941558837891 8 58.914035797119141 +32.116958618164062 8 59.348155975341797 +27.19291877746582 8 58.479915618896484 +27.305707931518555 8 58.058982849121094 +27.489873886108398 8 57.664035797119141 +27.739826202392578 8 57.307064056396484 +28.047969818115234 8 56.998924255371094 +28.404937744140625 8 56.748970031738281 +28.799888610839844 8 56.564804077148438 +29.220817565917969 8 56.452018737792969 +32.004169464111328 8 52.269084930419922 +31.820003509521484 8 52.664035797119141 +29.220817565917969 8 53.876052856445312 +28.799888610839844 8 53.763267517089844 +28.404937744140625 8 53.579097747802734 +30.089057922363281 8 48.952018737792969 +30.509988784790039 8 49.064804077148438 +30.904937744140625 8 49.248970031738281 +31.261905670166016 8 49.498924255371094 +31.570051193237305 8 49.80706787109375 +31.820003509521484 8 50.164035797119141 +32.004169464111328 8 50.558982849121094 +31.570051193237305 8 53.021007537841797 +31.261905670166016 8 53.329147338867188 +30.904937744140625 8 53.579097747802734 +28.047969818115234 8 53.329147338867188 +27.739826202392578 8 53.021007537841797 +27.489873886108398 8 52.664035797119141 +32.116958618164062 8 50.979915618896484 +32.154941558837891 8 51.414035797119141 +32.116958618164062 8 51.848155975341797 +30.509988784790039 8 53.763267517089844 +30.089057922363281 8 53.876052856445312 +29.654939651489258 8 53.914035797119141 +27.305707931518555 8 52.269084930419922 +27.19291877746582 8 51.848155975341797 +25.904937744140625 8 47.664035797119141 +27.154939651489258 8 51.414035797119141 +27.19291877746582 8 50.979915618896484 +27.305707931518555 8 50.558982849121094 +27.489873886108398 8 50.164035797119141 +27.739826202392578 8 49.80706787109375 +28.047969818115234 8 49.498924255371094 +28.404937744140625 8 49.248970031738281 +28.799888610839844 8 49.064804077148438 +29.220817565917969 8 48.952018737792969 +29.654939651489258 8 48.914035797119141 +29.220817565917969 8 46.376052856445312 +28.799888610839844 8 46.263267517089844 +28.404937744140625 8 46.079097747802734 +28.047969818115234 8 45.829147338867188 +27.305707931518555 8 44.769084930419922 +27.19291877746582 8 44.348155975341797 +27.305707931518555 8 37.269084930419922 +27.19291877746582 8 36.848155975341797 +28.799888610839844 8 34.064804077148438 +29.220817565917969 8 33.952014923095703 +25.904937744140625 8 32.664035797119141 +29.654939651489258 8 33.914035797119141 +28.404937744140625 8 41.748970031738281 +31.570051193237305 8 38.021007537841797 +28.047969818115234 8 41.998924255371094 +31.261905670166016 8 38.329147338867188 +30.904937744140625 8 38.579097747802734 +27.739826202392578 8 45.521007537841797 +27.489873886108398 8 45.164031982421875 +28.799888610839844 8 41.564804077148438 +29.220817565917969 8 41.452014923095703 +31.820003509521484 8 37.664031982421875 +30.509988784790039 8 38.763267517089844 +30.089057922363281 8 38.876056671142578 +27.739826202392578 8 42.30706787109375 +29.654939651489258 8 38.914035797119141 +27.489873886108398 8 42.664035797119141 +29.220817565917969 8 38.876056671142578 +27.305707931518555 8 43.058982849121094 +27.154939651489258 8 36.414035797119141 +27.19291877746582 8 35.979915618896484 +27.739826202392578 8 34.80706787109375 +28.047969818115234 8 34.498924255371094 +28.404937744140625 8 34.248970031738281 +29.654939651489258 8 41.414035797119141 +30.089057922363281 8 41.452014923095703 +32.004169464111328 8 37.269084930419922 +28.404937744140625 8 38.579097747802734 +28.047969818115234 8 38.329147338867188 +27.305707931518555 8 35.558982849121094 +27.489873886108398 8 35.164035797119141 +27.739826202392578 8 38.021007537841797 +27.489873886108398 8 37.664031982421875 +27.154939651489258 8 43.914035797119141 +27.19291877746582 8 43.479915618896484 +28.799888610839844 8 38.763267517089844 +30.089057922363281 8 33.952014923095703 +30.509988784790039 8 34.064804077148438 +30.904937744140625 8 34.248970031738281 +31.261905670166016 8 34.498924255371094 +31.570051193237305 8 34.80706787109375 +31.820003509521484 8 35.164035797119141 +32.154941558837891 8 36.414035797119141 +32.116958618164062 8 36.848155975341797 +32.004169464111328 8 35.558982849121094 +32.116958618164062 8 35.979915618896484 +31.570051193237305 8 42.30706787109375 +31.820003509521484 8 42.664035797119141 +30.509988784790039 8 41.564804077148438 +30.904937744140625 8 41.748970031738281 +31.261905670166016 8 41.998924255371094 +32.154941558837891 8 43.914035797119141 +32.116958618164062 8 43.479915618896484 +32.004169464111328 8 43.058982849121094 +32.116958618164062 8 44.348155975341797 +32.004169464111328 8 44.769084930419922 +31.820003509521484 8 45.164031982421875 +31.570051193237305 8 45.521007537841797 +31.261905670166016 8 45.829147338867188 +30.904937744140625 8 46.079097747802734 +30.509988784790039 8 46.263267517089844 +30.089057922363281 8 46.376052856445312 +29.654939651489258 8 46.414035797119141 +27.739826202392578 8 27.30706787109375 +28.047969818115234 8 26.998924255371094 +25.904937744140625 8 25.164035797119141 +28.404937744140625 8 26.748971939086914 +28.799888610839844 8 26.564804077148438 +29.220817565917969 8 26.452016830444336 +29.220817565917969 8 31.376056671142578 +28.799888610839844 8 31.263269424438477 +28.404937744140625 8 31.079097747802734 +28.047969818115234 8 30.829147338867188 +27.739826202392578 8 30.521005630493164 +27.489873886108398 8 30.164035797119141 +27.305707931518555 8 29.769084930419922 +27.19291877746582 8 28.479915618896484 +27.154939651489258 8 28.914035797119141 +27.19291877746582 8 29.348155975341797 +27.305707931518555 8 28.058984756469727 +27.489873886108398 8 27.664035797119141 +29.654939651489258 8 26.414035797119141 +30.089057922363281 8 26.452016830444336 +30.509988784790039 8 26.564804077148438 +30.904937744140625 8 26.748971939086914 +31.261905670166016 8 26.998924255371094 +31.570051193237305 8 27.30706787109375 +31.820003509521484 8 27.664035797119141 +32.154941558837891 8 28.914035797119141 +32.116958618164062 8 28.479915618896484 +32.004169464111328 8 28.058984756469727 +32.116958618164062 8 29.348155975341797 +32.004169464111328 8 29.769084930419922 +31.820003509521484 8 30.164035797119141 +31.570051193237305 8 30.521005630493164 +31.261905670166016 8 30.829147338867188 +30.904937744140625 8 31.079097747802734 +30.509988784790039 8 31.263269424438477 +30.089057922363281 8 31.376056671142578 +29.654939651489258 8 31.414035797119141 +27.305707931518555 8 20.558984756469727 +27.489873886108398 8 20.164035797119141 +25.904937744140625 8 17.664035797119141 +30.509988784790039 8 19.064804077148438 +30.904937744140625 8 19.248971939086914 +31.261905670166016 8 19.498924255371094 +28.404937744140625 8 19.248971939086914 +28.799888610839844 8 19.064804077148438 +27.739826202392578 8 19.807065963745117 +28.047969818115234 8 19.498924255371094 +29.220817565917969 8 18.952014923095703 +29.654939651489258 8 18.914033889770508 +30.089057922363281 8 18.952014923095703 +30.509988784790039 8 23.763267517089844 +30.089057922363281 8 23.876054763793945 +27.739826202392578 8 23.021005630493164 +27.489873886108398 8 22.664033889770508 +27.305707931518555 8 22.269084930419922 +32.004169464111328 8 22.269084930419922 +31.820003509521484 8 22.664033889770508 +31.570051193237305 8 23.021005630493164 +31.261905670166016 8 23.329145431518555 +30.904937744140625 8 23.579097747802734 +29.654939651489258 8 23.914035797119141 +29.220817565917969 8 23.876054763793945 +28.799888610839844 8 23.763267517089844 +31.570051193237305 8 19.807065963745117 +31.820003509521484 8 20.164035797119141 +32.004169464111328 8 20.558984756469727 +28.404937744140625 8 23.579097747802734 +28.047969818115234 8 23.329145431518555 +27.19291877746582 8 21.848155975341797 +27.154939651489258 8 21.414035797119141 +27.19291877746582 8 20.979915618896484 +32.116958618164062 8 20.979915618896484 +32.154941558837891 8 21.414035797119141 +32.116958618164062 8 21.848155975341797 +30.509988784790039 8 11.564802169799805 +30.904937744140625 8 11.74897289276123 +32.116958618164062 8 14.348156929016113 +32.004169464111328 8 14.769084930419922 +31.261905670166016 8 15.829145431518555 +30.904937744140625 8 16.079099655151367 +30.509988784790039 8 16.263267517089844 +30.089057922363281 8 16.376056671142578 +29.654939651489258 8 16.414035797119141 +29.220817565917969 8 16.376056671142578 +27.305707931518555 8 13.058986663818359 +27.489873886108398 8 12.664034843444824 +25.904937744140625 8 10.14332103729248 +27.739826202392578 8 12.307066917419434 +31.261905670166016 8 11.99892520904541 +31.570051193237305 8 12.307066917419434 +31.820003509521484 8 12.664034843444824 +31.820003509521484 8 15.164036750793457 +31.570051193237305 8 15.521004676818848 +28.047969818115234 8 11.99892520904541 +28.404937744140625 8 11.74897289276123 +28.799888610839844 8 11.564802169799805 +28.799888610839844 8 16.263267517089844 +28.404937744140625 8 16.079099655151367 +28.047969818115234 8 15.829145431518555 +27.739826202392578 8 15.521004676818848 +27.489873886108398 8 15.164036750793457 +27.305707931518555 8 14.769084930419922 +29.220817565917969 8 11.45201587677002 +29.654939651489258 8 11.414035797119141 +30.089057922363281 8 11.45201587677002 +32.004169464111328 8 13.058986663818359 +32.116958618164062 8 13.479914665222168 +32.154941558837891 8 13.914033889770508 +27.19291877746582 8 14.348156929016113 +27.154939651489258 8 13.914033889770508 +27.19291877746582 8 13.479914665222168 +18.404937744140625 8 94 +22.154937744140625 8 83.914031982421875 +21.720817565917969 8 83.876060485839844 +21.299886703491211 8 83.763275146484375 +20.904937744140625 8 83.5791015625 +20.239828109741211 8 79.80706787109375 +20.547969818115234 8 79.498924255371094 +18.404937744140625 8 77.664031982421875 +22.154937744140625 8 78.914031982421875 +22.589059829711914 8 78.952011108398438 +20.547969818115234 8 83.329139709472656 +20.239828109741211 8 83.021003723144531 +19.989873886108398 8 82.664031982421875 +19.69291877746582 8 80.979911804199219 +19.805707931518555 8 80.558982849121094 +19.989873886108398 8 80.164031982421875 +19.805707931518555 8 82.269088745117188 +19.69291877746582 8 81.848159790039062 +19.654939651489258 8 81.414039611816406 +20.904937744140625 8 79.248970031738281 +21.299886703491211 8 79.064804077148438 +21.720817565917969 8 78.952011108398438 +23.009988784790039 8 79.064804077148438 +23.404939651489258 8 79.248970031738281 +23.761907577514648 8 79.498924255371094 +24.504169464111328 8 82.269088745117188 +24.320003509521484 8 82.664031982421875 +24.070049285888672 8 79.80706787109375 +24.320003509521484 8 80.164031982421875 +24.504169464111328 8 80.558982849121094 +24.070049285888672 8 83.021003723144531 +23.761907577514648 8 83.329139709472656 +23.404939651489258 8 83.5791015625 +23.009988784790039 8 83.763275146484375 +22.589059829711914 8 83.876060485839844 +24.616958618164062 8 80.979911804199219 +24.654937744140625 8 81.414039611816406 +24.616958618164062 8 81.848159790039062 +22.154937744140625 8 76.414031982421875 +18.404937744140625 8 70.164039611816406 +20.239828109741211 8 72.30706787109375 +20.547969818115234 8 71.998924255371094 +22.154937744140625 8 71.414039611816406 +22.589059829711914 8 71.452011108398438 +23.009988784790039 8 71.564811706542969 +23.404939651489258 8 71.748970031738281 +23.761907577514648 8 71.998924255371094 +24.070049285888672 8 72.30706787109375 +24.320003509521484 8 72.664039611816406 +21.720817565917969 8 76.376052856445312 +21.299886703491211 8 76.263267517089844 +20.904937744140625 8 76.0791015625 +20.904937744140625 8 71.748970031738281 +21.299886703491211 8 71.564811706542969 +21.720817565917969 8 71.452011108398438 +24.070049285888672 8 75.521003723144531 +23.761907577514648 8 75.829147338867188 +23.404939651489258 8 76.0791015625 +23.009988784790039 8 76.263267517089844 +22.589059829711914 8 76.376052856445312 +20.547969818115234 8 75.829147338867188 +20.239828109741211 8 75.521003723144531 +19.989873886108398 8 75.164031982421875 +19.805707931518555 8 74.769088745117188 +19.69291877746582 8 74.348152160644531 +19.654939651489258 8 73.914039611816406 +19.69291877746582 8 73.479911804199219 +19.805707931518555 8 73.058982849121094 +19.989873886108398 8 72.664039611816406 +24.504169464111328 8 73.058982849121094 +24.616958618164062 8 73.479911804199219 +24.654937744140625 8 73.914039611816406 +24.616958618164062 8 74.348152160644531 +24.504169464111328 8 74.769088745117188 +24.320003509521484 8 75.164031982421875 +22.154937744140625 8 68.914031982421875 +22.589059829711914 8 63.952014923095703 +23.009988784790039 8 64.064804077148438 +23.404939651489258 8 64.248970031738281 +23.761907577514648 8 64.498924255371094 +24.070049285888672 8 64.80706787109375 +24.320003509521484 8 65.164039611816406 +21.720817565917969 8 68.876060485839844 +21.299886703491211 8 68.763267517089844 +20.904937744140625 8 68.5791015625 +20.239828109741211 8 64.80706787109375 +20.547969818115234 8 64.498924255371094 +18.404937744140625 8 62.664031982421875 +20.904937744140625 8 64.248970031738281 +21.299886703491211 8 64.064804077148438 +21.720817565917969 8 63.952014923095703 +22.154937744140625 8 63.914039611816406 +24.070049285888672 8 68.021003723144531 +23.761907577514648 8 68.329147338867188 +23.404939651489258 8 68.5791015625 +23.009988784790039 8 68.763267517089844 +22.589059829711914 8 68.876060485839844 +20.547969818115234 8 68.329147338867188 +20.239828109741211 8 68.021003723144531 +19.989873886108398 8 67.664031982421875 +19.805707931518555 8 67.269088745117188 +19.69291877746582 8 66.848159790039062 +19.654939651489258 8 66.414039611816406 +19.69291877746582 8 65.979911804199219 +19.805707931518555 8 65.558982849121094 +19.989873886108398 8 65.164039611816406 +24.504169464111328 8 65.558982849121094 +24.616958618164062 8 65.979911804199219 +24.654937744140625 8 66.414039611816406 +24.616958618164062 8 66.848159790039062 +24.504169464111328 8 67.269088745117188 +24.320003509521484 8 67.664031982421875 +22.589059829711914 8 56.452018737792969 +22.154937744140625 8 56.414035797119141 +18.404937744140625 8 55.164035797119141 +23.009988784790039 8 56.564804077148438 +23.404939651489258 8 56.748970031738281 +23.761907577514648 8 56.998924255371094 +23.761907577514648 8 60.829147338867188 +23.404939651489258 8 61.0791015625 +21.720817565917969 8 61.376052856445312 +21.299886703491211 8 61.263267517089844 +20.904937744140625 8 61.0791015625 +20.547969818115234 8 60.829147338867188 +23.009988784790039 8 61.263267517089844 +22.589059829711914 8 61.376052856445312 +22.154937744140625 8 61.414035797119141 +20.239828109741211 8 60.521007537841797 +19.989873886108398 8 60.164035797119141 +19.805707931518555 8 59.769084930419922 +19.69291877746582 8 59.348155975341797 +19.654939651489258 8 58.914035797119141 +24.070049285888672 8 57.307064056396484 +24.320003509521484 8 57.664035797119141 +24.504169464111328 8 58.058982849121094 +24.616958618164062 8 58.479915618896484 +24.654937744140625 8 58.914035797119141 +24.616958618164062 8 59.348155975341797 +24.504169464111328 8 59.769084930419922 +19.69291877746582 8 58.479915618896484 +19.805707931518555 8 58.058982849121094 +19.989873886108398 8 57.664035797119141 +20.239828109741211 8 57.307064056396484 +20.547969818115234 8 56.998924255371094 +20.904937744140625 8 56.748970031738281 +24.320003509521484 8 60.164035797119141 +24.070049285888672 8 60.521007537841797 +21.299886703491211 8 56.564804077148438 +21.720817565917969 8 56.452018737792969 +21.720817565917969 8 53.876052856445312 +21.299886703491211 8 53.763267517089844 +20.904937744140625 8 53.579097747802734 +22.589059829711914 8 48.952018737792969 +23.009988784790039 8 49.064804077148438 +23.404939651489258 8 49.248970031738281 +23.761907577514648 8 49.498924255371094 +23.761907577514648 8 53.329147338867188 +23.404939651489258 8 53.579097747802734 +23.009988784790039 8 53.763267517089844 +22.589059829711914 8 53.876052856445312 +22.154937744140625 8 53.914035797119141 +20.547969818115234 8 53.329147338867188 +20.239828109741211 8 53.021007537841797 +19.989873886108398 8 52.664035797119141 +19.805707931518555 8 52.269084930419922 +19.69291877746582 8 51.848155975341797 +18.404937744140625 8 47.664035797119141 +19.654939651489258 8 51.414035797119141 +24.070049285888672 8 49.80706787109375 +24.320003509521484 8 50.164035797119141 +24.504169464111328 8 50.558982849121094 +24.616958618164062 8 50.979915618896484 +24.654937744140625 8 51.414035797119141 +24.616958618164062 8 51.848155975341797 +24.504169464111328 8 52.269084930419922 +19.69291877746582 8 50.979915618896484 +19.805707931518555 8 50.558982849121094 +19.989873886108398 8 50.164035797119141 +20.239828109741211 8 49.80706787109375 +20.547969818115234 8 49.498924255371094 +20.904937744140625 8 49.248970031738281 +24.320003509521484 8 52.664035797119141 +24.070049285888672 8 53.021007537841797 +21.299886703491211 8 49.064804077148438 +21.720817565917969 8 48.952018737792969 +22.154937744140625 8 48.914035797119141 +21.720817565917969 8 46.376052856445312 +21.299886703491211 8 46.263267517089844 +20.904937744140625 8 46.079097747802734 +20.547969818115234 8 45.829147338867188 +19.805707931518555 8 44.769084930419922 +19.69291877746582 8 44.348155975341797 +19.805707931518555 8 37.269084930419922 +19.69291877746582 8 36.848155975341797 +22.589059829711914 8 33.952014923095703 +22.154937744140625 8 33.914035797119141 +18.404937744140625 8 32.664035797119141 +21.720817565917969 8 33.952014923095703 +21.299886703491211 8 34.064804077148438 +20.904937744140625 8 41.748970031738281 +24.070049285888672 8 38.021007537841797 +20.547969818115234 8 41.998924255371094 +23.761907577514648 8 38.329147338867188 +23.404939651489258 8 38.579097747802734 +20.239828109741211 8 45.521007537841797 +19.989873886108398 8 45.164031982421875 +21.299886703491211 8 41.564804077148438 +21.720817565917969 8 41.452014923095703 +24.320003509521484 8 37.664031982421875 +23.009988784790039 8 38.763267517089844 +22.589059829711914 8 38.876056671142578 +20.239828109741211 8 42.30706787109375 +22.154937744140625 8 38.914035797119141 +19.989873886108398 8 42.664035797119141 +21.720817565917969 8 38.876056671142578 +19.805707931518555 8 43.058982849121094 +19.654939651489258 8 36.414035797119141 +19.69291877746582 8 35.979915618896484 +20.239828109741211 8 34.80706787109375 +20.547969818115234 8 34.498924255371094 +20.904937744140625 8 34.248970031738281 +22.154937744140625 8 41.414035797119141 +22.589059829711914 8 41.452014923095703 +24.504169464111328 8 37.269084930419922 +20.904937744140625 8 38.579097747802734 +20.547969818115234 8 38.329147338867188 +19.805707931518555 8 35.558982849121094 +19.989873886108398 8 35.164035797119141 +23.761907577514648 8 34.498924255371094 +24.070049285888672 8 34.80706787109375 +20.239828109741211 8 38.021007537841797 +19.989873886108398 8 37.664031982421875 +23.009988784790039 8 34.064804077148438 +23.404939651489258 8 34.248970031738281 +19.654939651489258 8 43.914035797119141 +19.69291877746582 8 43.479915618896484 +21.299886703491211 8 38.763267517089844 +24.320003509521484 8 35.164035797119141 +24.504169464111328 8 35.558982849121094 +24.616958618164062 8 35.979915618896484 +23.404939651489258 8 41.748970031738281 +23.761907577514648 8 41.998924255371094 +24.070049285888672 8 42.30706787109375 +24.320003509521484 8 42.664035797119141 +24.504169464111328 8 43.058982849121094 +24.616958618164062 8 43.479915618896484 +24.654937744140625 8 43.914035797119141 +24.654937744140625 8 36.414035797119141 +24.616958618164062 8 36.848155975341797 +23.009988784790039 8 41.564804077148438 +24.616958618164062 8 44.348155975341797 +24.504169464111328 8 44.769084930419922 +24.320003509521484 8 45.164031982421875 +24.070049285888672 8 45.521007537841797 +23.761907577514648 8 45.829147338867188 +23.404939651489258 8 46.079097747802734 +23.009988784790039 8 46.263267517089844 +22.589059829711914 8 46.376052856445312 +22.154937744140625 8 46.414035797119141 +20.239828109741211 8 27.30706787109375 +20.547969818115234 8 26.998924255371094 +18.404937744140625 8 25.164035797119141 +20.904937744140625 8 26.748971939086914 +21.299886703491211 8 26.564804077148438 +21.720817565917969 8 26.452016830444336 +21.720817565917969 8 31.376056671142578 +21.299886703491211 8 31.263269424438477 +20.904937744140625 8 31.079097747802734 +20.547969818115234 8 30.829147338867188 +20.239828109741211 8 30.521005630493164 +19.989873886108398 8 30.164035797119141 +19.805707931518555 8 29.769084930419922 +19.69291877746582 8 28.479915618896484 +19.654939651489258 8 28.914035797119141 +19.69291877746582 8 29.348155975341797 +19.805707931518555 8 28.058984756469727 +19.989873886108398 8 27.664035797119141 +22.154937744140625 8 26.414035797119141 +22.589059829711914 8 26.452016830444336 +23.009988784790039 8 26.564804077148438 +23.404939651489258 8 26.748971939086914 +23.761907577514648 8 26.998924255371094 +24.070049285888672 8 27.30706787109375 +24.320003509521484 8 27.664035797119141 +24.504169464111328 8 28.058984756469727 +24.616958618164062 8 28.479915618896484 +24.654937744140625 8 28.914035797119141 +24.616958618164062 8 29.348155975341797 +24.504169464111328 8 29.769084930419922 +24.320003509521484 8 30.164035797119141 +24.070049285888672 8 30.521005630493164 +23.761907577514648 8 30.829147338867188 +23.404939651489258 8 31.079097747802734 +23.009988784790039 8 31.263269424438477 +22.589059829711914 8 31.376056671142578 +22.154937744140625 8 31.414035797119141 +23.761907577514648 8 23.329145431518555 +23.404939651489258 8 23.579097747802734 +23.009988784790039 8 23.763267517089844 +19.805707931518555 8 20.558984756469727 +19.989873886108398 8 20.164035797119141 +18.404937744140625 8 17.664035797119141 +20.239828109741211 8 19.807065963745117 +22.589059829711914 8 23.876054763793945 +20.547969818115234 8 19.498924255371094 +20.904937744140625 8 19.248971939086914 +21.299886703491211 8 19.064804077148438 +23.009988784790039 8 19.064804077148438 +23.404939651489258 8 19.248971939086914 +23.761907577514648 8 19.498924255371094 +20.239828109741211 8 23.021005630493164 +19.989873886108398 8 22.664033889770508 +19.805707931518555 8 22.269084930419922 +21.720817565917969 8 18.952014923095703 +22.154937744140625 8 18.914033889770508 +22.589059829711914 8 18.952014923095703 +24.504169464111328 8 22.269084930419922 +24.320003509521484 8 22.664033889770508 +24.070049285888672 8 23.021005630493164 +22.154937744140625 8 23.914035797119141 +21.720817565917969 8 23.876054763793945 +21.299886703491211 8 23.763267517089844 +20.904937744140625 8 23.579097747802734 +20.547969818115234 8 23.329145431518555 +19.69291877746582 8 21.848155975341797 +19.654939651489258 8 21.414035797119141 +19.69291877746582 8 20.979915618896484 +24.070049285888672 8 19.807065963745117 +24.320003509521484 8 20.164035797119141 +24.504169464111328 8 20.558984756469727 +24.616958618164062 8 20.979915618896484 +24.654937744140625 8 21.414035797119141 +24.616958618164062 8 21.848155975341797 +23.009988784790039 8 11.564802169799805 +23.404939651489258 8 11.74897289276123 +24.616958618164062 8 14.348156929016113 +24.504169464111328 8 14.769084930419922 +23.761907577514648 8 15.829145431518555 +23.404939651489258 8 16.079099655151367 +23.009988784790039 8 16.263267517089844 +22.589059829711914 8 16.376056671142578 +22.154937744140625 8 16.414035797119141 +21.720817565917969 8 16.376056671142578 +19.805707931518555 8 13.058986663818359 +19.989873886108398 8 12.664034843444824 +18.404937744140625 8 10.14332103729248 +20.239828109741211 8 12.307066917419434 +23.761907577514648 8 11.99892520904541 +24.070049285888672 8 12.307066917419434 +24.320003509521484 8 12.664034843444824 +24.320003509521484 8 15.164036750793457 +24.070049285888672 8 15.521004676818848 +20.547969818115234 8 11.99892520904541 +20.904937744140625 8 11.74897289276123 +21.299886703491211 8 11.564802169799805 +21.299886703491211 8 16.263267517089844 +20.904937744140625 8 16.079099655151367 +20.547969818115234 8 15.829145431518555 +20.239828109741211 8 15.521004676818848 +19.989873886108398 8 15.164036750793457 +19.805707931518555 8 14.769084930419922 +21.720817565917969 8 11.45201587677002 +22.154937744140625 8 11.414035797119141 +22.589059829711914 8 11.45201587677002 +24.504169464111328 8 13.058986663818359 +24.616958618164062 8 13.479914665222168 +24.654937744140625 8 13.914033889770508 +19.69291877746582 8 14.348156929016113 +19.654939651489258 8 13.914033889770508 +19.69291877746582 8 13.479914665222168 +18.404937744140625 8 2.436302661895752 +25.904937744140625 8 2.436302661895752 +33.404937744140625 8 2.436302661895752 +48.404937744140625 8 2.436302661895752 +55.904941558837891 8 2.436302661895752 +63.404941558837891 8 2.436302661895752 +70.904937744140625 8 2.436302661895752 +12.489873886108398 8 82.664031982421875 +12.739826202392578 8 83.021003723144531 +13.047970771789551 8 83.329139709472656 +14.654937744140625 8 83.914031982421875 +14.220818519592285 8 83.876060485839844 +13.799886703491211 8 83.763275146484375 +13.404939651489258 8 83.5791015625 +12.739826202392578 8 79.80706787109375 +13.047970771789551 8 79.498924255371094 +13.404939651489258 8 79.248970031738281 +17.004169464111328 8 82.269088745117188 +16.820001602172852 8 82.664031982421875 +12.305706977844238 8 82.269088745117188 +12.192919731140137 8 81.848159790039062 +12.154936790466309 8 81.414039611816406 +12.192919731140137 8 80.979911804199219 +12.305706977844238 8 80.558982849121094 +12.489873886108398 8 80.164031982421875 +16.261907577514648 8 79.498924255371094 +16.570051193237305 8 79.80706787109375 +16.820001602172852 8 80.164031982421875 +17.004169464111328 8 80.558982849121094 +15.089056968688965 8 78.952011108398438 +15.509988784790039 8 79.064804077148438 +15.904938697814941 8 79.248970031738281 +16.570051193237305 8 83.021003723144531 +16.261907577514648 8 83.329139709472656 +15.904938697814941 8 83.5791015625 +13.799886703491211 8 79.064804077148438 +14.220818519592285 8 78.952011108398438 +14.654937744140625 8 78.914031982421875 +17.116958618164062 8 80.979911804199219 +17.154937744140625 8 81.414039611816406 +17.116958618164062 8 81.848159790039062 +15.509988784790039 8 83.763275146484375 +15.089056968688965 8 83.876060485839844 +13.799886703491211 8 76.263267517089844 +13.404939651489258 8 76.0791015625 +13.047970771789551 8 75.829147338867188 +12.739826202392578 8 75.521003723144531 +12.489873886108398 8 75.164031982421875 +12.305706977844238 8 74.769088745117188 +12.192919731140137 8 74.348152160644531 +10.655548095703125 8 70.164039611816406 +12.154936790466309 8 73.914039611816406 +16.570051193237305 8 75.521003723144531 +16.261907577514648 8 75.829147338867188 +15.904938697814941 8 76.0791015625 +15.509988784790039 8 76.263267517089844 +12.192919731140137 8 73.479911804199219 +12.305706977844238 8 73.058982849121094 +12.489873886108398 8 72.664039611816406 +17.116958618164062 8 74.348152160644531 +17.004169464111328 8 74.769088745117188 +16.820001602172852 8 75.164031982421875 +15.089056968688965 8 76.376052856445312 +14.654937744140625 8 76.414031982421875 +14.220818519592285 8 76.376052856445312 +16.261907577514648 8 71.998924255371094 +16.570051193237305 8 72.30706787109375 +16.820001602172852 8 72.664039611816406 +17.004169464111328 8 73.058982849121094 +17.116958618164062 8 73.479911804199219 +17.154937744140625 8 73.914039611816406 +12.739826202392578 8 72.30706787109375 +13.047970771789551 8 71.998924255371094 +13.404939651489258 8 71.748970031738281 +13.799886703491211 8 71.564811706542969 +14.220818519592285 8 71.452011108398438 +14.654937744140625 8 71.414039611816406 +15.089056968688965 8 71.452011108398438 +15.509988784790039 8 71.564811706542969 +15.904938697814941 8 71.748970031738281 +13.799886703491211 8 68.763267517089844 +13.404939651489258 8 68.5791015625 +13.047970771789551 8 68.329147338867188 +12.739826202392578 8 68.021003723144531 +12.489873886108398 8 67.664031982421875 +12.305706977844238 8 67.269088745117188 +12.192919731140137 8 66.848159790039062 +10.655548095703125 8 62.664031982421875 +12.154936790466309 8 66.414039611816406 +12.192919731140137 8 65.979911804199219 +12.305706977844238 8 65.558982849121094 +16.570051193237305 8 68.021003723144531 +16.261907577514648 8 68.329147338867188 +15.904938697814941 8 68.5791015625 +15.509988784790039 8 68.763267517089844 +17.116958618164062 8 66.848159790039062 +17.004169464111328 8 67.269088745117188 +16.820001602172852 8 67.664031982421875 +15.089056968688965 8 68.876060485839844 +14.654937744140625 8 68.914031982421875 +14.220818519592285 8 68.876060485839844 +14.654937744140625 8 63.914039611816406 +15.089056968688965 8 63.952014923095703 +16.261907577514648 8 64.498924255371094 +16.570051193237305 8 64.80706787109375 +16.820001602172852 8 65.164039611816406 +17.004169464111328 8 65.558982849121094 +17.116958618164062 8 65.979911804199219 +17.154937744140625 8 66.414039611816406 +12.489873886108398 8 65.164039611816406 +12.739826202392578 8 64.80706787109375 +13.047970771789551 8 64.498924255371094 +13.404939651489258 8 64.248970031738281 +13.799886703491211 8 64.064804077148438 +14.220818519592285 8 63.952014923095703 +15.509988784790039 8 64.064804077148438 +15.904938697814941 8 64.248970031738281 +14.654937744140625 8 61.414035797119141 +10.655548095703125 8 55.164035797119141 +12.192919731140137 8 58.479915618896484 +12.305706977844238 8 58.058982849121094 +14.220818519592285 8 61.376052856445312 +13.799886703491211 8 61.263267517089844 +13.404939651489258 8 61.0791015625 +13.047970771789551 8 60.829147338867188 +12.739826202392578 8 60.521007537841797 +12.489873886108398 8 60.164035797119141 +14.654937744140625 8 56.414035797119141 +15.089056968688965 8 56.452018737792969 +17.004169464111328 8 59.769084930419922 +16.820001602172852 8 60.164035797119141 +12.305706977844238 8 59.769084930419922 +12.192919731140137 8 59.348155975341797 +12.154936790466309 8 58.914035797119141 +12.489873886108398 8 57.664035797119141 +12.739826202392578 8 57.307064056396484 +13.047970771789551 8 56.998924255371094 +16.261907577514648 8 56.998924255371094 +16.570051193237305 8 57.307064056396484 +16.820001602172852 8 57.664035797119141 +17.004169464111328 8 58.058982849121094 +13.404939651489258 8 56.748970031738281 +13.799886703491211 8 56.564804077148438 +14.220818519592285 8 56.452018737792969 +15.509988784790039 8 56.564804077148438 +15.904938697814941 8 56.748970031738281 +16.570051193237305 8 60.521007537841797 +16.261907577514648 8 60.829147338867188 +15.904938697814941 8 61.0791015625 +17.116958618164062 8 58.479915618896484 +17.154937744140625 8 58.914035797119141 +17.116958618164062 8 59.348155975341797 +15.509988784790039 8 61.263267517089844 +15.089056968688965 8 61.376052856445312 +14.654937744140625 8 53.914035797119141 +14.220818519592285 8 53.876052856445312 +12.489873886108398 8 52.664035797119141 +12.739826202392578 8 53.021007537841797 +13.047970771789551 8 53.329147338867188 +13.799886703491211 8 53.763267517089844 +13.404939651489258 8 53.579097747802734 +17.004169464111328 8 52.269084930419922 +16.820001602172852 8 52.664035797119141 +12.305706977844238 8 52.269084930419922 +12.192919731140137 8 51.848155975341797 +10.655548095703125 8 47.664035797119141 +12.154936790466309 8 51.414035797119141 +12.192919731140137 8 50.979915618896484 +14.654937744140625 8 48.914035797119141 +15.089056968688965 8 48.952018737792969 +16.261907577514648 8 49.498924255371094 +16.570051193237305 8 49.80706787109375 +16.820001602172852 8 50.164035797119141 +17.004169464111328 8 50.558982849121094 +12.739826202392578 8 49.80706787109375 +13.047970771789551 8 49.498924255371094 +12.305706977844238 8 50.558982849121094 +12.489873886108398 8 50.164035797119141 +14.220818519592285 8 48.952018737792969 +15.509988784790039 8 49.064804077148438 +15.904938697814941 8 49.248970031738281 +16.570051193237305 8 53.021007537841797 +16.261907577514648 8 53.329147338867188 +15.904938697814941 8 53.579097747802734 +13.404939651489258 8 49.248970031738281 +13.799886703491211 8 49.064804077148438 +17.116958618164062 8 50.979915618896484 +17.154937744140625 8 51.414035797119141 +17.116958618164062 8 51.848155975341797 +15.509988784790039 8 53.763267517089844 +15.089056968688965 8 53.876052856445312 +13.047970771789551 8 41.998924255371094 +16.570051193237305 8 38.021007537841797 +12.739826202392578 8 42.30706787109375 +16.261907577514648 8 38.329147338867188 +15.904938697814941 8 38.579097747802734 +14.654937744140625 8 46.414035797119141 +14.220818519592285 8 46.376052856445312 +15.509988784790039 8 38.763267517089844 +15.089056968688965 8 38.876056671142578 +12.489873886108398 8 42.664035797119141 +13.047970771789551 8 45.829147338867188 +12.739826202392578 8 45.521007537841797 +15.904938697814941 8 41.748970031738281 +16.261907577514648 8 41.998924255371094 +16.820001602172852 8 37.664031982421875 +13.799886703491211 8 46.263267517089844 +13.404939651489258 8 46.079097747802734 +12.489873886108398 8 45.164031982421875 +12.305706977844238 8 44.769084930419922 +12.192919731140137 8 44.348155975341797 +16.261907577514648 8 34.498924255371094 +16.570051193237305 8 34.80706787109375 +16.570051193237305 8 42.30706787109375 +16.820001602172852 8 42.664035797119141 +13.047970771789551 8 38.329147338867188 +12.739826202392578 8 38.021007537841797 +12.489873886108398 8 37.664031982421875 +12.154936790466309 8 43.914035797119141 +12.192919731140137 8 43.479915618896484 +12.305706977844238 8 43.058982849121094 +12.305706977844238 8 37.269084930419922 +12.192919731140137 8 36.848155975341797 +10.655548095703125 8 32.664035797119141 +12.154936790466309 8 36.414035797119141 +12.192919731140137 8 35.979915618896484 +14.654937744140625 8 33.914035797119141 +15.089056968688965 8 33.952014923095703 +13.404939651489258 8 41.748970031738281 +13.799886703491211 8 41.564804077148438 +14.220818519592285 8 41.452014923095703 +14.654937744140625 8 38.914035797119141 +14.220818519592285 8 38.876056671142578 +13.799886703491211 8 38.763267517089844 +13.404939651489258 8 38.579097747802734 +12.739826202392578 8 34.80706787109375 +13.047970771789551 8 34.498924255371094 +16.820001602172852 8 35.164035797119141 +17.004169464111328 8 35.558982849121094 +17.116958618164062 8 35.979915618896484 +17.004169464111328 8 43.058982849121094 +17.116958618164062 8 43.479915618896484 +17.154937744140625 8 43.914035797119141 +12.305706977844238 8 35.558982849121094 +12.489873886108398 8 35.164035797119141 +15.509988784790039 8 34.064804077148438 +15.904938697814941 8 34.248970031738281 +13.404939651489258 8 34.248970031738281 +13.799886703491211 8 34.064804077148438 +14.220818519592285 8 33.952014923095703 +17.154937744140625 8 36.414035797119141 +17.116958618164062 8 36.848155975341797 +17.004169464111328 8 37.269084930419922 +17.116958618164062 8 44.348155975341797 +17.004169464111328 8 44.769084930419922 +16.820001602172852 8 45.164031982421875 +16.570051193237305 8 45.521007537841797 +16.261907577514648 8 45.829147338867188 +15.904938697814941 8 46.079097747802734 +14.654937744140625 8 41.414035797119141 +15.089056968688965 8 41.452014923095703 +15.509988784790039 8 41.564804077148438 +15.509988784790039 8 46.263267517089844 +15.089056968688965 8 46.376052856445312 +14.654937744140625 8 31.414035797119141 +12.305706977844238 8 28.058984756469727 +12.489873886108398 8 27.664035797119141 +10.655548095703125 8 25.164035797119141 +12.739826202392578 8 27.30706787109375 +13.047970771789551 8 26.998924255371094 +13.404939651489258 8 26.748971939086914 +16.261907577514648 8 26.998924255371094 +16.570051193237305 8 27.30706787109375 +16.820001602172852 8 27.664035797119141 +12.154936790466309 8 28.914035797119141 +12.192919731140137 8 28.479915618896484 +14.220818519592285 8 31.376056671142578 +13.799886703491211 8 31.263269424438477 +13.404939651489258 8 31.079097747802734 +13.047970771789551 8 30.829147338867188 +12.739826202392578 8 30.521005630493164 +12.489873886108398 8 30.164035797119141 +13.799886703491211 8 26.564804077148438 +14.220818519592285 8 26.452016830444336 +14.654937744140625 8 26.414035797119141 +15.089056968688965 8 26.452016830444336 +15.509988784790039 8 26.564804077148438 +15.904938697814941 8 26.748971939086914 +12.305706977844238 8 29.769084930419922 +12.192919731140137 8 29.348155975341797 +17.004169464111328 8 28.058984756469727 +17.116958618164062 8 28.479915618896484 +17.154937744140625 8 28.914035797119141 +17.116958618164062 8 29.348155975341797 +17.004169464111328 8 29.769084930419922 +16.820001602172852 8 30.164035797119141 +16.570051193237305 8 30.521005630493164 +16.261907577514648 8 30.829147338867188 +15.904938697814941 8 31.079097747802734 +15.509988784790039 8 31.263269424438477 +15.089056968688965 8 31.376056671142578 +13.047970771789551 8 19.498924255371094 +13.404939651489258 8 19.248971939086914 +10.655548095703125 8 17.664035797119141 +16.261907577514648 8 23.329145431518555 +15.904938697814941 8 23.579097747802734 +15.509988784790039 8 23.763267517089844 +17.116958618164062 8 21.848155975341797 +17.004169464111328 8 22.269084930419922 +16.820001602172852 8 22.664033889770508 +16.570051193237305 8 23.021005630493164 +13.799886703491211 8 23.763267517089844 +13.404939651489258 8 23.579097747802734 +12.739826202392578 8 19.807065963745117 +16.820001602172852 8 20.164035797119141 +16.570051193237305 8 19.807065963745117 +16.261907577514648 8 19.498924255371094 +13.047970771789551 8 23.329145431518555 +12.739826202392578 8 23.021005630493164 +12.489873886108398 8 22.664033889770508 +13.799886703491211 8 19.064804077148438 +14.220818519592285 8 18.952014923095703 +14.654937744140625 8 18.914033889770508 +15.089056968688965 8 18.952014923095703 +15.509988784790039 8 19.064804077148438 +15.904938697814941 8 19.248971939086914 +17.004169464111328 8 20.558984756469727 +17.116958618164062 8 20.979915618896484 +17.154937744140625 8 21.414035797119141 +15.089056968688965 8 23.876054763793945 +14.654937744140625 8 23.914035797119141 +14.220818519592285 8 23.876054763793945 +12.192919731140137 8 20.979915618896484 +12.305706977844238 8 20.558984756469727 +12.489873886108398 8 20.164035797119141 +12.305706977844238 8 22.269084930419922 +12.192919731140137 8 21.848155975341797 +12.154936790466309 8 21.414035797119141 +16.820001602172852 8 12.664034843444824 +16.570051193237305 8 12.307066917419434 +16.261907577514648 8 11.99892520904541 +14.654937744140625 8 11.414035797119141 +15.089056968688965 8 11.45201587677002 +17.116958618164062 8 14.348156929016113 +17.004169464111328 8 14.769084930419922 +16.820001602172852 8 15.164036750793457 +16.570051193237305 8 15.521004676818848 +16.261907577514648 8 15.829145431518555 +15.904938697814941 8 16.079099655151367 +15.509988784790039 8 16.263267517089844 +15.089056968688965 8 16.376056671142578 +14.654937744140625 8 16.414035797119141 +14.220818519592285 8 16.376056671142578 +15.509988784790039 8 11.564802169799805 +15.904938697814941 8 11.74897289276123 +13.799886703491211 8 16.263267517089844 +13.404939651489258 8 16.079099655151367 +13.047970771789551 8 15.829145431518555 +12.305706977844238 8 13.058986663818359 +12.489873886108398 8 12.664034843444824 +10.655548095703125 8 10.14332103729248 +12.739826202392578 8 12.307066917419434 +13.047970771789551 8 11.99892520904541 +13.404939651489258 8 11.74897289276123 +13.799886703491211 8 11.564802169799805 +14.220818519592285 8 11.45201587677002 +17.004169464111328 8 13.058986663818359 +17.116958618164062 8 13.479914665222168 +17.154937744140625 8 13.914033889770508 +12.739826202392578 8 15.521004676818848 +12.489873886108398 8 15.164036750793457 +12.305706977844238 8 14.769084930419922 +12.192919731140137 8 14.348156929016113 +12.154936790466309 8 13.914033889770508 +12.192919731140137 8 13.479914665222168 +78.404930114746094 8 0 +70.904937744140625 8 0 +63.404941558837891 8 0 +55.904941558837891 8 0 +48.404937744140625 8 0 +33.404937744140625 8 0 +25.904937744140625 8 0 +18.404937744140625 8 0 +10.655548095703125 8 0 +8.0603733062744141 8 0 +2.6082656383514404 8 10.14332103729248 +2.6082656383514404 8 17.664035797119141 +2.6082656383514404 8 25.164035797119141 +2.6082656383514404 8 32.664035797119141 +2.6082656383514404 8 47.664035797119141 +2.6082656383514404 8 55.164035797119141 +2.6082656383514404 8 62.664031982421875 +2.6082656383514404 8 70.164039611816406 +8.1561613082885742 8 8.6046571731567383 +7.8402013778686523 8 8.7519922256469727 +5.8705844879150391 8 8.4046945571899414 +6.1561613082885742 8 8.6046571731567383 +6.4721183776855469 8 8.7519922256469727 +9.0355463027954102 8 6.1885676383972168 +9.1257762908935547 8 6.5253114700317383 +9.1561603546142578 8 6.8726053237915039 +9.1257762908935547 8 7.2199029922485352 +9.0355463027954102 8 7.5566473007202148 +8.8882112503051758 8 7.8726077079772949 +8.6882486343383789 8 8.1581811904907227 +8.4417352676391602 8 8.4046945571899414 +7.5034575462341309 8 8.8422222137451172 +7.1561598777770996 8 8.8726062774658203 +6.8088622093200684 8 8.8422222137451172 +5.6240706443786621 8 8.1581811904907227 +5.4241085052490234 8 7.8726077079772949 +5.2767729759216309 8 7.5566473007202148 +5.2767729759216309 8 6.1885676383972168 +5.4241085052490234 8 5.8726072311401367 +8.8882112503051758 8 5.8726072311401367 +5.6240706443786621 8 5.5870304107666016 +5.8705844879150391 8 5.3405165672302246 +6.1561613082885742 8 5.1405539512634277 +7.5034575462341309 8 4.9029922485351562 +7.8402013778686523 8 4.993222713470459 +8.1561613082885742 8 5.1405539512634277 +5.1865429878234863 8 7.2199029922485352 +5.1561594009399414 8 6.8726053237915039 +5.1865429878234863 8 6.5253114700317383 +8.4417352676391602 8 5.3405165672302246 +8.6882486343383789 8 5.5870304107666016 +6.4721183776855469 8 4.993222713470459 +6.8088622093200684 8 4.9029922485351562 +7.1561598777770996 8 4.8726053237915039 +0.15886873006820679 8 6.7485237121582031 +0.060375779867172241 8 7.999997615814209 +0.060375779867172241 8 10.14332103729248 +0.060375779867172241 8 17.664035797119141 +0.060375779867172241 8 25.164035797119141 +0.060375779867172241 8 32.664035797119141 +0.060375779867172241 8 47.664035797119141 +0.060375779867172241 8 55.164035797119141 +0.060375779867172241 8 62.664031982421875 +0.060375779867172241 8 70.164039611816406 +0.060375779867172241 8 77.664031982421875 +0.060375779867172241 8 85.999992370605469 +94.120750427246094 3.4694469519536142e-15 9.7292852401733398 +94.060379028320312 3.4694469519536142e-15 9.7292852401733398 +94.060379028320312 3.4694469519536142e-15 9.5602426528930664 +86.617294311523438 3.4694469519536142e-15 8.8422222137451172 +86.964591979980469 3.4694469519536142e-15 8.8726062774658203 +87.3118896484375 3.4694469519536142e-15 8.8422222137451172 +87.648628234863281 3.4694469519536142e-15 8.7519922256469727 +86.617294311523438 3.4694469519536142e-15 4.9029922485351562 +86.280548095703125 3.4694469519536142e-15 4.993222713470459 +84.197181701660156 3.4694469519536142e-15 1.9999966621398926 +85.964591979980469 3.4694469519536142e-15 5.1405539512634277 +87.964584350585938 3.4694469519536142e-15 8.6046571731567383 +88.250160217285156 3.4694469519536142e-15 8.4046945571899414 +88.496681213378906 3.4694469519536142e-15 8.1581811904907227 +85.679008483886719 3.4694469519536142e-15 5.3405165672302246 +85.432502746582031 3.4694469519536142e-15 5.5870304107666016 +85.2325439453125 3.4694469519536142e-15 5.8726072311401367 +84.994972229003906 3.4694469519536142e-15 7.2199029922485352 +85.085197448730469 3.4694469519536142e-15 7.5566473007202148 +84.197181701660156 3.4694469519536142e-15 9.7292852401733398 +85.085197448730469 3.4694469519536142e-15 6.1885676383972168 +84.994972229003906 3.4694469519536142e-15 6.5253114700317383 +84.964591979980469 3.4694469519536142e-15 6.8726053237915039 +85.2325439453125 3.4694469519536142e-15 7.8726077079772949 +85.432502746582031 3.4694469519536142e-15 8.1581811904907227 +85.679008483886719 3.4694469519536142e-15 8.4046945571899414 +92.060371398925781 3.4694469519536142e-15 9.7292852401733398 +92.060371398925781 3.4694469519536142e-15 47 +94.060379028320312 3.4694469519536142e-15 47 +92.060371398925781 3.4694469519536142e-15 84.270713806152344 +85.964591979980469 3.4694469519536142e-15 8.6046571731567383 +86.280548095703125 3.4694469519536142e-15 8.7519922256469727 +88.696640014648438 3.4694469519536142e-15 7.8726077079772949 +88.843971252441406 3.4694469519536142e-15 7.5566473007202148 +94.060379028320312 3.4694469519536142e-15 7.999997615814209 +88.9342041015625 3.4694469519536142e-15 7.2199029922485352 +93.961875915527344 3.4694469519536142e-15 6.7485237121582031 +88.964591979980469 3.4694469519536142e-15 6.8726053237915039 +93.6688232421875 3.4694469519536142e-15 5.5278615951538086 +88.9342041015625 3.4694469519536142e-15 6.5253114700317383 +93.188430786132812 3.4694469519536142e-15 4.3680744171142578 +88.843971252441406 3.4694469519536142e-15 6.1885676383972168 +92.532516479492188 3.4694469519536142e-15 3.2977163791656494 +88.696640014648438 3.4694469519536142e-15 5.8726072311401367 +91.717231750488281 3.4694469519536142e-15 2.3431441783905029 +88.496681213378906 3.4694469519536142e-15 5.5870304107666016 +90.762657165527344 3.4694469519536142e-15 1.5278607606887817 +88.250160217285156 3.4694469519536142e-15 5.3405165672302246 +87.964584350585938 3.4694469519536142e-15 5.1405539512634277 +89.692291259765625 3.4694469519536142e-15 0.87194514274597168 +87.648628234863281 3.4694469519536142e-15 4.993222713470459 +88.532508850097656 3.4694469519536142e-15 0.39154663681983948 +87.3118896484375 3.4694469519536142e-15 4.9029922485351562 +87.311851501464844 3.4694469519536142e-15 0.098492950201034546 +86.964591979980469 3.4694469519536142e-15 4.8726053237915039 +86.060371398925781 3.4694469519536142e-15 0 +88.496681213378906 3.4694469519536142e-15 85.841819763183594 +88.250160217285156 3.4694469519536142e-15 85.595298767089844 +94.060379028320312 3.4694469519536142e-15 84.270713806152344 +87.964584350585938 3.4694469519536142e-15 85.395339965820312 +87.648628234863281 3.4694469519536142e-15 85.248008728027344 +87.3118896484375 3.4694469519536142e-15 85.15777587890625 +86.964591979980469 3.4694469519536142e-15 85.127388000488281 +88.496681213378906 3.4694469519536142e-15 88.412971496582031 +88.696640014648438 3.4694469519536142e-15 88.127388000488281 +94.060379028320312 3.4694469519536142e-15 84.43975830078125 +94.120750427246094 3.4694469519536142e-15 84.270713806152344 +84.197181701660156 3.4694469519536142e-15 84.270713806152344 +86.280548095703125 3.4694469519536142e-15 85.248008728027344 +85.964591979980469 3.4694469519536142e-15 85.395339965820312 +85.2325439453125 3.4694469519536142e-15 86.127388000488281 +85.085197448730469 3.4694469519536142e-15 86.443351745605469 +84.197181701660156 3.4694469519536142e-15 92 +85.085197448730469 3.4694469519536142e-15 87.811424255371094 +85.2325439453125 3.4694469519536142e-15 88.127388000488281 +88.843971252441406 3.4694469519536142e-15 87.811424255371094 +88.9342041015625 3.4694469519536142e-15 87.474685668945312 +88.964591979980469 3.4694469519536142e-15 87.127388000488281 +86.617294311523438 3.4694469519536142e-15 85.15777587890625 +85.679008483886719 3.4694469519536142e-15 85.595298767089844 +85.432502746582031 3.4694469519536142e-15 85.841819763183594 +84.994972229003906 3.4694469519536142e-15 86.78009033203125 +84.964591979980469 3.4694469519536142e-15 87.127388000488281 +84.994972229003906 3.4694469519536142e-15 87.474685668945312 +85.432502746582031 3.4694469519536142e-15 88.412971496582031 +85.679008483886719 3.4694469519536142e-15 88.659477233886719 +85.964591979980469 3.4694469519536142e-15 88.85943603515625 +88.9342041015625 3.4694469519536142e-15 86.78009033203125 +88.843971252441406 3.4694469519536142e-15 86.443351745605469 +88.696640014648438 3.4694469519536142e-15 86.127388000488281 +90.762657165527344 3.4694469519536142e-15 92.472137451171875 +87.964584350585938 3.4694469519536142e-15 88.85943603515625 +88.250160217285156 3.4694469519536142e-15 88.659477233886719 +87.648628234863281 3.4694469519536142e-15 89.00677490234375 +89.692291259765625 3.4694469519536142e-15 93.1280517578125 +87.3118896484375 3.4694469519536142e-15 89.097007751464844 +88.532508850097656 3.4694469519536142e-15 93.608451843261719 +86.964591979980469 3.4694469519536142e-15 89.127388000488281 +87.311851501464844 3.4694469519536142e-15 93.901496887207031 +86.617294311523438 3.4694469519536142e-15 89.097007751464844 +86.060371398925781 3.4694469519536142e-15 94 +86.280548095703125 3.4694469519536142e-15 89.00677490234375 +94.060379028320312 3.4694469519536142e-15 85.999992370605469 +93.961875915527344 3.4694469519536142e-15 87.251472473144531 +91.717231750488281 3.4694469519536142e-15 91.656845092773438 +92.532516479492188 3.4694469519536142e-15 90.702278137207031 +93.188430786132812 3.4694469519536142e-15 89.631919860839844 +93.6688232421875 3.4694469519536142e-15 88.472137451171875 +0.060375779867172241 3.4694469519536142e-15 84.43975830078125 +0 3.4694469519536142e-15 84.270713806152344 +0.060375779867172241 3.4694469519536142e-15 84.270713806152344 +0.060375779867172241 3.4694469519536142e-15 85.999992370605469 +8.0603733062744141 3.4694469519536142e-15 94 +6.6711902618408203 3.4694469519536142e-15 93.878463745117188 +0.18191337585449219 3.4694469519536142e-15 87.389183044433594 +5.3242149353027344 3.4694469519536142e-15 93.517539978027344 +0.54283440113067627 3.4694469519536142e-15 88.736160278320312 +4.0603728294372559 3.4694469519536142e-15 92.928199768066406 +1.132171630859375 3.4694469519536142e-15 90 +2.918071985244751 3.4694469519536142e-15 92.128349304199219 +1.9320175647735596 3.4694469519536142e-15 91.142295837402344 +6.8088622093200684 3.4694469519536142e-15 85.15777587890625 +6.4721183776855469 3.4694469519536142e-15 85.248008728027344 +2.0603723526000977 3.4694469519536142e-15 84.270713806152344 +6.1561613082885742 3.4694469519536142e-15 85.395339965820312 +5.8705844879150391 3.4694469519536142e-15 85.595298767089844 +5.6240706443786621 3.4694469519536142e-15 85.841819763183594 +5.4241085052490234 3.4694469519536142e-15 86.127388000488281 +5.2767729759216309 3.4694469519536142e-15 86.443351745605469 +5.1865429878234863 3.4694469519536142e-15 86.78009033203125 +5.1561594009399414 3.4694469519536142e-15 87.127388000488281 +5.1865429878234863 3.4694469519536142e-15 87.474685668945312 +5.2767729759216309 3.4694469519536142e-15 87.811424255371094 +5.4241085052490234 3.4694469519536142e-15 88.127388000488281 +5.6240706443786621 3.4694469519536142e-15 88.412971496582031 +5.8705844879150391 3.4694469519536142e-15 88.659477233886719 +6.1561613082885742 3.4694469519536142e-15 88.85943603515625 +6.4721183776855469 3.4694469519536142e-15 89.00677490234375 +6.8088622093200684 3.4694469519536142e-15 89.097007751464844 +7.1561598777770996 3.4694469519536142e-15 89.127388000488281 +7.5034575462341309 3.4694469519536142e-15 89.097007751464844 +7.8402013778686523 3.4694469519536142e-15 89.00677490234375 +9.9235658645629883 3.4694469519536142e-15 92 +8.1561613082885742 3.4694469519536142e-15 88.85943603515625 +9.1257762908935547 3.4694469519536142e-15 86.78009033203125 +9.0355463027954102 3.4694469519536142e-15 86.443351745605469 +9.9235658645629883 3.4694469519536142e-15 84.270713806152344 +47.060375213623047 3.4694469519536142e-15 94 +47.060375213623047 3.4694469519536142e-15 92 +8.4417352676391602 3.4694469519536142e-15 88.659477233886719 +8.6882486343383789 3.4694469519536142e-15 88.412971496582031 +8.8882112503051758 3.4694469519536142e-15 88.127388000488281 +9.0355463027954102 3.4694469519536142e-15 87.811424255371094 +9.1257762908935547 3.4694469519536142e-15 87.474685668945312 +9.1561603546142578 3.4694469519536142e-15 87.127388000488281 +8.8882112503051758 3.4694469519536142e-15 86.127388000488281 +8.6882486343383789 3.4694469519536142e-15 85.841819763183594 +8.4417352676391602 3.4694469519536142e-15 85.595298767089844 +7.5034575462341309 3.4694469519536142e-15 85.15777587890625 +7.1561598777770996 3.4694469519536142e-15 85.127388000488281 +8.1561613082885742 3.4694469519536142e-15 85.395339965820312 +7.8402013778686523 3.4694469519536142e-15 85.248008728027344 +47.060375213623047 3.4694469519536142e-15 0 +47.060375213623047 3.4694469519536142e-15 1.9999966621398926 +8.0603733062744141 3.4694469519536142e-15 0 +9.9235658645629883 3.4694469519536142e-15 1.9999966621398926 +2.0603723526000977 3.4694469519536142e-15 47 +0.060375779867172241 3.4694469519536142e-15 47 +2.0603723526000977 3.4694469519536142e-15 9.7292852401733398 +0.060375779867172241 3.4694469519536142e-15 9.7292852401733398 +5.6240706443786621 3.4694469519536142e-15 8.1581811904907227 +5.8705844879150391 3.4694469519536142e-15 8.4046945571899414 +6.1561613082885742 3.4694469519536142e-15 8.6046571731567383 +7.5034575462341309 3.4694469519536142e-15 8.8422222137451172 +7.8402013778686523 3.4694469519536142e-15 8.7519922256469727 +9.9235658645629883 3.4694469519536142e-15 9.7292852401733398 +8.1561613082885742 3.4694469519536142e-15 8.6046571731567383 +8.4417352676391602 3.4694469519536142e-15 8.4046945571899414 +0 3.4694469519536142e-15 9.7292852401733398 +5.8705844879150391 3.4694469519536142e-15 5.3405165672302246 +5.6240706443786621 3.4694469519536142e-15 5.5870304107666016 +5.4241085052490234 3.4694469519536142e-15 5.8726072311401367 +6.4721183776855469 3.4694469519536142e-15 8.7519922256469727 +6.8088622093200684 3.4694469519536142e-15 8.8422222137451172 +7.1561598777770996 3.4694469519536142e-15 8.8726062774658203 +0.060375779867172241 3.4694469519536142e-15 9.5602426528930664 +0.060375779867172241 3.4694469519536142e-15 7.999997615814209 +0.15886873006820679 3.4694469519536142e-15 6.7485237121582031 +8.6882486343383789 3.4694469519536142e-15 8.1581811904907227 +8.8882112503051758 3.4694469519536142e-15 7.8726077079772949 +9.0355463027954102 3.4694469519536142e-15 7.5566473007202148 +9.0355463027954102 3.4694469519536142e-15 6.1885676383972168 +8.8882112503051758 3.4694469519536142e-15 5.8726072311401367 +8.6882486343383789 3.4694469519536142e-15 5.5870304107666016 +8.4417352676391602 3.4694469519536142e-15 5.3405165672302246 +8.1561613082885742 3.4694469519536142e-15 5.1405539512634277 +7.8402013778686523 3.4694469519536142e-15 4.993222713470459 +7.5034575462341309 3.4694469519536142e-15 4.9029922485351562 +6.8088994026184082 3.4694469519536142e-15 0.098492950201034546 +7.1561598777770996 3.4694469519536142e-15 4.8726053237915039 +5.5882372856140137 3.4694469519536142e-15 0.39154663681983948 +6.8088622093200684 3.4694469519536142e-15 4.9029922485351562 +4.4284501075744629 3.4694469519536142e-15 0.87194514274597168 +6.4721183776855469 3.4694469519536142e-15 4.993222713470459 +3.3580920696258545 3.4694469519536142e-15 1.5278607606887817 +6.1561613082885742 3.4694469519536142e-15 5.1405539512634277 +2.4035201072692871 3.4694469519536142e-15 2.3431441783905029 +1.5882365703582764 3.4694469519536142e-15 3.2977163791656494 +0.93232095241546631 3.4694469519536142e-15 4.3680744171142578 +0.45192241668701172 3.4694469519536142e-15 5.5278615951538086 +5.2767729759216309 3.4694469519536142e-15 6.1885676383972168 +5.1865429878234863 3.4694469519536142e-15 6.5253114700317383 +5.1561594009399414 3.4694469519536142e-15 6.8726053237915039 +5.1865429878234863 3.4694469519536142e-15 7.2199029922485352 +5.2767729759216309 3.4694469519536142e-15 7.5566473007202148 +5.4241085052490234 3.4694469519536142e-15 7.8726077079772949 +9.1257762908935547 3.4694469519536142e-15 7.2199029922485352 +9.1561603546142578 3.4694469519536142e-15 6.8726053237915039 +9.1257762908935547 3.4694469519536142e-15 6.5253114700317383 +52.589057922363281 6 26.452016830444336 +52.154937744140625 6 26.414035797119141 +55.904941558837891 6 25.164035797119141 +9.9235658645629883 6 9.7292852401733398 +9.9235658645629883 6 1.9999966621398926 +18.404937744140625 6 1.9999966621398926 +17.004169464111328 6 13.058986663818359 +16.820001602172852 6 12.664034843444824 +15.904938697814941 6 11.74897289276123 +15.509988784790039 6 11.564802169799805 +13.799886703491211 6 11.564802169799805 +13.404939651489258 6 11.74897289276123 +16.570051193237305 6 12.307066917419434 +16.261907577514648 6 11.99892520904541 +16.820001602172852 6 15.164036750793457 +17.004169464111328 6 14.769084930419922 +18.404937744140625 6 17.664035797119141 +15.089056968688965 6 11.45201587677002 +14.654937744140625 6 11.414035797119141 +14.220818519592285 6 11.45201587677002 +15.089056968688965 6 16.376056671142578 +15.509988784790039 6 16.263267517089844 +15.904938697814941 6 16.079099655151367 +12.489873886108398 6 12.664034843444824 +7.1076564788818359 6 9.7292852401733398 +12.739826202392578 6 12.307066917419434 +13.047970771789551 6 11.99892520904541 +12.192919731140137 6 14.348156929016113 +12.305706977844238 6 14.769084930419922 +7.1076564788818359 6 17.664035797119141 +13.047970771789551 6 15.829145431518555 +13.404939651489258 6 16.079099655151367 +16.261907577514648 6 15.829145431518555 +16.570051193237305 6 15.521004676818848 +17.116958618164062 6 14.348156929016113 +17.154937744140625 6 13.914033889770508 +17.116958618164062 6 13.479914665222168 +12.489873886108398 6 15.164036750793457 +12.739826202392578 6 15.521004676818848 +13.799886703491211 6 16.263267517089844 +14.220818519592285 6 16.376056671142578 +14.654937744140625 6 16.414035797119141 +12.305706977844238 6 13.058986663818359 +12.192919731140137 6 13.479914665222168 +12.154936790466309 6 13.914033889770508 +13.799886703491211 6 79.064804077148438 +13.404939651489258 6 79.248970031738281 +7.1076564788818359 6 77.664031982421875 +9.9235658645629883 6 87.957015991210938 +9.9235658645629883 6 84.270713806152344 +12.739826202392578 6 83.021003723144531 +13.047970771789551 6 79.498924255371094 +12.739826202392578 6 79.80706787109375 +12.489873886108398 6 80.164031982421875 +14.654937744140625 6 83.914031982421875 +15.089056968688965 6 83.876060485839844 +18.404937744140625 6 87.957015991210938 +16.261907577514648 6 83.329139709472656 +16.570051193237305 6 83.021003723144531 +16.820001602172852 6 82.664031982421875 +13.047970771789551 6 83.329139709472656 +13.404939651489258 6 83.5791015625 +13.799886703491211 6 83.763275146484375 +18.404937744140625 6 77.664031982421875 +14.654937744140625 6 78.914031982421875 +14.220818519592285 6 78.952011108398438 +12.305706977844238 6 80.558982849121094 +12.192919731140137 6 80.979911804199219 +7.1076564788818359 6 84.270713806152344 +12.154936790466309 6 81.414039611816406 +12.192919731140137 6 81.848159790039062 +12.305706977844238 6 82.269088745117188 +12.489873886108398 6 82.664031982421875 +14.220818519592285 6 83.876060485839844 +15.509988784790039 6 83.763275146484375 +15.904938697814941 6 83.5791015625 +16.820001602172852 6 80.164031982421875 +17.004169464111328 6 80.558982849121094 +17.116958618164062 6 80.979911804199219 +16.570051193237305 6 79.80706787109375 +16.261907577514648 6 79.498924255371094 +15.904938697814941 6 79.248970031738281 +17.004169464111328 6 82.269088745117188 +17.116958618164062 6 81.848159790039062 +17.154937744140625 6 81.414039611816406 +15.509988784790039 6 79.064804077148438 +15.089056968688965 6 78.952011108398438 +18.404937744140625 6 92 +9.9235658645629883 6 92 +84.504173278808594 6 80.558982849121094 +84.319999694824219 6 80.164031982421875 +92.060371398925781 6 77.664031982421875 +80.904937744140625 6 83.5791015625 +81.299888610839844 6 83.763275146484375 +78.404930114746094 6 87.957015991210938 +81.720817565917969 6 83.876060485839844 +84.197181701660156 6 84.270713806152344 +82.589057922363281 6 83.876060485839844 +83.009986877441406 6 83.763275146484375 +92.060371398925781 6 84.270713806152344 +84.319999694824219 6 82.664031982421875 +84.504173278808594 6 82.269088745117188 +81.720817565917969 6 78.952011108398438 +81.299888610839844 6 79.064804077148438 +78.404930114746094 6 77.664031982421875 +80.239830017089844 6 79.80706787109375 +79.989883422851562 6 80.164031982421875 +79.805702209472656 6 80.558982849121094 +84.197181701660156 6 92 +84.197181701660156 6 87.957015991210938 +82.154937744140625 6 83.914031982421875 +83.404945373535156 6 83.5791015625 +83.761909484863281 6 83.329139709472656 +84.070045471191406 6 83.021003723144531 +84.616958618164062 6 81.848159790039062 +84.654945373535156 6 81.414039611816406 +84.616958618164062 6 80.979911804199219 +84.070045471191406 6 79.80706787109375 +83.761909484863281 6 79.498924255371094 +83.404945373535156 6 79.248970031738281 +83.009986877441406 6 79.064804077148438 +82.589057922363281 6 78.952011108398438 +82.154937744140625 6 78.914031982421875 +80.904937744140625 6 79.248970031738281 +80.5479736328125 6 79.498924255371094 +79.805702209472656 6 82.269088745117188 +79.989883422851562 6 82.664031982421875 +80.239830017089844 6 83.021003723144531 +80.5479736328125 6 83.329139709472656 +79.692916870117188 6 80.979911804199219 +79.654937744140625 6 81.414039611816406 +79.692916870117188 6 81.848159790039062 +84.070045471191406 6 15.521004676818848 +84.319999694824219 6 15.164036750793457 +92.060371398925781 6 17.664035797119141 +84.504173278808594 6 14.769084930419922 +83.761909484863281 6 11.99892520904541 +84.197181701660156 6 9.7292852401733398 +84.070045471191406 6 12.307066917419434 +84.319999694824219 6 12.664034843444824 +78.404930114746094 6 1.9999966621398926 +84.197181701660156 6 1.9999966621398926 +82.154937744140625 6 11.414035797119141 +81.720817565917969 6 11.45201587677002 +81.299888610839844 6 11.564802169799805 +80.904937744140625 6 11.74897289276123 +80.5479736328125 6 11.99892520904541 +80.239830017089844 6 12.307066917419434 +79.989883422851562 6 12.664034843444824 +83.009986877441406 6 16.263267517089844 +83.404945373535156 6 16.079099655151367 +83.761909484863281 6 15.829145431518555 +83.404945373535156 6 11.74897289276123 +83.009986877441406 6 11.564802169799805 +82.589057922363281 6 11.45201587677002 +80.239830017089844 6 15.521004676818848 +80.5479736328125 6 15.829145431518555 +78.404930114746094 6 17.664035797119141 +80.904937744140625 6 16.079099655151367 +81.299888610839844 6 16.263267517089844 +84.616958618164062 6 14.348156929016113 +84.654945373535156 6 13.914033889770508 +92.060371398925781 6 9.7292852401733398 +84.616958618164062 6 13.479914665222168 +84.504173278808594 6 13.058986663818359 +79.805702209472656 6 13.058986663818359 +79.692916870117188 6 13.479914665222168 +79.654937744140625 6 13.914033889770508 +79.692916870117188 6 14.348156929016113 +79.805702209472656 6 14.769084930419922 +79.989883422851562 6 15.164036750793457 +81.720817565917969 6 16.376056671142578 +82.154937744140625 6 16.414035797119141 +82.589057922363281 6 16.376056671142578 +79.692916870117188 6 21.848155975341797 +78.404930114746094 6 25.164035797119141 +79.654937744140625 6 21.414035797119141 +82.154937744140625 6 18.914033889770508 +81.720817565917969 6 18.952014923095703 +81.299888610839844 6 19.064804077148438 +80.904937744140625 6 19.248971939086914 +79.989883422851562 6 20.164035797119141 +79.805702209472656 6 20.558984756469727 +79.692916870117188 6 20.979915618896484 +79.805702209472656 6 22.269084930419922 +79.989883422851562 6 22.664033889770508 +80.239830017089844 6 23.021005630493164 +84.616958618164062 6 20.979915618896484 +84.504173278808594 6 20.558984756469727 +84.319999694824219 6 20.164035797119141 +84.070045471191406 6 19.807065963745117 +82.589057922363281 6 18.952014923095703 +83.009986877441406 6 19.064804077148438 +80.5479736328125 6 19.498924255371094 +80.239830017089844 6 19.807065963745117 +83.009986877441406 6 23.763267517089844 +83.404945373535156 6 23.579097747802734 +92.060371398925781 6 25.164035797119141 +83.761909484863281 6 19.498924255371094 +83.404945373535156 6 19.248971939086914 +80.5479736328125 6 23.329145431518555 +80.904937744140625 6 23.579097747802734 +81.299888610839844 6 23.763267517089844 +83.761909484863281 6 23.329145431518555 +84.070045471191406 6 23.021005630493164 +84.319999694824219 6 22.664033889770508 +84.504173278808594 6 22.269084930419922 +84.616958618164062 6 21.848155975341797 +84.654945373535156 6 21.414035797119141 +81.720817565917969 6 23.876054763793945 +82.154937744140625 6 23.914035797119141 +82.589057922363281 6 23.876054763793945 +81.720817565917969 6 26.452016830444336 +81.299888610839844 6 26.564804077148438 +79.692916870117188 6 29.348155975341797 +78.404930114746094 6 32.664035797119141 +79.654937744140625 6 28.914035797119141 +79.692916870117188 6 28.479915618896484 +80.904937744140625 6 26.748971939086914 +80.5479736328125 6 26.998924255371094 +80.239830017089844 6 27.30706787109375 +79.989883422851562 6 27.664035797119141 +79.805702209472656 6 28.058984756469727 +79.805702209472656 6 29.769084930419922 +79.989883422851562 6 30.164035797119141 +80.239830017089844 6 30.521005630493164 +84.654945373535156 6 28.914035797119141 +84.616958618164062 6 29.348155975341797 +92.060371398925781 6 32.664035797119141 +84.504173278808594 6 29.769084930419922 +84.319999694824219 6 30.164035797119141 +84.616958618164062 6 28.479915618896484 +84.504173278808594 6 28.058984756469727 +84.319999694824219 6 27.664035797119141 +80.5479736328125 6 30.829147338867188 +80.904937744140625 6 31.079097747802734 +81.299888610839844 6 31.263269424438477 +84.070045471191406 6 27.30706787109375 +83.761909484863281 6 26.998924255371094 +83.404945373535156 6 26.748971939086914 +83.009986877441406 6 26.564804077148438 +82.589057922363281 6 26.452016830444336 +82.154937744140625 6 26.414035797119141 +81.720817565917969 6 31.376056671142578 +82.154937744140625 6 31.414035797119141 +82.589057922363281 6 31.376056671142578 +83.009986877441406 6 31.263269424438477 +83.404945373535156 6 31.079097747802734 +83.761909484863281 6 30.829147338867188 +84.070045471191406 6 30.521005630493164 +79.692916870117188 6 36.848155975341797 +78.404930114746094 6 40.164035797119141 +79.654937744140625 6 36.414035797119141 +79.989883422851562 6 35.164035797119141 +79.805702209472656 6 35.558982849121094 +79.692916870117188 6 35.979915618896484 +79.805702209472656 6 37.269084930419922 +79.989883422851562 6 37.664031982421875 +80.239830017089844 6 38.021007537841797 +81.720817565917969 6 33.952014923095703 +81.299888610839844 6 34.064804077148438 +80.904937744140625 6 34.248970031738281 +80.5479736328125 6 34.498924255371094 +80.239830017089844 6 34.80706787109375 +84.654945373535156 6 36.414035797119141 +84.616958618164062 6 36.848155975341797 +92.060371398925781 6 40.164035797119141 +84.504173278808594 6 37.269084930419922 +84.319999694824219 6 37.664031982421875 +84.616958618164062 6 35.979915618896484 +84.504173278808594 6 35.558982849121094 +84.319999694824219 6 35.164035797119141 +80.5479736328125 6 38.329147338867188 +80.904937744140625 6 38.579097747802734 +81.299888610839844 6 38.763267517089844 +84.070045471191406 6 34.80706787109375 +83.761909484863281 6 34.498924255371094 +83.404945373535156 6 34.248970031738281 +83.009986877441406 6 34.064804077148438 +82.589057922363281 6 33.952014923095703 +82.154937744140625 6 33.914035797119141 +81.720817565917969 6 38.876056671142578 +82.154937744140625 6 38.914035797119141 +82.589057922363281 6 38.876056671142578 +83.009986877441406 6 38.763267517089844 +83.404945373535156 6 38.579097747802734 +83.761909484863281 6 38.329147338867188 +84.070045471191406 6 38.021007537841797 +79.692916870117188 6 44.348155975341797 +78.404930114746094 6 47.664035797119141 +79.654937744140625 6 43.914035797119141 +79.692916870117188 6 43.479915618896484 +81.720817565917969 6 41.452014923095703 +81.299888610839844 6 41.564804077148438 +79.805702209472656 6 44.769084930419922 +79.989883422851562 6 45.164031982421875 +80.239830017089844 6 45.521007537841797 +80.904937744140625 6 41.748970031738281 +80.5479736328125 6 41.998924255371094 +80.239830017089844 6 42.30706787109375 +79.989883422851562 6 42.664035797119141 +79.805702209472656 6 43.058982849121094 +84.654945373535156 6 43.914035797119141 +84.616958618164062 6 44.348155975341797 +92.060371398925781 6 47.664035797119141 +84.504173278808594 6 44.769084930419922 +84.319999694824219 6 45.164031982421875 +84.616958618164062 6 43.479915618896484 +84.504173278808594 6 43.058982849121094 +84.319999694824219 6 42.664035797119141 +80.5479736328125 6 45.829147338867188 +80.904937744140625 6 46.079097747802734 +81.299888610839844 6 46.263267517089844 +84.070045471191406 6 42.30706787109375 +83.761909484863281 6 41.998924255371094 +83.404945373535156 6 41.748970031738281 +83.009986877441406 6 41.564804077148438 +82.589057922363281 6 41.452014923095703 +82.154937744140625 6 41.414035797119141 +81.720817565917969 6 46.376052856445312 +82.154937744140625 6 46.414035797119141 +82.589057922363281 6 46.376052856445312 +83.009986877441406 6 46.263267517089844 +83.404945373535156 6 46.079097747802734 +83.761909484863281 6 45.829147338867188 +84.070045471191406 6 45.521007537841797 +79.654937744140625 6 51.414035797119141 +79.692916870117188 6 51.848155975341797 +78.404930114746094 6 62.664031982421875 +84.504173278808594 6 52.269084930419922 +84.616958618164062 6 51.848155975341797 +84.654945373535156 6 51.414035797119141 +79.989883422851562 6 50.164035797119141 +79.805702209472656 6 50.558982849121094 +79.692916870117188 6 50.979915618896484 +81.720817565917969 6 48.952018737792969 +81.299888610839844 6 49.064804077148438 +80.904937744140625 6 49.248970031738281 +80.5479736328125 6 49.498924255371094 +80.239830017089844 6 49.80706787109375 +79.692916870117188 6 59.348155975341797 +79.805702209472656 6 59.769084930419922 +83.761909484863281 6 60.829147338867188 +84.070045471191406 6 60.521007537841797 +92.060371398925781 6 62.664031982421875 +84.616958618164062 6 50.979915618896484 +84.504173278808594 6 50.558982849121094 +84.319999694824219 6 50.164035797119141 +80.5479736328125 6 56.998924255371094 +80.239830017089844 6 57.307064056396484 +79.989883422851562 6 57.664035797119141 +84.319999694824219 6 60.164035797119141 +84.504173278808594 6 59.769084930419922 +84.616958618164062 6 59.348155975341797 +84.319999694824219 6 57.664035797119141 +84.070045471191406 6 57.307064056396484 +83.761909484863281 6 56.998924255371094 +83.404945373535156 6 56.748970031738281 +84.070045471191406 6 49.80706787109375 +83.761909484863281 6 49.498924255371094 +83.404945373535156 6 49.248970031738281 +83.009986877441406 6 49.064804077148438 +82.589057922363281 6 48.952018737792969 +82.154937744140625 6 48.914035797119141 +82.154937744140625 6 61.414035797119141 +82.589057922363281 6 61.376052856445312 +84.654945373535156 6 58.914035797119141 +84.616958618164062 6 58.479915618896484 +84.504173278808594 6 58.058982849121094 +79.989883422851562 6 60.164035797119141 +80.239830017089844 6 60.521007537841797 +80.5479736328125 6 60.829147338867188 +83.009986877441406 6 61.263267517089844 +83.404945373535156 6 61.0791015625 +84.070045471191406 6 53.021007537841797 +84.319999694824219 6 52.664035797119141 +80.904937744140625 6 56.748970031738281 +79.805702209472656 6 52.269084930419922 +81.299888610839844 6 56.564804077148438 +79.805702209472656 6 58.058982849121094 +79.692916870117188 6 58.479915618896484 +79.654937744140625 6 58.914035797119141 +80.904937744140625 6 61.0791015625 +81.299888610839844 6 61.263267517089844 +81.720817565917969 6 61.376052856445312 +82.589057922363281 6 56.452018737792969 +83.009986877441406 6 53.763267517089844 +83.009986877441406 6 56.564804077148438 +83.404945373535156 6 53.579097747802734 +83.761909484863281 6 53.329147338867188 +80.5479736328125 6 53.329147338867188 +80.904937744140625 6 53.579097747802734 +82.154937744140625 6 56.414035797119141 +81.299888610839844 6 53.763267517089844 +81.720817565917969 6 56.452018737792969 +79.989883422851562 6 52.664035797119141 +80.239830017089844 6 53.021007537841797 +81.720817565917969 6 53.876052856445312 +82.154937744140625 6 53.914035797119141 +82.589057922363281 6 53.876052856445312 +83.761909484863281 6 68.329147338867188 +84.070045471191406 6 68.021003723144531 +92.060371398925781 6 70.164039611816406 +84.319999694824219 6 67.664031982421875 +84.504173278808594 6 67.269088745117188 +84.504173278808594 6 65.558982849121094 +84.319999694824219 6 65.164039611816406 +84.070045471191406 6 64.80706787109375 +80.239830017089844 6 64.80706787109375 +79.989883422851562 6 65.164039611816406 +79.805702209472656 6 65.558982849121094 +84.616958618164062 6 66.848159790039062 +84.654945373535156 6 66.414039611816406 +84.616958618164062 6 65.979911804199219 +83.761909484863281 6 64.498924255371094 +83.404945373535156 6 64.248970031738281 +83.009986877441406 6 64.064804077148438 +82.589057922363281 6 63.952014923095703 +82.154937744140625 6 63.914039611816406 +81.720817565917969 6 63.952014923095703 +81.299888610839844 6 64.064804077148438 +80.904937744140625 6 64.248970031738281 +80.5479736328125 6 64.498924255371094 +82.154937744140625 6 68.914031982421875 +82.589057922363281 6 68.876060485839844 +79.805702209472656 6 67.269088745117188 +79.989883422851562 6 67.664031982421875 +78.404930114746094 6 70.164039611816406 +80.239830017089844 6 68.021003723144531 +80.5479736328125 6 68.329147338867188 +83.009986877441406 6 68.763267517089844 +83.404945373535156 6 68.5791015625 +79.692916870117188 6 65.979911804199219 +79.654937744140625 6 66.414039611816406 +79.692916870117188 6 66.848159790039062 +80.904937744140625 6 68.5791015625 +81.299888610839844 6 68.763267517089844 +81.720817565917969 6 68.876060485839844 +83.009986877441406 6 76.263267517089844 +83.404945373535156 6 76.0791015625 +83.761909484863281 6 75.829147338867188 +84.070045471191406 6 75.521003723144531 +84.319999694824219 6 75.164031982421875 +84.504173278808594 6 74.769088745117188 +84.504173278808594 6 73.058982849121094 +84.319999694824219 6 72.664039611816406 +84.070045471191406 6 72.30706787109375 +80.239830017089844 6 72.30706787109375 +79.989883422851562 6 72.664039611816406 +79.805702209472656 6 73.058982849121094 +84.616958618164062 6 74.348152160644531 +84.654945373535156 6 73.914039611816406 +84.616958618164062 6 73.479911804199219 +83.761909484863281 6 71.998924255371094 +83.404945373535156 6 71.748970031738281 +83.009986877441406 6 71.564811706542969 +82.589057922363281 6 71.452011108398438 +82.154937744140625 6 71.414039611816406 +81.720817565917969 6 71.452011108398438 +81.299888610839844 6 71.564811706542969 +80.904937744140625 6 71.748970031738281 +80.5479736328125 6 71.998924255371094 +79.805702209472656 6 74.769088745117188 +79.989883422851562 6 75.164031982421875 +80.239830017089844 6 75.521003723144531 +79.692916870117188 6 73.479911804199219 +79.654937744140625 6 73.914039611816406 +79.692916870117188 6 74.348152160644531 +80.5479736328125 6 75.829147338867188 +80.904937744140625 6 76.0791015625 +81.299888610839844 6 76.263267517089844 +81.720817565917969 6 76.376052856445312 +82.154937744140625 6 76.414031982421875 +82.589057922363281 6 76.376052856445312 +73.799888610839844 6 11.564802169799805 +73.404937744140625 6 11.74897289276123 +70.904937744140625 6 1.9999966621398926 +76.819999694824219 6 15.164036750793457 +77.004173278808594 6 14.769084930419922 +75.509986877441406 6 11.564802169799805 +75.089057922363281 6 11.45201587677002 +74.654937744140625 6 11.414035797119141 +74.220817565917969 6 11.45201587677002 +73.047966003417969 6 11.99892520904541 +72.739822387695312 6 12.307066917419434 +72.489875793457031 6 12.664034843444824 +75.509986877441406 6 16.263267517089844 +75.904937744140625 6 16.079099655151367 +72.305709838867188 6 13.058986663818359 +72.192924499511719 6 13.479914665222168 +70.904937744140625 6 17.664035797119141 +72.154937744140625 6 13.914033889770508 +72.192924499511719 6 14.348156929016113 +76.261909484863281 6 15.829145431518555 +76.570045471191406 6 15.521004676818848 +77.116958618164062 6 14.348156929016113 +77.154937744140625 6 13.914033889770508 +77.116958618164062 6 13.479914665222168 +77.004173278808594 6 13.058986663818359 +76.819999694824219 6 12.664034843444824 +76.570045471191406 6 12.307066917419434 +72.305709838867188 6 14.769084930419922 +72.489875793457031 6 15.164036750793457 +72.739822387695312 6 15.521004676818848 +73.047966003417969 6 15.829145431518555 +73.404937744140625 6 16.079099655151367 +73.799888610839844 6 16.263267517089844 +76.261909484863281 6 11.99892520904541 +75.904937744140625 6 11.74897289276123 +74.220817565917969 6 16.376056671142578 +74.654937744140625 6 16.414035797119141 +75.089057922363281 6 16.376056671142578 +73.799888610839844 6 19.064804077148438 +73.404937744140625 6 19.248971939086914 +73.047966003417969 6 19.498924255371094 +75.509986877441406 6 19.064804077148438 +75.089057922363281 6 18.952014923095703 +74.654937744140625 6 18.914033889770508 +74.220817565917969 6 18.952014923095703 +72.739822387695312 6 19.807065963745117 +72.489875793457031 6 20.164035797119141 +72.305709838867188 6 20.558984756469727 +75.509986877441406 6 23.763267517089844 +75.904937744140625 6 23.579097747802734 +72.192924499511719 6 21.848155975341797 +70.904937744140625 6 25.164035797119141 +72.154937744140625 6 21.414035797119141 +72.192924499511719 6 20.979915618896484 +72.305709838867188 6 22.269084930419922 +72.489875793457031 6 22.664033889770508 +72.739822387695312 6 23.021005630493164 +76.261909484863281 6 23.329145431518555 +76.570045471191406 6 23.021005630493164 +76.819999694824219 6 22.664033889770508 +77.004173278808594 6 22.269084930419922 +77.116958618164062 6 21.848155975341797 +77.154937744140625 6 21.414035797119141 +77.116958618164062 6 20.979915618896484 +77.004173278808594 6 20.558984756469727 +76.819999694824219 6 20.164035797119141 +76.570045471191406 6 19.807065963745117 +76.261909484863281 6 19.498924255371094 +75.904937744140625 6 19.248971939086914 +73.047966003417969 6 23.329145431518555 +73.404937744140625 6 23.579097747802734 +73.799888610839844 6 23.763267517089844 +74.220817565917969 6 23.876054763793945 +74.654937744140625 6 23.914035797119141 +75.089057922363281 6 23.876054763793945 +74.220817565917969 6 26.452016830444336 +73.799888610839844 6 26.564804077148438 +72.192924499511719 6 29.348155975341797 +70.904937744140625 6 32.664035797119141 +72.154937744140625 6 28.914035797119141 +72.192924499511719 6 28.479915618896484 +73.404937744140625 6 26.748971939086914 +73.047966003417969 6 26.998924255371094 +72.739822387695312 6 27.30706787109375 +72.489875793457031 6 27.664035797119141 +72.305709838867188 6 28.058984756469727 +72.305709838867188 6 29.769084930419922 +72.489875793457031 6 30.164035797119141 +72.739822387695312 6 30.521005630493164 +77.154937744140625 6 28.914035797119141 +77.116958618164062 6 29.348155975341797 +77.004173278808594 6 29.769084930419922 +76.819999694824219 6 30.164035797119141 +77.116958618164062 6 28.479915618896484 +77.004173278808594 6 28.058984756469727 +76.819999694824219 6 27.664035797119141 +73.047966003417969 6 30.829147338867188 +73.404937744140625 6 31.079097747802734 +73.799888610839844 6 31.263269424438477 +76.570045471191406 6 27.30706787109375 +76.261909484863281 6 26.998924255371094 +75.904937744140625 6 26.748971939086914 +75.509986877441406 6 26.564804077148438 +75.089057922363281 6 26.452016830444336 +74.654937744140625 6 26.414035797119141 +74.220817565917969 6 31.376056671142578 +74.654937744140625 6 31.414035797119141 +75.089057922363281 6 31.376056671142578 +75.509986877441406 6 31.263269424438477 +75.904937744140625 6 31.079097747802734 +76.261909484863281 6 30.829147338867188 +76.570045471191406 6 30.521005630493164 +72.489875793457031 6 35.164035797119141 +72.305709838867188 6 35.558982849121094 +72.192924499511719 6 36.848155975341797 +70.904937744140625 6 40.164035797119141 +72.154937744140625 6 36.414035797119141 +72.192924499511719 6 35.979915618896484 +74.220817565917969 6 33.952014923095703 +73.799888610839844 6 34.064804077148438 +73.404937744140625 6 34.248970031738281 +73.047966003417969 6 34.498924255371094 +72.739822387695312 6 34.80706787109375 +72.305709838867188 6 37.269084930419922 +72.489875793457031 6 37.664031982421875 +72.739822387695312 6 38.021007537841797 +77.154937744140625 6 36.414035797119141 +77.116958618164062 6 36.848155975341797 +77.004173278808594 6 37.269084930419922 +76.819999694824219 6 37.664031982421875 +77.116958618164062 6 35.979915618896484 +77.004173278808594 6 35.558982849121094 +76.819999694824219 6 35.164035797119141 +73.047966003417969 6 38.329147338867188 +73.404937744140625 6 38.579097747802734 +73.799888610839844 6 38.763267517089844 +76.570045471191406 6 34.80706787109375 +76.261909484863281 6 34.498924255371094 +75.904937744140625 6 34.248970031738281 +75.509986877441406 6 34.064804077148438 +75.089057922363281 6 33.952014923095703 +74.654937744140625 6 33.914035797119141 +74.220817565917969 6 38.876056671142578 +74.654937744140625 6 38.914035797119141 +75.089057922363281 6 38.876056671142578 +75.509986877441406 6 38.763267517089844 +75.904937744140625 6 38.579097747802734 +76.261909484863281 6 38.329147338867188 +76.570045471191406 6 38.021007537841797 +74.220817565917969 6 41.452014923095703 +73.799888610839844 6 41.564804077148438 +72.192924499511719 6 44.348155975341797 +70.904937744140625 6 47.664035797119141 +72.154937744140625 6 43.914035797119141 +72.192924499511719 6 43.479915618896484 +73.404937744140625 6 41.748970031738281 +73.047966003417969 6 41.998924255371094 +72.739822387695312 6 42.30706787109375 +72.489875793457031 6 42.664035797119141 +72.305709838867188 6 43.058982849121094 +72.305709838867188 6 44.769084930419922 +72.489875793457031 6 45.164031982421875 +72.739822387695312 6 45.521007537841797 +77.154937744140625 6 43.914035797119141 +77.116958618164062 6 44.348155975341797 +77.004173278808594 6 44.769084930419922 +76.819999694824219 6 45.164031982421875 +77.116958618164062 6 43.479915618896484 +77.004173278808594 6 43.058982849121094 +76.819999694824219 6 42.664035797119141 +73.047966003417969 6 45.829147338867188 +73.404937744140625 6 46.079097747802734 +73.799888610839844 6 46.263267517089844 +76.570045471191406 6 42.30706787109375 +76.261909484863281 6 41.998924255371094 +75.904937744140625 6 41.748970031738281 +75.509986877441406 6 41.564804077148438 +75.089057922363281 6 41.452014923095703 +74.654937744140625 6 41.414035797119141 +74.220817565917969 6 46.376052856445312 +74.654937744140625 6 46.414035797119141 +75.089057922363281 6 46.376052856445312 +75.509986877441406 6 46.263267517089844 +75.904937744140625 6 46.079097747802734 +76.261909484863281 6 45.829147338867188 +76.570045471191406 6 45.521007537841797 +72.489875793457031 6 50.164035797119141 +72.305709838867188 6 50.558982849121094 +77.116958618164062 6 59.348155975341797 +77.154937744140625 6 58.914035797119141 +77.116958618164062 6 51.848155975341797 +77.154937744140625 6 51.414035797119141 +70.904937744140625 6 62.664031982421875 +72.154937744140625 6 58.914035797119141 +72.192924499511719 6 59.348155975341797 +77.116958618164062 6 58.479915618896484 +77.004173278808594 6 58.058982849121094 +77.116958618164062 6 50.979915618896484 +77.004173278808594 6 50.558982849121094 +76.819999694824219 6 50.164035797119141 +72.489875793457031 6 57.664035797119141 +72.305709838867188 6 58.058982849121094 +72.739822387695312 6 53.021007537841797 +76.261909484863281 6 53.329147338867188 +76.570045471191406 6 53.021007537841797 +76.570045471191406 6 57.307064056396484 +76.819999694824219 6 52.664035797119141 +76.570045471191406 6 49.80706787109375 +76.261909484863281 6 49.498924255371094 +75.904937744140625 6 49.248970031738281 +72.192924499511719 6 50.979915618896484 +72.154937744140625 6 51.414035797119141 +72.192924499511719 6 51.848155975341797 +72.305709838867188 6 52.269084930419922 +72.305709838867188 6 59.769084930419922 +72.489875793457031 6 60.164035797119141 +72.739822387695312 6 60.521007537841797 +75.089057922363281 6 56.452018737792969 +74.654937744140625 6 56.414035797119141 +74.654937744140625 6 53.914035797119141 +76.819999694824219 6 57.664035797119141 +77.004173278808594 6 52.269084930419922 +74.654937744140625 6 48.914035797119141 +75.089057922363281 6 48.952018737792969 +75.509986877441406 6 49.064804077148438 +74.220817565917969 6 48.952018737792969 +73.799888610839844 6 49.064804077148438 +73.404937744140625 6 49.248970031738281 +73.047966003417969 6 49.498924255371094 +72.739822387695312 6 49.80706787109375 +72.192924499511719 6 58.479915618896484 +72.489875793457031 6 52.664035797119141 +76.570045471191406 6 60.521007537841797 +76.819999694824219 6 60.164035797119141 +77.004173278808594 6 59.769084930419922 +74.220817565917969 6 53.876052856445312 +76.261909484863281 6 56.998924255371094 +75.904937744140625 6 56.748970031738281 +75.509986877441406 6 56.564804077148438 +73.404937744140625 6 56.748970031738281 +73.047966003417969 6 53.329147338867188 +73.047966003417969 6 56.998924255371094 +72.739822387695312 6 57.307064056396484 +73.047966003417969 6 60.829147338867188 +73.404937744140625 6 61.0791015625 +73.799888610839844 6 61.263267517089844 +74.220817565917969 6 61.376052856445312 +74.654937744140625 6 61.414035797119141 +75.089057922363281 6 61.376052856445312 +75.509986877441406 6 61.263267517089844 +75.904937744140625 6 61.0791015625 +76.261909484863281 6 60.829147338867188 +75.089057922363281 6 53.876052856445312 +75.509986877441406 6 53.763267517089844 +75.904937744140625 6 53.579097747802734 +74.220817565917969 6 56.452018737792969 +73.799888610839844 6 56.564804077148438 +73.799888610839844 6 53.763267517089844 +73.404937744140625 6 53.579097747802734 +72.489875793457031 6 65.164039611816406 +72.305709838867188 6 65.558982849121094 +75.089057922363281 6 68.876060485839844 +75.509986877441406 6 68.763267517089844 +75.904937744140625 6 68.5791015625 +76.261909484863281 6 68.329147338867188 +76.570045471191406 6 68.021003723144531 +76.819999694824219 6 67.664031982421875 +77.004173278808594 6 67.269088745117188 +77.004173278808594 6 65.558982849121094 +76.819999694824219 6 65.164039611816406 +76.570045471191406 6 64.80706787109375 +73.799888610839844 6 64.064804077148438 +73.404937744140625 6 64.248970031738281 +73.047966003417969 6 64.498924255371094 +72.739822387695312 6 64.80706787109375 +77.116958618164062 6 66.848159790039062 +77.154937744140625 6 66.414039611816406 +77.116958618164062 6 65.979911804199219 +76.261909484863281 6 64.498924255371094 +75.904937744140625 6 64.248970031738281 +75.509986877441406 6 64.064804077148438 +75.089057922363281 6 63.952014923095703 +74.654937744140625 6 63.914039611816406 +74.220817565917969 6 63.952014923095703 +72.192924499511719 6 65.979911804199219 +72.154937744140625 6 66.414039611816406 +70.904937744140625 6 70.164039611816406 +72.192924499511719 6 66.848159790039062 +72.305709838867188 6 67.269088745117188 +72.489875793457031 6 67.664031982421875 +72.739822387695312 6 68.021003723144531 +73.047966003417969 6 68.329147338867188 +73.404937744140625 6 68.5791015625 +73.799888610839844 6 68.763267517089844 +74.220817565917969 6 68.876060485839844 +74.654937744140625 6 68.914031982421875 +72.489875793457031 6 72.664039611816406 +72.305709838867188 6 73.058982849121094 +75.089057922363281 6 76.376052856445312 +75.509986877441406 6 76.263267517089844 +75.904937744140625 6 76.0791015625 +76.261909484863281 6 75.829147338867188 +76.570045471191406 6 75.521003723144531 +76.819999694824219 6 75.164031982421875 +77.004173278808594 6 74.769088745117188 +77.004173278808594 6 73.058982849121094 +76.819999694824219 6 72.664039611816406 +76.570045471191406 6 72.30706787109375 +73.799888610839844 6 71.564811706542969 +73.404937744140625 6 71.748970031738281 +73.047966003417969 6 71.998924255371094 +72.739822387695312 6 72.30706787109375 +77.116958618164062 6 74.348152160644531 +77.154937744140625 6 73.914039611816406 +77.116958618164062 6 73.479911804199219 +76.261909484863281 6 71.998924255371094 +75.904937744140625 6 71.748970031738281 +75.509986877441406 6 71.564811706542969 +75.089057922363281 6 71.452011108398438 +74.654937744140625 6 71.414039611816406 +74.220817565917969 6 71.452011108398438 +72.192924499511719 6 73.479911804199219 +72.154937744140625 6 73.914039611816406 +70.904937744140625 6 77.664031982421875 +72.192924499511719 6 74.348152160644531 +72.305709838867188 6 74.769088745117188 +72.489875793457031 6 75.164031982421875 +72.739822387695312 6 75.521003723144531 +73.047966003417969 6 75.829147338867188 +73.404937744140625 6 76.0791015625 +73.799888610839844 6 76.263267517089844 +74.220817565917969 6 76.376052856445312 +74.654937744140625 6 76.414031982421875 +70.904937744140625 6 87.957015991210938 +72.305709838867188 6 82.269088745117188 +72.489875793457031 6 82.664031982421875 +75.904937744140625 6 83.5791015625 +75.509986877441406 6 83.763275146484375 +75.089057922363281 6 83.876060485839844 +76.261909484863281 6 83.329139709472656 +76.570045471191406 6 83.021003723144531 +76.819999694824219 6 82.664031982421875 +77.004173278808594 6 82.269088745117188 +77.116958618164062 6 81.848159790039062 +77.154937744140625 6 81.414039611816406 +77.116958618164062 6 80.979911804199219 +77.004173278808594 6 80.558982849121094 +76.819999694824219 6 80.164031982421875 +76.570045471191406 6 79.80706787109375 +76.261909484863281 6 79.498924255371094 +75.904937744140625 6 79.248970031738281 +75.509986877441406 6 79.064804077148438 +75.089057922363281 6 78.952011108398438 +74.654937744140625 6 78.914031982421875 +74.220817565917969 6 78.952011108398438 +73.047966003417969 6 79.498924255371094 +72.739822387695312 6 79.80706787109375 +72.489875793457031 6 80.164031982421875 +72.305709838867188 6 80.558982849121094 +73.799888610839844 6 79.064804077148438 +73.404937744140625 6 79.248970031738281 +72.739822387695312 6 83.021003723144531 +73.047966003417969 6 83.329139709472656 +73.404937744140625 6 83.5791015625 +73.799888610839844 6 83.763275146484375 +74.220817565917969 6 83.876060485839844 +74.654937744140625 6 83.914031982421875 +72.192924499511719 6 80.979911804199219 +72.154937744140625 6 81.414039611816406 +72.192924499511719 6 81.848159790039062 +69.504173278808594 6 13.058986663818359 +69.319999694824219 6 12.664034843444824 +65.904937744140625 6 11.74897289276123 +63.404941558837891 6 1.9999966621398926 +66.299888610839844 6 11.564802169799805 +66.720809936523438 6 11.45201587677002 +64.692916870117188 6 14.348156929016113 +64.805709838867188 6 14.769084930419922 +63.404941558837891 6 17.664035797119141 +64.989875793457031 6 15.164036750793457 +65.239830017089844 6 15.521004676818848 +68.009986877441406 6 16.263267517089844 +68.404945373535156 6 16.079099655151367 +68.761909484863281 6 15.829145431518555 +69.070045471191406 6 15.521004676818848 +69.319999694824219 6 15.164036750793457 +69.504173278808594 6 14.769084930419922 +69.616958618164062 6 14.348156929016113 +69.654937744140625 6 13.914033889770508 +69.616958618164062 6 13.479914665222168 +69.070045471191406 6 12.307066917419434 +68.761909484863281 6 11.99892520904541 +68.404945373535156 6 11.74897289276123 +68.009986877441406 6 11.564802169799805 +67.589057922363281 6 11.45201587677002 +67.154937744140625 6 11.414035797119141 +64.989875793457031 6 12.664034843444824 +64.805709838867188 6 13.058986663818359 +64.692916870117188 6 13.479914665222168 +64.654937744140625 6 13.914033889770508 +65.5479736328125 6 15.829145431518555 +65.904937744140625 6 16.079099655151367 +66.299888610839844 6 16.263267517089844 +65.5479736328125 6 11.99892520904541 +65.239830017089844 6 12.307066917419434 +66.720809936523438 6 16.376056671142578 +67.154937744140625 6 16.414035797119141 +67.589057922363281 6 16.376056671142578 +65.904937744140625 6 19.248971939086914 +66.299888610839844 6 19.064804077148438 +66.720809936523438 6 18.952014923095703 +64.989875793457031 6 22.664033889770508 +65.239830017089844 6 23.021005630493164 +63.404941558837891 6 25.164035797119141 +69.319999694824219 6 20.164035797119141 +69.504173278808594 6 20.558984756469727 +69.616958618164062 6 20.979915618896484 +64.989875793457031 6 20.164035797119141 +64.805709838867188 6 20.558984756469727 +64.692916870117188 6 20.979915618896484 +64.654937744140625 6 21.414035797119141 +64.692916870117188 6 21.848155975341797 +64.805709838867188 6 22.269084930419922 +69.319999694824219 6 22.664033889770508 +69.504173278808594 6 22.269084930419922 +69.616958618164062 6 21.848155975341797 +69.654937744140625 6 21.414035797119141 +69.070045471191406 6 19.807065963745117 +68.761909484863281 6 19.498924255371094 +68.404945373535156 6 19.248971939086914 +68.009986877441406 6 19.064804077148438 +67.589057922363281 6 18.952014923095703 +67.154937744140625 6 18.914033889770508 +65.5479736328125 6 19.498924255371094 +65.239830017089844 6 19.807065963745117 +65.5479736328125 6 23.329145431518555 +65.904937744140625 6 23.579097747802734 +66.299888610839844 6 23.763267517089844 +66.720809936523438 6 23.876054763793945 +67.154937744140625 6 23.914035797119141 +67.589057922363281 6 23.876054763793945 +68.009986877441406 6 23.763267517089844 +68.404945373535156 6 23.579097747802734 +68.761909484863281 6 23.329145431518555 +69.070045471191406 6 23.021005630493164 +64.805709838867188 6 29.769084930419922 +64.989875793457031 6 30.164035797119141 +63.404941558837891 6 32.664035797119141 +66.720809936523438 6 26.452016830444336 +66.299888610839844 6 26.564804077148438 +65.904937744140625 6 26.748971939086914 +65.5479736328125 6 26.998924255371094 +65.904937744140625 6 31.079097747802734 +66.299888610839844 6 31.263269424438477 +69.070045471191406 6 27.30706787109375 +68.761909484863281 6 26.998924255371094 +68.404945373535156 6 26.748971939086914 +65.239830017089844 6 30.521005630493164 +65.5479736328125 6 30.829147338867188 +69.616958618164062 6 28.479915618896484 +69.504173278808594 6 28.058984756469727 +69.319999694824219 6 27.664035797119141 +68.009986877441406 6 26.564804077148438 +67.589057922363281 6 26.452016830444336 +67.154937744140625 6 26.414035797119141 +65.239830017089844 6 27.30706787109375 +64.989875793457031 6 27.664035797119141 +64.805709838867188 6 28.058984756469727 +64.692916870117188 6 28.479915618896484 +64.654937744140625 6 28.914035797119141 +64.692916870117188 6 29.348155975341797 +66.720809936523438 6 31.376056671142578 +67.154937744140625 6 31.414035797119141 +67.589057922363281 6 31.376056671142578 +68.009986877441406 6 31.263269424438477 +68.404945373535156 6 31.079097747802734 +68.761909484863281 6 30.829147338867188 +69.070045471191406 6 30.521005630493164 +69.319999694824219 6 30.164035797119141 +69.504173278808594 6 29.769084930419922 +69.616958618164062 6 29.348155975341797 +69.654937744140625 6 28.914035797119141 +64.805709838867188 6 37.269084930419922 +64.989875793457031 6 37.664031982421875 +63.404941558837891 6 40.164035797119141 +69.070045471191406 6 38.021007537841797 +69.319999694824219 6 37.664031982421875 +66.720809936523438 6 33.952014923095703 +66.299888610839844 6 34.064804077148438 +65.904937744140625 6 34.248970031738281 +65.5479736328125 6 34.498924255371094 +65.239830017089844 6 34.80706787109375 +64.989875793457031 6 35.164035797119141 +64.805709838867188 6 35.558982849121094 +64.692916870117188 6 35.979915618896484 +64.654937744140625 6 36.414035797119141 +64.692916870117188 6 36.848155975341797 +65.904937744140625 6 38.579097747802734 +66.299888610839844 6 38.763267517089844 +68.009986877441406 6 38.763267517089844 +68.404945373535156 6 38.579097747802734 +68.761909484863281 6 38.329147338867188 +69.319999694824219 6 35.164035797119141 +69.504173278808594 6 35.558982849121094 +69.616958618164062 6 35.979915618896484 +69.070045471191406 6 34.80706787109375 +68.761909484863281 6 34.498924255371094 +68.404945373535156 6 34.248970031738281 +65.239830017089844 6 38.021007537841797 +65.5479736328125 6 38.329147338867188 +69.504173278808594 6 37.269084930419922 +69.616958618164062 6 36.848155975341797 +69.654937744140625 6 36.414035797119141 +68.009986877441406 6 34.064804077148438 +67.589057922363281 6 33.952014923095703 +67.154937744140625 6 33.914035797119141 +66.720809936523438 6 38.876056671142578 +67.154937744140625 6 38.914035797119141 +67.589057922363281 6 38.876056671142578 +64.805709838867188 6 44.769084930419922 +64.989875793457031 6 45.164031982421875 +63.404941558837891 6 47.664035797119141 +66.720809936523438 6 41.452014923095703 +66.299888610839844 6 41.564804077148438 +65.904937744140625 6 41.748970031738281 +65.5479736328125 6 41.998924255371094 +65.904937744140625 6 46.079097747802734 +66.299888610839844 6 46.263267517089844 +69.070045471191406 6 42.30706787109375 +68.761909484863281 6 41.998924255371094 +68.404945373535156 6 41.748970031738281 +65.239830017089844 6 45.521007537841797 +65.5479736328125 6 45.829147338867188 +69.616958618164062 6 43.479915618896484 +69.504173278808594 6 43.058982849121094 +69.319999694824219 6 42.664035797119141 +68.009986877441406 6 41.564804077148438 +67.589057922363281 6 41.452014923095703 +67.154937744140625 6 41.414035797119141 +65.239830017089844 6 42.30706787109375 +64.989875793457031 6 42.664035797119141 +64.805709838867188 6 43.058982849121094 +64.692916870117188 6 43.479915618896484 +64.654937744140625 6 43.914035797119141 +64.692916870117188 6 44.348155975341797 +66.720809936523438 6 46.376052856445312 +67.154937744140625 6 46.414035797119141 +67.589057922363281 6 46.376052856445312 +68.009986877441406 6 46.263267517089844 +68.404945373535156 6 46.079097747802734 +68.761909484863281 6 45.829147338867188 +69.070045471191406 6 45.521007537841797 +69.319999694824219 6 45.164031982421875 +69.504173278808594 6 44.769084930419922 +69.616958618164062 6 44.348155975341797 +69.654937744140625 6 43.914035797119141 +65.239830017089844 6 49.80706787109375 +64.989875793457031 6 50.164035797119141 +64.654937744140625 6 51.414035797119141 +64.692916870117188 6 51.848155975341797 +63.404941558837891 6 62.664031982421875 +64.805709838867188 6 50.558982849121094 +64.692916870117188 6 50.979915618896484 +65.239830017089844 6 57.307064056396484 +64.989875793457031 6 57.664035797119141 +67.154937744140625 6 48.914035797119141 +66.720809936523438 6 48.952018737792969 +66.299888610839844 6 49.064804077148438 +65.904937744140625 6 49.248970031738281 +65.5479736328125 6 49.498924255371094 +64.805709838867188 6 58.058982849121094 +64.692916870117188 6 58.479915618896484 +64.654937744140625 6 58.914035797119141 +64.805709838867188 6 52.269084930419922 +65.904937744140625 6 56.748970031738281 +65.5479736328125 6 56.998924255371094 +68.761909484863281 6 60.829147338867188 +69.070045471191406 6 60.521007537841797 +69.319999694824219 6 60.164035797119141 +69.504173278808594 6 59.769084930419922 +69.616958618164062 6 59.348155975341797 +69.654937744140625 6 58.914035797119141 +69.616958618164062 6 58.479915618896484 +69.504173278808594 6 58.058982849121094 +69.616958618164062 6 50.979915618896484 +69.504173278808594 6 50.558982849121094 +69.319999694824219 6 50.164035797119141 +67.589057922363281 6 61.376052856445312 +68.009986877441406 6 61.263267517089844 +68.404945373535156 6 61.0791015625 +69.319999694824219 6 57.664035797119141 +69.504173278808594 6 52.269084930419922 +69.616958618164062 6 51.848155975341797 +69.654937744140625 6 51.414035797119141 +69.070045471191406 6 49.80706787109375 +68.761909484863281 6 49.498924255371094 +68.404945373535156 6 49.248970031738281 +68.404945373535156 6 53.579097747802734 +68.761909484863281 6 53.329147338867188 +68.761909484863281 6 56.998924255371094 +69.070045471191406 6 53.021007537841797 +68.009986877441406 6 49.064804077148438 +67.589057922363281 6 48.952018737792969 +64.692916870117188 6 59.348155975341797 +64.805709838867188 6 59.769084930419922 +64.989875793457031 6 60.164035797119141 +65.239830017089844 6 60.521007537841797 +65.5479736328125 6 60.829147338867188 +65.904937744140625 6 61.0791015625 +66.299888610839844 6 61.263267517089844 +66.720809936523438 6 61.376052856445312 +67.154937744140625 6 61.414035797119141 +69.070045471191406 6 57.307064056396484 +69.319999694824219 6 52.664035797119141 +65.239830017089844 6 53.021007537841797 +67.154937744140625 6 56.414035797119141 +64.989875793457031 6 52.664035797119141 +66.720809936523438 6 56.452018737792969 +66.299888610839844 6 56.564804077148438 +67.589057922363281 6 56.452018737792969 +68.009986877441406 6 53.763267517089844 +68.009986877441406 6 56.564804077148438 +68.404945373535156 6 56.748970031738281 +65.5479736328125 6 53.329147338867188 +65.904937744140625 6 53.579097747802734 +66.299888610839844 6 53.763267517089844 +66.720809936523438 6 53.876052856445312 +67.154937744140625 6 53.914035797119141 +67.589057922363281 6 53.876052856445312 +67.154937744140625 6 63.914039611816406 +66.720809936523438 6 63.952014923095703 +66.299888610839844 6 64.064804077148438 +65.239830017089844 6 64.80706787109375 +64.989875793457031 6 65.164039611816406 +64.805709838867188 6 65.558982849121094 +64.692916870117188 6 65.979911804199219 +64.654937744140625 6 66.414039611816406 +63.404941558837891 6 70.164039611816406 +65.904937744140625 6 64.248970031738281 +65.5479736328125 6 64.498924255371094 +67.589057922363281 6 68.876060485839844 +68.009986877441406 6 68.763267517089844 +68.404945373535156 6 68.5791015625 +68.761909484863281 6 68.329147338867188 +69.504173278808594 6 65.558982849121094 +69.319999694824219 6 65.164039611816406 +69.070045471191406 6 64.80706787109375 +68.761909484863281 6 64.498924255371094 +68.404945373535156 6 64.248970031738281 +64.692916870117188 6 66.848159790039062 +64.805709838867188 6 67.269088745117188 +64.989875793457031 6 67.664031982421875 +65.239830017089844 6 68.021003723144531 +65.5479736328125 6 68.329147338867188 +65.904937744140625 6 68.5791015625 +69.070045471191406 6 68.021003723144531 +69.319999694824219 6 67.664031982421875 +69.504173278808594 6 67.269088745117188 +69.616958618164062 6 66.848159790039062 +69.654937744140625 6 66.414039611816406 +69.616958618164062 6 65.979911804199219 +68.009986877441406 6 64.064804077148438 +67.589057922363281 6 63.952014923095703 +66.299888610839844 6 68.763267517089844 +66.720809936523438 6 68.876060485839844 +67.154937744140625 6 68.914031982421875 +67.154937744140625 6 71.414039611816406 +66.720809936523438 6 71.452011108398438 +66.299888610839844 6 71.564811706542969 +68.009986877441406 6 76.263267517089844 +68.404945373535156 6 76.0791015625 +68.761909484863281 6 75.829147338867188 +65.239830017089844 6 72.30706787109375 +64.989875793457031 6 72.664039611816406 +64.805709838867188 6 73.058982849121094 +64.692916870117188 6 74.348152160644531 +63.404941558837891 6 77.664031982421875 +64.654937744140625 6 73.914039611816406 +64.692916870117188 6 73.479911804199219 +65.904937744140625 6 71.748970031738281 +65.5479736328125 6 71.998924255371094 +65.239830017089844 6 75.521003723144531 +65.5479736328125 6 75.829147338867188 +69.504173278808594 6 73.058982849121094 +69.319999694824219 6 72.664039611816406 +69.070045471191406 6 72.30706787109375 +68.761909484863281 6 71.998924255371094 +68.404945373535156 6 71.748970031738281 +64.805709838867188 6 74.769088745117188 +64.989875793457031 6 75.164031982421875 +66.720809936523438 6 76.376052856445312 +67.154937744140625 6 76.414031982421875 +67.589057922363281 6 76.376052856445312 +69.070045471191406 6 75.521003723144531 +69.319999694824219 6 75.164031982421875 +69.504173278808594 6 74.769088745117188 +69.616958618164062 6 74.348152160644531 +69.654937744140625 6 73.914039611816406 +69.616958618164062 6 73.479911804199219 +68.009986877441406 6 71.564811706542969 +67.589057922363281 6 71.452011108398438 +65.904937744140625 6 76.0791015625 +66.299888610839844 6 76.263267517089844 +66.720809936523438 6 78.952011108398438 +66.299888610839844 6 79.064804077148438 +65.904937744140625 6 79.248970031738281 +65.5479736328125 6 79.498924255371094 +65.239830017089844 6 79.80706787109375 +64.989875793457031 6 80.164031982421875 +64.805709838867188 6 80.558982849121094 +67.154937744140625 6 78.914031982421875 +64.692916870117188 6 80.979911804199219 +64.654937744140625 6 81.414039611816406 +63.404941558837891 6 87.957015991210938 +64.692916870117188 6 81.848159790039062 +64.805709838867188 6 82.269088745117188 +64.989875793457031 6 82.664031982421875 +65.239830017089844 6 83.021003723144531 +65.5479736328125 6 83.329139709472656 +65.904937744140625 6 83.5791015625 +67.154937744140625 6 83.914031982421875 +66.299888610839844 6 83.763275146484375 +66.720809936523438 6 83.876060485839844 +67.589057922363281 6 83.876060485839844 +68.009986877441406 6 83.763275146484375 +68.404945373535156 6 83.5791015625 +68.761909484863281 6 83.329139709472656 +69.070045471191406 6 83.021003723144531 +69.319999694824219 6 82.664031982421875 +69.654937744140625 6 81.414039611816406 +69.616958618164062 6 81.848159790039062 +69.504173278808594 6 82.269088745117188 +69.616958618164062 6 80.979911804199219 +69.504173278808594 6 80.558982849121094 +69.319999694824219 6 80.164031982421875 +69.070045471191406 6 79.80706787109375 +68.761909484863281 6 79.498924255371094 +68.404945373535156 6 79.248970031738281 +68.009986877441406 6 79.064804077148438 +67.589057922363281 6 78.952011108398438 +62.004169464111328 6 13.058986663818359 +61.819999694824219 6 12.664034843444824 +58.404937744140625 6 11.74897289276123 +55.904941558837891 6 1.9999966621398926 +58.799888610839844 6 11.564802169799805 +59.220817565917969 6 11.45201587677002 +60.904937744140625 6 11.74897289276123 +60.509986877441406 6 11.564802169799805 +60.089057922363281 6 11.45201587677002 +59.654937744140625 6 11.414035797119141 +58.047969818115234 6 11.99892520904541 +57.739826202392578 6 12.307066917419434 +57.489875793457031 6 12.664034843444824 +61.570049285888672 6 12.307066917419434 +61.261905670166016 6 11.99892520904541 +60.509986877441406 6 16.263267517089844 +60.904937744140625 6 16.079099655151367 +61.261905670166016 6 15.829145431518555 +61.570049285888672 6 15.521004676818848 +61.819999694824219 6 15.164036750793457 +62.004169464111328 6 14.769084930419922 +57.192916870117188 6 14.348156929016113 +57.305709838867188 6 14.769084930419922 +55.904941558837891 6 17.664035797119141 +57.489875793457031 6 15.164036750793457 +57.739826202392578 6 15.521004676818848 +58.047969818115234 6 15.829145431518555 +58.404937744140625 6 16.079099655151367 +58.799888610839844 6 16.263267517089844 +62.116958618164062 6 14.348156929016113 +62.154937744140625 6 13.914033889770508 +62.116958618164062 6 13.479914665222168 +57.305709838867188 6 13.058986663818359 +57.192916870117188 6 13.479914665222168 +57.154937744140625 6 13.914033889770508 +59.220817565917969 6 16.376056671142578 +59.654937744140625 6 16.414035797119141 +60.089057922363281 6 16.376056671142578 +58.799888610839844 6 19.064804077148438 +58.404937744140625 6 19.248971939086914 +60.509986877441406 6 19.064804077148438 +60.089057922363281 6 18.952014923095703 +59.654937744140625 6 18.914033889770508 +59.220817565917969 6 18.952014923095703 +58.047969818115234 6 19.498924255371094 +57.739826202392578 6 19.807065963745117 +57.489875793457031 6 20.164035797119141 +62.154937744140625 6 21.414035797119141 +62.116958618164062 6 20.979915618896484 +62.116958618164062 6 21.848155975341797 +61.261905670166016 6 23.329145431518555 +61.570049285888672 6 23.021005630493164 +61.819999694824219 6 22.664033889770508 +62.004169464111328 6 22.269084930419922 +62.004169464111328 6 20.558984756469727 +61.819999694824219 6 20.164035797119141 +61.570049285888672 6 19.807065963745117 +61.261905670166016 6 19.498924255371094 +60.904937744140625 6 19.248971939086914 +57.305709838867188 6 20.558984756469727 +57.192916870117188 6 20.979915618896484 +57.154937744140625 6 21.414035797119141 +57.192916870117188 6 21.848155975341797 +57.305709838867188 6 22.269084930419922 +57.489875793457031 6 22.664033889770508 +57.739826202392578 6 23.021005630493164 +58.047969818115234 6 23.329145431518555 +58.404937744140625 6 23.579097747802734 +60.089057922363281 6 23.876054763793945 +60.509986877441406 6 23.763267517089844 +60.904937744140625 6 23.579097747802734 +58.799888610839844 6 23.763267517089844 +59.220817565917969 6 23.876054763793945 +59.654937744140625 6 23.914035797119141 +61.819999694824219 6 30.164035797119141 +62.004169464111328 6 29.769084930419922 +62.116958618164062 6 29.348155975341797 +62.154937744140625 6 28.914035797119141 +62.116958618164062 6 28.479915618896484 +62.004169464111328 6 28.058984756469727 +61.819999694824219 6 27.664035797119141 +61.570049285888672 6 27.30706787109375 +61.261905670166016 6 26.998924255371094 +60.904937744140625 6 26.748971939086914 +60.509986877441406 6 26.564804077148438 +57.489875793457031 6 27.664035797119141 +57.739826202392578 6 27.30706787109375 +58.047969818115234 6 26.998924255371094 +60.089057922363281 6 26.452016830444336 +59.654937744140625 6 26.414035797119141 +59.220817565917969 6 26.452016830444336 +58.799888610839844 6 26.564804077148438 +58.404937744140625 6 26.748971939086914 +57.305709838867188 6 28.058984756469727 +57.192916870117188 6 28.479915618896484 +55.904941558837891 6 32.664035797119141 +57.154937744140625 6 28.914035797119141 +57.192916870117188 6 29.348155975341797 +57.739826202392578 6 30.521005630493164 +58.047969818115234 6 30.829147338867188 +59.654937744140625 6 31.414035797119141 +60.089057922363281 6 31.376056671142578 +60.509986877441406 6 31.263269424438477 +60.904937744140625 6 31.079097747802734 +61.261905670166016 6 30.829147338867188 +61.570049285888672 6 30.521005630493164 +57.305709838867188 6 29.769084930419922 +57.489875793457031 6 30.164035797119141 +58.404937744140625 6 31.079097747802734 +58.799888610839844 6 31.263269424438477 +59.220817565917969 6 31.376056671142578 +62.116958618164062 6 35.979915618896484 +62.004169464111328 6 35.558982849121094 +61.819999694824219 6 35.164035797119141 +59.654937744140625 6 33.914035797119141 +61.261905670166016 6 38.329147338867188 +61.570049285888672 6 38.021007537841797 +61.819999694824219 6 37.664031982421875 +62.004169464111328 6 37.269084930419922 +62.116958618164062 6 36.848155975341797 +62.154937744140625 6 36.414035797119141 +61.570049285888672 6 34.80706787109375 +61.261905670166016 6 34.498924255371094 +60.904937744140625 6 34.248970031738281 +60.509986877441406 6 34.064804077148438 +60.089057922363281 6 33.952014923095703 +59.220817565917969 6 33.952014923095703 +58.799888610839844 6 34.064804077148438 +58.404937744140625 6 34.248970031738281 +58.047969818115234 6 34.498924255371094 +57.739826202392578 6 34.80706787109375 +57.489875793457031 6 35.164035797119141 +57.192916870117188 6 36.848155975341797 +55.904941558837891 6 40.164035797119141 +57.154937744140625 6 36.414035797119141 +59.654937744140625 6 38.914035797119141 +60.089057922363281 6 38.876056671142578 +57.305709838867188 6 35.558982849121094 +57.192916870117188 6 35.979915618896484 +57.739826202392578 6 38.021007537841797 +58.047969818115234 6 38.329147338867188 +57.305709838867188 6 37.269084930419922 +57.489875793457031 6 37.664031982421875 +58.404937744140625 6 38.579097747802734 +58.799888610839844 6 38.763267517089844 +59.220817565917969 6 38.876056671142578 +60.509986877441406 6 38.763267517089844 +60.904937744140625 6 38.579097747802734 +59.654937744140625 6 41.414035797119141 +59.220817565917969 6 41.452014923095703 +58.799888610839844 6 41.564804077148438 +58.404937744140625 6 41.748970031738281 +58.047969818115234 6 41.998924255371094 +57.739826202392578 6 42.30706787109375 +57.489875793457031 6 42.664035797119141 +55.904941558837891 6 47.664035797119141 +57.154937744140625 6 43.914035797119141 +57.305709838867188 6 43.058982849121094 +57.192916870117188 6 43.479915618896484 +57.192916870117188 6 44.348155975341797 +57.305709838867188 6 44.769084930419922 +57.489875793457031 6 45.164031982421875 +57.739826202392578 6 45.521007537841797 +58.047969818115234 6 45.829147338867188 +58.404937744140625 6 46.079097747802734 +58.799888610839844 6 46.263267517089844 +59.220817565917969 6 46.376052856445312 +59.654937744140625 6 46.414035797119141 +60.089057922363281 6 46.376052856445312 +60.509986877441406 6 46.263267517089844 +60.904937744140625 6 46.079097747802734 +61.261905670166016 6 45.829147338867188 +61.570049285888672 6 45.521007537841797 +61.819999694824219 6 45.164031982421875 +62.154937744140625 6 43.914035797119141 +62.116958618164062 6 44.348155975341797 +62.004169464111328 6 44.769084930419922 +62.116958618164062 6 43.479915618896484 +62.004169464111328 6 43.058982849121094 +61.819999694824219 6 42.664035797119141 +61.570049285888672 6 42.30706787109375 +61.261905670166016 6 41.998924255371094 +60.904937744140625 6 41.748970031738281 +60.509986877441406 6 41.564804077148438 +60.089057922363281 6 41.452014923095703 +57.192916870117188 6 50.979915618896484 +57.154937744140625 6 51.414035797119141 +59.654937744140625 6 48.914035797119141 +59.220817565917969 6 48.952018737792969 +57.192916870117188 6 59.348155975341797 +57.305709838867188 6 59.769084930419922 +55.904941558837891 6 62.664031982421875 +57.489875793457031 6 60.164035797119141 +58.047969818115234 6 49.498924255371094 +57.739826202392578 6 49.80706787109375 +57.192916870117188 6 51.848155975341797 +57.305709838867188 6 52.269084930419922 +58.799888610839844 6 49.064804077148438 +58.404937744140625 6 49.248970031738281 +57.489875793457031 6 50.164035797119141 +57.305709838867188 6 50.558982849121094 +57.489875793457031 6 57.664035797119141 +57.305709838867188 6 58.058982849121094 +57.192916870117188 6 58.479915618896484 +57.154937744140625 6 58.914035797119141 +58.404937744140625 6 56.748970031738281 +58.047969818115234 6 56.998924255371094 +57.739826202392578 6 57.307064056396484 +61.261905670166016 6 56.998924255371094 +60.904937744140625 6 56.748970031738281 +57.739826202392578 6 53.021007537841797 +60.509986877441406 6 56.564804077148438 +60.089057922363281 6 56.452018737792969 +57.489875793457031 6 52.664035797119141 +61.570049285888672 6 57.307064056396484 +58.047969818115234 6 53.329147338867188 +58.404937744140625 6 53.579097747802734 +58.799888610839844 6 53.763267517089844 +59.220817565917969 6 53.876052856445312 +61.819999694824219 6 57.664035797119141 +57.739826202392578 6 60.521007537841797 +58.047969818115234 6 60.829147338867188 +58.404937744140625 6 61.0791015625 +59.654937744140625 6 56.414035797119141 +59.220817565917969 6 56.452018737792969 +58.799888610839844 6 56.564804077148438 +60.089057922363281 6 61.376052856445312 +60.509986877441406 6 61.263267517089844 +60.904937744140625 6 61.0791015625 +62.154937744140625 6 58.914035797119141 +62.116958618164062 6 58.479915618896484 +58.799888610839844 6 61.263267517089844 +59.220817565917969 6 61.376052856445312 +59.654937744140625 6 61.414035797119141 +61.261905670166016 6 60.829147338867188 +61.570049285888672 6 60.521007537841797 +61.819999694824219 6 60.164035797119141 +62.004169464111328 6 59.769084930419922 +62.116958618164062 6 59.348155975341797 +59.654937744140625 6 53.914035797119141 +60.089057922363281 6 53.876052856445312 +62.004169464111328 6 58.058982849121094 +60.509986877441406 6 53.763267517089844 +60.904937744140625 6 53.579097747802734 +61.261905670166016 6 53.329147338867188 +61.570049285888672 6 53.021007537841797 +61.819999694824219 6 52.664035797119141 +62.154937744140625 6 51.414035797119141 +62.116958618164062 6 51.848155975341797 +62.004169464111328 6 52.269084930419922 +62.116958618164062 6 50.979915618896484 +62.004169464111328 6 50.558982849121094 +61.819999694824219 6 50.164035797119141 +61.570049285888672 6 49.80706787109375 +61.261905670166016 6 49.498924255371094 +60.904937744140625 6 49.248970031738281 +60.509986877441406 6 49.064804077148438 +60.089057922363281 6 48.952018737792969 +57.192916870117188 6 65.979911804199219 +57.154937744140625 6 66.414039611816406 +57.192916870117188 6 66.848159790039062 +55.904941558837891 6 70.164039611816406 +60.509986877441406 6 68.763267517089844 +60.904937744140625 6 68.5791015625 +59.220817565917969 6 63.952014923095703 +58.799888610839844 6 64.064804077148438 +58.404937744140625 6 64.248970031738281 +58.047969818115234 6 64.498924255371094 +57.739826202392578 6 64.80706787109375 +57.305709838867188 6 67.269088745117188 +57.489875793457031 6 67.664031982421875 +57.739826202392578 6 68.021003723144531 +58.047969818115234 6 68.329147338867188 +58.404937744140625 6 68.5791015625 +58.799888610839844 6 68.763267517089844 +62.116958618164062 6 65.979911804199219 +62.004169464111328 6 65.558982849121094 +61.819999694824219 6 65.164039611816406 +61.570049285888672 6 64.80706787109375 +61.261905670166016 6 64.498924255371094 +60.904937744140625 6 64.248970031738281 +57.489875793457031 6 65.164039611816406 +57.305709838867188 6 65.558982849121094 +61.819999694824219 6 67.664031982421875 +62.004169464111328 6 67.269088745117188 +62.116958618164062 6 66.848159790039062 +62.154937744140625 6 66.414039611816406 +60.509986877441406 6 64.064804077148438 +60.089057922363281 6 63.952014923095703 +59.654937744140625 6 63.914039611816406 +61.261905670166016 6 68.329147338867188 +61.570049285888672 6 68.021003723144531 +59.220817565917969 6 68.876060485839844 +59.654937744140625 6 68.914031982421875 +60.089057922363281 6 68.876060485839844 +62.004169464111328 6 73.058982849121094 +61.819999694824219 6 72.664039611816406 +58.799888610839844 6 71.564811706542969 +58.404937744140625 6 71.748970031738281 +58.047969818115234 6 71.998924255371094 +60.904937744140625 6 71.748970031738281 +60.509986877441406 6 71.564811706542969 +57.739826202392578 6 72.30706787109375 +57.489875793457031 6 72.664039611816406 +57.305709838867188 6 73.058982849121094 +61.570049285888672 6 72.30706787109375 +61.261905670166016 6 71.998924255371094 +60.089057922363281 6 71.452011108398438 +59.654937744140625 6 71.414039611816406 +59.220817565917969 6 71.452011108398438 +57.192916870117188 6 74.348152160644531 +55.904941558837891 6 77.664031982421875 +57.154937744140625 6 73.914039611816406 +57.192916870117188 6 73.479911804199219 +57.739826202392578 6 75.521003723144531 +58.047969818115234 6 75.829147338867188 +57.305709838867188 6 74.769088745117188 +57.489875793457031 6 75.164031982421875 +59.654937744140625 6 76.414031982421875 +60.089057922363281 6 76.376052856445312 +60.509986877441406 6 76.263267517089844 +60.904937744140625 6 76.0791015625 +61.819999694824219 6 75.164031982421875 +62.004169464111328 6 74.769088745117188 +58.404937744140625 6 76.0791015625 +58.799888610839844 6 76.263267517089844 +59.220817565917969 6 76.376052856445312 +61.261905670166016 6 75.829147338867188 +61.570049285888672 6 75.521003723144531 +62.116958618164062 6 74.348152160644531 +62.154937744140625 6 73.914039611816406 +62.116958618164062 6 73.479911804199219 +57.305709838867188 6 82.269088745117188 +57.489875793457031 6 82.664031982421875 +55.904941558837891 6 87.957015991210938 +59.654937744140625 6 78.914031982421875 +57.739826202392578 6 83.021003723144531 +58.047969818115234 6 83.329139709472656 +58.404937744140625 6 83.5791015625 +59.220817565917969 6 78.952011108398438 +58.799888610839844 6 79.064804077148438 +58.404937744140625 6 79.248970031738281 +58.047969818115234 6 79.498924255371094 +57.739826202392578 6 79.80706787109375 +57.489875793457031 6 80.164031982421875 +57.154937744140625 6 81.414039611816406 +57.192916870117188 6 81.848159790039062 +58.799888610839844 6 83.763275146484375 +59.220817565917969 6 83.876060485839844 +59.654937744140625 6 83.914031982421875 +57.305709838867188 6 80.558982849121094 +57.192916870117188 6 80.979911804199219 +60.089057922363281 6 83.876060485839844 +60.509986877441406 6 83.763275146484375 +60.904937744140625 6 83.5791015625 +61.261905670166016 6 83.329139709472656 +61.570049285888672 6 83.021003723144531 +61.819999694824219 6 82.664031982421875 +62.154937744140625 6 81.414039611816406 +62.116958618164062 6 81.848159790039062 +62.004169464111328 6 82.269088745117188 +62.116958618164062 6 80.979911804199219 +62.004169464111328 6 80.558982849121094 +61.819999694824219 6 80.164031982421875 +61.570049285888672 6 79.80706787109375 +61.261905670166016 6 79.498924255371094 +60.904937744140625 6 79.248970031738281 +60.509986877441406 6 79.064804077148438 +60.089057922363281 6 78.952011108398438 +54.504169464111328 6 13.058986663818359 +54.319999694824219 6 12.664034843444824 +50.904937744140625 6 11.74897289276123 +48.404937744140625 6 1.9999966621398926 +51.299888610839844 6 11.564802169799805 +51.720817565917969 6 11.45201587677002 +53.404937744140625 6 11.74897289276123 +53.009986877441406 6 11.564802169799805 +52.589057922363281 6 11.45201587677002 +52.154937744140625 6 11.414035797119141 +50.547969818115234 6 11.99892520904541 +50.239826202392578 6 12.307066917419434 +49.989875793457031 6 12.664034843444824 +54.070049285888672 6 12.307066917419434 +53.761905670166016 6 11.99892520904541 +53.009986877441406 6 16.263267517089844 +53.404937744140625 6 16.079099655151367 +54.319999694824219 6 15.164036750793457 +54.504169464111328 6 14.769084930419922 +49.692916870117188 6 14.348156929016113 +49.805709838867188 6 14.769084930419922 +48.404937744140625 6 17.664035797119141 +49.989875793457031 6 15.164036750793457 +50.239826202392578 6 15.521004676818848 +50.547969818115234 6 15.829145431518555 +50.904937744140625 6 16.079099655151367 +51.299888610839844 6 16.263267517089844 +53.761905670166016 6 15.829145431518555 +54.070049285888672 6 15.521004676818848 +54.616958618164062 6 14.348156929016113 +54.654937744140625 6 13.914033889770508 +54.616958618164062 6 13.479914665222168 +49.805709838867188 6 13.058986663818359 +49.692916870117188 6 13.479914665222168 +49.654937744140625 6 13.914033889770508 +51.720817565917969 6 16.376056671142578 +52.154937744140625 6 16.414035797119141 +52.589057922363281 6 16.376056671142578 +53.404937744140625 6 19.248971939086914 +53.009986877441406 6 19.064804077148438 +52.589057922363281 6 18.952014923095703 +52.154937744140625 6 18.914033889770508 +51.720817565917969 6 18.952014923095703 +51.299888610839844 6 19.064804077148438 +50.904937744140625 6 19.248971939086914 +50.547969818115234 6 19.498924255371094 +50.239826202392578 6 19.807065963745117 +49.989875793457031 6 20.164035797119141 +49.805709838867188 6 20.558984756469727 +53.009986877441406 6 23.763267517089844 +53.404937744140625 6 23.579097747802734 +54.319999694824219 6 20.164035797119141 +54.504169464111328 6 20.558984756469727 +54.616958618164062 6 20.979915618896484 +54.070049285888672 6 19.807065963745117 +53.761905670166016 6 19.498924255371094 +49.692916870117188 6 20.979915618896484 +49.654937744140625 6 21.414035797119141 +48.404937744140625 6 25.164035797119141 +49.692916870117188 6 21.848155975341797 +49.805709838867188 6 22.269084930419922 +53.761905670166016 6 23.329145431518555 +54.070049285888672 6 23.021005630493164 +54.319999694824219 6 22.664033889770508 +49.989875793457031 6 22.664033889770508 +50.239826202392578 6 23.021005630493164 +50.547969818115234 6 23.329145431518555 +54.504169464111328 6 22.269084930419922 +54.616958618164062 6 21.848155975341797 +54.654937744140625 6 21.414035797119141 +50.904937744140625 6 23.579097747802734 +51.299888610839844 6 23.763267517089844 +51.720817565917969 6 23.876054763793945 +52.154937744140625 6 23.914035797119141 +52.589057922363281 6 23.876054763793945 +51.720817565917969 6 26.452016830444336 +50.547969818115234 6 26.998924255371094 +50.239826202392578 6 27.30706787109375 +49.989875793457031 6 27.664035797119141 +49.805709838867188 6 28.058984756469727 +51.299888610839844 6 26.564804077148438 +50.904937744140625 6 26.748971939086914 +54.070049285888672 6 27.30706787109375 +53.761905670166016 6 26.998924255371094 +49.692916870117188 6 29.348155975341797 +48.404937744140625 6 32.664035797119141 +49.654937744140625 6 28.914035797119141 +49.692916870117188 6 28.479915618896484 +52.154937744140625 6 31.414035797119141 +52.589057922363281 6 31.376056671142578 +53.761905670166016 6 30.829147338867188 +54.070049285888672 6 30.521005630493164 +54.319999694824219 6 30.164035797119141 +53.404937744140625 6 26.748971939086914 +53.009986877441406 6 26.564804077148438 +50.239826202392578 6 30.521005630493164 +50.547969818115234 6 30.829147338867188 +53.009986877441406 6 31.263269424438477 +53.404937744140625 6 31.079097747802734 +54.616958618164062 6 28.479915618896484 +54.504169464111328 6 28.058984756469727 +54.319999694824219 6 27.664035797119141 +49.805709838867188 6 29.769084930419922 +49.989875793457031 6 30.164035797119141 +54.504169464111328 6 29.769084930419922 +54.616958618164062 6 29.348155975341797 +54.654937744140625 6 28.914035797119141 +50.904937744140625 6 31.079097747802734 +51.299888610839844 6 31.263269424438477 +51.720817565917969 6 31.376056671142578 +52.154937744140625 6 33.914035797119141 +54.319999694824219 6 37.664031982421875 +54.070049285888672 6 38.021007537841797 +53.761905670166016 6 38.329147338867188 +52.154937744140625 6 38.914035797119141 +52.589057922363281 6 38.876056671142578 +54.319999694824219 6 35.164035797119141 +54.504169464111328 6 35.558982849121094 +54.616958618164062 6 35.979915618896484 +54.070049285888672 6 34.80706787109375 +53.761905670166016 6 34.498924255371094 +53.404937744140625 6 34.248970031738281 +54.504169464111328 6 37.269084930419922 +54.616958618164062 6 36.848155975341797 +54.654937744140625 6 36.414035797119141 +53.009986877441406 6 34.064804077148438 +52.589057922363281 6 33.952014923095703 +53.009986877441406 6 38.763267517089844 +53.404937744140625 6 38.579097747802734 +51.720817565917969 6 33.952014923095703 +51.299888610839844 6 34.064804077148438 +50.904937744140625 6 34.248970031738281 +50.547969818115234 6 34.498924255371094 +50.239826202392578 6 34.80706787109375 +49.989875793457031 6 35.164035797119141 +49.692916870117188 6 36.848155975341797 +48.404937744140625 6 40.164035797119141 +49.654937744140625 6 36.414035797119141 +50.239826202392578 6 38.021007537841797 +50.547969818115234 6 38.329147338867188 +49.805709838867188 6 35.558982849121094 +49.692916870117188 6 35.979915618896484 +49.805709838867188 6 37.269084930419922 +49.989875793457031 6 37.664031982421875 +50.904937744140625 6 38.579097747802734 +51.299888610839844 6 38.763267517089844 +51.720817565917969 6 38.876056671142578 +52.154937744140625 6 41.414035797119141 +53.009986877441406 6 46.263267517089844 +53.404937744140625 6 46.079097747802734 +53.761905670166016 6 45.829147338867188 +54.070049285888672 6 45.521007537841797 +54.319999694824219 6 45.164031982421875 +51.720817565917969 6 41.452014923095703 +51.299888610839844 6 41.564804077148438 +50.904937744140625 6 41.748970031738281 +50.547969818115234 6 41.998924255371094 +50.239826202392578 6 42.30706787109375 +49.989875793457031 6 42.664035797119141 +48.404937744140625 6 47.664035797119141 +49.654937744140625 6 43.914035797119141 +54.654937744140625 6 43.914035797119141 +54.616958618164062 6 44.348155975341797 +54.504169464111328 6 44.769084930419922 +49.805709838867188 6 43.058982849121094 +49.692916870117188 6 43.479915618896484 +52.154937744140625 6 46.414035797119141 +52.589057922363281 6 46.376052856445312 +54.616958618164062 6 43.479915618896484 +54.504169464111328 6 43.058982849121094 +54.319999694824219 6 42.664035797119141 +54.070049285888672 6 42.30706787109375 +53.761905670166016 6 41.998924255371094 +53.404937744140625 6 41.748970031738281 +49.692916870117188 6 44.348155975341797 +49.805709838867188 6 44.769084930419922 +49.989875793457031 6 45.164031982421875 +50.239826202392578 6 45.521007537841797 +50.547969818115234 6 45.829147338867188 +50.904937744140625 6 46.079097747802734 +53.009986877441406 6 41.564804077148438 +52.589057922363281 6 41.452014923095703 +51.299888610839844 6 46.263267517089844 +51.720817565917969 6 46.376052856445312 +54.616958618164062 6 59.348155975341797 +54.654937744140625 6 58.914035797119141 +54.616958618164062 6 58.479915618896484 +54.504169464111328 6 58.058982849121094 +49.692916870117188 6 59.348155975341797 +49.805709838867188 6 59.769084930419922 +48.404937744140625 6 62.664031982421875 +49.989875793457031 6 60.164035797119141 +50.239826202392578 6 60.521007537841797 +50.547969818115234 6 60.829147338867188 +50.904937744140625 6 61.0791015625 +50.547969818115234 6 49.498924255371094 +50.239826202392578 6 49.80706787109375 +50.547969818115234 6 56.998924255371094 +50.239826202392578 6 57.307064056396484 +49.989875793457031 6 57.664035797119141 +49.805709838867188 6 58.058982849121094 +49.692916870117188 6 58.479915618896484 +49.654937744140625 6 58.914035797119141 +53.761905670166016 6 60.829147338867188 +54.070049285888672 6 60.521007537841797 +54.319999694824219 6 60.164035797119141 +54.504169464111328 6 59.769084930419922 +52.589057922363281 6 53.876052856445312 +53.009986877441406 6 53.763267517089844 +52.589057922363281 6 56.452018737792969 +53.404937744140625 6 53.579097747802734 +51.720817565917969 6 48.952018737792969 +51.299888610839844 6 49.064804077148438 +50.904937744140625 6 49.248970031738281 +49.989875793457031 6 52.664035797119141 +50.239826202392578 6 53.021007537841797 +52.154937744140625 6 53.914035797119141 +52.154937744140625 6 56.414035797119141 +51.720817565917969 6 53.876052856445312 +52.589057922363281 6 61.376052856445312 +53.009986877441406 6 61.263267517089844 +53.404937744140625 6 61.0791015625 +54.319999694824219 6 57.664035797119141 +54.070049285888672 6 57.307064056396484 +54.616958618164062 6 51.848155975341797 +53.761905670166016 6 56.998924255371094 +53.404937744140625 6 56.748970031738281 +54.654937744140625 6 51.414035797119141 +49.989875793457031 6 50.164035797119141 +49.805709838867188 6 50.558982849121094 +49.692916870117188 6 50.979915618896484 +51.299888610839844 6 61.263267517089844 +51.720817565917969 6 61.376052856445312 +52.154937744140625 6 61.414035797119141 +54.616958618164062 6 50.979915618896484 +54.504169464111328 6 50.558982849121094 +54.319999694824219 6 50.164035797119141 +54.070049285888672 6 49.80706787109375 +53.761905670166016 6 49.498924255371094 +53.404937744140625 6 49.248970031738281 +53.009986877441406 6 49.064804077148438 +52.589057922363281 6 48.952018737792969 +52.154937744140625 6 48.914035797119141 +49.654937744140625 6 51.414035797119141 +49.692916870117188 6 51.848155975341797 +49.805709838867188 6 52.269084930419922 +53.761905670166016 6 53.329147338867188 +54.070049285888672 6 53.021007537841797 +53.009986877441406 6 56.564804077148438 +54.319999694824219 6 52.664035797119141 +54.504169464111328 6 52.269084930419922 +51.720817565917969 6 56.452018737792969 +51.299888610839844 6 56.564804077148438 +51.299888610839844 6 53.763267517089844 +50.904937744140625 6 56.748970031738281 +50.904937744140625 6 53.579097747802734 +50.547969818115234 6 53.329147338867188 +54.616958618164062 6 66.848159790039062 +54.654937744140625 6 66.414039611816406 +51.299888610839844 6 64.064804077148438 +50.904937744140625 6 64.248970031738281 +50.547969818115234 6 64.498924255371094 +50.239826202392578 6 64.80706787109375 +49.989875793457031 6 65.164039611816406 +49.805709838867188 6 65.558982849121094 +54.616958618164062 6 65.979911804199219 +49.692916870117188 6 65.979911804199219 +49.654937744140625 6 66.414039611816406 +48.404937744140625 6 70.164039611816406 +49.692916870117188 6 66.848159790039062 +49.805709838867188 6 67.269088745117188 +54.504169464111328 6 65.558982849121094 +54.319999694824219 6 65.164039611816406 +54.070049285888672 6 64.80706787109375 +53.761905670166016 6 64.498924255371094 +53.404937744140625 6 64.248970031738281 +53.009986877441406 6 64.064804077148438 +52.589057922363281 6 63.952014923095703 +52.154937744140625 6 63.914039611816406 +51.720817565917969 6 63.952014923095703 +53.009986877441406 6 68.763267517089844 +53.404937744140625 6 68.5791015625 +53.761905670166016 6 68.329147338867188 +54.070049285888672 6 68.021003723144531 +49.989875793457031 6 67.664031982421875 +50.239826202392578 6 68.021003723144531 +50.547969818115234 6 68.329147338867188 +54.319999694824219 6 67.664031982421875 +54.504169464111328 6 67.269088745117188 +51.720817565917969 6 68.876060485839844 +52.154937744140625 6 68.914031982421875 +52.589057922363281 6 68.876060485839844 +50.904937744140625 6 68.5791015625 +51.299888610839844 6 68.763267517089844 +54.616958618164062 6 73.479911804199219 +54.504169464111328 6 73.058982849121094 +54.319999694824219 6 72.664039611816406 +52.154937744140625 6 71.414039611816406 +51.720817565917969 6 71.452011108398438 +53.761905670166016 6 75.829147338867188 +54.070049285888672 6 75.521003723144531 +54.319999694824219 6 75.164031982421875 +54.070049285888672 6 72.30706787109375 +53.761905670166016 6 71.998924255371094 +53.404937744140625 6 71.748970031738281 +51.299888610839844 6 71.564811706542969 +50.904937744140625 6 71.748970031738281 +50.547969818115234 6 71.998924255371094 +54.504169464111328 6 74.769088745117188 +54.616958618164062 6 74.348152160644531 +54.654937744140625 6 73.914039611816406 +53.009986877441406 6 71.564811706542969 +52.589057922363281 6 71.452011108398438 +52.154937744140625 6 76.414031982421875 +52.589057922363281 6 76.376052856445312 +48.404937744140625 6 77.664031982421875 +50.239826202392578 6 75.521003723144531 +50.547969818115234 6 75.829147338867188 +53.009986877441406 6 76.263267517089844 +53.404937744140625 6 76.0791015625 +50.239826202392578 6 72.30706787109375 +49.989875793457031 6 72.664039611816406 +49.805709838867188 6 73.058982849121094 +49.692916870117188 6 74.348152160644531 +49.654937744140625 6 73.914039611816406 +49.692916870117188 6 73.479911804199219 +49.805709838867188 6 74.769088745117188 +49.989875793457031 6 75.164031982421875 +50.904937744140625 6 76.0791015625 +51.299888610839844 6 76.263267517089844 +51.720817565917969 6 76.376052856445312 +52.154937744140625 6 78.914031982421875 +51.720817565917969 6 78.952011108398438 +51.299888610839844 6 79.064804077148438 +50.904937744140625 6 79.248970031738281 +50.547969818115234 6 79.498924255371094 +50.239826202392578 6 79.80706787109375 +49.989875793457031 6 80.164031982421875 +48.404937744140625 6 87.957015991210938 +49.654937744140625 6 81.414039611816406 +49.805709838867188 6 80.558982849121094 +49.692916870117188 6 80.979911804199219 +49.692916870117188 6 81.848159790039062 +49.805709838867188 6 82.269088745117188 +49.989875793457031 6 82.664031982421875 +50.239826202392578 6 83.021003723144531 +50.547969818115234 6 83.329139709472656 +50.904937744140625 6 83.5791015625 +52.154937744140625 6 83.914031982421875 +51.720817565917969 6 83.876060485839844 +51.299888610839844 6 83.763275146484375 +52.589057922363281 6 83.876060485839844 +53.009986877441406 6 83.763275146484375 +53.404937744140625 6 83.5791015625 +53.761905670166016 6 83.329139709472656 +54.070049285888672 6 83.021003723144531 +54.319999694824219 6 82.664031982421875 +54.654937744140625 6 81.414039611816406 +54.616958618164062 6 81.848159790039062 +54.504169464111328 6 82.269088745117188 +54.616958618164062 6 80.979911804199219 +54.504169464111328 6 80.558982849121094 +54.319999694824219 6 80.164031982421875 +54.070049285888672 6 79.80706787109375 +53.761905670166016 6 79.498924255371094 +53.404937744140625 6 79.248970031738281 +53.009986877441406 6 79.064804077148438 +52.589057922363281 6 78.952011108398438 +37.589057922363281 6 11.45201587677002 +37.154937744140625 6 11.414035797119141 +33.404937744140625 6 1.9999966621398926 +47.004169464111328 6 13.058986663818359 +46.820003509521484 6 12.664034843444824 +34.692920684814453 6 14.348156929016113 +34.805706024169922 6 14.769084930419922 +33.404937744140625 6 17.664035797119141 +45.904937744140625 6 11.74897289276123 +45.509990692138672 6 11.564802169799805 +45.089057922363281 6 11.45201587677002 +44.654937744140625 6 11.414035797119141 +36.720821380615234 6 11.45201587677002 +36.299888610839844 6 11.564802169799805 +35.904937744140625 6 11.74897289276123 +46.570049285888672 6 12.307066917419434 +46.261905670166016 6 11.99892520904541 +44.220817565917969 6 11.45201587677002 +43.799888610839844 6 11.564802169799805 +43.404937744140625 6 11.74897289276123 +46.820003509521484 6 15.164036750793457 +47.004169464111328 6 14.769084930419922 +35.5479736328125 6 11.99892520904541 +35.239826202392578 6 12.307066917419434 +34.989875793457031 6 12.664034843444824 +36.299888610839844 6 16.263267517089844 +35.904937744140625 6 16.079099655151367 +35.5479736328125 6 15.829145431518555 +38.009990692138672 6 11.564802169799805 +38.404937744140625 6 11.74897289276123 +43.047969818115234 6 11.99892520904541 +34.989875793457031 6 15.164036750793457 +35.239826202392578 6 15.521004676818848 +38.009990692138672 6 16.263267517089844 +38.404937744140625 6 16.079099655151367 +38.761905670166016 6 15.829145431518555 +39.070049285888672 6 15.521004676818848 +42.739826202392578 6 12.307066917419434 +42.489875793457031 6 12.664034843444824 +38.761905670166016 6 11.99892520904541 +39.070049285888672 6 12.307066917419434 +47.116958618164062 6 14.348156929016113 +47.154937744140625 6 13.914033889770508 +47.116958618164062 6 13.479914665222168 +34.805706024169922 6 13.058986663818359 +34.692920684814453 6 13.479914665222168 +34.654937744140625 6 13.914033889770508 +44.654937744140625 6 16.414035797119141 +45.089057922363281 6 16.376056671142578 +45.509990692138672 6 16.263267517089844 +45.904937744140625 6 16.079099655151367 +36.720821380615234 6 16.376056671142578 +37.154937744140625 6 16.414035797119141 +37.589057922363281 6 16.376056671142578 +39.616958618164062 6 13.479914665222168 +39.504169464111328 6 13.058986663818359 +39.320003509521484 6 12.664034843444824 +46.261905670166016 6 15.829145431518555 +46.570049285888672 6 15.521004676818848 +42.739826202392578 6 15.521004676818848 +43.047969818115234 6 15.829145431518555 +43.404937744140625 6 16.079099655151367 +43.799888610839844 6 16.263267517089844 +44.220817565917969 6 16.376056671142578 +42.305709838867188 6 14.769084930419922 +39.504169464111328 6 14.769084930419922 +39.616958618164062 6 14.348156929016113 +39.320003509521484 6 15.164036750793457 +42.489875793457031 6 15.164036750793457 +42.305709838867188 6 13.058986663818359 +42.192920684814453 6 13.479914665222168 +39.654941558837891 6 13.914033889770508 +42.154937744140625 6 13.914033889770508 +42.192920684814453 6 14.348156929016113 +46.261905670166016 6 23.329145431518555 +46.570049285888672 6 23.021005630493164 +46.820003509521484 6 22.664033889770508 +43.799888610839844 6 19.064804077148438 +43.404937744140625 6 19.248971939086914 +45.904937744140625 6 19.248971939086914 +45.509990692138672 6 19.064804077148438 +37.154937744140625 6 18.914033889770508 +36.720821380615234 6 18.952014923095703 +36.299888610839844 6 19.064804077148438 +35.904937744140625 6 19.248971939086914 +45.089057922363281 6 18.952014923095703 +44.654937744140625 6 18.914033889770508 +44.220817565917969 6 18.952014923095703 +47.154937744140625 6 21.414035797119141 +47.116958618164062 6 21.848155975341797 +47.004169464111328 6 22.269084930419922 +47.116958618164062 6 20.979915618896484 +47.004169464111328 6 20.558984756469727 +46.820003509521484 6 20.164035797119141 +39.504169464111328 6 20.558984756469727 +39.320003509521484 6 20.164035797119141 +39.070049285888672 6 19.807065963745117 +38.761905670166016 6 19.498924255371094 +38.404937744140625 6 19.248971939086914 +38.009990692138672 6 19.064804077148438 +37.589057922363281 6 18.952014923095703 +39.070049285888672 6 23.021005630493164 +42.489875793457031 6 20.164035797119141 +38.761905670166016 6 23.329145431518555 +42.305709838867188 6 20.558984756469727 +42.192920684814453 6 20.979915618896484 +35.5479736328125 6 19.498924255371094 +35.239826202392578 6 19.807065963745117 +34.989875793457031 6 20.164035797119141 +34.692920684814453 6 21.848155975341797 +34.805706024169922 6 22.269084930419922 +33.404937744140625 6 25.164035797119141 +46.570049285888672 6 19.807065963745117 +46.261905670166016 6 19.498924255371094 +39.320003509521484 6 22.664033889770508 +39.504169464111328 6 22.269084930419922 +39.616958618164062 6 21.848155975341797 +34.989875793457031 6 22.664033889770508 +35.239826202392578 6 23.021005630493164 +35.5479736328125 6 23.329145431518555 +39.654941558837891 6 21.414035797119141 +39.616958618164062 6 20.979915618896484 +42.739826202392578 6 19.807065963745117 +43.047969818115234 6 19.498924255371094 +34.805706024169922 6 20.558984756469727 +34.692920684814453 6 20.979915618896484 +34.654937744140625 6 21.414035797119141 +42.489875793457031 6 22.664033889770508 +42.739826202392578 6 23.021005630493164 +43.047969818115234 6 23.329145431518555 +43.404937744140625 6 23.579097747802734 +35.904937744140625 6 23.579097747802734 +36.299888610839844 6 23.763267517089844 +36.720821380615234 6 23.876054763793945 +45.089057922363281 6 23.876054763793945 +45.509990692138672 6 23.763267517089844 +45.904937744140625 6 23.579097747802734 +43.799888610839844 6 23.763267517089844 +44.220817565917969 6 23.876054763793945 +44.654937744140625 6 23.914035797119141 +37.154937744140625 6 23.914035797119141 +37.589057922363281 6 23.876054763793945 +38.009990692138672 6 23.763267517089844 +42.305709838867188 6 22.269084930419922 +38.404937744140625 6 23.579097747802734 +42.192920684814453 6 21.848155975341797 +42.154937744140625 6 21.414035797119141 +37.589057922363281 6 26.452016830444336 +37.154937744140625 6 26.414035797119141 +47.154937744140625 6 28.914035797119141 +47.116958618164062 6 28.479915618896484 +47.004169464111328 6 28.058984756469727 +46.820003509521484 6 27.664035797119141 +46.570049285888672 6 27.30706787109375 +46.261905670166016 6 26.998924255371094 +45.904937744140625 6 26.748971939086914 +45.509990692138672 6 26.564804077148438 +36.720821380615234 6 26.452016830444336 +36.299888610839844 6 26.564804077148438 +35.904937744140625 6 26.748971939086914 +47.116958618164062 6 29.348155975341797 +47.004169464111328 6 29.769084930419922 +38.009990692138672 6 31.263269424438477 +38.404937744140625 6 31.079097747802734 +38.761905670166016 6 30.829147338867188 +39.070049285888672 6 30.521005630493164 +46.261905670166016 6 30.829147338867188 +46.570049285888672 6 30.521005630493164 +46.820003509521484 6 30.164035797119141 +35.5479736328125 6 26.998924255371094 +35.239826202392578 6 27.30706787109375 +34.989875793457031 6 27.664035797119141 +36.299888610839844 6 31.263269424438477 +36.720821380615234 6 31.376056671142578 +33.404937744140625 6 32.664035797119141 +37.154937744140625 6 31.414035797119141 +37.589057922363281 6 31.376056671142578 +38.009990692138672 6 26.564804077148438 +44.220817565917969 6 26.452016830444336 +44.654937744140625 6 26.414035797119141 +45.089057922363281 6 26.452016830444336 +34.692920684814453 6 29.348155975341797 +34.805706024169922 6 29.769084930419922 +34.989875793457031 6 30.164035797119141 +35.239826202392578 6 30.521005630493164 +35.5479736328125 6 30.829147338867188 +35.904937744140625 6 31.079097747802734 +34.805706024169922 6 28.058984756469727 +34.692920684814453 6 28.479915618896484 +34.654937744140625 6 28.914035797119141 +43.404937744140625 6 26.748971939086914 +43.047969818115234 6 26.998924255371094 +38.404937744140625 6 26.748971939086914 +42.739826202392578 6 27.30706787109375 +43.799888610839844 6 26.564804077148438 +44.654937744140625 6 31.414035797119141 +45.089057922363281 6 31.376056671142578 +39.320003509521484 6 30.164035797119141 +39.504169464111328 6 29.769084930419922 +42.192920684814453 6 29.348155975341797 +39.616958618164062 6 29.348155975341797 +42.154937744140625 6 28.914035797119141 +39.654941558837891 6 28.914035797119141 +42.192920684814453 6 28.479915618896484 +45.509990692138672 6 31.263269424438477 +45.904937744140625 6 31.079097747802734 +42.305709838867188 6 29.769084930419922 +42.489875793457031 6 30.164035797119141 +42.739826202392578 6 30.521005630493164 +43.047969818115234 6 30.829147338867188 +43.404937744140625 6 31.079097747802734 +43.799888610839844 6 31.263269424438477 +44.220817565917969 6 31.376056671142578 +39.616958618164062 6 28.479915618896484 +39.504169464111328 6 28.058984756469727 +42.305709838867188 6 28.058984756469727 +39.320003509521484 6 27.664035797119141 +42.489875793457031 6 27.664035797119141 +39.070049285888672 6 27.30706787109375 +38.761905670166016 6 26.998924255371094 +36.720821380615234 6 33.952014923095703 +36.299888610839844 6 34.064804077148438 +35.904937744140625 6 34.248970031738281 +35.5479736328125 6 34.498924255371094 +35.239826202392578 6 34.80706787109375 +34.989875793457031 6 35.164035797119141 +34.805706024169922 6 35.558982849121094 +33.404937744140625 6 40.164035797119141 +34.692920684814453 6 35.979915618896484 +34.654937744140625 6 36.414035797119141 +34.692920684814453 6 36.848155975341797 +34.805706024169922 6 37.269084930419922 +34.989875793457031 6 37.664031982421875 +35.239826202392578 6 38.021007537841797 +38.761905670166016 6 38.329147338867188 +39.070049285888672 6 38.021007537841797 +39.320003509521484 6 37.664031982421875 +35.5479736328125 6 38.329147338867188 +35.904937744140625 6 38.579097747802734 +36.299888610839844 6 38.763267517089844 +37.589057922363281 6 38.876056671142578 +37.154937744140625 6 38.914035797119141 +36.720821380615234 6 38.876056671142578 +38.009990692138672 6 38.763267517089844 +38.404937744140625 6 38.579097747802734 +44.654937744140625 6 33.914035797119141 +44.220817565917969 6 33.952014923095703 +39.320003509521484 6 35.164035797119141 +39.070049285888672 6 34.80706787109375 +38.761905670166016 6 34.498924255371094 +38.404937744140625 6 34.248970031738281 +38.009990692138672 6 34.064804077148438 +37.589057922363281 6 33.952014923095703 +37.154937744140625 6 33.914035797119141 +43.404937744140625 6 34.248970031738281 +43.047969818115234 6 34.498924255371094 +42.739826202392578 6 34.80706787109375 +42.192920684814453 6 36.848155975341797 +39.504169464111328 6 37.269084930419922 +39.616958618164062 6 36.848155975341797 +43.799888610839844 6 34.064804077148438 +42.489875793457031 6 37.664031982421875 +42.739826202392578 6 38.021007537841797 +43.047969818115234 6 38.329147338867188 +42.192920684814453 6 35.979915618896484 +39.504169464111328 6 35.558982849121094 +42.305709838867188 6 35.558982849121094 +42.489875793457031 6 35.164035797119141 +42.154937744140625 6 36.414035797119141 +39.654941558837891 6 36.414035797119141 +39.616958618164062 6 35.979915618896484 +42.305709838867188 6 37.269084930419922 +43.404937744140625 6 38.579097747802734 +43.799888610839844 6 38.763267517089844 +44.220817565917969 6 38.876056671142578 +44.654937744140625 6 38.914035797119141 +45.089057922363281 6 38.876056671142578 +45.509990692138672 6 38.763267517089844 +45.904937744140625 6 38.579097747802734 +46.261905670166016 6 38.329147338867188 +46.570049285888672 6 38.021007537841797 +46.820003509521484 6 37.664031982421875 +47.154937744140625 6 36.414035797119141 +47.116958618164062 6 36.848155975341797 +47.004169464111328 6 37.269084930419922 +47.116958618164062 6 35.979915618896484 +47.004169464111328 6 35.558982849121094 +46.820003509521484 6 35.164035797119141 +46.570049285888672 6 34.80706787109375 +46.261905670166016 6 34.498924255371094 +45.904937744140625 6 34.248970031738281 +45.509990692138672 6 34.064804077148438 +45.089057922363281 6 33.952014923095703 +44.654937744140625 6 41.414035797119141 +44.220817565917969 6 41.452014923095703 +38.761905670166016 6 41.998924255371094 +38.404937744140625 6 41.748970031738281 +42.192920684814453 6 43.479915618896484 +38.404937744140625 6 46.079097747802734 +38.761905670166016 6 45.829147338867188 +42.154937744140625 6 43.914035797119141 +42.192920684814453 6 44.348155975341797 +38.009990692138672 6 46.263267517089844 +37.154937744140625 6 41.414035797119141 +37.589057922363281 6 41.452014923095703 +38.009990692138672 6 41.564804077148438 +39.070049285888672 6 45.521007537841797 +39.320003509521484 6 45.164031982421875 +39.504169464111328 6 44.769084930419922 +39.070049285888672 6 42.30706787109375 +39.320003509521484 6 42.664035797119141 +43.799888610839844 6 41.564804077148438 +43.404937744140625 6 41.748970031738281 +43.047969818115234 6 41.998924255371094 +42.739826202392578 6 42.30706787109375 +42.489875793457031 6 42.664035797119141 +33.404937744140625 6 47.664035797119141 +44.220817565917969 6 46.376052856445312 +44.654937744140625 6 46.414035797119141 +39.616958618164062 6 44.348155975341797 +39.654941558837891 6 43.914035797119141 +42.305709838867188 6 43.058982849121094 +39.616958618164062 6 43.479915618896484 +39.504169464111328 6 43.058982849121094 +36.720821380615234 6 41.452014923095703 +36.299888610839844 6 41.564804077148438 +35.904937744140625 6 41.748970031738281 +35.5479736328125 6 41.998924255371094 +35.239826202392578 6 42.30706787109375 +34.989875793457031 6 42.664035797119141 +34.692920684814453 6 44.348155975341797 +34.654937744140625 6 43.914035797119141 +45.089057922363281 6 46.376052856445312 +45.509990692138672 6 46.263267517089844 +45.904937744140625 6 46.079097747802734 +46.261905670166016 6 45.829147338867188 +46.570049285888672 6 45.521007537841797 +46.820003509521484 6 45.164031982421875 +34.805706024169922 6 43.058982849121094 +34.692920684814453 6 43.479915618896484 +47.154937744140625 6 43.914035797119141 +47.116958618164062 6 44.348155975341797 +47.004169464111328 6 44.769084930419922 +34.805706024169922 6 44.769084930419922 +34.989875793457031 6 45.164031982421875 +35.239826202392578 6 45.521007537841797 +47.116958618164062 6 43.479915618896484 +47.004169464111328 6 43.058982849121094 +46.820003509521484 6 42.664035797119141 +46.570049285888672 6 42.30706787109375 +46.261905670166016 6 41.998924255371094 +45.904937744140625 6 41.748970031738281 +35.5479736328125 6 45.829147338867188 +35.904937744140625 6 46.079097747802734 +36.299888610839844 6 46.263267517089844 +37.589057922363281 6 46.376052856445312 +43.047969818115234 6 45.829147338867188 +43.404937744140625 6 46.079097747802734 +45.509990692138672 6 41.564804077148438 +45.089057922363281 6 41.452014923095703 +42.305709838867188 6 44.769084930419922 +42.489875793457031 6 45.164031982421875 +42.739826202392578 6 45.521007537841797 +36.720821380615234 6 46.376052856445312 +37.154937744140625 6 46.414035797119141 +43.799888610839844 6 46.263267517089844 +38.761905670166016 6 60.829147338867188 +39.070049285888672 6 60.521007537841797 +42.154937744140625 6 58.914035797119141 +39.320003509521484 6 60.164035797119141 +39.504169464111328 6 59.769084930419922 +38.404937744140625 6 61.0791015625 +42.192920684814453 6 59.348155975341797 +38.009990692138672 6 61.263267517089844 +45.089057922363281 6 56.452018737792969 +44.654937744140625 6 56.414035797119141 +44.654937744140625 6 53.914035797119141 +39.616958618164062 6 51.848155975341797 +39.654941558837891 6 51.414035797119141 +42.154937744140625 6 51.414035797119141 +39.320003509521484 6 57.664035797119141 +39.070049285888672 6 57.307064056396484 +42.305709838867188 6 58.058982849121094 +38.761905670166016 6 56.998924255371094 +37.589057922363281 6 48.952018737792969 +37.154937744140625 6 48.914035797119141 +36.720821380615234 6 48.952018737792969 +45.089057922363281 6 61.376052856445312 +45.509990692138672 6 61.263267517089844 +45.904937744140625 6 61.0791015625 +46.261905670166016 6 60.829147338867188 +46.570049285888672 6 60.521007537841797 +46.820003509521484 6 60.164035797119141 +47.004169464111328 6 59.769084930419922 +42.192920684814453 6 50.979915618896484 +38.404937744140625 6 53.579097747802734 +38.761905670166016 6 53.329147338867188 +42.305709838867188 6 52.269084930419922 +39.070049285888672 6 53.021007537841797 +39.320003509521484 6 52.664035797119141 +35.239826202392578 6 53.021007537841797 +35.5479736328125 6 53.329147338867188 +37.154937744140625 6 56.414035797119141 +35.904937744140625 6 53.579097747802734 +36.299888610839844 6 53.763267517089844 +44.220817565917969 6 53.876052856445312 +39.616958618164062 6 59.348155975341797 +39.654941558837891 6 58.914035797119141 +42.192920684814453 6 58.479915618896484 +39.616958618164062 6 58.479915618896484 +39.504169464111328 6 58.058982849121094 +38.404937744140625 6 56.748970031738281 +38.009990692138672 6 56.564804077148438 +42.489875793457031 6 57.664035797119141 +35.5479736328125 6 49.498924255371094 +35.239826202392578 6 49.80706787109375 +34.989875793457031 6 50.164035797119141 +34.805706024169922 6 50.558982849121094 +43.799888610839844 6 61.263267517089844 +44.220817565917969 6 61.376052856445312 +33.404937744140625 6 62.664031982421875 +47.116958618164062 6 58.479915618896484 +47.154937744140625 6 58.914035797119141 +47.116958618164062 6 59.348155975341797 +45.089057922363281 6 53.876052856445312 +45.509990692138672 6 53.763267517089844 +45.904937744140625 6 53.579097747802734 +43.404937744140625 6 49.248970031738281 +43.047969818115234 6 49.498924255371094 +39.070049285888672 6 49.80706787109375 +42.192920684814453 6 51.848155975341797 +39.504169464111328 6 52.269084930419922 +42.739826202392578 6 53.021007537841797 +42.489875793457031 6 52.664035797119141 +37.589057922363281 6 56.452018737792969 +38.009990692138672 6 53.763267517089844 +43.047969818115234 6 53.329147338867188 +43.404937744140625 6 56.748970031738281 +43.047969818115234 6 56.998924255371094 +42.739826202392578 6 57.307064056396484 +36.299888610839844 6 49.064804077148438 +35.904937744140625 6 49.248970031738281 +34.692920684814453 6 50.979915618896484 +34.654937744140625 6 51.414035797119141 +34.692920684814453 6 51.848155975341797 +34.805706024169922 6 52.269084930419922 +36.299888610839844 6 61.263267517089844 +36.720821380615234 6 61.376052856445312 +44.654937744140625 6 61.414035797119141 +44.220817565917969 6 48.952018737792969 +38.761905670166016 6 49.498924255371094 +38.404937744140625 6 49.248970031738281 +35.904937744140625 6 56.748970031738281 +35.5479736328125 6 56.998924255371094 +35.239826202392578 6 57.307064056396484 +34.692920684814453 6 58.479915618896484 +34.654937744140625 6 58.914035797119141 +34.692920684814453 6 59.348155975341797 +34.805706024169922 6 59.769084930419922 +34.989875793457031 6 60.164035797119141 +35.239826202392578 6 60.521007537841797 +35.5479736328125 6 60.829147338867188 +35.904937744140625 6 61.0791015625 +42.489875793457031 6 60.164035797119141 +42.739826202392578 6 60.521007537841797 +47.004169464111328 6 58.058982849121094 +46.820003509521484 6 57.664035797119141 +47.116958618164062 6 51.848155975341797 +46.570049285888672 6 57.307064056396484 +46.261905670166016 6 56.998924255371094 +45.904937744140625 6 56.748970031738281 +47.154937744140625 6 51.414035797119141 +43.799888610839844 6 49.064804077148438 +44.654937744140625 6 48.914035797119141 +38.009990692138672 6 49.064804077148438 +36.720821380615234 6 53.876052856445312 +37.154937744140625 6 53.914035797119141 +37.589057922363281 6 53.876052856445312 +44.220817565917969 6 56.452018737792969 +43.799888610839844 6 56.564804077148438 +43.799888610839844 6 53.763267517089844 +43.404937744140625 6 53.579097747802734 +34.989875793457031 6 57.664035797119141 +34.805706024169922 6 58.058982849121094 +43.047969818115234 6 60.829147338867188 +43.404937744140625 6 61.0791015625 +47.116958618164062 6 50.979915618896484 +47.004169464111328 6 50.558982849121094 +46.820003509521484 6 50.164035797119141 +46.570049285888672 6 49.80706787109375 +46.261905670166016 6 49.498924255371094 +45.904937744140625 6 49.248970031738281 +45.509990692138672 6 49.064804077148438 +45.089057922363281 6 48.952018737792969 +34.989875793457031 6 52.664035797119141 +36.720821380615234 6 56.452018737792969 +36.299888610839844 6 56.564804077148438 +37.154937744140625 6 61.414035797119141 +37.589057922363281 6 61.376052856445312 +42.305709838867188 6 59.769084930419922 +46.261905670166016 6 53.329147338867188 +46.570049285888672 6 53.021007537841797 +45.509990692138672 6 56.564804077148438 +46.820003509521484 6 52.664035797119141 +47.004169464111328 6 52.269084930419922 +39.616958618164062 6 50.979915618896484 +39.504169464111328 6 50.558982849121094 +42.305709838867188 6 50.558982849121094 +39.320003509521484 6 50.164035797119141 +42.489875793457031 6 50.164035797119141 +42.739826202392578 6 49.80706787109375 +37.589057922363281 6 63.952014923095703 +37.154937744140625 6 63.914039611816406 +38.761905670166016 6 68.329147338867188 +42.154937744140625 6 66.414039611816406 +38.404937744140625 6 68.5791015625 +42.192920684814453 6 66.848159790039062 +38.009990692138672 6 68.763267517089844 +39.070049285888672 6 68.021003723144531 +39.320003509521484 6 67.664031982421875 +39.504169464111328 6 67.269088745117188 +38.009990692138672 6 64.064804077148438 +43.799888610839844 6 64.064804077148438 +43.404937744140625 6 64.248970031738281 +43.047969818115234 6 64.498924255371094 +46.261905670166016 6 68.329147338867188 +46.570049285888672 6 68.021003723144531 +46.820003509521484 6 67.664031982421875 +47.116958618164062 6 65.979911804199219 +47.004169464111328 6 65.558982849121094 +46.820003509521484 6 65.164039611816406 +46.570049285888672 6 64.80706787109375 +46.261905670166016 6 64.498924255371094 +45.904937744140625 6 64.248970031738281 +45.509990692138672 6 64.064804077148438 +45.089057922363281 6 63.952014923095703 +44.654937744140625 6 63.914039611816406 +44.220817565917969 6 63.952014923095703 +39.616958618164062 6 66.848159790039062 +39.654941558837891 6 66.414039611816406 +42.192920684814453 6 65.979911804199219 +39.616958618164062 6 65.979911804199219 +42.305709838867188 6 65.558982849121094 +39.504169464111328 6 65.558982849121094 +39.320003509521484 6 65.164039611816406 +39.070049285888672 6 64.80706787109375 +38.761905670166016 6 64.498924255371094 +36.720821380615234 6 63.952014923095703 +36.299888610839844 6 64.064804077148438 +35.904937744140625 6 64.248970031738281 +47.004169464111328 6 67.269088745117188 +47.116958618164062 6 66.848159790039062 +47.154937744140625 6 66.414039611816406 +45.089057922363281 6 68.876060485839844 +45.509990692138672 6 68.763267517089844 +45.904937744140625 6 68.5791015625 +38.404937744140625 6 64.248970031738281 +42.489875793457031 6 65.164039611816406 +42.739826202392578 6 64.80706787109375 +33.404937744140625 6 70.164039611816406 +44.220817565917969 6 68.876060485839844 +44.654937744140625 6 68.914031982421875 +42.305709838867188 6 67.269088745117188 +42.489875793457031 6 67.664031982421875 +37.589057922363281 6 68.876060485839844 +42.739826202392578 6 68.021003723144531 +43.047969818115234 6 68.329147338867188 +43.404937744140625 6 68.5791015625 +35.5479736328125 6 64.498924255371094 +35.239826202392578 6 64.80706787109375 +34.989875793457031 6 65.164039611816406 +34.692920684814453 6 66.848159790039062 +34.805706024169922 6 67.269088745117188 +34.989875793457031 6 67.664031982421875 +35.239826202392578 6 68.021003723144531 +35.5479736328125 6 68.329147338867188 +35.904937744140625 6 68.5791015625 +36.299888610839844 6 68.763267517089844 +36.720821380615234 6 68.876060485839844 +37.154937744140625 6 68.914031982421875 +43.799888610839844 6 68.763267517089844 +34.805706024169922 6 65.558982849121094 +34.692920684814453 6 65.979911804199219 +34.654937744140625 6 66.414039611816406 +46.820003509521484 6 72.664039611816406 +46.570049285888672 6 72.30706787109375 +37.589057922363281 6 71.452011108398438 +37.154937744140625 6 71.414039611816406 +36.720821380615234 6 71.452011108398438 +47.004169464111328 6 73.058982849121094 +39.070049285888672 6 72.30706787109375 +44.220817565917969 6 71.452011108398438 +39.320003509521484 6 72.664039611816406 +43.799888610839844 6 71.564811706542969 +39.504169464111328 6 73.058982849121094 +38.761905670166016 6 71.998924255371094 +38.404937744140625 6 71.748970031738281 +38.009990692138672 6 71.564811706542969 +36.299888610839844 6 71.564811706542969 +35.904937744140625 6 71.748970031738281 +35.5479736328125 6 71.998924255371094 +46.261905670166016 6 71.998924255371094 +45.904937744140625 6 71.748970031738281 +45.509990692138672 6 71.564811706542969 +44.654937744140625 6 71.414039611816406 +45.089057922363281 6 71.452011108398438 +35.239826202392578 6 72.30706787109375 +34.989875793457031 6 72.664039611816406 +34.805706024169922 6 73.058982849121094 +42.192920684814453 6 74.348152160644531 +39.504169464111328 6 74.769088745117188 +39.616958618164062 6 74.348152160644531 +43.404937744140625 6 71.748970031738281 +43.047969818115234 6 71.998924255371094 +42.739826202392578 6 72.30706787109375 +34.692920684814453 6 74.348152160644531 +33.404937744140625 6 77.664031982421875 +34.654937744140625 6 73.914039611816406 +34.692920684814453 6 73.479911804199219 +38.009990692138672 6 76.263267517089844 +38.404937744140625 6 76.0791015625 +38.761905670166016 6 75.829147338867188 +39.070049285888672 6 75.521003723144531 +34.805706024169922 6 74.769088745117188 +34.989875793457031 6 75.164031982421875 +35.239826202392578 6 75.521003723144531 +42.489875793457031 6 72.664039611816406 +42.305709838867188 6 73.058982849121094 +42.192920684814453 6 73.479911804199219 +42.154937744140625 6 73.914039611816406 +39.654941558837891 6 73.914039611816406 +39.616958618164062 6 73.479911804199219 +35.5479736328125 6 75.829147338867188 +35.904937744140625 6 76.0791015625 +36.299888610839844 6 76.263267517089844 +36.720821380615234 6 76.376052856445312 +37.154937744140625 6 76.414031982421875 +37.589057922363281 6 76.376052856445312 +42.739826202392578 6 75.521003723144531 +43.047969818115234 6 75.829147338867188 +44.654937744140625 6 76.414031982421875 +45.089057922363281 6 76.376052856445312 +45.509990692138672 6 76.263267517089844 +45.904937744140625 6 76.0791015625 +46.261905670166016 6 75.829147338867188 +46.570049285888672 6 75.521003723144531 +46.820003509521484 6 75.164031982421875 +47.004169464111328 6 74.769088745117188 +47.116958618164062 6 74.348152160644531 +47.154937744140625 6 73.914039611816406 +47.116958618164062 6 73.479911804199219 +39.320003509521484 6 75.164031982421875 +42.305709838867188 6 74.769088745117188 +42.489875793457031 6 75.164031982421875 +43.404937744140625 6 76.0791015625 +43.799888610839844 6 76.263267517089844 +44.220817565917969 6 76.376052856445312 +34.805706024169922 6 82.269088745117188 +34.989875793457031 6 82.664031982421875 +33.404937744140625 6 87.957015991210938 +42.489875793457031 6 82.664031982421875 +42.739826202392578 6 83.021003723144531 +43.047969818115234 6 83.329139709472656 +35.239826202392578 6 83.021003723144531 +35.5479736328125 6 83.329139709472656 +35.904937744140625 6 83.5791015625 +36.299888610839844 6 83.763275146484375 +36.720821380615234 6 83.876060485839844 +37.154937744140625 6 83.914031982421875 +43.404937744140625 6 83.5791015625 +43.799888610839844 6 83.763275146484375 +44.220817565917969 6 83.876060485839844 +44.654937744140625 6 83.914031982421875 +37.154937744140625 6 78.914031982421875 +36.720821380615234 6 78.952011108398438 +36.299888610839844 6 79.064804077148438 +35.904937744140625 6 79.248970031738281 +35.5479736328125 6 79.498924255371094 +35.239826202392578 6 79.80706787109375 +34.989875793457031 6 80.164031982421875 +34.654937744140625 6 81.414039611816406 +34.692920684814453 6 81.848159790039062 +34.805706024169922 6 80.558982849121094 +34.692920684814453 6 80.979911804199219 +38.761905670166016 6 83.329139709472656 +39.070049285888672 6 83.021003723144531 +39.616958618164062 6 80.979911804199219 +42.305709838867188 6 80.558982849121094 +42.192920684814453 6 80.979911804199219 +45.089057922363281 6 83.876060485839844 +45.509990692138672 6 83.763275146484375 +45.904937744140625 6 83.5791015625 +46.261905670166016 6 83.329139709472656 +46.570049285888672 6 83.021003723144531 +46.820003509521484 6 82.664031982421875 +37.589057922363281 6 78.952011108398438 +44.654937744140625 6 78.914031982421875 +47.154937744140625 6 81.414039611816406 +47.116958618164062 6 81.848159790039062 +47.004169464111328 6 82.269088745117188 +37.589057922363281 6 83.876060485839844 +38.009990692138672 6 83.763275146484375 +38.404937744140625 6 83.5791015625 +47.116958618164062 6 80.979911804199219 +47.004169464111328 6 80.558982849121094 +46.820003509521484 6 80.164031982421875 +46.570049285888672 6 79.80706787109375 +46.261905670166016 6 79.498924255371094 +45.904937744140625 6 79.248970031738281 +39.616958618164062 6 81.848159790039062 +42.305709838867188 6 82.269088745117188 +39.504169464111328 6 82.269088745117188 +39.320003509521484 6 82.664031982421875 +39.654941558837891 6 81.414039611816406 +42.154937744140625 6 81.414039611816406 +42.192920684814453 6 81.848159790039062 +45.509990692138672 6 79.064804077148438 +45.089057922363281 6 78.952011108398438 +44.220817565917969 6 78.952011108398438 +43.799888610839844 6 79.064804077148438 +43.404937744140625 6 79.248970031738281 +39.320003509521484 6 80.164031982421875 +39.070049285888672 6 79.80706787109375 +42.489875793457031 6 80.164031982421875 +42.739826202392578 6 79.80706787109375 +38.761905670166016 6 79.498924255371094 +38.404937744140625 6 79.248970031738281 +43.047969818115234 6 79.498924255371094 +38.009990692138672 6 79.064804077148438 +39.504169464111328 6 80.558982849121094 +32.004169464111328 6 13.058986663818359 +31.820003509521484 6 12.664034843444824 +29.654939651489258 6 11.414035797119141 +25.904937744140625 6 1.9999966621398926 +30.089057922363281 6 11.45201587677002 +30.509988784790039 6 11.564802169799805 +30.904937744140625 6 11.74897289276123 +29.220817565917969 6 11.45201587677002 +28.799888610839844 6 11.564802169799805 +28.404937744140625 6 11.74897289276123 +28.047969818115234 6 11.99892520904541 +27.739826202392578 6 12.307066917419434 +27.489873886108398 6 12.664034843444824 +30.509988784790039 6 16.263267517089844 +30.904937744140625 6 16.079099655151367 +31.820003509521484 6 15.164036750793457 +32.004169464111328 6 14.769084930419922 +31.570051193237305 6 12.307066917419434 +31.261905670166016 6 11.99892520904541 +27.19291877746582 6 14.348156929016113 +27.305707931518555 6 14.769084930419922 +25.904937744140625 6 17.664035797119141 +27.489873886108398 6 15.164036750793457 +27.739826202392578 6 15.521004676818848 +28.047969818115234 6 15.829145431518555 +28.404937744140625 6 16.079099655151367 +28.799888610839844 6 16.263267517089844 +31.261905670166016 6 15.829145431518555 +31.570051193237305 6 15.521004676818848 +29.220817565917969 6 16.376056671142578 +29.654939651489258 6 16.414035797119141 +30.089057922363281 6 16.376056671142578 +32.116958618164062 6 14.348156929016113 +32.154941558837891 6 13.914033889770508 +32.116958618164062 6 13.479914665222168 +27.305707931518555 6 13.058986663818359 +27.19291877746582 6 13.479914665222168 +27.154939651489258 6 13.914033889770508 +28.404937744140625 6 19.248971939086914 +28.799888610839844 6 19.064804077148438 +29.220817565917969 6 18.952014923095703 +30.904937744140625 6 19.248971939086914 +30.509988784790039 6 19.064804077148438 +30.089057922363281 6 18.952014923095703 +29.654939651489258 6 18.914033889770508 +28.047969818115234 6 19.498924255371094 +27.739826202392578 6 19.807065963745117 +27.489873886108398 6 20.164035797119141 +27.19291877746582 6 21.848155975341797 +27.305707931518555 6 22.269084930419922 +25.904937744140625 6 25.164035797119141 +27.489873886108398 6 22.664033889770508 +27.739826202392578 6 23.021005630493164 +28.047969818115234 6 23.329145431518555 +31.820003509521484 6 20.164035797119141 +31.570051193237305 6 19.807065963745117 +31.261905670166016 6 19.498924255371094 +27.305707931518555 6 20.558984756469727 +27.19291877746582 6 20.979915618896484 +27.154939651489258 6 21.414035797119141 +29.654939651489258 6 23.914035797119141 +30.089057922363281 6 23.876054763793945 +30.509988784790039 6 23.763267517089844 +30.904937744140625 6 23.579097747802734 +31.261905670166016 6 23.329145431518555 +31.570051193237305 6 23.021005630493164 +31.820003509521484 6 22.664033889770508 +29.220817565917969 6 23.876054763793945 +32.004169464111328 6 22.269084930419922 +32.116958618164062 6 21.848155975341797 +32.154941558837891 6 21.414035797119141 +28.404937744140625 6 23.579097747802734 +28.799888610839844 6 23.763267517089844 +32.116958618164062 6 20.979915618896484 +32.004169464111328 6 20.558984756469727 +29.654939651489258 6 26.414035797119141 +29.220817565917969 6 26.452016830444336 +27.305707931518555 6 29.769084930419922 +27.489873886108398 6 30.164035797119141 +25.904937744140625 6 32.664035797119141 +28.799888610839844 6 26.564804077148438 +28.404937744140625 6 26.748971939086914 +28.047969818115234 6 26.998924255371094 +27.739826202392578 6 30.521005630493164 +28.047969818115234 6 30.829147338867188 +28.404937744140625 6 31.079097747802734 +28.799888610839844 6 31.263269424438477 +29.220817565917969 6 31.376056671142578 +29.654939651489258 6 31.414035797119141 +27.739826202392578 6 27.30706787109375 +27.489873886108398 6 27.664035797119141 +27.305707931518555 6 28.058984756469727 +27.19291877746582 6 28.479915618896484 +27.154939651489258 6 28.914035797119141 +27.19291877746582 6 29.348155975341797 +30.089057922363281 6 31.376056671142578 +30.509988784790039 6 31.263269424438477 +30.904937744140625 6 31.079097747802734 +31.261905670166016 6 30.829147338867188 +31.570051193237305 6 30.521005630493164 +31.820003509521484 6 30.164035797119141 +32.154941558837891 6 28.914035797119141 +32.116958618164062 6 29.348155975341797 +32.004169464111328 6 29.769084930419922 +32.116958618164062 6 28.479915618896484 +32.004169464111328 6 28.058984756469727 +31.820003509521484 6 27.664035797119141 +31.570051193237305 6 27.30706787109375 +31.261905670166016 6 26.998924255371094 +30.904937744140625 6 26.748971939086914 +30.509988784790039 6 26.564804077148438 +30.089057922363281 6 26.452016830444336 +29.654939651489258 6 33.914035797119141 +29.220817565917969 6 33.952014923095703 +27.305707931518555 6 37.269084930419922 +27.489873886108398 6 37.664031982421875 +25.904937744140625 6 40.164035797119141 +28.799888610839844 6 34.064804077148438 +28.404937744140625 6 34.248970031738281 +28.047969818115234 6 34.498924255371094 +27.739826202392578 6 38.021007537841797 +28.047969818115234 6 38.329147338867188 +28.404937744140625 6 38.579097747802734 +28.799888610839844 6 38.763267517089844 +29.220817565917969 6 38.876056671142578 +29.654939651489258 6 38.914035797119141 +27.739826202392578 6 34.80706787109375 +27.489873886108398 6 35.164035797119141 +27.305707931518555 6 35.558982849121094 +27.19291877746582 6 35.979915618896484 +27.154939651489258 6 36.414035797119141 +27.19291877746582 6 36.848155975341797 +30.089057922363281 6 38.876056671142578 +30.509988784790039 6 38.763267517089844 +30.904937744140625 6 38.579097747802734 +31.261905670166016 6 38.329147338867188 +31.570051193237305 6 38.021007537841797 +31.820003509521484 6 37.664031982421875 +32.154941558837891 6 36.414035797119141 +32.116958618164062 6 36.848155975341797 +32.004169464111328 6 37.269084930419922 +32.116958618164062 6 35.979915618896484 +32.004169464111328 6 35.558982849121094 +31.820003509521484 6 35.164035797119141 +31.570051193237305 6 34.80706787109375 +31.261905670166016 6 34.498924255371094 +30.904937744140625 6 34.248970031738281 +30.509988784790039 6 34.064804077148438 +30.089057922363281 6 33.952014923095703 +29.654939651489258 6 41.414035797119141 +29.220817565917969 6 41.452014923095703 +27.305707931518555 6 44.769084930419922 +27.489873886108398 6 45.164031982421875 +25.904937744140625 6 47.664035797119141 +28.799888610839844 6 41.564804077148438 +28.404937744140625 6 41.748970031738281 +28.047969818115234 6 41.998924255371094 +27.739826202392578 6 45.521007537841797 +28.047969818115234 6 45.829147338867188 +28.404937744140625 6 46.079097747802734 +28.799888610839844 6 46.263267517089844 +29.220817565917969 6 46.376052856445312 +29.654939651489258 6 46.414035797119141 +27.739826202392578 6 42.30706787109375 +27.489873886108398 6 42.664035797119141 +27.305707931518555 6 43.058982849121094 +27.19291877746582 6 43.479915618896484 +27.154939651489258 6 43.914035797119141 +27.19291877746582 6 44.348155975341797 +30.089057922363281 6 46.376052856445312 +30.509988784790039 6 46.263267517089844 +30.904937744140625 6 46.079097747802734 +31.261905670166016 6 45.829147338867188 +31.570051193237305 6 45.521007537841797 +31.820003509521484 6 45.164031982421875 +32.154941558837891 6 43.914035797119141 +32.116958618164062 6 44.348155975341797 +32.004169464111328 6 44.769084930419922 +32.116958618164062 6 43.479915618896484 +32.004169464111328 6 43.058982849121094 +31.820003509521484 6 42.664035797119141 +31.570051193237305 6 42.30706787109375 +31.261905670166016 6 41.998924255371094 +30.904937744140625 6 41.748970031738281 +30.509988784790039 6 41.564804077148438 +30.089057922363281 6 41.452014923095703 +29.654939651489258 6 48.914035797119141 +29.654939651489258 6 61.414035797119141 +30.089057922363281 6 61.376052856445312 +29.220817565917969 6 56.452018737792969 +27.305707931518555 6 52.269084930419922 +27.489873886108398 6 52.664035797119141 +27.739826202392578 6 53.021007537841797 +28.047969818115234 6 53.329147338867188 +28.404937744140625 6 53.579097747802734 +28.799888610839844 6 53.763267517089844 +29.220817565917969 6 53.876052856445312 +29.654939651489258 6 56.414035797119141 +29.654939651489258 6 53.914035797119141 +30.089057922363281 6 56.452018737792969 +30.089057922363281 6 53.876052856445312 +30.509988784790039 6 53.763267517089844 +30.904937744140625 6 53.579097747802734 +30.509988784790039 6 61.263267517089844 +30.904937744140625 6 61.0791015625 +31.261905670166016 6 60.829147338867188 +31.570051193237305 6 60.521007537841797 +31.820003509521484 6 60.164035797119141 +32.004169464111328 6 59.769084930419922 +32.116958618164062 6 51.848155975341797 +32.154941558837891 6 51.414035797119141 +31.820003509521484 6 50.164035797119141 +31.570051193237305 6 49.80706787109375 +31.261905670166016 6 49.498924255371094 +30.904937744140625 6 49.248970031738281 +30.509988784790039 6 49.064804077148438 +30.089057922363281 6 48.952018737792969 +29.220817565917969 6 48.952018737792969 +28.799888610839844 6 49.064804077148438 +28.404937744140625 6 49.248970031738281 +28.047969818115234 6 49.498924255371094 +27.739826202392578 6 49.80706787109375 +27.489873886108398 6 50.164035797119141 +27.19291877746582 6 51.848155975341797 +25.904937744140625 6 62.664031982421875 +27.154939651489258 6 51.414035797119141 +32.116958618164062 6 59.348155975341797 +32.154941558837891 6 58.914035797119141 +32.116958618164062 6 58.479915618896484 +32.004169464111328 6 58.058982849121094 +31.820003509521484 6 57.664035797119141 +31.570051193237305 6 57.307064056396484 +31.261905670166016 6 56.998924255371094 +31.261905670166016 6 53.329147338867188 +31.570051193237305 6 53.021007537841797 +30.509988784790039 6 56.564804077148438 +31.820003509521484 6 52.664035797119141 +32.004169464111328 6 52.269084930419922 +30.904937744140625 6 56.748970031738281 +32.116958618164062 6 50.979915618896484 +32.004169464111328 6 50.558982849121094 +27.305707931518555 6 50.558982849121094 +27.19291877746582 6 50.979915618896484 +28.047969818115234 6 60.829147338867188 +28.404937744140625 6 61.0791015625 +27.739826202392578 6 57.307064056396484 +27.489873886108398 6 57.664035797119141 +28.799888610839844 6 56.564804077148438 +28.404937744140625 6 56.748970031738281 +28.047969818115234 6 56.998924255371094 +27.305707931518555 6 58.058982849121094 +27.19291877746582 6 58.479915618896484 +27.154939651489258 6 58.914035797119141 +27.19291877746582 6 59.348155975341797 +27.305707931518555 6 59.769084930419922 +28.799888610839844 6 61.263267517089844 +29.220817565917969 6 61.376052856445312 +27.489873886108398 6 60.164035797119141 +27.739826202392578 6 60.521007537841797 +29.654939651489258 6 63.914039611816406 +29.220817565917969 6 63.952014923095703 +28.799888610839844 6 64.064804077148438 +28.404937744140625 6 64.248970031738281 +28.047969818115234 6 64.498924255371094 +27.739826202392578 6 64.80706787109375 +27.489873886108398 6 65.164039611816406 +27.305707931518555 6 65.558982849121094 +27.19291877746582 6 65.979911804199219 +27.154939651489258 6 66.414039611816406 +25.904937744140625 6 70.164039611816406 +27.19291877746582 6 66.848159790039062 +27.305707931518555 6 67.269088745117188 +30.509988784790039 6 68.763267517089844 +30.904937744140625 6 68.5791015625 +27.489873886108398 6 67.664031982421875 +27.739826202392578 6 68.021003723144531 +28.047969818115234 6 68.329147338867188 +28.404937744140625 6 68.5791015625 +28.799888610839844 6 68.763267517089844 +29.220817565917969 6 68.876060485839844 +31.820003509521484 6 67.664031982421875 +32.004169464111328 6 67.269088745117188 +29.654939651489258 6 68.914031982421875 +30.089057922363281 6 68.876060485839844 +31.261905670166016 6 68.329147338867188 +31.570051193237305 6 68.021003723144531 +32.004169464111328 6 65.558982849121094 +31.820003509521484 6 65.164039611816406 +31.570051193237305 6 64.80706787109375 +31.261905670166016 6 64.498924255371094 +30.904937744140625 6 64.248970031738281 +32.116958618164062 6 66.848159790039062 +32.154941558837891 6 66.414039611816406 +32.116958618164062 6 65.979911804199219 +30.509988784790039 6 64.064804077148438 +30.089057922363281 6 63.952014923095703 +29.654939651489258 6 71.414039611816406 +29.220817565917969 6 71.452011108398438 +28.799888610839844 6 71.564811706542969 +28.404937744140625 6 71.748970031738281 +28.047969818115234 6 71.998924255371094 +27.739826202392578 6 72.30706787109375 +27.489873886108398 6 72.664039611816406 +27.305707931518555 6 73.058982849121094 +27.19291877746582 6 73.479911804199219 +27.154939651489258 6 73.914039611816406 +25.904937744140625 6 77.664031982421875 +27.19291877746582 6 74.348152160644531 +27.305707931518555 6 74.769088745117188 +30.509988784790039 6 76.263267517089844 +30.904937744140625 6 76.0791015625 +27.489873886108398 6 75.164031982421875 +27.739826202392578 6 75.521003723144531 +28.047969818115234 6 75.829147338867188 +28.404937744140625 6 76.0791015625 +28.799888610839844 6 76.263267517089844 +29.220817565917969 6 76.376052856445312 +31.820003509521484 6 75.164031982421875 +32.004169464111328 6 74.769088745117188 +29.654939651489258 6 76.414031982421875 +30.089057922363281 6 76.376052856445312 +31.261905670166016 6 75.829147338867188 +31.570051193237305 6 75.521003723144531 +32.004169464111328 6 73.058982849121094 +31.820003509521484 6 72.664039611816406 +31.570051193237305 6 72.30706787109375 +31.261905670166016 6 71.998924255371094 +30.904937744140625 6 71.748970031738281 +32.116958618164062 6 74.348152160644531 +32.154941558837891 6 73.914039611816406 +32.116958618164062 6 73.479911804199219 +30.509988784790039 6 71.564811706542969 +30.089057922363281 6 71.452011108398438 +27.305707931518555 6 82.269088745117188 +27.489873886108398 6 82.664031982421875 +25.904937744140625 6 87.957015991210938 +28.047969818115234 6 79.498924255371094 +27.739826202392578 6 79.80706787109375 +27.489873886108398 6 80.164031982421875 +27.305707931518555 6 80.558982849121094 +29.654939651489258 6 78.914031982421875 +29.220817565917969 6 78.952011108398438 +27.739826202392578 6 83.021003723144531 +28.047969818115234 6 83.329139709472656 +28.404937744140625 6 83.5791015625 +28.799888610839844 6 83.763275146484375 +29.220817565917969 6 83.876060485839844 +29.654939651489258 6 83.914031982421875 +28.799888610839844 6 79.064804077148438 +28.404937744140625 6 79.248970031738281 +27.19291877746582 6 80.979911804199219 +27.154939651489258 6 81.414039611816406 +27.19291877746582 6 81.848159790039062 +30.089057922363281 6 83.876060485839844 +30.509988784790039 6 83.763275146484375 +30.904937744140625 6 83.5791015625 +31.261905670166016 6 83.329139709472656 +31.570051193237305 6 83.021003723144531 +31.820003509521484 6 82.664031982421875 +32.154941558837891 6 81.414039611816406 +32.116958618164062 6 81.848159790039062 +32.004169464111328 6 82.269088745117188 +32.116958618164062 6 80.979911804199219 +32.004169464111328 6 80.558982849121094 +31.820003509521484 6 80.164031982421875 +31.570051193237305 6 79.80706787109375 +31.261905670166016 6 79.498924255371094 +30.904937744140625 6 79.248970031738281 +30.509988784790039 6 79.064804077148438 +30.089057922363281 6 78.952011108398438 +24.504169464111328 6 13.058986663818359 +24.320003509521484 6 12.664034843444824 +22.154937744140625 6 11.414035797119141 +22.589059829711914 6 11.45201587677002 +23.009988784790039 6 11.564802169799805 +23.404939651489258 6 11.74897289276123 +21.720817565917969 6 11.45201587677002 +21.299886703491211 6 11.564802169799805 +20.904937744140625 6 11.74897289276123 +20.547969818115234 6 11.99892520904541 +20.239828109741211 6 12.307066917419434 +19.989873886108398 6 12.664034843444824 +23.009988784790039 6 16.263267517089844 +23.404939651489258 6 16.079099655151367 +24.320003509521484 6 15.164036750793457 +24.504169464111328 6 14.769084930419922 +24.070049285888672 6 12.307066917419434 +23.761907577514648 6 11.99892520904541 +19.69291877746582 6 14.348156929016113 +19.805707931518555 6 14.769084930419922 +19.989873886108398 6 15.164036750793457 +20.239828109741211 6 15.521004676818848 +20.547969818115234 6 15.829145431518555 +20.904937744140625 6 16.079099655151367 +21.299886703491211 6 16.263267517089844 +23.761907577514648 6 15.829145431518555 +24.070049285888672 6 15.521004676818848 +21.720817565917969 6 16.376056671142578 +22.154937744140625 6 16.414035797119141 +22.589059829711914 6 16.376056671142578 +24.616958618164062 6 14.348156929016113 +24.654937744140625 6 13.914033889770508 +24.616958618164062 6 13.479914665222168 +19.805707931518555 6 13.058986663818359 +19.69291877746582 6 13.479914665222168 +19.654939651489258 6 13.914033889770508 +20.904937744140625 6 19.248971939086914 +21.299886703491211 6 19.064804077148438 +21.720817565917969 6 18.952014923095703 +23.761907577514648 6 23.329145431518555 +24.070049285888672 6 23.021005630493164 +24.320003509521484 6 22.664033889770508 +23.404939651489258 6 19.248971939086914 +23.009988784790039 6 19.064804077148438 +22.589059829711914 6 18.952014923095703 +22.154937744140625 6 18.914033889770508 +20.547969818115234 6 19.498924255371094 +20.239828109741211 6 19.807065963745117 +19.989873886108398 6 20.164035797119141 +19.69291877746582 6 21.848155975341797 +19.805707931518555 6 22.269084930419922 +18.404937744140625 6 25.164035797119141 +24.320003509521484 6 20.164035797119141 +24.070049285888672 6 19.807065963745117 +23.761907577514648 6 19.498924255371094 +19.989873886108398 6 22.664033889770508 +20.239828109741211 6 23.021005630493164 +20.547969818115234 6 23.329145431518555 +22.154937744140625 6 23.914035797119141 +22.589059829711914 6 23.876054763793945 +24.504169464111328 6 22.269084930419922 +24.616958618164062 6 21.848155975341797 +24.654937744140625 6 21.414035797119141 +19.805707931518555 6 20.558984756469727 +19.69291877746582 6 20.979915618896484 +19.654939651489258 6 21.414035797119141 +23.009988784790039 6 23.763267517089844 +23.404939651489258 6 23.579097747802734 +24.616958618164062 6 20.979915618896484 +24.504169464111328 6 20.558984756469727 +21.720817565917969 6 23.876054763793945 +20.904937744140625 6 23.579097747802734 +21.299886703491211 6 23.763267517089844 +22.154937744140625 6 26.414035797119141 +21.720817565917969 6 26.452016830444336 +19.805707931518555 6 29.769084930419922 +19.989873886108398 6 30.164035797119141 +18.404937744140625 6 32.664035797119141 +21.299886703491211 6 26.564804077148438 +20.904937744140625 6 26.748971939086914 +20.547969818115234 6 26.998924255371094 +20.239828109741211 6 30.521005630493164 +20.547969818115234 6 30.829147338867188 +20.904937744140625 6 31.079097747802734 +21.299886703491211 6 31.263269424438477 +21.720817565917969 6 31.376056671142578 +22.154937744140625 6 31.414035797119141 +24.070049285888672 6 27.30706787109375 +23.761907577514648 6 26.998924255371094 +23.404939651489258 6 26.748971939086914 +20.239828109741211 6 27.30706787109375 +19.989873886108398 6 27.664035797119141 +19.805707931518555 6 28.058984756469727 +19.69291877746582 6 28.479915618896484 +19.654939651489258 6 28.914035797119141 +19.69291877746582 6 29.348155975341797 +24.616958618164062 6 28.479915618896484 +24.504169464111328 6 28.058984756469727 +24.320003509521484 6 27.664035797119141 +23.009988784790039 6 26.564804077148438 +22.589059829711914 6 26.452016830444336 +22.589059829711914 6 31.376056671142578 +23.009988784790039 6 31.263269424438477 +23.404939651489258 6 31.079097747802734 +23.761907577514648 6 30.829147338867188 +24.070049285888672 6 30.521005630493164 +24.320003509521484 6 30.164035797119141 +24.504169464111328 6 29.769084930419922 +24.616958618164062 6 29.348155975341797 +24.654937744140625 6 28.914035797119141 +22.154937744140625 6 33.914035797119141 +21.720817565917969 6 33.952014923095703 +19.805707931518555 6 37.269084930419922 +19.989873886108398 6 37.664031982421875 +18.404937744140625 6 40.164035797119141 +21.299886703491211 6 34.064804077148438 +20.904937744140625 6 34.248970031738281 +20.547969818115234 6 34.498924255371094 +20.239828109741211 6 38.021007537841797 +20.547969818115234 6 38.329147338867188 +20.904937744140625 6 38.579097747802734 +21.299886703491211 6 38.763267517089844 +21.720817565917969 6 38.876056671142578 +22.154937744140625 6 38.914035797119141 +22.589059829711914 6 38.876056671142578 +23.009988784790039 6 38.763267517089844 +23.404939651489258 6 38.579097747802734 +23.761907577514648 6 38.329147338867188 +24.070049285888672 6 38.021007537841797 +24.320003509521484 6 37.664031982421875 +20.239828109741211 6 34.80706787109375 +19.989873886108398 6 35.164035797119141 +19.805707931518555 6 35.558982849121094 +19.69291877746582 6 35.979915618896484 +19.654939651489258 6 36.414035797119141 +19.69291877746582 6 36.848155975341797 +24.070049285888672 6 34.80706787109375 +23.761907577514648 6 34.498924255371094 +23.404939651489258 6 34.248970031738281 +24.616958618164062 6 35.979915618896484 +24.504169464111328 6 35.558982849121094 +24.320003509521484 6 35.164035797119141 +23.009988784790039 6 34.064804077148438 +22.589059829711914 6 33.952014923095703 +24.504169464111328 6 37.269084930419922 +24.616958618164062 6 36.848155975341797 +24.654937744140625 6 36.414035797119141 +22.154937744140625 6 41.414035797119141 +21.720817565917969 6 41.452014923095703 +19.805707931518555 6 44.769084930419922 +19.989873886108398 6 45.164031982421875 +18.404937744140625 6 47.664035797119141 +21.299886703491211 6 41.564804077148438 +20.904937744140625 6 41.748970031738281 +20.547969818115234 6 41.998924255371094 +20.239828109741211 6 45.521007537841797 +20.547969818115234 6 45.829147338867188 +20.904937744140625 6 46.079097747802734 +21.299886703491211 6 46.263267517089844 +21.720817565917969 6 46.376052856445312 +22.154937744140625 6 46.414035797119141 +24.070049285888672 6 42.30706787109375 +23.761907577514648 6 41.998924255371094 +23.404939651489258 6 41.748970031738281 +20.239828109741211 6 42.30706787109375 +19.989873886108398 6 42.664035797119141 +19.805707931518555 6 43.058982849121094 +19.69291877746582 6 43.479915618896484 +19.654939651489258 6 43.914035797119141 +19.69291877746582 6 44.348155975341797 +24.616958618164062 6 43.479915618896484 +24.504169464111328 6 43.058982849121094 +24.320003509521484 6 42.664035797119141 +23.009988784790039 6 41.564804077148438 +22.589059829711914 6 41.452014923095703 +22.589059829711914 6 46.376052856445312 +23.009988784790039 6 46.263267517089844 +23.404939651489258 6 46.079097747802734 +23.761907577514648 6 45.829147338867188 +24.070049285888672 6 45.521007537841797 +24.320003509521484 6 45.164031982421875 +24.504169464111328 6 44.769084930419922 +24.616958618164062 6 44.348155975341797 +24.654937744140625 6 43.914035797119141 +22.154937744140625 6 48.914035797119141 +22.154937744140625 6 61.414035797119141 +22.589059829711914 6 61.376052856445312 +21.720817565917969 6 56.452018737792969 +19.805707931518555 6 52.269084930419922 +19.989873886108398 6 52.664035797119141 +20.239828109741211 6 53.021007537841797 +20.547969818115234 6 53.329147338867188 +20.904937744140625 6 53.579097747802734 +21.299886703491211 6 53.763267517089844 +21.720817565917969 6 53.876052856445312 +22.154937744140625 6 56.414035797119141 +22.154937744140625 6 53.914035797119141 +22.589059829711914 6 56.452018737792969 +21.720817565917969 6 48.952018737792969 +21.299886703491211 6 49.064804077148438 +20.904937744140625 6 49.248970031738281 +20.547969818115234 6 49.498924255371094 +20.239828109741211 6 49.80706787109375 +19.989873886108398 6 50.164035797119141 +19.69291877746582 6 51.848155975341797 +18.404937744140625 6 62.664031982421875 +19.654939651489258 6 51.414035797119141 +19.805707931518555 6 50.558982849121094 +19.69291877746582 6 50.979915618896484 +20.547969818115234 6 60.829147338867188 +20.904937744140625 6 61.0791015625 +23.009988784790039 6 61.263267517089844 +23.404939651489258 6 61.0791015625 +23.761907577514648 6 60.829147338867188 +22.589059829711914 6 53.876052856445312 +23.009988784790039 6 53.763267517089844 +23.404939651489258 6 53.579097747802734 +20.239828109741211 6 57.307064056396484 +19.989873886108398 6 57.664035797119141 +23.761907577514648 6 49.498924255371094 +23.404939651489258 6 49.248970031738281 +21.299886703491211 6 56.564804077148438 +20.904937744140625 6 56.748970031738281 +20.547969818115234 6 56.998924255371094 +19.805707931518555 6 58.058982849121094 +19.69291877746582 6 58.479915618896484 +19.654939651489258 6 58.914035797119141 +19.69291877746582 6 59.348155975341797 +19.805707931518555 6 59.769084930419922 +21.299886703491211 6 61.263267517089844 +21.720817565917969 6 61.376052856445312 +23.761907577514648 6 56.998924255371094 +23.404939651489258 6 56.748970031738281 +23.009988784790039 6 49.064804077148438 +22.589059829711914 6 48.952018737792969 +19.989873886108398 6 60.164035797119141 +20.239828109741211 6 60.521007537841797 +24.070049285888672 6 60.521007537841797 +24.320003509521484 6 60.164035797119141 +24.504169464111328 6 59.769084930419922 +24.616958618164062 6 59.348155975341797 +24.654937744140625 6 58.914035797119141 +24.616958618164062 6 58.479915618896484 +24.504169464111328 6 58.058982849121094 +24.654937744140625 6 51.414035797119141 +24.616958618164062 6 50.979915618896484 +24.504169464111328 6 50.558982849121094 +24.320003509521484 6 57.664035797119141 +24.070049285888672 6 57.307064056396484 +24.320003509521484 6 50.164035797119141 +24.070049285888672 6 49.80706787109375 +23.761907577514648 6 53.329147338867188 +24.070049285888672 6 53.021007537841797 +23.009988784790039 6 56.564804077148438 +24.320003509521484 6 52.664035797119141 +24.504169464111328 6 52.269084930419922 +24.616958618164062 6 51.848155975341797 +22.154937744140625 6 63.914039611816406 +21.720817565917969 6 63.952014923095703 +21.299886703491211 6 64.064804077148438 +20.904937744140625 6 64.248970031738281 +20.547969818115234 6 64.498924255371094 +20.239828109741211 6 64.80706787109375 +19.989873886108398 6 65.164039611816406 +19.805707931518555 6 65.558982849121094 +19.69291877746582 6 65.979911804199219 +19.654939651489258 6 66.414039611816406 +18.404937744140625 6 70.164039611816406 +19.69291877746582 6 66.848159790039062 +19.805707931518555 6 67.269088745117188 +23.009988784790039 6 68.763267517089844 +23.404939651489258 6 68.5791015625 +23.761907577514648 6 68.329147338867188 +19.989873886108398 6 67.664031982421875 +20.239828109741211 6 68.021003723144531 +20.547969818115234 6 68.329147338867188 +20.904937744140625 6 68.5791015625 +21.299886703491211 6 68.763267517089844 +21.720817565917969 6 68.876060485839844 +24.504169464111328 6 65.558982849121094 +24.320003509521484 6 65.164039611816406 +22.154937744140625 6 68.914031982421875 +22.589059829711914 6 68.876060485839844 +24.070049285888672 6 64.80706787109375 +23.761907577514648 6 64.498924255371094 +23.404939651489258 6 64.248970031738281 +24.070049285888672 6 68.021003723144531 +24.320003509521484 6 67.664031982421875 +24.504169464111328 6 67.269088745117188 +24.616958618164062 6 66.848159790039062 +24.654937744140625 6 66.414039611816406 +24.616958618164062 6 65.979911804199219 +23.009988784790039 6 64.064804077148438 +22.589059829711914 6 63.952014923095703 +22.154937744140625 6 71.414039611816406 +21.720817565917969 6 71.452011108398438 +21.299886703491211 6 71.564811706542969 +20.904937744140625 6 71.748970031738281 +20.547969818115234 6 71.998924255371094 +20.239828109741211 6 72.30706787109375 +19.989873886108398 6 72.664039611816406 +19.805707931518555 6 73.058982849121094 +19.69291877746582 6 73.479911804199219 +19.654939651489258 6 73.914039611816406 +19.69291877746582 6 74.348152160644531 +19.805707931518555 6 74.769088745117188 +23.009988784790039 6 76.263267517089844 +23.404939651489258 6 76.0791015625 +23.761907577514648 6 75.829147338867188 +19.989873886108398 6 75.164031982421875 +20.239828109741211 6 75.521003723144531 +20.547969818115234 6 75.829147338867188 +20.904937744140625 6 76.0791015625 +21.299886703491211 6 76.263267517089844 +21.720817565917969 6 76.376052856445312 +24.504169464111328 6 73.058982849121094 +24.320003509521484 6 72.664039611816406 +22.154937744140625 6 76.414031982421875 +22.589059829711914 6 76.376052856445312 +24.070049285888672 6 72.30706787109375 +23.761907577514648 6 71.998924255371094 +23.404939651489258 6 71.748970031738281 +24.070049285888672 6 75.521003723144531 +24.320003509521484 6 75.164031982421875 +24.504169464111328 6 74.769088745117188 +24.616958618164062 6 74.348152160644531 +24.654937744140625 6 73.914039611816406 +24.616958618164062 6 73.479911804199219 +23.009988784790039 6 71.564811706542969 +22.589059829711914 6 71.452011108398438 +19.805707931518555 6 82.269088745117188 +19.989873886108398 6 82.664031982421875 +20.547969818115234 6 79.498924255371094 +20.239828109741211 6 79.80706787109375 +19.989873886108398 6 80.164031982421875 +19.805707931518555 6 80.558982849121094 +22.154937744140625 6 78.914031982421875 +21.720817565917969 6 78.952011108398438 +20.239828109741211 6 83.021003723144531 +20.547969818115234 6 83.329139709472656 +20.904937744140625 6 83.5791015625 +21.299886703491211 6 83.763275146484375 +21.720817565917969 6 83.876060485839844 +22.154937744140625 6 83.914031982421875 +21.299886703491211 6 79.064804077148438 +20.904937744140625 6 79.248970031738281 +22.589059829711914 6 83.876060485839844 +23.009988784790039 6 83.763275146484375 +23.404939651489258 6 83.5791015625 +23.761907577514648 6 83.329139709472656 +24.070049285888672 6 83.021003723144531 +24.320003509521484 6 82.664031982421875 +19.69291877746582 6 80.979911804199219 +19.654939651489258 6 81.414039611816406 +19.69291877746582 6 81.848159790039062 +24.070049285888672 6 79.80706787109375 +23.761907577514648 6 79.498924255371094 +23.404939651489258 6 79.248970031738281 +24.616958618164062 6 80.979911804199219 +24.504169464111328 6 80.558982849121094 +24.320003509521484 6 80.164031982421875 +23.009988784790039 6 79.064804077148438 +22.589059829711914 6 78.952011108398438 +24.504169464111328 6 82.269088745117188 +24.616958618164062 6 81.848159790039062 +24.654937744140625 6 81.414039611816406 +25.904937744140625 6 92 +33.404937744140625 6 92 +48.404937744140625 6 92 +55.904941558837891 6 92 +63.404941558837891 6 92 +70.904937744140625 6 92 +78.404930114746094 6 92 +13.799886703491211 6 19.064804077148438 +13.404939651489258 6 19.248971939086914 +13.047970771789551 6 19.498924255371094 +16.820001602172852 6 20.164035797119141 +17.004169464111328 6 20.558984756469727 +17.116958618164062 6 20.979915618896484 +15.904938697814941 6 19.248971939086914 +15.509988784790039 6 19.064804077148438 +16.570051193237305 6 19.807065963745117 +16.261907577514648 6 19.498924255371094 +15.089056968688965 6 18.952014923095703 +14.654937744140625 6 18.914033889770508 +14.220818519592285 6 18.952014923095703 +12.739826202392578 6 19.807065963745117 +12.489873886108398 6 20.164035797119141 +12.305706977844238 6 20.558984756469727 +15.509988784790039 6 23.763267517089844 +15.904938697814941 6 23.579097747802734 +12.305706977844238 6 22.269084930419922 +12.489873886108398 6 22.664033889770508 +7.1076564788818359 6 25.164035797119141 +12.739826202392578 6 23.021005630493164 +13.047970771789551 6 23.329145431518555 +16.261907577514648 6 23.329145431518555 +16.570051193237305 6 23.021005630493164 +16.820001602172852 6 22.664033889770508 +17.004169464111328 6 22.269084930419922 +17.116958618164062 6 21.848155975341797 +17.154937744140625 6 21.414035797119141 +12.192919731140137 6 20.979915618896484 +12.154936790466309 6 21.414035797119141 +12.192919731140137 6 21.848155975341797 +13.404939651489258 6 23.579097747802734 +13.799886703491211 6 23.763267517089844 +14.220818519592285 6 23.876054763793945 +14.654937744140625 6 23.914035797119141 +15.089056968688965 6 23.876054763793945 +14.220818519592285 6 26.452016830444336 +13.799886703491211 6 26.564804077148438 +13.404939651489258 6 26.748971939086914 +13.047970771789551 6 26.998924255371094 +14.654937744140625 6 26.414035797119141 +12.739826202392578 6 27.30706787109375 +12.489873886108398 6 27.664035797119141 +12.305706977844238 6 28.058984756469727 +12.192919731140137 6 29.348155975341797 +7.1076564788818359 6 32.664035797119141 +12.154936790466309 6 28.914035797119141 +12.192919731140137 6 28.479915618896484 +16.570051193237305 6 27.30706787109375 +16.261907577514648 6 26.998924255371094 +15.904938697814941 6 26.748971939086914 +12.739826202392578 6 30.521005630493164 +13.047970771789551 6 30.829147338867188 +15.509988784790039 6 26.564804077148438 +15.089056968688965 6 26.452016830444336 +12.305706977844238 6 29.769084930419922 +12.489873886108398 6 30.164035797119141 +13.404939651489258 6 31.079097747802734 +13.799886703491211 6 31.263269424438477 +14.220818519592285 6 31.376056671142578 +17.116958618164062 6 28.479915618896484 +17.004169464111328 6 28.058984756469727 +16.820001602172852 6 27.664035797119141 +14.654937744140625 6 31.414035797119141 +15.089056968688965 6 31.376056671142578 +15.509988784790039 6 31.263269424438477 +15.904938697814941 6 31.079097747802734 +16.261907577514648 6 30.829147338867188 +16.570051193237305 6 30.521005630493164 +16.820001602172852 6 30.164035797119141 +17.004169464111328 6 29.769084930419922 +17.116958618164062 6 29.348155975341797 +17.154937744140625 6 28.914035797119141 +14.654937744140625 6 33.914035797119141 +14.654937744140625 6 38.914035797119141 +15.089056968688965 6 38.876056671142578 +16.261907577514648 6 38.329147338867188 +16.570051193237305 6 38.021007537841797 +16.820001602172852 6 37.664031982421875 +12.192919731140137 6 36.848155975341797 +7.1076564788818359 6 40.164035797119141 +12.154936790466309 6 36.414035797119141 +12.739826202392578 6 38.021007537841797 +13.047970771789551 6 38.329147338867188 +14.220818519592285 6 33.952014923095703 +13.799886703491211 6 34.064804077148438 +13.404939651489258 6 34.248970031738281 +13.047970771789551 6 34.498924255371094 +12.739826202392578 6 34.80706787109375 +12.489873886108398 6 35.164035797119141 +12.305706977844238 6 37.269084930419922 +12.489873886108398 6 37.664031982421875 +14.220818519592285 6 38.876056671142578 +15.509988784790039 6 38.763267517089844 +15.904938697814941 6 38.579097747802734 +12.305706977844238 6 35.558982849121094 +12.192919731140137 6 35.979915618896484 +13.404939651489258 6 38.579097747802734 +13.799886703491211 6 38.763267517089844 +16.820001602172852 6 35.164035797119141 +17.004169464111328 6 35.558982849121094 +17.116958618164062 6 35.979915618896484 +16.570051193237305 6 34.80706787109375 +16.261907577514648 6 34.498924255371094 +15.904938697814941 6 34.248970031738281 +17.004169464111328 6 37.269084930419922 +17.116958618164062 6 36.848155975341797 +17.154937744140625 6 36.414035797119141 +15.509988784790039 6 34.064804077148438 +15.089056968688965 6 33.952014923095703 +14.220818519592285 6 41.452014923095703 +13.799886703491211 6 41.564804077148438 +13.404939651489258 6 41.748970031738281 +14.654937744140625 6 41.414035797119141 +13.047970771789551 6 41.998924255371094 +12.739826202392578 6 42.30706787109375 +12.489873886108398 6 42.664035797119141 +12.192919731140137 6 44.348155975341797 +7.1076564788818359 6 47.664035797119141 +12.154936790466309 6 43.914035797119141 +12.305706977844238 6 43.058982849121094 +12.192919731140137 6 43.479915618896484 +12.739826202392578 6 45.521007537841797 +13.047970771789551 6 45.829147338867188 +16.570051193237305 6 42.30706787109375 +16.261907577514648 6 41.998924255371094 +15.904938697814941 6 41.748970031738281 +12.305706977844238 6 44.769084930419922 +12.489873886108398 6 45.164031982421875 +15.509988784790039 6 41.564804077148438 +15.089056968688965 6 41.452014923095703 +13.404939651489258 6 46.079097747802734 +13.799886703491211 6 46.263267517089844 +14.220818519592285 6 46.376052856445312 +17.116958618164062 6 43.479915618896484 +17.004169464111328 6 43.058982849121094 +16.820001602172852 6 42.664035797119141 +14.654937744140625 6 46.414035797119141 +15.089056968688965 6 46.376052856445312 +15.509988784790039 6 46.263267517089844 +15.904938697814941 6 46.079097747802734 +16.261907577514648 6 45.829147338867188 +16.570051193237305 6 45.521007537841797 +16.820001602172852 6 45.164031982421875 +17.004169464111328 6 44.769084930419922 +17.116958618164062 6 44.348155975341797 +17.154937744140625 6 43.914035797119141 +12.154936790466309 6 51.414035797119141 +12.192919731140137 6 51.848155975341797 +14.654937744140625 6 48.914035797119141 +7.1076564788818359 6 62.664031982421875 +12.305706977844238 6 52.269084930419922 +12.489873886108398 6 52.664035797119141 +12.192919731140137 6 58.479915618896484 +12.154936790466309 6 58.914035797119141 +16.261907577514648 6 60.829147338867188 +16.570051193237305 6 60.521007537841797 +16.820001602172852 6 60.164035797119141 +17.004169464111328 6 59.769084930419922 +14.220818519592285 6 48.952018737792969 +13.799886703491211 6 49.064804077148438 +13.404939651489258 6 49.248970031738281 +13.047970771789551 6 49.498924255371094 +12.739826202392578 6 49.80706787109375 +12.489873886108398 6 50.164035797119141 +13.799886703491211 6 56.564804077148438 +13.404939651489258 6 56.748970031738281 +13.047970771789551 6 56.998924255371094 +12.739826202392578 6 57.307064056396484 +12.489873886108398 6 57.664035797119141 +12.305706977844238 6 58.058982849121094 +12.192919731140137 6 59.348155975341797 +12.305706977844238 6 59.769084930419922 +12.489873886108398 6 60.164035797119141 +12.739826202392578 6 60.521007537841797 +13.047970771789551 6 60.829147338867188 +13.404939651489258 6 61.0791015625 +15.089056968688965 6 61.376052856445312 +15.509988784790039 6 61.263267517089844 +15.904938697814941 6 61.0791015625 +17.004169464111328 6 58.058982849121094 +16.820001602172852 6 57.664035797119141 +16.570051193237305 6 57.307064056396484 +16.261907577514648 6 56.998924255371094 +12.305706977844238 6 50.558982849121094 +12.192919731140137 6 50.979915618896484 +13.799886703491211 6 61.263267517089844 +14.220818519592285 6 61.376052856445312 +14.654937744140625 6 61.414035797119141 +15.904938697814941 6 53.579097747802734 +16.261907577514648 6 53.329147338867188 +16.570051193237305 6 53.021007537841797 +17.116958618164062 6 59.348155975341797 +17.154937744140625 6 58.914035797119141 +17.116958618164062 6 58.479915618896484 +12.739826202392578 6 53.021007537841797 +14.654937744140625 6 56.414035797119141 +14.220818519592285 6 56.452018737792969 +15.089056968688965 6 56.452018737792969 +15.509988784790039 6 53.763267517089844 +15.509988784790039 6 56.564804077148438 +15.904938697814941 6 56.748970031738281 +13.047970771789551 6 53.329147338867188 +13.404939651489258 6 53.579097747802734 +13.799886703491211 6 53.763267517089844 +14.220818519592285 6 53.876052856445312 +14.654937744140625 6 53.914035797119141 +15.089056968688965 6 53.876052856445312 +16.820001602172852 6 52.664035797119141 +17.004169464111328 6 52.269084930419922 +17.116958618164062 6 51.848155975341797 +17.154937744140625 6 51.414035797119141 +17.116958618164062 6 50.979915618896484 +17.004169464111328 6 50.558982849121094 +16.820001602172852 6 50.164035797119141 +16.570051193237305 6 49.80706787109375 +16.261907577514648 6 49.498924255371094 +15.904938697814941 6 49.248970031738281 +15.509988784790039 6 49.064804077148438 +15.089056968688965 6 48.952018737792969 +12.305706977844238 6 67.269088745117188 +12.489873886108398 6 67.664031982421875 +7.1076564788818359 6 70.164039611816406 +17.004169464111328 6 65.558982849121094 +16.820001602172852 6 65.164039611816406 +14.654937744140625 6 63.914039611816406 +14.220818519592285 6 63.952014923095703 +13.799886703491211 6 64.064804077148438 +12.739826202392578 6 68.021003723144531 +13.047970771789551 6 68.329147338867188 +13.404939651489258 6 68.5791015625 +12.739826202392578 6 64.80706787109375 +12.489873886108398 6 65.164039611816406 +12.305706977844238 6 65.558982849121094 +12.192919731140137 6 65.979911804199219 +12.154936790466309 6 66.414039611816406 +12.192919731140137 6 66.848159790039062 +16.570051193237305 6 64.80706787109375 +16.261907577514648 6 64.498924255371094 +15.904938697814941 6 64.248970031738281 +13.404939651489258 6 64.248970031738281 +13.047970771789551 6 64.498924255371094 +15.089056968688965 6 68.876060485839844 +15.509988784790039 6 68.763267517089844 +15.904938697814941 6 68.5791015625 +16.261907577514648 6 68.329147338867188 +15.509988784790039 6 64.064804077148438 +15.089056968688965 6 63.952014923095703 +13.799886703491211 6 68.763267517089844 +14.220818519592285 6 68.876060485839844 +14.654937744140625 6 68.914031982421875 +16.570051193237305 6 68.021003723144531 +16.820001602172852 6 67.664031982421875 +17.004169464111328 6 67.269088745117188 +17.116958618164062 6 66.848159790039062 +17.154937744140625 6 66.414039611816406 +17.116958618164062 6 65.979911804199219 +12.305706977844238 6 74.769088745117188 +12.489873886108398 6 75.164031982421875 +17.004169464111328 6 73.058982849121094 +16.820001602172852 6 72.664039611816406 +14.654937744140625 6 71.414039611816406 +14.220818519592285 6 71.452011108398438 +13.799886703491211 6 71.564811706542969 +12.739826202392578 6 75.521003723144531 +13.047970771789551 6 75.829147338867188 +13.404939651489258 6 76.0791015625 +12.739826202392578 6 72.30706787109375 +12.489873886108398 6 72.664039611816406 +12.305706977844238 6 73.058982849121094 +12.192919731140137 6 73.479911804199219 +12.154936790466309 6 73.914039611816406 +12.192919731140137 6 74.348152160644531 +16.570051193237305 6 72.30706787109375 +16.261907577514648 6 71.998924255371094 +15.904938697814941 6 71.748970031738281 +13.404939651489258 6 71.748970031738281 +13.047970771789551 6 71.998924255371094 +15.089056968688965 6 76.376052856445312 +15.509988784790039 6 76.263267517089844 +15.904938697814941 6 76.0791015625 +16.261907577514648 6 75.829147338867188 +15.509988784790039 6 71.564811706542969 +15.089056968688965 6 71.452011108398438 +13.799886703491211 6 76.263267517089844 +14.220818519592285 6 76.376052856445312 +14.654937744140625 6 76.414031982421875 +16.570051193237305 6 75.521003723144531 +16.820001602172852 6 75.164031982421875 +17.004169464111328 6 74.769088745117188 +17.116958618164062 6 74.348152160644531 +17.154937744140625 6 73.914039611816406 +17.116958618164062 6 73.479911804199219 +2.0603723526000977 6 84.270713806152344 +2.0603723526000977 6 77.664031982421875 +2.0603723526000977 6 70.164039611816406 +2.0603723526000977 6 62.664031982421875 +2.0603723526000977 6 47.664035797119141 +2.0603723526000977 6 40.164035797119141 +2.0603723526000977 6 32.664035797119141 +2.0603723526000977 6 25.164035797119141 +2.0603723526000977 6 17.664035797119141 +2.0603723526000977 6 9.7292852401733398 +94.060379028320312 6 9.5602426528930664 +94.060379028320312 6 9.7292852401733398 +94.060379028320312 6 84.43975830078125 +94.060379028320312 6 84.270713806152344 +0.060375779867172241 6 9.5602426528930664 +0.060375779867172241 6 9.7292852401733398 +0.060375779867172241 6 84.43975830078125 +0.060375779867172241 6 84.270713806152344 +9.9235658645629883 -3.4694469519536142e-15 84.270713806152344 +2.0603723526000977 0 84.270713806152344 +9.9235658645629883 0 92 +0 6 84.270713806152344 +0.060375779867172241 0 84.270713806152344 +0 0 84.270713806152344 +84.197181701660156 0 84.270713806152344 +92.060371398925781 0 84.270713806152344 +84.197181701660156 0 92 +94.120750427246094 6 84.270713806152344 +94.120750427246094 0 84.270713806152344 +94.060379028320312 0 84.270713806152344 +84.197181701660156 -3.4694469519536142e-15 9.7292852401733398 +84.197181701660156 0 1.9999966621398926 +92.060371398925781 0 9.7292852401733398 +94.120750427246094 6 9.7292852401733398 +94.060379028320312 0 9.7292852401733398 +94.120750427246094 0 9.7292852401733398 +2.0603723526000977 0 9.7292852401733398 +9.9235658645629883 0 9.7292852401733398 +9.9235658645629883 0 1.9999966621398926 +0 6 9.7292852401733398 +0 0 9.7292852401733398 +0.060375779867172241 0 9.7292852401733398 +3 0 1 2 +3 3 4 5 +3 6 7 8 +3 8 7 9 +3 8 9 10 +3 10 9 5 +3 10 5 11 +3 11 5 4 +3 12 13 14 +3 14 13 15 +3 16 14 17 +3 17 14 15 +3 17 15 18 +3 18 15 19 +3 20 21 22 +3 23 24 19 +3 19 24 25 +3 26 27 28 +3 27 29 28 +3 28 29 30 +3 28 30 22 +3 22 30 31 +3 22 31 32 +3 25 33 19 +3 19 33 34 +3 19 34 35 +3 32 36 22 +3 22 36 37 +3 22 37 38 +3 39 40 28 +3 28 40 41 +3 28 41 26 +3 38 42 22 +3 22 42 43 +3 22 43 20 +3 35 44 19 +3 19 44 45 +3 19 45 18 +3 18 45 46 +3 46 47 18 +3 18 47 48 +3 18 48 49 +3 49 50 18 +3 18 50 51 +3 18 51 52 +3 52 51 53 +3 52 53 54 +3 54 53 55 +3 54 55 56 +3 56 55 57 +3 56 57 58 +3 58 57 59 +3 58 59 60 +3 60 59 61 +3 60 61 28 +3 28 61 62 +3 28 62 39 +3 63 64 65 +3 66 67 68 +3 69 70 63 +3 63 70 71 +3 72 73 74 +3 74 73 66 +3 74 66 75 +3 75 66 68 +3 76 77 78 +3 78 77 67 +3 78 67 79 +3 79 67 66 +3 71 80 63 +3 63 80 81 +3 63 81 82 +3 83 84 85 +3 76 86 77 +3 77 86 87 +3 77 87 88 +3 87 89 88 +3 88 89 90 +3 88 90 82 +3 90 91 82 +3 82 91 92 +3 82 92 63 +3 63 92 93 +3 63 93 64 +3 65 94 63 +3 63 94 95 +3 63 95 96 +3 97 98 99 +3 99 98 100 +3 99 100 101 +3 101 102 99 +3 99 102 103 +3 99 103 104 +3 105 106 107 +3 107 106 73 +3 107 73 108 +3 108 73 72 +3 109 99 110 +3 110 99 111 +3 84 112 85 +3 85 112 113 +3 85 113 114 +3 109 115 99 +3 99 115 116 +3 99 116 117 +3 118 119 120 +3 120 119 121 +3 120 121 122 +3 122 121 123 +3 122 123 124 +3 124 123 125 +3 124 125 69 +3 69 125 126 +3 69 126 70 +3 114 127 85 +3 85 127 128 +3 85 128 129 +3 105 130 106 +3 106 130 131 +3 106 131 104 +3 104 131 99 +3 99 131 132 +3 99 132 111 +3 96 133 63 +3 63 133 134 +3 63 134 85 +3 85 134 135 +3 85 135 83 +3 116 136 117 +3 117 136 137 +3 117 137 138 +3 138 137 139 +3 138 139 140 +3 140 139 141 +3 140 141 142 +3 142 141 143 +3 142 143 144 +3 144 143 145 +3 144 145 146 +3 146 145 147 +3 146 147 118 +3 118 147 148 +3 118 148 119 +3 149 150 151 +3 152 153 154 +3 155 156 157 +3 157 156 158 +3 157 158 159 +3 160 161 162 +3 162 161 163 +3 162 163 164 +3 164 163 165 +3 164 165 166 +3 166 165 167 +3 166 167 151 +3 151 167 168 +3 151 168 149 +3 169 170 157 +3 159 171 157 +3 157 171 172 +3 157 172 154 +3 154 172 173 +3 154 173 152 +3 153 174 154 +3 154 174 175 +3 154 175 176 +3 150 177 151 +3 151 177 178 +3 151 178 179 +3 179 178 180 +3 180 181 179 +3 179 181 182 +3 179 182 183 +3 170 184 157 +3 157 184 185 +3 157 185 155 +3 176 186 154 +3 154 186 187 +3 154 187 188 +3 188 187 189 +3 188 189 160 +3 160 189 190 +3 160 190 161 +3 183 191 179 +3 179 191 192 +3 179 192 193 +3 194 151 195 +3 195 151 196 +3 195 196 197 +3 198 199 200 +3 201 202 99 +3 99 202 203 +3 99 203 204 +3 204 205 99 +3 99 205 85 +3 99 85 97 +3 97 85 129 +3 198 200 206 +3 199 207 200 +3 200 207 208 +3 200 208 99 +3 99 208 209 +3 99 209 210 +3 210 211 99 +3 99 211 212 +3 99 212 201 +3 213 214 215 +3 85 216 217 +3 214 218 215 +3 215 218 219 +3 215 219 220 +3 221 222 200 +3 220 223 215 +3 215 223 224 +3 215 224 225 +3 222 226 200 +3 200 226 227 +3 200 227 206 +3 205 228 85 +3 85 228 229 +3 85 229 230 +3 230 231 85 +3 85 231 232 +3 85 232 216 +3 217 233 85 +3 85 233 234 +3 85 234 215 +3 215 234 235 +3 215 235 213 +3 236 237 238 +3 239 240 200 +3 200 240 241 +3 200 241 242 +3 242 243 200 +3 200 243 215 +3 200 215 221 +3 221 215 225 +3 237 244 238 +3 238 244 245 +3 238 245 246 +3 246 247 238 +3 238 247 248 +3 238 248 200 +3 200 248 249 +3 200 249 250 +3 250 251 200 +3 200 251 252 +3 200 252 239 +3 215 253 254 +3 255 256 257 +3 257 256 258 +3 257 258 259 +3 259 260 257 +3 257 260 261 +3 257 261 262 +3 243 263 215 +3 215 263 264 +3 215 264 265 +3 265 266 215 +3 215 266 267 +3 215 267 253 +3 254 268 215 +3 215 268 269 +3 215 269 257 +3 257 269 270 +3 257 270 255 +3 262 271 257 +3 257 271 272 +3 257 272 238 +3 238 272 273 +3 238 273 236 +3 274 275 238 +3 276 277 278 +3 278 277 279 +3 279 280 278 +3 278 280 281 +3 278 281 282 +3 283 284 285 +3 285 284 286 +3 282 287 278 +3 278 287 288 +3 278 288 238 +3 238 288 289 +3 238 289 274 +3 275 290 238 +3 238 290 291 +3 238 291 292 +3 292 293 238 +3 238 293 294 +3 238 294 257 +3 257 294 295 +3 257 295 296 +3 296 297 257 +3 257 297 298 +3 257 298 299 +3 299 300 257 +3 257 300 301 +3 257 301 302 +3 286 303 285 +3 285 303 304 +3 285 304 305 +3 306 307 285 +3 285 307 308 +3 285 308 283 +3 305 309 285 +3 285 309 310 +3 285 310 278 +3 278 310 311 +3 278 311 276 +3 312 313 314 +3 315 316 285 +3 285 316 317 +3 285 317 318 +3 312 314 319 +3 318 320 285 +3 285 320 321 +3 285 321 322 +3 313 323 314 +3 314 323 324 +3 314 324 325 +3 278 326 327 +3 328 329 326 +3 326 329 330 +3 326 330 327 +3 327 331 278 +3 278 331 332 +3 278 332 333 +3 325 334 314 +3 314 334 335 +3 314 335 336 +3 333 337 278 +3 278 337 338 +3 278 338 339 +3 339 340 278 +3 278 340 341 +3 278 341 285 +3 285 341 342 +3 285 342 315 +3 336 343 314 +3 314 343 344 +3 314 344 326 +3 344 345 326 +3 326 345 346 +3 326 346 347 +3 347 348 326 +3 326 348 349 +3 326 349 328 +3 350 351 352 +3 353 354 355 +3 350 352 356 +3 357 358 314 +3 359 360 361 +3 362 363 314 +3 314 363 364 +3 364 365 314 +3 314 365 366 +3 314 366 357 +3 358 367 314 +3 314 367 368 +3 314 368 356 +3 356 368 359 +3 356 359 369 +3 369 359 361 +3 351 370 352 +3 352 370 371 +3 352 371 372 +3 373 374 326 +3 375 376 326 +3 326 376 377 +3 353 355 378 +3 379 380 381 +3 381 380 382 +3 381 382 383 +3 382 384 383 +3 383 384 385 +3 383 385 359 +3 359 385 386 +3 359 386 360 +3 372 387 352 +3 352 387 388 +3 352 388 389 +3 354 390 355 +3 355 390 391 +3 355 391 326 +3 326 391 392 +3 326 392 373 +3 389 393 352 +3 352 393 394 +3 352 394 355 +3 394 395 355 +3 355 395 396 +3 355 396 397 +3 397 398 355 +3 355 398 399 +3 355 399 378 +3 377 400 326 +3 326 400 401 +3 326 401 402 +3 402 403 326 +3 326 403 404 +3 326 404 405 +3 405 406 326 +3 326 406 407 +3 326 407 314 +3 314 407 408 +3 314 408 362 +3 409 374 410 +3 409 411 374 +3 374 411 412 +3 374 412 326 +3 326 412 413 +3 326 413 375 +3 379 414 380 +3 380 414 415 +3 380 415 416 +3 417 418 419 +3 419 418 409 +3 419 409 420 +3 420 409 410 +3 416 421 380 +3 380 421 422 +3 380 422 417 +3 417 422 423 +3 417 423 418 +3 424 425 352 +3 352 425 426 +3 352 426 427 +3 428 429 430 +3 430 429 431 +3 430 431 432 +3 355 433 434 +3 435 436 352 +3 352 436 437 +3 437 438 352 +3 352 438 439 +3 352 439 424 +3 434 440 355 +3 355 440 441 +3 355 441 442 +3 443 444 433 +3 433 444 445 +3 433 445 434 +3 442 446 355 +3 355 446 447 +3 355 447 448 +3 448 449 355 +3 355 449 450 +3 355 450 352 +3 352 450 451 +3 352 451 435 +3 432 452 430 +3 430 452 453 +3 430 453 454 +3 454 455 430 +3 430 455 456 +3 430 456 433 +3 456 457 433 +3 433 457 458 +3 433 458 459 +3 459 460 433 +3 433 460 461 +3 433 461 443 +3 462 463 430 +3 430 463 464 +3 464 465 430 +3 430 465 466 +3 430 466 467 +3 467 466 468 +3 467 468 469 +3 470 471 430 +3 430 471 472 +3 430 472 462 +3 473 474 475 +3 476 477 433 +3 469 478 467 +3 467 478 479 +3 467 479 480 +3 480 481 467 +3 467 481 482 +3 467 482 483 +3 475 484 485 +3 485 486 475 +3 475 486 487 +3 475 487 433 +3 433 487 488 +3 433 488 489 +3 477 490 433 +3 433 490 491 +3 433 491 430 +3 430 491 492 +3 430 492 470 +3 483 493 467 +3 467 493 494 +3 467 494 475 +3 475 494 495 +3 475 495 473 +3 474 496 475 +3 475 496 497 +3 475 497 484 +3 489 498 433 +3 433 498 499 +3 433 499 476 +3 500 501 22 +3 22 501 502 +3 503 504 475 +3 475 505 506 +3 507 467 508 +3 508 467 475 +3 508 475 509 +3 509 475 506 +3 467 510 511 +3 504 512 475 +3 475 512 513 +3 475 513 505 +3 507 514 467 +3 467 514 515 +3 467 515 510 +3 511 516 467 +3 467 516 517 +3 467 517 518 +3 502 519 22 +3 22 519 520 +3 22 520 521 +3 518 522 467 +3 467 522 523 +3 467 523 22 +3 22 523 524 +3 22 524 500 +3 525 526 28 +3 526 527 28 +3 28 527 528 +3 28 528 529 +3 521 530 22 +3 22 530 531 +3 22 531 28 +3 28 531 532 +3 28 532 525 +3 529 533 28 +3 28 533 534 +3 28 534 475 +3 475 534 535 +3 475 535 503 +3 536 537 538 +3 539 540 63 +3 63 540 541 +3 542 543 85 +3 85 543 544 +3 85 544 545 +3 545 546 85 +3 85 546 547 +3 85 547 63 +3 63 547 548 +3 63 548 539 +3 541 549 63 +3 63 549 550 +3 63 550 551 +3 551 552 63 +3 63 552 553 +3 63 553 538 +3 538 553 554 +3 538 554 536 +3 555 556 538 +3 538 556 557 +3 537 558 538 +3 538 558 559 +3 538 559 555 +3 560 561 562 +3 562 561 563 +3 562 563 564 +3 564 565 562 +3 562 565 566 +3 562 566 567 +3 568 569 85 +3 85 569 570 +3 85 570 542 +3 567 571 562 +3 562 571 572 +3 562 572 85 +3 85 572 573 +3 85 573 568 +3 574 575 215 +3 576 577 578 +3 578 577 579 +3 574 215 580 +3 581 582 85 +3 85 582 583 +3 85 583 584 +3 575 585 215 +3 215 585 586 +3 215 586 85 +3 85 586 587 +3 85 587 588 +3 588 589 85 +3 85 589 590 +3 85 590 581 +3 562 591 592 +3 584 593 85 +3 85 593 594 +3 85 594 562 +3 562 594 595 +3 562 595 591 +3 579 596 578 +3 578 596 597 +3 578 597 598 +3 599 600 215 +3 215 600 601 +3 215 601 580 +3 592 602 562 +3 562 602 603 +3 562 603 604 +3 604 605 562 +3 562 605 606 +3 562 606 578 +3 578 606 607 +3 578 607 576 +3 598 608 578 +3 578 608 609 +3 578 609 215 +3 215 609 610 +3 215 610 599 +3 611 612 257 +3 613 614 615 +3 615 614 616 +3 611 257 617 +3 618 619 215 +3 215 619 620 +3 215 620 621 +3 612 622 257 +3 257 622 623 +3 257 623 215 +3 215 623 624 +3 215 624 625 +3 625 626 215 +3 215 626 627 +3 215 627 618 +3 578 628 629 +3 621 630 215 +3 215 630 631 +3 215 631 578 +3 578 631 632 +3 578 632 628 +3 616 633 615 +3 615 633 634 +3 615 634 635 +3 636 637 257 +3 257 637 638 +3 257 638 617 +3 629 639 578 +3 578 639 640 +3 578 640 641 +3 641 642 578 +3 578 642 643 +3 578 643 615 +3 615 643 644 +3 615 644 613 +3 635 645 615 +3 615 645 646 +3 615 646 257 +3 257 646 647 +3 257 647 636 +3 648 649 615 +3 615 649 650 +3 651 652 285 +3 285 652 257 +3 285 257 306 +3 306 257 302 +3 653 654 655 +3 654 656 655 +3 655 656 657 +3 655 657 658 +3 652 659 257 +3 257 659 660 +3 257 660 661 +3 661 662 257 +3 257 662 663 +3 257 663 664 +3 665 666 615 +3 615 666 667 +3 667 668 615 +3 615 668 669 +3 615 669 648 +3 670 671 285 +3 285 671 672 +3 285 672 651 +3 664 673 257 +3 257 673 674 +3 257 674 615 +3 615 674 675 +3 615 675 665 +3 658 676 655 +3 655 676 677 +3 655 677 678 +3 678 679 655 +3 655 679 680 +3 655 680 285 +3 285 680 681 +3 285 681 682 +3 682 683 285 +3 285 683 684 +3 285 684 670 +3 685 686 655 +3 687 688 689 +3 689 688 690 +3 691 692 314 +3 314 692 285 +3 314 285 319 +3 319 285 322 +3 690 693 689 +3 689 693 694 +3 689 694 695 +3 692 696 285 +3 285 696 697 +3 285 697 698 +3 698 699 285 +3 285 699 700 +3 285 700 701 +3 702 703 655 +3 655 703 704 +3 704 705 655 +3 655 705 706 +3 655 706 685 +3 707 708 314 +3 314 708 709 +3 314 709 691 +3 701 710 285 +3 285 710 711 +3 285 711 655 +3 655 711 712 +3 655 712 702 +3 695 713 689 +3 689 713 714 +3 689 714 715 +3 715 716 689 +3 689 716 717 +3 689 717 314 +3 314 717 718 +3 314 718 719 +3 719 720 314 +3 314 720 721 +3 314 721 707 +3 356 352 314 +3 314 352 722 +3 314 722 723 +3 724 725 689 +3 726 727 728 +3 728 727 689 +3 728 689 729 +3 729 689 725 +3 730 731 689 +3 689 731 732 +3 732 733 689 +3 689 733 734 +3 689 734 724 +3 726 735 736 +3 737 314 738 +3 738 314 723 +3 738 723 739 +3 740 741 742 +3 742 741 743 +3 742 743 744 +3 736 745 726 +3 726 745 746 +3 726 746 727 +3 727 746 747 +3 727 747 748 +3 737 749 314 +3 314 749 750 +3 314 750 751 +3 748 752 727 +3 727 752 753 +3 727 753 754 +3 751 755 314 +3 314 755 756 +3 314 756 757 +3 757 758 314 +3 314 758 759 +3 314 759 689 +3 689 759 760 +3 689 760 730 +3 743 761 744 +3 744 761 762 +3 744 762 726 +3 726 762 763 +3 726 763 735 +3 764 765 352 +3 352 765 766 +3 352 766 722 +3 739 767 738 +3 738 767 768 +3 738 768 769 +3 769 768 770 +3 754 771 727 +3 727 771 772 +3 727 772 773 +3 774 768 775 +3 774 776 768 +3 768 776 777 +3 768 777 770 +3 773 778 727 +3 727 778 779 +3 727 779 352 +3 779 780 352 +3 352 780 781 +3 352 781 782 +3 782 783 352 +3 352 783 784 +3 352 784 764 +3 740 785 741 +3 741 785 786 +3 741 786 787 +3 788 789 790 +3 790 789 774 +3 790 774 791 +3 791 774 775 +3 787 792 741 +3 741 792 793 +3 741 793 788 +3 788 793 794 +3 788 794 789 +3 795 796 727 +3 797 352 430 +3 430 352 427 +3 430 427 428 +3 795 727 798 +3 799 800 801 +3 801 800 802 +3 797 803 352 +3 352 803 804 +3 352 804 805 +3 806 807 727 +3 727 807 808 +3 808 809 727 +3 727 809 810 +3 727 810 798 +3 802 811 801 +3 801 811 812 +3 801 812 813 +3 805 814 352 +3 352 814 815 +3 352 815 816 +3 816 817 352 +3 352 817 818 +3 352 818 727 +3 727 818 819 +3 727 819 806 +3 820 821 430 +3 430 821 822 +3 430 822 797 +3 813 823 801 +3 801 823 824 +3 801 824 825 +3 826 827 430 +3 430 827 828 +3 430 828 829 +3 829 830 430 +3 430 830 831 +3 430 831 820 +3 832 833 430 +3 430 833 834 +3 834 835 430 +3 430 835 801 +3 430 801 826 +3 826 801 825 +3 801 836 837 +3 838 839 840 +3 840 839 841 +3 842 843 430 +3 430 843 844 +3 430 844 832 +3 837 845 801 +3 801 845 846 +3 801 846 839 +3 839 846 847 +3 839 847 841 +3 848 467 849 +3 849 467 850 +3 851 852 467 +3 835 853 801 +3 801 853 854 +3 801 854 855 +3 855 856 801 +3 801 856 857 +3 801 857 836 +3 838 858 839 +3 839 858 859 +3 839 859 860 +3 860 861 839 +3 839 861 862 +3 839 862 467 +3 467 862 863 +3 467 863 850 +3 852 864 467 +3 467 864 865 +3 467 865 430 +3 430 865 866 +3 430 866 842 +3 848 867 467 +3 467 867 868 +3 467 868 851 +3 869 870 871 +3 872 873 467 +3 874 875 467 +3 875 876 467 +3 467 876 877 +3 467 877 839 +3 839 877 878 +3 839 878 879 +3 873 880 467 +3 467 880 881 +3 467 881 874 +3 882 22 883 +3 883 22 884 +3 879 885 839 +3 839 885 886 +3 839 886 887 +3 870 888 871 +3 871 888 889 +3 871 889 890 +3 890 891 871 +3 871 891 892 +3 871 892 22 +3 22 892 893 +3 22 893 884 +3 887 894 839 +3 839 894 895 +3 839 895 896 +3 896 897 839 +3 839 897 898 +3 839 898 871 +3 871 898 899 +3 871 899 869 +3 900 901 22 +3 22 901 902 +3 22 902 467 +3 467 902 903 +3 467 903 872 +3 882 904 22 +3 22 904 905 +3 22 905 900 +3 906 907 908 +3 538 909 910 +3 910 909 911 +3 907 912 908 +3 908 912 913 +3 908 913 914 +3 915 916 908 +3 910 917 918 +3 916 919 908 +3 908 919 920 +3 908 920 906 +3 921 922 562 +3 562 922 923 +3 562 923 924 +3 924 925 562 +3 562 925 926 +3 562 926 927 +3 928 538 562 +3 562 538 557 +3 562 557 560 +3 911 929 910 +3 910 929 930 +3 910 930 917 +3 927 931 562 +3 562 931 932 +3 562 932 928 +3 918 933 910 +3 910 933 934 +3 910 934 935 +3 928 936 538 +3 538 936 937 +3 538 937 938 +3 938 939 538 +3 538 939 940 +3 538 940 941 +3 941 942 538 +3 538 942 943 +3 538 943 909 +3 944 908 562 +3 562 908 914 +3 562 914 921 +3 945 946 562 +3 562 946 947 +3 948 949 562 +3 562 949 950 +3 562 950 945 +3 947 951 562 +3 562 951 952 +3 562 952 944 +3 944 953 908 +3 908 953 954 +3 908 954 955 +3 955 956 908 +3 908 956 957 +3 908 957 958 +3 959 960 961 +3 961 960 962 +3 958 963 908 +3 908 963 964 +3 908 964 961 +3 961 964 965 +3 961 965 959 +3 962 966 961 +3 961 966 967 +3 961 967 968 +3 968 969 961 +3 961 969 970 +3 961 970 578 +3 578 970 971 +3 971 972 578 +3 578 972 973 +3 578 973 974 +3 974 975 578 +3 578 975 976 +3 578 976 977 +3 977 978 578 +3 578 978 979 +3 578 979 562 +3 562 979 980 +3 562 980 948 +3 981 982 578 +3 578 982 983 +3 578 983 984 +3 961 985 986 +3 987 988 578 +3 578 988 989 +3 578 989 981 +3 990 961 991 +3 991 961 578 +3 991 578 992 +3 992 578 984 +3 990 993 961 +3 961 993 994 +3 961 994 985 +3 995 996 997 +3 997 996 998 +3 997 998 999 +3 999 1000 997 +3 997 1000 1001 +3 997 1001 1002 +3 986 1003 961 +3 961 1003 1004 +3 961 1004 995 +3 1002 1005 997 +3 997 1005 1006 +3 997 1006 1007 +3 1007 1008 615 +3 1008 1009 615 +3 615 1009 1010 +3 615 1010 1011 +3 1011 1012 615 +3 615 1012 1013 +3 615 1013 1014 +3 1014 1015 615 +3 615 1015 1016 +3 615 1016 578 +3 578 1016 1017 +3 578 1017 987 +3 1018 1019 997 +3 997 1019 1020 +3 1021 1022 1023 +3 1023 1022 1024 +3 1007 615 997 +3 997 615 1025 +3 997 1025 1018 +3 1020 1026 997 +3 997 1026 1027 +3 997 1027 1028 +3 1028 1029 997 +3 997 1029 1030 +3 997 1030 1021 +3 1031 1032 655 +3 655 1032 615 +3 655 615 653 +3 653 615 650 +3 1032 1033 615 +3 615 1033 1034 +3 615 1034 1035 +3 1036 1037 655 +3 655 1037 1038 +3 655 1038 1031 +3 1035 1039 615 +3 615 1039 1040 +3 615 1040 1041 +3 1042 1043 655 +3 655 1043 1044 +3 655 1044 1036 +3 1041 1045 615 +3 615 1045 1046 +3 615 1046 1025 +3 1024 1047 1023 +3 1023 1047 1048 +3 1023 1048 1049 +3 1050 1051 655 +3 655 1051 1052 +3 655 1052 1042 +3 1049 1053 1023 +3 1023 1053 1054 +3 1023 1054 1050 +3 1055 1056 1023 +3 1050 655 1023 +3 1023 655 1057 +3 1023 1057 1055 +3 1056 1058 1023 +3 1023 1058 1059 +3 1023 1059 1060 +3 1061 1062 1063 +3 1062 1064 1063 +3 1063 1064 1065 +3 1063 1065 1066 +3 1060 1067 1023 +3 1023 1067 1068 +3 1023 1068 1061 +3 1069 1070 689 +3 689 1070 655 +3 689 655 687 +3 687 655 686 +3 689 1071 1072 +3 1070 1073 655 +3 655 1073 1074 +3 655 1074 1075 +3 1072 1076 689 +3 689 1076 1077 +3 689 1077 1069 +3 1075 1078 655 +3 655 1078 1079 +3 655 1079 1080 +3 1081 1082 689 +3 689 1082 1083 +3 689 1083 1071 +3 1080 1084 655 +3 655 1084 1085 +3 655 1085 1057 +3 1066 1086 1063 +3 1063 1086 1087 +3 1063 1087 1088 +3 1088 1089 1063 +3 1063 1089 1090 +3 1063 1090 689 +3 689 1090 1091 +3 689 1091 1081 +3 1092 1093 689 +3 1094 1095 727 +3 727 1095 1096 +3 727 1096 1097 +3 1063 1098 1099 +3 1099 1100 1063 +3 1063 1100 1101 +3 1063 1101 1102 +3 1103 1104 1105 +3 1102 1106 1063 +3 1063 1106 1107 +3 1063 1107 1108 +3 1109 1110 1063 +3 1063 1110 1111 +3 1063 1111 1112 +3 1112 1113 1063 +3 1063 1113 1114 +3 1063 1114 1115 +3 1115 1114 1116 +3 1115 1116 1117 +3 1118 1119 1115 +3 1115 1119 1120 +3 1115 1120 1121 +3 1122 727 1123 +3 1123 727 1115 +3 1123 1115 1124 +3 1124 1115 1121 +3 1122 1125 727 +3 727 1125 1126 +3 727 1126 1094 +3 1097 1127 727 +3 727 1127 1128 +3 727 1128 689 +3 689 1128 1129 +3 689 1129 1092 +3 1130 1131 1132 +3 1132 1131 1133 +3 1132 1133 1134 +3 689 1135 1136 +3 1137 1138 1109 +3 1117 1139 1115 +3 1115 1139 1140 +3 1115 1140 1118 +3 1105 1104 1141 +3 1135 689 1142 +3 1142 689 1093 +3 1142 1093 1134 +3 1134 1093 1143 +3 1134 1143 1132 +3 1137 1109 1144 +3 1105 1145 1103 +3 1103 1145 1146 +3 1103 1146 1147 +3 1147 1146 1109 +3 1147 1109 1148 +3 1148 1109 1138 +3 1136 1149 689 +3 689 1149 1150 +3 689 1150 1151 +3 1151 1152 689 +3 689 1152 1153 +3 689 1153 1154 +3 1104 1155 1141 +3 1141 1155 1156 +3 1141 1156 1157 +3 1157 1156 1130 +3 1157 1130 1158 +3 1158 1130 1132 +3 1154 1159 689 +3 689 1159 1160 +3 689 1160 1063 +3 1063 1160 1161 +3 1063 1161 1098 +3 1108 1162 1063 +3 1063 1162 1163 +3 1063 1163 1109 +3 1109 1163 1164 +3 1109 1164 1144 +3 801 1165 1166 +3 1166 1167 801 +3 801 1167 1168 +3 801 1168 1169 +3 1170 1171 1115 +3 1115 1171 1172 +3 1115 1172 1173 +3 1173 1174 1115 +3 1115 1174 1175 +3 1115 1175 1176 +3 1169 1177 801 +3 801 1177 727 +3 801 727 799 +3 799 727 796 +3 1178 1179 1180 +3 1181 801 1182 +3 1182 801 1180 +3 1182 1180 1183 +3 1181 1184 801 +3 801 1184 1185 +3 801 1185 1165 +3 1177 1186 727 +3 727 1186 1187 +3 727 1187 1188 +3 1188 1189 727 +3 727 1189 1190 +3 727 1190 1191 +3 1192 1180 1193 +3 1193 1180 1115 +3 1193 1115 1194 +3 1194 1115 1176 +3 1191 1195 727 +3 727 1195 1196 +3 727 1196 1115 +3 1115 1196 1197 +3 1115 1197 1170 +3 1179 1198 1180 +3 1180 1198 1199 +3 1180 1199 1183 +3 1192 1200 1180 +3 1180 1200 1201 +3 1180 1201 1178 +3 1202 1203 801 +3 1203 1204 801 +3 801 1204 1205 +3 801 1205 1180 +3 1180 1205 1206 +3 1180 1206 1207 +3 1208 1209 1180 +3 1180 1209 1210 +3 1211 1212 801 +3 801 1212 1213 +3 801 1213 1202 +3 1210 1214 1180 +3 1180 1214 1215 +3 1180 1215 1216 +3 1216 1215 1217 +3 1216 1217 1218 +3 1218 1219 1216 +3 1216 1219 1220 +3 1216 1220 1221 +3 1222 1223 1216 +3 1224 1225 839 +3 839 1225 1226 +3 839 1226 801 +3 801 1226 1227 +3 801 1227 1211 +3 1207 1228 1180 +3 1180 1228 1229 +3 1180 1229 1208 +3 1221 1230 1216 +3 1216 1230 1231 +3 1216 1231 1222 +3 1232 1233 839 +3 1233 1234 839 +3 839 1234 1235 +3 839 1235 1236 +3 1236 1237 839 +3 839 1237 1238 +3 839 1238 1224 +3 1239 1240 871 +3 1241 1242 839 +3 839 1243 1244 +3 1241 839 1245 +3 1242 1246 839 +3 839 1246 1216 +3 839 1216 1232 +3 1232 1216 1223 +3 1247 1216 1248 +3 1248 1216 1249 +3 871 1240 839 +3 839 1240 1250 +3 839 1250 1243 +3 1244 1251 839 +3 839 1251 1252 +3 839 1252 1245 +3 1246 1253 1216 +3 1216 1253 1254 +3 1216 1254 1255 +3 1255 1256 1216 +3 1216 1256 1257 +3 1216 1257 1249 +3 1247 1258 1216 +3 1216 1258 1259 +3 1216 1259 1260 +3 1260 1259 1261 +3 1261 1262 1260 +3 1260 1262 1263 +3 1260 1263 1264 +3 1265 1266 871 +3 871 1266 1267 +3 1264 1268 1260 +3 1260 1268 1269 +3 1260 1269 1270 +3 1270 1271 1260 +3 1260 1271 1272 +3 1260 1272 871 +3 871 1272 1273 +3 871 1273 1265 +3 1267 1274 871 +3 871 1274 1275 +3 871 1275 1239 +3 1276 1277 1278 +3 910 1279 1278 +3 1278 1279 1280 +3 1280 1281 1278 +3 1278 1281 1282 +3 1278 1282 1283 +3 1283 1284 1278 +3 1278 1284 1285 +3 1278 1285 1276 +3 1286 1287 1288 +3 1288 1287 1289 +3 1288 1289 1290 +3 1290 1291 1288 +3 1288 1291 1292 +3 1288 1292 1293 +3 1294 908 1295 +3 1295 908 1288 +3 1295 1288 1296 +3 1296 1288 1293 +3 1294 1297 908 +3 908 1297 1298 +3 908 1298 1299 +3 1299 1300 908 +3 908 1300 1301 +3 908 1301 1302 +3 1303 910 908 +3 908 910 935 +3 908 935 915 +3 1302 1304 908 +3 908 1304 1305 +3 908 1305 1303 +3 1303 1306 910 +3 910 1306 1307 +3 910 1307 1308 +3 1308 1309 910 +3 910 1309 1310 +3 910 1310 1311 +3 1311 1312 910 +3 910 1312 1313 +3 910 1313 1279 +3 1314 1315 1316 +3 1317 1318 1316 +3 1316 1318 1319 +3 1315 1320 1316 +3 1316 1320 1321 +3 1316 1321 1317 +3 1322 1323 961 +3 1324 1325 1288 +3 1325 1326 1288 +3 1288 1326 1327 +3 1288 1327 1328 +3 1328 1329 1288 +3 1288 1329 1330 +3 1288 1330 1316 +3 1316 1330 1331 +3 1316 1331 1314 +3 1323 1332 961 +3 961 1332 1333 +3 961 1333 1334 +3 1335 1336 908 +3 908 1336 1337 +3 908 1337 1288 +3 1288 1337 1338 +3 1288 1338 1324 +3 1339 1340 961 +3 961 1340 1341 +3 961 1341 1322 +3 1334 1342 961 +3 961 1342 1343 +3 961 1343 908 +3 908 1343 1344 +3 908 1344 1345 +3 1345 1346 908 +3 908 1346 1347 +3 908 1347 1348 +3 1348 1349 908 +3 908 1349 1350 +3 908 1350 1335 +3 1351 1352 1353 +3 1353 1352 1354 +3 1353 1354 1355 +3 1356 1357 961 +3 961 1357 1358 +3 961 1358 1359 +3 1360 1361 961 +3 961 1361 1316 +3 961 1316 1339 +3 1339 1316 1319 +3 1359 1362 961 +3 961 1362 1363 +3 961 1363 1360 +3 1361 1364 1316 +3 1316 1364 1365 +3 1316 1365 1366 +3 1366 1367 1316 +3 1316 1367 1368 +3 1316 1368 1369 +3 1369 1370 1316 +3 1316 1370 1371 +3 1316 1371 1351 +3 1372 1373 1353 +3 1353 1373 1374 +3 1353 1374 1375 +3 1355 1376 1353 +3 1353 1376 1377 +3 1353 1377 1372 +3 995 997 961 +3 961 997 1378 +3 961 1378 1356 +3 1379 1380 997 +3 997 1380 1381 +3 997 1381 1382 +3 1382 1383 997 +3 997 1383 1384 +3 997 1384 1385 +3 1385 1386 997 +3 997 1386 1387 +3 997 1387 1378 +3 1388 1389 1353 +3 1353 1389 1390 +3 1353 1390 1391 +3 1392 1393 997 +3 997 1393 1353 +3 997 1353 1379 +3 1379 1353 1375 +3 1391 1394 1395 +3 1394 1396 1395 +3 1395 1396 1397 +3 1395 1397 1398 +3 1393 1399 1353 +3 1353 1399 1400 +3 1353 1400 1401 +3 1401 1402 1353 +3 1353 1402 1403 +3 1353 1403 1388 +3 1398 1404 1395 +3 1395 1404 1405 +3 1395 1405 1406 +3 1407 1408 1023 +3 1408 1409 1023 +3 1023 1409 1410 +3 1023 1410 1411 +3 1411 1412 1023 +3 1023 1412 1413 +3 1023 1413 1414 +3 1021 1023 997 +3 997 1023 1415 +3 997 1415 1416 +3 1414 1417 1023 +3 1023 1417 1418 +3 1023 1418 1415 +3 997 1419 1420 +3 1416 1421 997 +3 997 1421 1422 +3 997 1422 1419 +3 1420 1423 997 +3 997 1423 1424 +3 997 1424 1392 +3 1425 1426 1395 +3 1395 1426 1427 +3 1428 1429 1023 +3 1023 1429 1395 +3 1023 1395 1407 +3 1407 1395 1406 +3 1430 1431 1432 +3 1432 1431 1433 +3 1432 1433 1434 +3 1429 1435 1395 +3 1395 1435 1436 +3 1395 1436 1437 +3 1437 1438 1395 +3 1395 1438 1439 +3 1395 1439 1425 +3 1434 1440 1432 +3 1432 1440 1441 +3 1432 1441 1442 +3 1442 1443 1432 +3 1432 1443 1444 +3 1432 1444 1445 +3 1446 1447 1063 +3 1063 1447 1448 +3 1448 1449 1063 +3 1063 1449 1450 +3 1063 1450 1451 +3 1061 1063 1023 +3 1023 1063 1452 +3 1023 1452 1453 +3 1451 1454 1063 +3 1063 1454 1455 +3 1063 1455 1452 +3 1023 1456 1457 +3 1453 1458 1023 +3 1023 1458 1459 +3 1023 1459 1456 +3 1457 1460 1023 +3 1023 1460 1461 +3 1023 1461 1428 +3 1063 1462 1463 +3 1464 1432 1063 +3 1063 1432 1445 +3 1063 1445 1446 +3 1465 1466 1115 +3 1115 1466 1467 +3 1115 1467 1468 +3 1468 1469 1115 +3 1115 1469 1470 +3 1115 1470 1063 +3 1063 1470 1471 +3 1063 1471 1462 +3 1463 1472 1063 +3 1063 1472 1473 +3 1063 1473 1474 +3 1464 1475 1432 +3 1432 1475 1476 +3 1432 1476 1477 +3 1477 1478 1432 +3 1432 1478 1479 +3 1432 1479 1480 +3 1481 1482 1483 +3 1483 1482 1432 +3 1484 1485 1486 +3 1486 1485 1487 +3 1486 1488 1484 +3 1484 1488 1489 +3 1484 1489 1490 +3 1491 1484 1492 +3 1480 1493 1432 +3 1432 1493 1494 +3 1432 1494 1483 +3 1490 1495 1484 +3 1484 1495 1496 +3 1484 1496 1492 +3 1492 1497 1491 +3 1491 1497 1498 +3 1491 1498 1499 +3 1499 1500 1491 +3 1491 1500 1501 +3 1491 1501 1502 +3 1502 1501 1503 +3 1502 1503 1474 +3 1474 1503 1504 +3 1474 1504 1063 +3 1063 1504 1505 +3 1063 1505 1506 +3 1506 1507 1063 +3 1063 1507 1508 +3 1063 1508 1509 +3 1509 1510 1063 +3 1063 1510 1511 +3 1063 1511 1512 +3 1481 1513 1514 +3 1512 1515 1063 +3 1063 1515 1516 +3 1063 1516 1464 +3 1485 1517 1487 +3 1487 1517 1518 +3 1487 1518 1481 +3 1481 1518 1519 +3 1481 1519 1513 +3 1520 1482 1521 +3 1521 1482 1481 +3 1521 1481 1522 +3 1522 1481 1514 +3 1520 1523 1482 +3 1482 1523 1524 +3 1482 1524 1525 +3 1525 1526 1482 +3 1482 1526 1527 +3 1482 1527 1528 +3 1528 1529 1482 +3 1482 1529 1530 +3 1482 1530 1531 +3 1532 1533 1115 +3 1115 1533 1534 +3 1115 1534 1465 +3 1535 1536 1180 +3 1115 1537 1538 +3 1539 1482 1115 +3 1115 1482 1531 +3 1115 1531 1532 +3 1180 1536 1115 +3 1115 1536 1540 +3 1115 1540 1537 +3 1541 1542 1543 +3 1544 1545 1180 +3 1545 1546 1180 +3 1180 1546 1547 +3 1180 1547 1535 +3 1538 1548 1115 +3 1115 1548 1549 +3 1115 1549 1550 +3 1550 1551 1115 +3 1115 1551 1552 +3 1115 1552 1539 +3 1482 1553 1543 +3 1543 1553 1554 +3 1543 1554 1541 +3 1539 1555 1482 +3 1482 1555 1556 +3 1482 1556 1557 +3 1557 1558 1482 +3 1482 1558 1559 +3 1482 1559 1560 +3 1561 1562 1180 +3 1180 1562 1563 +3 1180 1563 1544 +3 1560 1564 1482 +3 1482 1564 1565 +3 1482 1565 1553 +3 1542 1566 1543 +3 1543 1566 1567 +3 1543 1567 1568 +3 1568 1569 1543 +3 1543 1569 1570 +3 1543 1570 1180 +3 1180 1570 1571 +3 1180 1571 1561 +3 1572 1573 1574 +3 1575 1576 1216 +3 1573 1577 1574 +3 1574 1577 1578 +3 1574 1578 1579 +3 1576 1580 1216 +3 1216 1580 1581 +3 1216 1581 1180 +3 1180 1581 1582 +3 1582 1583 1180 +3 1180 1583 1584 +3 1180 1584 1585 +3 1585 1586 1180 +3 1180 1586 1587 +3 1180 1587 1588 +3 1589 1216 1590 +3 1590 1216 1574 +3 1590 1574 1591 +3 1591 1574 1579 +3 1589 1592 1216 +3 1216 1592 1593 +3 1216 1593 1594 +3 1588 1595 1180 +3 1180 1595 1596 +3 1180 1596 1543 +3 1543 1596 1597 +3 1543 1597 1598 +3 1599 1600 1543 +3 1543 1600 1601 +3 1601 1602 1543 +3 1543 1602 1603 +3 1543 1603 1574 +3 1574 1603 1604 +3 1574 1604 1572 +3 1594 1605 1216 +3 1216 1605 1606 +3 1216 1606 1575 +3 1598 1607 1543 +3 1543 1607 1608 +3 1543 1608 1599 +3 1609 1610 1260 +3 1611 1612 1216 +3 1613 1614 1615 +3 1615 1614 1616 +3 1616 1617 1615 +3 1615 1617 1618 +3 1615 1618 1619 +3 1612 1620 1216 +3 1216 1620 1621 +3 1216 1621 1574 +3 1574 1621 1622 +3 1574 1622 1623 +3 1619 1624 1615 +3 1615 1624 1625 +3 1615 1625 1260 +3 1260 1625 1626 +3 1260 1626 1609 +3 1610 1627 1260 +3 1260 1627 1628 +3 1260 1628 1629 +3 1630 1631 1216 +3 1631 1632 1216 +3 1216 1632 1633 +3 1216 1633 1611 +3 1623 1634 1574 +3 1574 1634 1635 +3 1574 1635 1636 +3 1636 1637 1574 +3 1574 1637 1638 +3 1574 1638 1639 +3 1629 1640 1260 +3 1260 1640 1641 +3 1260 1641 1216 +3 1216 1641 1642 +3 1216 1642 1630 +3 1639 1643 1574 +3 1574 1643 1644 +3 1574 1644 1615 +3 1615 1644 1645 +3 1615 1645 1613 +3 1278 1646 1647 +3 1647 1646 1648 +3 1649 1650 1651 +3 1647 1652 1653 +3 1654 1655 1288 +3 1288 1655 1656 +3 1288 1656 1657 +3 1657 1658 1288 +3 1288 1658 1659 +3 1288 1659 1660 +3 1661 1278 1288 +3 1288 1278 1277 +3 1288 1277 1286 +3 1648 1662 1647 +3 1647 1662 1663 +3 1647 1663 1652 +3 1660 1664 1288 +3 1288 1664 1665 +3 1288 1665 1661 +3 1653 1666 1647 +3 1647 1666 1667 +3 1647 1667 1668 +3 1651 1669 1670 +3 1661 1671 1278 +3 1278 1671 1672 +3 1278 1672 1673 +3 1673 1674 1278 +3 1278 1674 1675 +3 1278 1675 1676 +3 1650 1677 1651 +3 1651 1677 1678 +3 1651 1678 1669 +3 1676 1679 1278 +3 1278 1679 1680 +3 1278 1680 1646 +3 1670 1681 1651 +3 1651 1681 1682 +3 1651 1682 1683 +3 1684 1685 1316 +3 1316 1685 1686 +3 1316 1686 1687 +3 1688 1689 1288 +3 1690 1651 1288 +3 1288 1651 1683 +3 1288 1683 1654 +3 1691 1692 1288 +3 1288 1692 1693 +3 1288 1693 1688 +3 1689 1694 1288 +3 1288 1694 1695 +3 1288 1695 1690 +3 1687 1696 1316 +3 1316 1696 1697 +3 1316 1697 1288 +3 1288 1697 1698 +3 1288 1698 1691 +3 1699 1700 1701 +3 1701 1700 1702 +3 1702 1703 1701 +3 1701 1703 1704 +3 1701 1704 1316 +3 1316 1704 1705 +3 1316 1705 1706 +3 1706 1707 1316 +3 1316 1707 1708 +3 1316 1708 1684 +3 1690 1709 1651 +3 1651 1709 1710 +3 1651 1710 1711 +3 1711 1712 1651 +3 1651 1712 1713 +3 1651 1713 1714 +3 1715 1716 1701 +3 1701 1716 1717 +3 1701 1717 1699 +3 1714 1718 1651 +3 1651 1718 1719 +3 1651 1719 1701 +3 1701 1719 1720 +3 1701 1720 1715 +3 1721 1722 1316 +3 1316 1722 1723 +3 1724 1725 1316 +3 1316 1725 1726 +3 1351 1353 1316 +3 1316 1353 1727 +3 1316 1727 1721 +3 1728 1701 1729 +3 1729 1701 1316 +3 1729 1316 1730 +3 1730 1316 1726 +3 1701 1731 1732 +3 1701 1733 1734 +3 1734 1733 1735 +3 1734 1735 1736 +3 1737 1738 1353 +3 1353 1738 1739 +3 1353 1739 1740 +3 1740 1741 1353 +3 1353 1741 1742 +3 1353 1742 1727 +3 1723 1743 1316 +3 1316 1743 1744 +3 1316 1744 1724 +3 1728 1745 1701 +3 1701 1745 1746 +3 1701 1746 1731 +3 1732 1747 1701 +3 1701 1747 1748 +3 1701 1748 1733 +3 1736 1749 1734 +3 1734 1749 1750 +3 1734 1750 1751 +3 1751 1752 1734 +3 1734 1752 1753 +3 1734 1753 1754 +3 1754 1755 1734 +3 1734 1755 1756 +3 1734 1756 1353 +3 1353 1756 1757 +3 1353 1757 1737 +3 1758 1759 1395 +3 1760 1761 1734 +3 1391 1395 1353 +3 1353 1395 1759 +3 1353 1759 1762 +3 1761 1763 1734 +3 1734 1763 1764 +3 1734 1764 1765 +3 1762 1766 1353 +3 1353 1766 1767 +3 1353 1767 1768 +3 1768 1769 1353 +3 1353 1769 1770 +3 1353 1770 1771 +3 1771 1772 1353 +3 1353 1772 1773 +3 1353 1773 1734 +3 1734 1773 1774 +3 1734 1774 1760 +3 1765 1775 1734 +3 1734 1775 1776 +3 1734 1776 1777 +3 1395 1778 1779 +3 1777 1780 1781 +3 1780 1782 1781 +3 1781 1782 1783 +3 1781 1783 1784 +3 1784 1785 1781 +3 1781 1785 1786 +3 1781 1786 1787 +3 1788 1395 1789 +3 1789 1395 1781 +3 1789 1781 1790 +3 1790 1781 1787 +3 1788 1791 1395 +3 1395 1791 1792 +3 1395 1792 1778 +3 1779 1793 1395 +3 1395 1793 1794 +3 1395 1794 1758 +3 1781 1795 1796 +3 1797 1798 1781 +3 1781 1798 1799 +3 1781 1799 1795 +3 1800 1801 1432 +3 1801 1802 1432 +3 1432 1802 1803 +3 1432 1803 1804 +3 1805 1395 1432 +3 1432 1395 1427 +3 1432 1427 1430 +3 1796 1806 1781 +3 1781 1806 1807 +3 1781 1807 1808 +3 1809 1810 1432 +3 1432 1810 1811 +3 1432 1811 1800 +3 1804 1812 1432 +3 1432 1812 1813 +3 1432 1813 1805 +3 1805 1814 1395 +3 1395 1814 1815 +3 1395 1815 1816 +3 1816 1817 1395 +3 1395 1817 1818 +3 1395 1818 1819 +3 1820 1821 1809 +3 1809 1821 1822 +3 1809 1822 1823 +3 1823 1824 1809 +3 1809 1824 1825 +3 1809 1825 1826 +3 1819 1827 1395 +3 1395 1827 1828 +3 1395 1828 1781 +3 1781 1828 1829 +3 1781 1829 1797 +3 1826 1830 1809 +3 1809 1830 1831 +3 1809 1831 1810 +3 1832 1833 1432 +3 1834 1835 1482 +3 1482 1835 1836 +3 1482 1836 1837 +3 1838 1839 1840 +3 1840 1839 1841 +3 1837 1842 1482 +3 1482 1842 1843 +3 1482 1843 1432 +3 1432 1843 1844 +3 1432 1844 1832 +3 1845 1846 1847 +3 1848 1849 1482 +3 1482 1849 1850 +3 1482 1850 1834 +3 1833 1851 1432 +3 1432 1851 1852 +3 1432 1852 1853 +3 1432 1854 1855 +3 1856 1857 1809 +3 1809 1857 1858 +3 1858 1859 1809 +3 1809 1859 1860 +3 1809 1860 1861 +3 1840 1862 1838 +3 1838 1862 1863 +3 1838 1863 1864 +3 1865 1866 1867 +3 1867 1866 1838 +3 1861 1868 1809 +3 1809 1868 1869 +3 1809 1869 1845 +3 1854 1432 1870 +3 1870 1432 1853 +3 1870 1853 1871 +3 1871 1853 1872 +3 1871 1872 1873 +3 1873 1872 1866 +3 1873 1866 1874 +3 1855 1875 1432 +3 1432 1875 1876 +3 1432 1876 1877 +3 1877 1878 1432 +3 1432 1878 1879 +3 1432 1879 1880 +3 1864 1881 1838 +3 1838 1881 1882 +3 1838 1882 1867 +3 1865 1883 1866 +3 1866 1883 1884 +3 1866 1884 1874 +3 1846 1885 1886 +3 1880 1887 1432 +3 1432 1887 1888 +3 1432 1888 1809 +3 1809 1888 1889 +3 1809 1889 1856 +3 1839 1890 1841 +3 1841 1890 1891 +3 1841 1891 1846 +3 1846 1891 1892 +3 1846 1892 1885 +3 1893 1847 1894 +3 1894 1847 1846 +3 1894 1846 1895 +3 1895 1846 1886 +3 1893 1896 1847 +3 1847 1896 1897 +3 1847 1897 1898 +3 1898 1899 1847 +3 1847 1899 1900 +3 1847 1900 1901 +3 1901 1902 1847 +3 1847 1902 1903 +3 1847 1903 1482 +3 1482 1903 1904 +3 1482 1904 1848 +3 1905 1906 1907 +3 1907 1906 1908 +3 1907 1908 1909 +3 1910 1911 1543 +3 1543 1911 1912 +3 1913 1914 1482 +3 1482 1914 1915 +3 1482 1915 1847 +3 1915 1916 1847 +3 1847 1916 1917 +3 1847 1917 1918 +3 1918 1919 1847 +3 1847 1919 1920 +3 1847 1920 1921 +3 1909 1922 1907 +3 1907 1922 1923 +3 1907 1923 1924 +3 1925 1926 1482 +3 1482 1926 1927 +3 1927 1928 1482 +3 1482 1928 1929 +3 1482 1929 1913 +3 1921 1930 1847 +3 1847 1930 1931 +3 1847 1931 1907 +3 1907 1931 1932 +3 1907 1932 1905 +3 1924 1933 1907 +3 1907 1933 1934 +3 1907 1934 1543 +3 1543 1934 1935 +3 1543 1935 1936 +3 1936 1937 1543 +3 1543 1937 1938 +3 1543 1938 1910 +3 1912 1939 1543 +3 1543 1939 1940 +3 1543 1940 1482 +3 1482 1940 1941 +3 1482 1941 1925 +3 1942 1943 1543 +3 1543 1943 1944 +3 1945 1946 1947 +3 1948 1949 1574 +3 1950 1951 1907 +3 1907 1951 1952 +3 1944 1953 1543 +3 1543 1953 1954 +3 1543 1954 1907 +3 1907 1954 1955 +3 1956 1945 1957 +3 1957 1945 1907 +3 1957 1907 1958 +3 1958 1907 1952 +3 1956 1959 1945 +3 1945 1959 1960 +3 1945 1960 1946 +3 1947 1961 1945 +3 1945 1961 1962 +3 1945 1962 1963 +3 1963 1964 1945 +3 1945 1964 1965 +3 1945 1965 1574 +3 1574 1965 1966 +3 1574 1966 1948 +3 1949 1967 1574 +3 1574 1967 1968 +3 1574 1968 1969 +3 1970 1971 1543 +3 1955 1972 1907 +3 1907 1972 1973 +3 1907 1973 1950 +3 1971 1974 1543 +3 1543 1974 1975 +3 1543 1975 1942 +3 1969 1976 1574 +3 1574 1976 1977 +3 1574 1977 1543 +3 1543 1977 1978 +3 1543 1978 1970 +3 1979 1980 1615 +3 1981 1982 1983 +3 1984 1985 1574 +3 1985 1986 1574 +3 1574 1986 1987 +3 1574 1987 1945 +3 1945 1987 1988 +3 1945 1988 1989 +3 1989 1990 1945 +3 1945 1990 1991 +3 1945 1991 1992 +3 1983 1993 1994 +3 1982 1995 1983 +3 1983 1995 1996 +3 1983 1996 1993 +3 1994 1997 1983 +3 1983 1997 1998 +3 1983 1998 1615 +3 1615 1998 1999 +3 1615 1999 1979 +3 1980 2000 1615 +3 1615 2000 2001 +3 1615 2001 2002 +3 2003 2004 1574 +3 1992 2005 1945 +3 1945 2005 2006 +3 1945 2006 2007 +3 2004 2008 1574 +3 1574 2008 2009 +3 1574 2009 1984 +3 2007 2010 1945 +3 1945 2010 2011 +3 1945 2011 1983 +3 1983 2011 2012 +3 1983 2012 1981 +3 2002 2013 1615 +3 1615 2013 2014 +3 1615 2014 1574 +3 1574 2014 2015 +3 1574 2015 2003 +3 1647 2016 2017 +3 2018 2019 2020 +3 1647 2017 2020 +3 2020 2017 2021 +3 2020 2021 2022 +3 2022 2023 2020 +3 2020 2023 2024 +3 2020 2024 2025 +3 2026 2027 2020 +3 2020 2027 2028 +3 2020 2028 2029 +3 2029 2030 2020 +3 2020 2030 2031 +3 2020 2031 2018 +3 2032 2033 2034 +3 2034 2033 2035 +3 2034 2035 2036 +3 2036 2037 2034 +3 2034 2037 2038 +3 2034 2038 2039 +3 2040 1651 2041 +3 2041 1651 2034 +3 2039 2042 2034 +3 2034 2042 2043 +3 2034 2043 2041 +3 2044 2045 2046 +3 2047 2048 2049 +3 2048 2050 2049 +3 2049 2050 2051 +3 2049 2051 2052 +3 2053 1651 2049 +3 2049 1651 2040 +3 2049 2040 2047 +3 2054 2055 2025 +3 2025 2055 2056 +3 2025 2056 2057 +3 2044 2046 2058 +3 2058 2046 2059 +3 2058 2059 2060 +3 2045 2044 2025 +3 2025 2044 2061 +3 2025 2061 2054 +3 2057 2062 2025 +3 2025 2062 2063 +3 2025 2063 2020 +3 2020 2063 2064 +3 2020 2064 2026 +3 2053 2065 1651 +3 1651 2065 2066 +3 1651 2066 2067 +3 2067 2068 1651 +3 1651 2068 2069 +3 1651 2069 2070 +3 2071 1647 1651 +3 1651 1647 1668 +3 1651 1668 1649 +3 2059 2072 2060 +3 2060 2072 2073 +3 2060 2073 2074 +3 2074 2075 2060 +3 2060 2075 2076 +3 2060 2076 2077 +3 2077 2076 2078 +3 2077 2078 2052 +3 2052 2078 2079 +3 2052 2079 2049 +3 2070 2080 1651 +3 1651 2080 2081 +3 1651 2081 2071 +3 2071 2082 1647 +3 1647 2082 2083 +3 1647 2083 2084 +3 2084 2085 1647 +3 1647 2085 2086 +3 1647 2086 2087 +3 2087 2088 1647 +3 1647 2088 2089 +3 1647 2089 2016 +3 2090 1701 2091 +3 2091 1701 2092 +3 2093 2094 1651 +3 1651 2094 2095 +3 1651 2096 2097 +3 2098 2099 2093 +3 2100 2101 2102 +3 2103 2034 2104 +3 2104 2034 1651 +3 2104 1651 2105 +3 2105 1651 2095 +3 2106 2107 2108 +3 2108 2107 2109 +3 2110 2111 2112 +3 2090 2113 1701 +3 1701 2113 2114 +3 1701 2114 1651 +3 1651 2114 2115 +3 1651 2115 2116 +3 2116 2117 1651 +3 1651 2117 2118 +3 1651 2118 2096 +3 2097 2119 1651 +3 1651 2119 2120 +3 1651 2120 2121 +3 2122 2123 1701 +3 1701 2123 2124 +3 1701 2124 2092 +3 2121 2125 1651 +3 1651 2125 2126 +3 1651 2126 2093 +3 2093 2126 2127 +3 2093 2127 2098 +3 2099 2128 2093 +3 2093 2128 2129 +3 2093 2129 2130 +3 2102 2101 2131 +3 2131 2101 2132 +3 2131 2132 2108 +3 2108 2132 2133 +3 2108 2133 2106 +3 2103 2134 2034 +3 2034 2134 2135 +3 2034 2135 2136 +3 2136 2137 2034 +3 2034 2137 2138 +3 2034 2138 2139 +3 2140 2141 2112 +3 2112 2141 2142 +3 2112 2142 2143 +3 2143 2144 2112 +3 2112 2144 2145 +3 2112 2145 2110 +3 2109 2146 2108 +3 2108 2146 2147 +3 2108 2147 2148 +3 2148 2147 2149 +3 2139 2150 2034 +3 2034 2150 2151 +3 2034 2151 2112 +3 2112 2151 2152 +3 2112 2152 2140 +3 2111 2153 2112 +3 2112 2153 2149 +3 2112 2149 1701 +3 1701 2149 2154 +3 1701 2154 2122 +3 2153 2155 2149 +3 2149 2155 2156 +3 2149 2156 2157 +3 2157 2158 2149 +3 2149 2158 2159 +3 2149 2159 2148 +3 2102 2160 2100 +3 2100 2160 2161 +3 2100 2161 2130 +3 2130 2161 2162 +3 2130 2162 2093 +3 2163 2164 2165 +3 2164 2166 2167 +3 2167 2168 2164 +3 2164 2168 2169 +3 2164 2169 2165 +3 2170 2171 1701 +3 1701 2171 2172 +3 1701 2172 2173 +3 2174 2175 2176 +3 2175 2177 2176 +3 2176 2177 2178 +3 2176 2178 2179 +3 2163 2165 2180 +3 2180 2165 2181 +3 2180 2181 2179 +3 2179 2181 2182 +3 2179 2182 2176 +3 2173 2183 1701 +3 1701 2183 2184 +3 1701 2184 2112 +3 2112 2184 2185 +3 2112 2185 2186 +3 2187 2188 2189 +3 2189 2188 2190 +3 2191 2192 1701 +3 1701 2192 2193 +3 1701 2193 2194 +3 2194 2195 1701 +3 1701 2195 2196 +3 1701 2196 2197 +3 2197 2198 1701 +3 1701 2198 2199 +3 1701 2199 2170 +3 2170 2199 2200 +3 2170 2200 2164 +3 2164 2200 2201 +3 2164 2201 2166 +3 2202 2203 1734 +3 1734 2203 2204 +3 1734 2204 2205 +3 2205 2206 1734 +3 1734 2206 2207 +3 1734 2207 2208 +3 2208 2209 1734 +3 1734 2209 2210 +3 1734 2210 1701 +3 1701 2210 2211 +3 1701 2211 2191 +3 2212 2213 2189 +3 2189 2213 2214 +3 2189 2214 2215 +3 2215 2216 2189 +3 2189 2216 2217 +3 2189 2217 1734 +3 1734 2217 2218 +3 1734 2218 2202 +3 2186 2219 2112 +3 2112 2219 2220 +3 2112 2220 2221 +3 2189 2222 2223 +3 2221 2224 2112 +3 2112 2224 2225 +3 2112 2225 2226 +3 2223 2227 2189 +3 2189 2227 2228 +3 2189 2228 2187 +3 2226 2229 2112 +3 2112 2229 2230 +3 2112 2230 2189 +3 2189 2230 2231 +3 2189 2231 2222 +3 2190 2232 2189 +3 2189 2232 2233 +3 2189 2233 2212 +3 2212 2233 2234 +3 2212 2234 2176 +3 2176 2234 2235 +3 2176 2235 2174 +3 2236 2237 2238 +3 2238 2237 2239 +3 2238 2239 2240 +3 2241 2242 2243 +3 2244 2245 2189 +3 2189 2245 2246 +3 2247 2248 1734 +3 1734 2248 2249 +3 1734 2249 2250 +3 2250 2251 1734 +3 1734 2251 2252 +3 1734 2252 2253 +3 2254 2244 2255 +3 2255 2244 2189 +3 2255 2189 2256 +3 2256 2189 1734 +3 2256 1734 2257 +3 2257 1734 2253 +3 2258 2259 2255 +3 2255 2259 2260 +3 2255 2260 2254 +3 2236 2261 2237 +3 2237 2261 2262 +3 2237 2262 2263 +3 2263 2264 2237 +3 2237 2264 2265 +3 2237 2265 2266 +3 2266 2265 2267 +3 2266 2267 2268 +3 2268 2267 2243 +3 2268 2243 2269 +3 2269 2243 2242 +3 2258 2255 2270 +3 2270 2255 2271 +3 2270 2271 2243 +3 2243 2271 2272 +3 2243 2272 2241 +3 2246 2273 2189 +3 2189 2273 2274 +3 2189 2274 2275 +3 2276 2277 2278 +3 2278 2277 2279 +3 2275 2280 2189 +3 2189 2280 2281 +3 2189 2281 2282 +3 2282 2283 2189 +3 2189 2283 2284 +3 2189 2284 2277 +3 2277 2284 2285 +3 2277 2285 2286 +3 2287 2288 2277 +3 2277 2288 2289 +3 2277 2289 2279 +3 2290 2291 1781 +3 1781 2291 2292 +3 1781 2292 2293 +3 2293 2294 1781 +3 1781 2294 2295 +3 1781 2295 2296 +3 1777 1781 1734 +3 1734 1781 2297 +3 1734 2297 2247 +3 2296 2298 1781 +3 1781 2298 2299 +3 1781 2299 2297 +3 2286 2300 2277 +3 2277 2300 2301 +3 2277 2301 2302 +3 2302 2303 2277 +3 2277 2303 2304 +3 2277 2304 2305 +3 2305 2306 2277 +3 2277 2306 2307 +3 2277 2307 2287 +3 2287 2307 2240 +3 2287 2240 2308 +3 2308 2240 2239 +3 2309 2310 2277 +3 2311 2277 1781 +3 1781 2277 2276 +3 1781 2276 2290 +3 2311 2312 2277 +3 2277 2312 2313 +3 2277 2313 2314 +3 2314 2315 2277 +3 2277 2315 2316 +3 2277 2316 2317 +3 2310 2318 2277 +3 2277 2318 2319 +3 2277 2319 2320 +3 2309 2277 2321 +3 2321 2277 2317 +3 2321 2317 2322 +3 2323 2324 1809 +3 2320 2325 2277 +3 2277 2325 2326 +3 2277 2326 2327 +3 2328 2329 2330 +3 2330 2329 2277 +3 2330 2277 2331 +3 2331 2277 2327 +3 2332 2333 1809 +3 1809 2333 2334 +3 2334 2335 1809 +3 1809 2335 2336 +3 1809 2336 2337 +3 2338 1781 1809 +3 1809 1781 1808 +3 1809 1808 1820 +3 2339 2340 2341 +3 2341 2340 2342 +3 2341 2342 2343 +3 2337 2344 1809 +3 1809 2344 2345 +3 1809 2345 2338 +3 2338 2346 1781 +3 1781 2346 2347 +3 1781 2347 2348 +3 2348 2349 1781 +3 1781 2349 2350 +3 1781 2350 2351 +3 2352 2353 2322 +3 2328 2354 2329 +3 2329 2354 2355 +3 2329 2355 2356 +3 2351 2357 1781 +3 1781 2357 2358 +3 1781 2358 2311 +3 2339 2359 2340 +3 2340 2359 2360 +3 2340 2360 2361 +3 2353 2362 2322 +3 2322 2362 2363 +3 2322 2363 2321 +3 2356 2364 2329 +3 2329 2364 2365 +3 2329 2365 2366 +3 2361 2367 2340 +3 2340 2367 2368 +3 2340 2368 2369 +3 2369 2368 2370 +3 2369 2370 2322 +3 2322 2370 2371 +3 2322 2371 2352 +3 2366 2372 2329 +3 2329 2372 2373 +3 2329 2373 2323 +3 2324 2374 2375 +3 2342 2376 2343 +3 2343 2376 2377 +3 2343 2377 2324 +3 2324 2377 2378 +3 2324 2378 2374 +3 2375 2379 2324 +3 2324 2379 2380 +3 2324 2380 1809 +3 1809 2380 2381 +3 1809 2381 2332 +3 2382 2383 2384 +3 2384 2383 2385 +3 2329 2386 2387 +3 2329 2388 2389 +3 2390 2391 2392 +3 2392 2391 2393 +3 2393 2394 2392 +3 2392 2394 2395 +3 2392 2395 2396 +3 2396 2397 2392 +3 2392 2397 2398 +3 2392 2398 1847 +3 2398 2399 1847 +3 1847 2399 2400 +3 1847 2400 2401 +3 2401 2402 1847 +3 1847 2402 2403 +3 1847 2403 2404 +3 2405 2406 2407 +3 2408 2409 2410 +3 2387 2411 2329 +3 2329 2411 2412 +3 2329 2412 2413 +3 2389 2414 2392 +3 2392 2414 2415 +3 2392 2415 2390 +3 2416 2417 2418 +3 2418 2417 2419 +3 2418 2419 2420 +3 2413 2421 2329 +3 2329 2421 2422 +3 2329 2422 2423 +3 2423 2424 2329 +3 2329 2424 2425 +3 2329 2425 2388 +3 2388 2425 2426 +3 2388 2426 2427 +3 2427 2426 2428 +3 2429 2430 2404 +3 2404 2430 2431 +3 2432 2433 2434 +3 2434 2433 2435 +3 2434 2435 2436 +3 2383 2437 2385 +3 2385 2437 2438 +3 2385 2438 2426 +3 2426 2438 2439 +3 2426 2439 2428 +3 2440 2441 2442 +3 2442 2441 2418 +3 2442 2418 2443 +3 2443 2418 2420 +3 2405 2407 2444 +3 2444 2407 2445 +3 2444 2445 2440 +3 2440 2445 2446 +3 2440 2446 2441 +3 2384 2447 2382 +3 2382 2447 2448 +3 2382 2448 2449 +3 2450 2434 2451 +3 2451 2434 2382 +3 2406 2405 2404 +3 2404 2405 2452 +3 2404 2452 2429 +3 2416 2418 2410 +3 2410 2418 2453 +3 2410 2453 2408 +3 2408 2453 2454 +3 2408 2454 2455 +3 2455 2454 2456 +3 2455 2456 2436 +3 2436 2456 2457 +3 2436 2457 2434 +3 2449 2458 2382 +3 2382 2458 2459 +3 2382 2459 2451 +3 2431 2460 2404 +3 2404 2460 2461 +3 2404 2461 1847 +3 1847 2461 2462 +3 1847 2462 2463 +3 2463 2464 1847 +3 1847 2464 2465 +3 1847 2465 2466 +3 2466 2467 1847 +3 1847 2467 2468 +3 1847 2468 2469 +3 1845 1847 1809 +3 1809 1847 2470 +3 1809 2470 2471 +3 2472 2473 2474 +3 2450 2475 2434 +3 2434 2475 2476 +3 2434 2476 2477 +3 2478 2479 2480 +3 2323 1809 2329 +3 2329 1809 2481 +3 2329 2481 2386 +3 2469 2482 1847 +3 1847 2482 2483 +3 1847 2483 2470 +3 2473 2484 2474 +3 2474 2484 2485 +3 2474 2485 2480 +3 2480 2485 2486 +3 2480 2486 2478 +3 2472 2474 2477 +3 2477 2474 2487 +3 2477 2487 2434 +3 2434 2487 2488 +3 2434 2488 2432 +3 2489 2490 2491 +3 2490 2492 2491 +3 2491 2492 2493 +3 2491 2493 2494 +3 2495 1809 2491 +3 2491 1809 2471 +3 2491 2471 2489 +3 2408 2496 2409 +3 2409 2496 2497 +3 2409 2497 2498 +3 2499 2409 2500 +3 2501 2502 2503 +3 2498 2504 2409 +3 2409 2504 2505 +3 2409 2505 2500 +3 2500 2506 2499 +3 2499 2506 2507 +3 2499 2507 2508 +3 2478 2509 2479 +3 2479 2509 2510 +3 2479 2510 2501 +3 2501 2510 2511 +3 2501 2511 2502 +3 1809 2512 2481 +3 2481 2512 2501 +3 2481 2501 2513 +3 2513 2501 2503 +3 2495 2514 1809 +3 1809 2514 2515 +3 1809 2515 2516 +3 2516 2517 1809 +3 1809 2517 2518 +3 1809 2518 2519 +3 2508 2520 2499 +3 2499 2520 2521 +3 2499 2521 2522 +3 2522 2521 2523 +3 2522 2523 2494 +3 2494 2523 2524 +3 2494 2524 2491 +3 2519 2525 1809 +3 1809 2525 2526 +3 1809 2526 2512 +3 2392 2527 2528 +3 2529 2530 1847 +3 1847 2530 2531 +3 1847 2531 2532 +3 2528 2533 2392 +3 2392 2533 2534 +3 2392 2534 2535 +3 2527 2392 2536 +3 2536 2392 1847 +3 2536 1847 2537 +3 2538 2539 1907 +3 1907 2539 2540 +3 1907 2540 2541 +3 2541 2542 1907 +3 1907 2542 2543 +3 1907 2543 2544 +3 2544 2545 1907 +3 1907 2545 2546 +3 1907 2546 1847 +3 1847 2546 2547 +3 1847 2547 2529 +3 2532 2548 1847 +3 1847 2548 2549 +3 1847 2549 2550 +3 2535 2551 2392 +3 2392 2551 2552 +3 2392 2552 2553 +3 2554 2555 2556 +3 2557 2554 2558 +3 2558 2554 2559 +3 2556 2560 2554 +3 2554 2560 2561 +3 2554 2561 2559 +3 2557 2562 2554 +3 2554 2562 2563 +3 2554 2563 1907 +3 1907 2563 2564 +3 1907 2564 2538 +3 2565 2566 1847 +3 1847 2566 2567 +3 1847 2567 2537 +3 2553 2568 2392 +3 2392 2568 2569 +3 2392 2569 2554 +3 2554 2569 2570 +3 2554 2570 2555 +3 2571 2572 2565 +3 2573 2574 2575 +3 2562 2576 2563 +3 2563 2576 2577 +3 2563 2577 2578 +3 2550 2579 1847 +3 1847 2579 2580 +3 1847 2580 2565 +3 2565 2580 2581 +3 2565 2581 2571 +3 2582 2583 2584 +3 2573 2575 2585 +3 2585 2575 2586 +3 2585 2586 2587 +3 2586 2588 2587 +3 2587 2588 2589 +3 2587 2589 2590 +3 2590 2589 2591 +3 2590 2591 2592 +3 2592 2591 2565 +3 2592 2565 2593 +3 2593 2565 2572 +3 2584 2583 2594 +3 2594 2583 2595 +3 2594 2595 2596 +3 2578 2597 2563 +3 2563 2597 2594 +3 2563 2594 2598 +3 2598 2594 2596 +3 2574 2573 2584 +3 2584 2573 2599 +3 2584 2599 2582 +3 2600 2601 1907 +3 1907 2601 2602 +3 2603 2604 2605 +3 2603 2606 2607 +3 2607 2606 2608 +3 2607 2608 2609 +3 2610 2611 1907 +3 1907 2611 2612 +3 1907 2612 2600 +3 2613 2614 2554 +3 2554 2614 2615 +3 2616 2617 2607 +3 2607 2617 2618 +3 2607 2618 2619 +3 2619 2620 2607 +3 2607 2620 2621 +3 2607 2621 2622 +3 2623 2624 2554 +3 2554 2624 2625 +3 2554 2625 2626 +3 2622 2627 2607 +3 2607 2627 2628 +3 2607 2628 2603 +3 2603 2628 2629 +3 2603 2629 2604 +3 2554 2630 2631 +3 2609 2632 2607 +3 2607 2632 2633 +3 2607 2633 1945 +3 1945 2633 2634 +3 1945 2634 2635 +3 2636 2637 1945 +3 1945 2637 2638 +3 1945 2638 1907 +3 1907 2638 2639 +3 1907 2639 2610 +3 2602 2640 1907 +3 1907 2640 2641 +3 1907 2641 2554 +3 2554 2641 2642 +3 2554 2642 2643 +3 2605 2644 2603 +3 2603 2644 2645 +3 2603 2645 2646 +3 2646 2645 2647 +3 2635 2648 1945 +3 1945 2648 2649 +3 1945 2649 2650 +3 2615 2651 2554 +3 2554 2651 2652 +3 2554 2652 2623 +3 2626 2653 2554 +3 2554 2653 2654 +3 2554 2654 2607 +3 2607 2654 2655 +3 2607 2655 2616 +3 2643 2656 2554 +3 2554 2656 2657 +3 2554 2657 2630 +3 2613 2554 2658 +3 2658 2554 2631 +3 2658 2631 2659 +3 2660 2661 2659 +3 2661 2662 2659 +3 2659 2662 2663 +3 2659 2663 2658 +3 2650 2664 1945 +3 1945 2664 2665 +3 1945 2665 2636 +3 2645 2666 2647 +3 2647 2666 2667 +3 2647 2667 2668 +3 2668 2667 2669 +3 2668 2669 2670 +3 2670 2669 2671 +3 2670 2671 2659 +3 2659 2671 2672 +3 2659 2672 2660 +3 2673 2674 1945 +3 2673 1945 2675 +3 2674 2676 1945 +3 1945 2676 2677 +3 1945 2677 2607 +3 2607 2677 2678 +3 2607 2678 2679 +3 2607 2680 2681 +3 2680 2607 2682 +3 2682 2607 2679 +3 2682 2679 2683 +3 2684 2685 2686 +3 2687 1983 2688 +3 2688 1983 2689 +3 2688 2689 2690 +3 2690 2689 2684 +3 2687 2691 1983 +3 1983 2691 2692 +3 1983 2692 2693 +3 2693 2694 1983 +3 1983 2694 2695 +3 1983 2695 2696 +3 2697 2698 1945 +3 2681 2699 2607 +3 2607 2699 2700 +3 2607 2700 2701 +3 2702 2703 2689 +3 2689 2703 2704 +3 2689 2704 2705 +3 2705 2706 2689 +3 2689 2706 2707 +3 2689 2707 2708 +3 2698 2709 1945 +3 1945 2709 2710 +3 1945 2710 2675 +3 2683 2679 2711 +3 2711 2679 2712 +3 2711 2712 2713 +3 2713 2714 2711 +3 2711 2714 2715 +3 2711 2715 2716 +3 2701 2717 2607 +3 2607 2717 2718 +3 2607 2718 2719 +3 2708 2720 2689 +3 2689 2720 2721 +3 2689 2721 2684 +3 2684 2721 2722 +3 2684 2722 2685 +3 2723 2724 2725 +3 2686 2726 2684 +3 2684 2726 2727 +3 2684 2727 2728 +3 2728 2727 2729 +3 2719 2730 2607 +3 2607 2730 2731 +3 2607 2731 2689 +3 2689 2731 2732 +3 2689 2732 2702 +3 2733 2734 2735 +3 2735 2734 2725 +3 2735 2725 2736 +3 2736 2725 2724 +3 2696 2737 1983 +3 1983 2737 2738 +3 1983 2738 1945 +3 1945 2738 2739 +3 1945 2739 2697 +3 2733 2735 2716 +3 2716 2735 2740 +3 2716 2740 2711 +3 2729 2727 2741 +3 2741 2727 2742 +3 2741 2742 2743 +3 2743 2742 2744 +3 2743 2744 2725 +3 2725 2744 2745 +3 2725 2745 2723 +3 2746 2020 2747 +3 2747 2748 2746 +3 2746 2748 2749 +3 2746 2749 2750 +3 2750 2751 2746 +3 2746 2751 2752 +3 2746 2752 2753 +3 2754 2755 2756 +3 2756 2755 2757 +3 2756 2757 2758 +3 2753 2759 2746 +3 2746 2759 2760 +3 2746 2760 2756 +3 2756 2760 2761 +3 2756 2761 2754 +3 2758 2762 2756 +3 2756 2762 2763 +3 2756 2763 2764 +3 2765 2766 2034 +3 2766 2767 2034 +3 2034 2767 2768 +3 2034 2768 2769 +3 2769 2770 2034 +3 2034 2770 2771 +3 2034 2771 2772 +3 2773 2020 2034 +3 2034 2020 2019 +3 2034 2019 2032 +3 2772 2774 2034 +3 2034 2774 2775 +3 2034 2775 2773 +3 2773 2776 2020 +3 2020 2776 2777 +3 2020 2777 2778 +3 2778 2779 2020 +3 2020 2779 2780 +3 2020 2780 2781 +3 2781 2782 2020 +3 2020 2782 2783 +3 2020 2783 2747 +3 2784 2785 2034 +3 2785 2786 2034 +3 2034 2786 2756 +3 2034 2756 2765 +3 2765 2756 2764 +3 2787 2788 2112 +3 2788 2789 2112 +3 2112 2789 2790 +3 2112 2790 2791 +3 2791 2792 2112 +3 2112 2792 2793 +3 2112 2793 2794 +3 2786 2795 2756 +3 2756 2795 2796 +3 2756 2796 2797 +3 2798 2799 2800 +3 2800 2799 2801 +3 2800 2801 2802 +3 2797 2803 2756 +3 2756 2803 2804 +3 2756 2804 2805 +3 2805 2806 2756 +3 2756 2806 2807 +3 2756 2807 2800 +3 2800 2807 2808 +3 2800 2808 2809 +3 2809 2810 2800 +3 2800 2810 2811 +3 2800 2811 2798 +3 2794 2812 2112 +3 2112 2812 2813 +3 2112 2813 2034 +3 2034 2813 2814 +3 2034 2814 2815 +3 2815 2816 2034 +3 2034 2816 2817 +3 2034 2817 2818 +3 2818 2819 2034 +3 2034 2819 2820 +3 2034 2820 2784 +3 2821 2822 2112 +3 2822 2823 2112 +3 2112 2823 2800 +3 2112 2800 2787 +3 2787 2800 2802 +3 2824 2825 2189 +3 2189 2825 2826 +3 2826 2827 2189 +3 2189 2827 2828 +3 2189 2828 2829 +3 2823 2830 2800 +3 2800 2830 2831 +3 2800 2831 2832 +3 2833 2834 2835 +3 2835 2834 2836 +3 2836 2837 2835 +3 2835 2837 2838 +3 2835 2838 2189 +3 2189 2838 2839 +3 2189 2839 2824 +3 2832 2840 2800 +3 2800 2840 2841 +3 2800 2841 2842 +3 2842 2843 2800 +3 2800 2843 2844 +3 2800 2844 2835 +3 2835 2844 2845 +3 2835 2845 2846 +3 2846 2847 2835 +3 2835 2847 2848 +3 2835 2848 2833 +3 2829 2849 2189 +3 2189 2849 2850 +3 2189 2850 2112 +3 2112 2850 2851 +3 2112 2851 2852 +3 2852 2853 2112 +3 2112 2853 2854 +3 2112 2854 2855 +3 2855 2856 2112 +3 2112 2856 2857 +3 2112 2857 2821 +3 2189 2858 2859 +3 2860 2277 2861 +3 2861 2277 2862 +3 2863 2864 2189 +3 2189 2864 2865 +3 2189 2865 2858 +3 2859 2866 2189 +3 2189 2866 2867 +3 2189 2867 2835 +3 2835 2867 2868 +3 2835 2868 2869 +3 2869 2870 2835 +3 2835 2870 2871 +3 2835 2871 2872 +3 2860 2873 2277 +3 2277 2873 2874 +3 2277 2874 2875 +3 2872 2876 2835 +3 2835 2876 2877 +3 2835 2877 2878 +3 2878 2879 2835 +3 2835 2879 2880 +3 2835 2880 2862 +3 2875 2881 2277 +3 2277 2881 2882 +3 2277 2882 2883 +3 2883 2884 2277 +3 2277 2884 2885 +3 2277 2885 2189 +3 2189 2885 2886 +3 2189 2886 2863 +3 2880 2887 2862 +3 2862 2887 2888 +3 2862 2888 2889 +3 2889 2890 2862 +3 2862 2890 2891 +3 2862 2891 2892 +3 2892 2893 2862 +3 2862 2893 2894 +3 2862 2894 2861 +3 2895 2896 2277 +3 2897 2898 2862 +3 2862 2898 2899 +3 2900 2901 2329 +3 2329 2901 2902 +3 2329 2902 2903 +3 2903 2904 2329 +3 2329 2904 2905 +3 2329 2905 2906 +3 2896 2907 2277 +3 2277 2907 2908 +3 2277 2908 2909 +3 2899 2910 2862 +3 2862 2910 2911 +3 2862 2911 2912 +3 2906 2913 2329 +3 2329 2913 2914 +3 2329 2914 2277 +3 2277 2914 2915 +3 2277 2915 2895 +3 2909 2916 2277 +3 2277 2916 2917 +3 2277 2917 2862 +3 2862 2917 2918 +3 2862 2918 2897 +3 2912 2919 2862 +3 2862 2919 2920 +3 2862 2920 2921 +3 2921 2920 2922 +3 2922 2923 2921 +3 2921 2923 2924 +3 2921 2924 2925 +3 2925 2926 2921 +3 2921 2926 2927 +3 2921 2927 2928 +3 2928 2929 2921 +3 2921 2929 2930 +3 2921 2930 2329 +3 2329 2930 2931 +3 2329 2931 2900 +3 2932 2933 2921 +3 2921 2933 2934 +3 2921 2934 2935 +3 2936 2937 2921 +3 2938 2939 2921 +3 2940 2941 2942 +3 2942 2941 2943 +3 2942 2943 2392 +3 2944 2945 2946 +3 2946 2945 2947 +3 2946 2947 2948 +3 2935 2949 2921 +3 2921 2949 2950 +3 2921 2950 2936 +3 2944 2951 2945 +3 2945 2951 2952 +3 2945 2952 2953 +3 2948 2954 2946 +3 2946 2954 2955 +3 2946 2955 2956 +3 2956 2955 2957 +3 2956 2957 2958 +3 2958 2957 2959 +3 2958 2959 2960 +3 2921 2939 2942 +3 2942 2939 2961 +3 2942 2961 2962 +3 2963 2964 2942 +3 2942 2964 2965 +3 2942 2965 2940 +3 2952 2966 2953 +3 2953 2966 2967 +3 2953 2967 2968 +3 2921 2969 2970 +3 2962 2971 2942 +3 2942 2971 2972 +3 2942 2972 2963 +3 2970 2973 2921 +3 2921 2973 2974 +3 2921 2974 2938 +3 2937 2975 2921 +3 2921 2975 2976 +3 2921 2976 2969 +3 2969 2976 2960 +3 2969 2960 2977 +3 2977 2960 2959 +3 2943 2978 2392 +3 2392 2978 2979 +3 2392 2979 2980 +3 2980 2981 2392 +3 2392 2981 2982 +3 2392 2982 2983 +3 2389 2392 2329 +3 2329 2392 2984 +3 2329 2984 2985 +3 2983 2986 2392 +3 2392 2986 2987 +3 2392 2987 2984 +3 2985 2988 2989 +3 2967 2990 2968 +3 2968 2990 2991 +3 2968 2991 2985 +3 2985 2991 2992 +3 2985 2992 2988 +3 2993 2329 2994 +3 2994 2329 2985 +3 2994 2985 2995 +3 2995 2985 2989 +3 2993 2996 2329 +3 2329 2996 2997 +3 2329 2997 2998 +3 2998 2999 2329 +3 2329 2999 3000 +3 2329 3000 3001 +3 3001 3002 2329 +3 2329 3002 3003 +3 2329 3003 2921 +3 2921 3003 3004 +3 2921 3004 2932 +3 3005 3006 3007 +3 3006 3008 3007 +3 3007 3008 3009 +3 3007 3009 3010 +3 3011 3012 2942 +3 2942 3012 3013 +3 2942 3013 3014 +3 3014 3015 2942 +3 2942 3015 3016 +3 2942 3016 3017 +3 3018 3007 3019 +3 3019 3007 2942 +3 3019 2942 3020 +3 3020 2942 3017 +3 3018 3021 3007 +3 3007 3021 3022 +3 3007 3022 3005 +3 3023 3024 2554 +3 2554 3024 3025 +3 2554 3025 3026 +3 3026 3027 2554 +3 2554 3027 3028 +3 2554 3028 3029 +3 3030 2392 3031 +3 3031 2392 2554 +3 3031 2554 3032 +3 3032 2554 3029 +3 3030 3033 2392 +3 2392 3033 3034 +3 2392 3034 3035 +3 3035 3036 2392 +3 2392 3036 3037 +3 2392 3037 3038 +3 3038 3039 2392 +3 2392 3039 3040 +3 2392 3040 2942 +3 2942 3040 3041 +3 2942 3041 3011 +3 3042 3043 3044 +3 3045 3046 2607 +3 2607 3046 3047 +3 3044 3048 3049 +3 3043 3050 3044 +3 3044 3050 3051 +3 3044 3051 3048 +3 3049 3052 3044 +3 3044 3052 3053 +3 3044 3053 2607 +3 2607 3053 3054 +3 2607 3054 3045 +3 3055 3056 2554 +3 2554 3056 3007 +3 2554 3007 3023 +3 3023 3007 3010 +3 3057 3058 3007 +3 3007 3058 3059 +3 3060 3061 2554 +3 2554 3061 3062 +3 3062 3063 2554 +3 2554 3063 3064 +3 2554 3064 3055 +3 3056 3065 3007 +3 3007 3065 3066 +3 3007 3066 3067 +3 3047 3068 2607 +3 2607 3068 3069 +3 2607 3069 3070 +3 3067 3071 3007 +3 3007 3071 3072 +3 3007 3072 3057 +3 3059 3073 3007 +3 3007 3073 3074 +3 3007 3074 3044 +3 3044 3074 3075 +3 3044 3075 3042 +3 3070 3076 2607 +3 2607 3076 3077 +3 2607 3077 2554 +3 2554 3077 3078 +3 2554 3078 3060 +3 3079 3080 2689 +3 3081 3082 2607 +3 3083 3084 2607 +3 3084 3085 2607 +3 2607 3085 3086 +3 2607 3086 3044 +3 3044 3086 3087 +3 3044 3087 3088 +3 3089 3090 3091 +3 3091 3090 3092 +3 3080 3093 2689 +3 2689 3093 3094 +3 2689 3094 3095 +3 3082 3096 2607 +3 2607 3096 3097 +3 2607 3097 3083 +3 3092 3098 3091 +3 3091 3098 3099 +3 3091 3099 3100 +3 3088 3101 3044 +3 3044 3101 3102 +3 3044 3102 3103 +3 3103 3104 3044 +3 3044 3104 3105 +3 3044 3105 3106 +3 3100 3107 3091 +3 3091 3107 3108 +3 3091 3108 2689 +3 2689 3108 3109 +3 2689 3109 3079 +3 3095 3110 2689 +3 2689 3110 3111 +3 2689 3111 2607 +3 2607 3111 3112 +3 2607 3112 3081 +3 3106 3113 3044 +3 3044 3113 3114 +3 3044 3114 3091 +3 3091 3114 3115 +3 3091 3115 3089 +3 3116 2746 3117 +3 3117 3118 3116 +3 3116 3118 3119 +3 3116 3119 3120 +3 3121 3122 3123 +3 3124 3125 2756 +3 3120 3126 3116 +3 3116 3126 3127 +3 3116 3127 3128 +3 3129 3130 3123 +3 3123 3130 3131 +3 3123 3131 3121 +3 3128 3132 3116 +3 3116 3132 3133 +3 3116 3133 3123 +3 3123 3133 3134 +3 3123 3134 3129 +3 3122 3135 3123 +3 3123 3135 3136 +3 3123 3136 3137 +3 3125 3138 2756 +3 2756 3138 3139 +3 2756 3139 3140 +3 3141 3142 2746 +3 3140 3143 2756 +3 2756 3143 3144 +3 2756 3144 3145 +3 3142 3146 2746 +3 2746 3146 3147 +3 2746 3147 3148 +3 3148 3149 2746 +3 2746 3149 3150 +3 2746 3150 3117 +3 3145 3151 2756 +3 2756 3151 3152 +3 2756 3152 2746 +3 2746 3152 3153 +3 2746 3153 3141 +3 3154 3123 2756 +3 2756 3123 3137 +3 2756 3137 3124 +3 3155 3156 3157 +3 3158 3159 2800 +3 2800 3159 3160 +3 2800 3160 3161 +3 3161 3162 2800 +3 2800 3162 3163 +3 2800 3163 3164 +3 3154 3165 3123 +3 3123 3165 3166 +3 3123 3166 3167 +3 3157 3168 3155 +3 3155 3168 3169 +3 3155 3169 3170 +3 3171 3172 2756 +3 2756 3172 3173 +3 3173 3174 2756 +3 2756 3174 3175 +3 2756 3175 3154 +3 3167 3176 3123 +3 3123 3176 3177 +3 3123 3177 3178 +3 3178 3179 3123 +3 3123 3179 3180 +3 3123 3180 3155 +3 3155 3180 3181 +3 3155 3181 3182 +3 3182 3183 3155 +3 3155 3183 3184 +3 3155 3184 3156 +3 3164 3185 2800 +3 2800 3185 3186 +3 2800 3186 2756 +3 2756 3186 3187 +3 2756 3187 3188 +3 3188 3189 2756 +3 2756 3189 3190 +3 2756 3190 3171 +3 3191 3155 2800 +3 2800 3155 3170 +3 2800 3170 3158 +3 3192 3193 2835 +3 2835 3193 3194 +3 3194 3195 2835 +3 2835 3195 3196 +3 2835 3196 3197 +3 3191 3198 3155 +3 3155 3198 3199 +3 3155 3199 3200 +3 3201 3202 3203 +3 3203 3202 3204 +3 3204 3205 3203 +3 3203 3205 3206 +3 3203 3206 2835 +3 2835 3206 3207 +3 2835 3207 3192 +3 3208 3209 2800 +3 2800 3209 3210 +3 3210 3211 2800 +3 2800 3211 3212 +3 2800 3212 3191 +3 3200 3213 3155 +3 3155 3213 3214 +3 3155 3214 3215 +3 3215 3216 3155 +3 3155 3216 3217 +3 3155 3217 3203 +3 3203 3217 3218 +3 3203 3218 3219 +3 3219 3220 3203 +3 3203 3220 3221 +3 3203 3221 3201 +3 3197 3222 2835 +3 2835 3222 3223 +3 2835 3223 2800 +3 2800 3223 3224 +3 2800 3224 3225 +3 3225 3226 2800 +3 2800 3226 3227 +3 2800 3227 3208 +3 3228 2862 3229 +3 3229 2862 3230 +3 3228 3231 2862 +3 2862 3231 3232 +3 2862 3232 3233 +3 2835 3234 3235 +3 3236 3237 3203 +3 3203 3237 3238 +3 3203 3238 3239 +3 3235 3240 2835 +3 2835 3240 3241 +3 2835 3241 3203 +3 3203 3241 3242 +3 3203 3242 3236 +3 3239 3243 3203 +3 3203 3243 3244 +3 3203 3244 3245 +3 3245 3246 3203 +3 3203 3246 3247 +3 3203 3247 3230 +3 3233 3248 2862 +3 2862 3248 3249 +3 2862 3249 3250 +3 3250 3251 2862 +3 2862 3251 3252 +3 2862 3252 2835 +3 2835 3252 3253 +3 2835 3253 3254 +3 3247 3255 3230 +3 3230 3255 3256 +3 3230 3256 3257 +3 3257 3258 3230 +3 3230 3258 3259 +3 3230 3259 3260 +3 3254 3261 2835 +3 2835 3261 3262 +3 2835 3262 3234 +3 3260 3263 3230 +3 3230 3263 3264 +3 3230 3264 3229 +3 3265 3266 3230 +3 3230 3266 3267 +3 3268 3269 2921 +3 2921 3269 3270 +3 2921 3270 3271 +3 2862 3272 3273 +3 3273 3274 2862 +3 2862 3274 3275 +3 2862 3275 3230 +3 3230 3275 3276 +3 3230 3276 3265 +3 3267 3277 3230 +3 3230 3277 3278 +3 3230 3278 3279 +3 3279 3280 3230 +3 3230 3280 3281 +3 3230 3281 3282 +3 3282 3281 3283 +3 3271 3284 2921 +3 2921 3284 3285 +3 2921 3285 3286 +3 3286 3287 2921 +3 2921 3287 3288 +3 2921 3288 2862 +3 2862 3288 3289 +3 2862 3289 3290 +3 3283 3291 3282 +3 3282 3291 3292 +3 3282 3292 3293 +3 3293 3294 3282 +3 3282 3294 3295 +3 3282 3295 3296 +3 3290 3297 2862 +3 2862 3297 3298 +3 2862 3298 3272 +3 3296 3299 3282 +3 3282 3299 3300 +3 3282 3300 2921 +3 2921 3300 3301 +3 2921 3301 3268 +3 3302 3303 3282 +3 3282 3303 3304 +3 3282 3304 3305 +3 3306 3307 3282 +3 3308 3309 3282 +3 3310 2942 3311 +3 3311 2942 3312 +3 3311 3312 3313 +3 3313 3312 3314 +3 3315 3316 3317 +3 3317 3316 3318 +3 3317 3318 3319 +3 3305 3320 3282 +3 3282 3320 3321 +3 3282 3321 3306 +3 3315 3322 3316 +3 3316 3322 3323 +3 3316 3323 3324 +3 3319 3325 3317 +3 3317 3325 3326 +3 3317 3326 3327 +3 3327 3326 3328 +3 3327 3328 3329 +3 3329 3328 3330 +3 3329 3330 3331 +3 3282 3309 3312 +3 3312 3309 3332 +3 3312 3332 3333 +3 3334 3335 3312 +3 3312 3335 3336 +3 3312 3336 3314 +3 3323 3337 3324 +3 3324 3337 3338 +3 3324 3338 3339 +3 3282 3340 3341 +3 3333 3342 3312 +3 3312 3342 3343 +3 3312 3343 3334 +3 2942 3344 3345 +3 3341 3346 3282 +3 3282 3346 3347 +3 3282 3347 3308 +3 3310 3348 2942 +3 2942 3348 3349 +3 2942 3349 3344 +3 3307 3350 3282 +3 3282 3350 3351 +3 3282 3351 3340 +3 3340 3351 3331 +3 3340 3331 3352 +3 3352 3331 3330 +3 3345 3353 2942 +3 2942 3353 3354 +3 2942 3354 3355 +3 3356 3357 2942 +3 2942 3357 3358 +3 2942 3358 3359 +3 3359 3360 2942 +3 2942 3360 3361 +3 2942 3361 2921 +3 2921 3361 3362 +3 3355 3363 2942 +3 2942 3363 3364 +3 2942 3364 3356 +3 3356 3364 3339 +3 3356 3339 3365 +3 3365 3339 3338 +3 3362 3366 2921 +3 2921 3366 3367 +3 2921 3367 3368 +3 3368 3369 2921 +3 2921 3369 3370 +3 2921 3370 3371 +3 3371 3372 2921 +3 2921 3372 3373 +3 2921 3373 3282 +3 3282 3373 3374 +3 3282 3374 3302 +3 3375 3376 3377 +3 3376 3378 3377 +3 3377 3378 3379 +3 3377 3379 3380 +3 3381 3382 3312 +3 3312 3382 3383 +3 3312 3383 3384 +3 3384 3385 3312 +3 3312 3385 3386 +3 3312 3386 3387 +3 3388 3377 3389 +3 3389 3377 3312 +3 3389 3312 3390 +3 3390 3312 3387 +3 3388 3391 3377 +3 3377 3391 3392 +3 3377 3392 3375 +3 3393 3394 3007 +3 3007 3394 3395 +3 3007 3395 3396 +3 3396 3397 3007 +3 3007 3397 3398 +3 3007 3398 3399 +3 3399 3400 3007 +3 3007 3400 3401 +3 3007 3401 2942 +3 2942 3401 3402 +3 3402 3403 2942 +3 2942 3403 3404 +3 2942 3404 3405 +3 3405 3406 2942 +3 2942 3406 3407 +3 2942 3407 3408 +3 3408 3409 2942 +3 2942 3409 3410 +3 2942 3410 3312 +3 3312 3410 3411 +3 3312 3411 3381 +3 3412 3413 3007 +3 3007 3413 3414 +3 3415 3416 3417 +3 3417 3416 3418 +3 3414 3419 3007 +3 3007 3419 3377 +3 3007 3377 3393 +3 3393 3377 3380 +3 3418 3420 3417 +3 3417 3420 3421 +3 3417 3421 3422 +3 3423 3424 3044 +3 3044 3424 3425 +3 3426 3427 3377 +3 3377 3427 3428 +3 3422 3429 3417 +3 3417 3429 3430 +3 3417 3430 3044 +3 3044 3430 3431 +3 3044 3431 3423 +3 3432 3433 3007 +3 3007 3433 3434 +3 3007 3434 3412 +3 3419 3435 3377 +3 3377 3435 3436 +3 3377 3436 3437 +3 3437 3438 3377 +3 3377 3438 3439 +3 3377 3439 3426 +3 3428 3440 3377 +3 3377 3440 3441 +3 3377 3441 3417 +3 3417 3441 3442 +3 3417 3442 3415 +3 3425 3443 3044 +3 3044 3443 3444 +3 3044 3444 3445 +3 3445 3446 3044 +3 3044 3446 3447 +3 3044 3447 3007 +3 3007 3447 3448 +3 3007 3448 3432 +3 3449 3450 3091 +3 3451 3452 3044 +3 3453 3454 3044 +3 3454 3455 3044 +3 3044 3455 3456 +3 3044 3456 3417 +3 3417 3456 3457 +3 3417 3457 3458 +3 3459 3460 3461 +3 3461 3460 3462 +3 3450 3463 3091 +3 3091 3463 3464 +3 3091 3464 3465 +3 3452 3466 3044 +3 3044 3466 3467 +3 3044 3467 3453 +3 3462 3468 3461 +3 3461 3468 3469 +3 3461 3469 3470 +3 3458 3471 3417 +3 3417 3471 3472 +3 3417 3472 3473 +3 3473 3474 3417 +3 3417 3474 3475 +3 3417 3475 3476 +3 3470 3477 3461 +3 3461 3477 3478 +3 3461 3478 3091 +3 3091 3478 3479 +3 3091 3479 3449 +3 3465 3480 3091 +3 3091 3480 3481 +3 3091 3481 3044 +3 3044 3481 3482 +3 3044 3482 3451 +3 3476 3483 3417 +3 3417 3483 3484 +3 3417 3484 3461 +3 3461 3484 3485 +3 3461 3485 3459 +3 5 3461 3486 +3 3486 3461 3091 +3 3486 3091 3487 +3 3487 3091 2689 +3 3487 2689 3488 +3 3488 2689 1983 +3 3488 1983 3489 +3 3489 1983 1615 +3 3489 1615 3490 +3 3490 1615 1260 +3 3490 1260 3491 +3 3491 1260 871 +3 3491 871 3492 +3 3492 871 22 +3 3492 22 19 +3 19 22 21 +3 19 21 23 +3 3493 154 3494 +3 3494 154 3495 +3 3116 3496 154 +3 154 3496 3497 +3 3497 3498 154 +3 154 3498 3499 +3 154 3499 3495 +3 3500 3501 157 +3 157 3501 3502 +3 3503 3504 3116 +3 3493 3505 154 +3 154 3505 3506 +3 154 3506 157 +3 157 3506 3507 +3 157 3507 3508 +3 3508 3509 157 +3 157 3509 3510 +3 157 3510 3500 +3 3511 3512 3123 +3 3123 3512 3513 +3 3123 3513 3514 +3 3515 3516 3123 +3 3123 3516 3517 +3 3123 3517 3511 +3 3504 3518 3116 +3 3116 3518 3519 +3 3116 3519 3520 +3 3502 3521 157 +3 157 3521 3522 +3 157 3522 3123 +3 3123 3522 3523 +3 3123 3523 3515 +3 3514 3524 3123 +3 3123 3524 3525 +3 3123 3525 3116 +3 3116 3525 3526 +3 3116 3526 3503 +3 3520 3527 3116 +3 3116 3527 3528 +3 3116 3528 3496 +3 3529 3530 157 +3 3530 3531 157 +3 157 3531 3532 +3 157 3532 3533 +3 3533 3534 157 +3 157 3534 3535 +3 157 3535 3536 +3 3536 3535 3537 +3 3538 3539 3123 +3 3123 3539 3540 +3 3123 3540 3541 +3 3537 3542 3536 +3 3536 3542 3543 +3 3536 3543 3544 +3 3545 3546 3123 +3 3123 3546 3547 +3 3123 3547 3538 +3 3541 3548 3123 +3 3123 3548 3549 +3 3123 3549 157 +3 157 3549 3550 +3 157 3550 3529 +3 3551 3552 3155 +3 3155 3552 3553 +3 3553 3554 3155 +3 3155 3554 3555 +3 3155 3555 3123 +3 3123 3555 3556 +3 3123 3556 3545 +3 3544 3557 3536 +3 3536 3557 3558 +3 3536 3558 3559 +3 3559 3560 3536 +3 3536 3560 3561 +3 3536 3561 3155 +3 3155 3561 3562 +3 3155 3562 3563 +3 3563 3564 3155 +3 3155 3564 3565 +3 3155 3565 3551 +3 3566 3567 3536 +3 3567 3568 3536 +3 3536 3568 3569 +3 3536 3569 3570 +3 3570 3571 3536 +3 3536 3571 3572 +3 3536 3572 3573 +3 3572 3574 3573 +3 3573 3574 3575 +3 3573 3575 3576 +3 3577 3578 3155 +3 3155 3578 3579 +3 3155 3579 3580 +3 3581 3582 3155 +3 3155 3582 3583 +3 3155 3583 3577 +3 3580 3584 3155 +3 3155 3584 3585 +3 3155 3585 3536 +3 3536 3585 3586 +3 3536 3586 3566 +3 3587 3588 3203 +3 3589 3590 3203 +3 3203 3590 3591 +3 3591 3592 3203 +3 3203 3592 3593 +3 3203 3593 3155 +3 3155 3593 3594 +3 3155 3594 3581 +3 3576 3595 3573 +3 3573 3595 3596 +3 3573 3596 3597 +3 3597 3598 3573 +3 3573 3598 3599 +3 3573 3599 3600 +3 3588 3601 3203 +3 3203 3601 3602 +3 3203 3602 3589 +3 3603 3573 3203 +3 3203 3573 3600 +3 3203 3600 3587 +3 3604 3605 3606 +3 3603 3607 3573 +3 3573 3607 3608 +3 3573 3608 3609 +3 3609 3610 3573 +3 3573 3610 3611 +3 3573 3611 3612 +3 3613 3614 3230 +3 3615 3616 3203 +3 3612 3617 3573 +3 3573 3617 3618 +3 3573 3618 3604 +3 3604 3618 3619 +3 3604 3619 3605 +3 3606 3620 3604 +3 3604 3620 3621 +3 3604 3621 3622 +3 3623 3624 3230 +3 3230 3624 3625 +3 3230 3625 3626 +3 3622 3627 3604 +3 3604 3627 3628 +3 3604 3628 3629 +3 3613 3230 3629 +3 3614 3630 3230 +3 3230 3630 3631 +3 3230 3631 3623 +3 3616 3632 3203 +3 3203 3632 3633 +3 3203 3633 3634 +3 3626 3635 3230 +3 3230 3635 3636 +3 3230 3636 3203 +3 3203 3636 3637 +3 3203 3637 3615 +3 3634 3638 3203 +3 3203 3638 3639 +3 3203 3639 3603 +3 3629 3230 3604 +3 3604 3230 3640 +3 3604 3640 3641 +3 3642 3604 3643 +3 3643 3604 3644 +3 3641 3645 3604 +3 3604 3645 3646 +3 3604 3646 3644 +3 3647 3648 3230 +3 3642 3649 3604 +3 3604 3649 3650 +3 3604 3650 3651 +3 3651 3650 3652 +3 3651 3652 3653 +3 3654 3655 3282 +3 3656 3657 3282 +3 3282 3657 3658 +3 3282 3658 3659 +3 3651 3660 3661 +3 3653 3662 3651 +3 3651 3662 3663 +3 3651 3663 3660 +3 3654 3282 3664 +3 3655 3665 3282 +3 3282 3665 3666 +3 3282 3666 3656 +3 3648 3667 3230 +3 3230 3667 3668 +3 3230 3668 3669 +3 3661 3670 3651 +3 3651 3670 3671 +3 3651 3671 3664 +3 3659 3672 3282 +3 3282 3672 3673 +3 3282 3673 3230 +3 3230 3673 3674 +3 3230 3674 3647 +3 3669 3675 3230 +3 3230 3675 3676 +3 3230 3676 3640 +3 3677 3678 3679 +3 3679 3678 3680 +3 3679 3680 3681 +3 3664 3282 3651 +3 3651 3282 3682 +3 3651 3682 3683 +3 3681 3684 3679 +3 3679 3684 3685 +3 3679 3685 3686 +3 3651 3687 3688 +3 3689 3690 3691 +3 3683 3692 3651 +3 3651 3692 3693 +3 3651 3693 3687 +3 3688 3694 3651 +3 3651 3694 3695 +3 3651 3695 3696 +3 3312 3697 3698 +3 3690 3699 3312 +3 3312 3699 3700 +3 3701 3702 3651 +3 3651 3702 3703 +3 3696 3704 3651 +3 3651 3704 3705 +3 3651 3705 3706 +3 3703 3707 3651 +3 3651 3707 3708 +3 3651 3708 3709 +3 3709 3708 3710 +3 3709 3710 3711 +3 3712 3713 3312 +3 3677 3714 3678 +3 3678 3714 3715 +3 3678 3715 3716 +3 3685 3717 3686 +3 3686 3717 3718 +3 3686 3718 3706 +3 3706 3718 3719 +3 3706 3719 3651 +3 3651 3719 3720 +3 3651 3720 3701 +3 3709 3721 3722 +3 3698 3723 3312 +3 3312 3723 3724 +3 3312 3724 3725 +3 3700 3726 3312 +3 3312 3726 3727 +3 3312 3727 3282 +3 3282 3727 3728 +3 3711 3729 3709 +3 3709 3729 3730 +3 3709 3730 3721 +3 3713 3731 3312 +3 3312 3731 3732 +3 3312 3732 3697 +3 3722 3733 3709 +3 3709 3733 3734 +3 3709 3734 3735 +3 3725 3736 3312 +3 3312 3736 3737 +3 3312 3737 3690 +3 3690 3737 3738 +3 3690 3738 3691 +3 3728 3739 3282 +3 3282 3739 3740 +3 3282 3740 3741 +3 3741 3742 3282 +3 3282 3742 3743 +3 3282 3743 3744 +3 3716 3745 3678 +3 3678 3745 3746 +3 3678 3746 3691 +3 3691 3746 3747 +3 3691 3747 3689 +3 3744 3748 3282 +3 3282 3748 3749 +3 3282 3749 3682 +3 3750 3709 3312 +3 3312 3709 3735 +3 3312 3735 3712 +3 3751 3752 3753 +3 3752 3754 3753 +3 3753 3754 3755 +3 3753 3755 3756 +3 3757 3758 3377 +3 3377 3758 3759 +3 3709 3760 3753 +3 3753 3760 3761 +3 3753 3761 3751 +3 3750 3762 3709 +3 3709 3762 3763 +3 3709 3763 3764 +3 3764 3765 3709 +3 3709 3765 3766 +3 3709 3766 3767 +3 3756 3768 3753 +3 3753 3768 3769 +3 3753 3769 3377 +3 3377 3769 3770 +3 3377 3770 3771 +3 3771 3772 3377 +3 3377 3772 3773 +3 3377 3773 3757 +3 3767 3774 3709 +3 3709 3774 3775 +3 3709 3775 3760 +3 3759 3776 3377 +3 3377 3776 3777 +3 3377 3777 3312 +3 3312 3777 3778 +3 3778 3779 3312 +3 3312 3779 3780 +3 3312 3780 3781 +3 3781 3782 3312 +3 3312 3782 3783 +3 3312 3783 3784 +3 3784 3785 3312 +3 3312 3785 3786 +3 3312 3786 3750 +3 3787 3788 3789 +3 3790 3791 3377 +3 3377 3791 3792 +3 3793 3794 3377 +3 3794 3795 3377 +3 3377 3795 3796 +3 3377 3796 3790 +3 3797 3798 3753 +3 3787 3789 3799 +3 3800 3417 3801 +3 3801 3417 3802 +3 3798 3803 3753 +3 3753 3803 3804 +3 3753 3804 3805 +3 3788 3806 3789 +3 3789 3806 3807 +3 3789 3807 3417 +3 3417 3807 3808 +3 3417 3808 3809 +3 3809 3810 3417 +3 3417 3810 3811 +3 3417 3811 3802 +3 3800 3812 3417 +3 3417 3812 3813 +3 3417 3813 3377 +3 3377 3813 3814 +3 3377 3814 3793 +3 3792 3815 3377 +3 3377 3815 3816 +3 3377 3816 3753 +3 3753 3816 3817 +3 3753 3817 3797 +3 3818 3819 3789 +3 3789 3819 3820 +3 3789 3820 3799 +3 3805 3821 3753 +3 3753 3821 3822 +3 3753 3822 3789 +3 3789 3822 3823 +3 3789 3823 3818 +3 3824 3461 3825 +3 3825 3461 3826 +3 3461 3827 3828 +3 3829 3830 3417 +3 3417 3830 3831 +3 3417 3831 3832 +3 3832 3833 3417 +3 3417 3833 3834 +3 3417 3834 3835 +3 3835 3836 3417 +3 3417 3836 3837 +3 3417 3837 3789 +3 3789 3837 3838 +3 3828 3839 3461 +3 3461 3839 3840 +3 3461 3840 3826 +3 3838 3841 3789 +3 3789 3841 3842 +3 3789 3842 3843 +3 3844 3845 3846 +3 3846 3845 3847 +3 3846 3847 3848 +3 3848 3849 3846 +3 3846 3849 3850 +3 3846 3850 3851 +3 3824 3852 3461 +3 3461 3852 3853 +3 3461 3853 3417 +3 3417 3853 3854 +3 3417 3854 3829 +3 3843 3855 3789 +3 3789 3855 3856 +3 3789 3856 3857 +3 3857 3858 3789 +3 3789 3858 3859 +3 3789 3859 3846 +3 3846 3859 3860 +3 3846 3860 3844 +3 15 3861 19 +3 19 3861 3862 +3 19 3862 3492 +3 3492 3862 3863 +3 3492 3863 3491 +3 3491 3863 3864 +3 3491 3864 3490 +3 3490 3864 3865 +3 3490 3865 3489 +3 3489 3865 3866 +3 3489 3866 3488 +3 3488 3866 3867 +3 3488 3867 3487 +3 3487 3867 3868 +3 3487 3868 3486 +3 3486 3868 3869 +3 3486 3869 5 +3 5 3869 3870 +3 5 3870 3 +3 3846 3871 3789 +3 3789 3871 3872 +3 3789 3872 3753 +3 3753 3872 3873 +3 3753 3873 3709 +3 3709 3873 3874 +3 3709 3874 3651 +3 3651 3874 3875 +3 3651 3875 3604 +3 3604 3875 3876 +3 3604 3876 3573 +3 3573 3876 3877 +3 3573 3877 3536 +3 3536 3877 3878 +3 3536 3878 157 +3 157 3878 179 +3 157 179 169 +3 169 179 193 +3 3879 3880 3846 +3 3881 3871 3882 +3 3882 3871 3883 +3 3884 3885 3846 +3 3846 3885 3886 +3 3886 3887 3846 +3 3846 3887 3888 +3 3846 3888 3889 +3 3889 3890 3846 +3 3846 3890 3891 +3 3846 3891 3879 +3 3880 3892 3846 +3 3846 3892 3893 +3 3846 3893 3871 +3 3871 3893 3894 +3 3871 3894 3883 +3 3881 3895 3871 +3 3871 3895 3896 +3 3871 3896 3897 +3 9 3898 3899 +3 3900 3884 5 +3 5 3884 3846 +3 5 3846 3461 +3 3461 3846 3851 +3 3461 3851 3827 +3 3899 3901 9 +3 9 3901 3902 +3 9 3902 3903 +3 3904 3905 5 +3 5 3905 3906 +3 3897 3907 3871 +3 3871 3907 3908 +3 3871 3908 9 +3 9 3908 3909 +3 9 3909 3898 +3 3906 3910 5 +3 5 3910 3911 +3 5 3911 3900 +3 3903 3912 9 +3 9 3912 3913 +3 9 3913 5 +3 5 3913 3914 +3 5 3914 3904 +3 0 2 7 +3 7 2 3915 +3 7 3915 9 +3 9 3915 3916 +3 9 3916 3871 +3 3871 3916 3917 +3 3871 3917 3872 +3 3872 3917 3918 +3 3872 3918 3873 +3 3873 3918 3919 +3 3873 3919 3874 +3 3874 3919 3920 +3 3874 3920 3875 +3 3875 3920 3921 +3 3875 3921 3876 +3 3876 3921 3922 +3 3876 3922 3877 +3 3877 3922 3923 +3 3877 3923 3878 +3 3878 3923 3924 +3 3878 3924 179 +3 179 3924 3925 +3 179 3925 151 +3 151 3925 3926 +3 151 3926 196 +3 3927 3928 3929 +3 3929 3928 3930 +3 3930 3931 3929 +3 3929 3931 3932 +3 3929 3932 3933 +3 3934 3935 3936 +3 3936 3935 3937 +3 3933 3938 3929 +3 3929 3938 3939 +3 3929 3939 3940 +3 3937 3941 3936 +3 3936 3941 3942 +3 3936 3942 3943 +3 3944 3945 3946 +3 3943 3947 3936 +3 3936 3947 3948 +3 3936 3948 3946 +3 3946 3948 3949 +3 3946 3949 3944 +3 3945 3950 3946 +3 3946 3950 3951 +3 3946 3951 3952 +3 3946 3930 3953 +3 3953 3930 3928 +3 3953 3928 3954 +3 3954 3928 3955 +3 3954 3955 3956 +3 3952 3957 3946 +3 3946 3957 3958 +3 3946 3958 3930 +3 3940 3959 3929 +3 3929 3959 3960 +3 3929 3960 3961 +3 3961 3960 3962 +3 3961 3962 3963 +3 3963 3962 3964 +3 3963 3964 3965 +3 3965 3964 3966 +3 3965 3966 3967 +3 3967 3966 3968 +3 3967 3968 3969 +3 3969 3968 3970 +3 3969 3970 3971 +3 3971 3970 3972 +3 3971 3972 3973 +3 3972 3974 3973 +3 3973 3974 3975 +3 3973 3975 3976 +3 3976 3975 3977 +3 3976 3977 3978 +3 3978 3977 3979 +3 3978 3979 3980 +3 3980 3979 3981 +3 3980 3981 3982 +3 3983 3984 3985 +3 3985 3984 3986 +3 3986 3987 3985 +3 3985 3987 3988 +3 3985 3988 3989 +3 3990 3991 3992 +3 3985 3993 3992 +3 3994 3995 3996 +3 3997 3998 3994 +3 3999 4000 4001 +3 3991 4002 3992 +3 3992 4002 4003 +3 3992 4003 4004 +3 3955 3985 3956 +3 3956 3985 3989 +3 3956 3989 3994 +3 3994 3989 4005 +3 3994 4005 3995 +3 3996 4006 3994 +3 3994 4006 4007 +3 3994 4007 3997 +3 3998 4008 3994 +3 3994 4008 4009 +3 3994 4009 3999 +3 3999 4009 4010 +3 3999 4010 4000 +3 4001 4011 3999 +3 3999 4011 4012 +3 3999 4012 4013 +3 4004 4014 3992 +3 3992 4014 4015 +3 3992 4015 3985 +3 3985 4015 4016 +3 3985 4016 3983 +3 4017 4018 4019 +3 4018 4017 4020 +3 4020 4017 4021 +3 4020 4021 4022 +3 4022 4021 4023 +3 4022 4023 4024 +3 4024 4023 4025 +3 4024 4025 4026 +3 4026 4025 4027 +3 4026 4027 4028 +3 3990 3992 4019 +3 4019 3992 4029 +3 4019 4029 4030 +3 4031 4017 4032 +3 4032 4017 4019 +3 4032 4019 4033 +3 4033 4019 4030 +3 4033 4030 4034 +3 4035 4036 4037 +3 4038 4039 4040 +3 4038 4040 4041 +3 4041 4040 4042 +3 4041 4042 4043 +3 4043 4042 4044 +3 4043 4044 4045 +3 4045 4044 4046 +3 4045 4046 4047 +3 4048 4049 4050 +3 4049 4051 4050 +3 4050 4051 4052 +3 4050 4052 4053 +3 4054 4055 4037 +3 4037 4055 4056 +3 4056 4057 4037 +3 4037 4057 4058 +3 4037 4058 4059 +3 4059 4060 4037 +3 4037 4060 4039 +3 4037 4039 4035 +3 4035 4039 4038 +3 4060 4061 4039 +3 4039 4061 4062 +3 4039 4062 4063 +3 4063 4064 4039 +3 4039 4064 4065 +3 4039 4065 4066 +3 4067 4068 4069 +3 4069 4068 4070 +3 4071 4072 4073 +3 4066 4067 4039 +3 4039 4067 4069 +3 4039 4069 4074 +3 4074 4069 4075 +3 4074 4075 4027 +3 4027 4075 3999 +3 4027 3999 4028 +3 4028 3999 4013 +3 4070 4076 4069 +3 4069 4076 4077 +3 4069 4077 4078 +3 4078 4079 4069 +3 4069 4079 4080 +3 4069 4080 4073 +3 4073 4080 4081 +3 4073 4081 4071 +3 4072 4082 4073 +3 4073 4082 4083 +3 4073 4083 4084 +3 4073 4085 4050 +3 4050 4085 4086 +3 4050 4086 4048 +3 4084 4087 4073 +3 4073 4087 4088 +3 4073 4088 4085 +3 3981 3934 3982 +3 3982 3934 3936 +3 3982 3936 4089 +3 4089 3936 4090 +3 4089 4090 4091 +3 4091 4090 4092 +3 4053 4054 4050 +3 4050 4054 4037 +3 4050 4037 4093 +3 4093 4037 4094 +3 4093 4094 4095 +3 4095 4094 4096 +3 4097 4098 4095 +3 4095 4098 4099 +3 4100 4101 4102 +3 4102 4101 4103 +3 4102 4103 4104 +3 4105 4106 4096 +3 4096 4106 4107 +3 4096 4107 4108 +3 4099 4109 4095 +3 4095 4109 4110 +3 4095 4110 4102 +3 4102 4110 4111 +3 4102 4111 4100 +3 4105 4112 4106 +3 4106 4112 4113 +3 4106 4113 4114 +3 4104 4115 4102 +3 4102 4115 4116 +3 4102 4116 4117 +3 4118 4119 4092 +3 4092 4119 4120 +3 4092 4120 4121 +3 4121 4122 4092 +3 4092 4122 4123 +3 4092 4123 4091 +3 4091 4123 4124 +3 4091 4124 4125 +3 4125 4124 4126 +3 4125 4126 4127 +3 4127 4126 4128 +3 4127 4128 4129 +3 4129 4128 4130 +3 4129 4130 4131 +3 4131 4130 4132 +3 4131 4132 4106 +3 4133 4131 4134 +3 4134 4131 4106 +3 4134 4106 4135 +3 4135 4106 4114 +3 4135 4114 4136 +3 4108 4137 4096 +3 4096 4137 4138 +3 4096 4138 4139 +3 4139 4140 4096 +3 4096 4140 4141 +3 4096 4141 4095 +3 4095 4141 4142 +3 4095 4142 4097 +3 4117 4143 4102 +3 4102 4143 4144 +3 4102 4144 4092 +3 4092 4144 4145 +3 4092 4145 4118 +3 4146 4147 4148 +3 4149 4150 4151 +3 4152 4153 4151 +3 4151 4154 4155 +3 4156 4157 4149 +3 4153 4158 4151 +3 4151 4158 4159 +3 4151 4159 4154 +3 4160 4161 4162 +3 4155 4163 4151 +3 4151 4163 4164 +3 4151 4164 4149 +3 4149 4164 4165 +3 4149 4165 4156 +3 4166 4167 4162 +3 4162 4167 4168 +3 4169 4170 4171 +3 4171 4170 4149 +3 4171 4149 4172 +3 4172 4149 4157 +3 4173 4174 4175 +3 4176 4177 4175 +3 4168 4178 4162 +3 4162 4178 4179 +3 4162 4179 4160 +3 4161 4180 4162 +3 4162 4180 4181 +3 4162 4181 4151 +3 4151 4181 4182 +3 4151 4182 4152 +3 4174 4183 4175 +3 4175 4183 4184 +3 4175 4184 4176 +3 4177 4185 4175 +3 4175 4185 4186 +3 4175 4186 4162 +3 4162 4186 4187 +3 4162 4187 4166 +3 4169 4188 4170 +3 4170 4188 4189 +3 4170 4189 4175 +3 4175 4189 4190 +3 4175 4190 4173 +3 4191 4192 4193 +3 4194 4195 4196 +3 4192 4197 4193 +3 4193 4197 4198 +3 4193 4198 4199 +3 4200 4201 4202 +3 4203 4204 4202 +3 4202 4204 4205 +3 4196 4206 4194 +3 4194 4206 4207 +3 4194 4207 4208 +3 4209 4210 4193 +3 4193 4210 4211 +3 4193 4211 4191 +3 4199 4212 4193 +3 4193 4212 4213 +3 4193 4213 4214 +3 4214 4213 4215 +3 4215 4216 4214 +3 4214 4216 4217 +3 4214 4217 4195 +3 4195 4217 4218 +3 4195 4218 4196 +3 4200 4202 4219 +3 4201 4220 4202 +3 4202 4220 4221 +3 4202 4221 4203 +3 4222 4209 4223 +3 4223 4209 4224 +3 4222 4225 4209 +3 4209 4225 4226 +3 4209 4226 4227 +3 4205 4228 4202 +3 4202 4228 4229 +3 4202 4229 4209 +3 4209 4229 4230 +3 4209 4230 4224 +3 4227 4231 4209 +3 4209 4231 4232 +3 4209 4232 4210 +3 4233 4234 4194 +3 4235 4236 4237 +3 4238 4239 4240 +3 4240 4239 4241 +3 4242 4243 4244 +3 4245 4246 4247 +3 4248 4249 4250 +3 4251 4252 4250 +3 4250 4252 4253 +3 4254 4240 4255 +3 4255 4240 4241 +3 4255 4241 4242 +3 4242 4241 4256 +3 4242 4256 4243 +3 4244 4257 4242 +3 4242 4257 4258 +3 4242 4258 4245 +3 4245 4258 4259 +3 4245 4259 4246 +3 4247 4260 4245 +3 4245 4260 4261 +3 4245 4261 4237 +3 4237 4261 4262 +3 4237 4262 4235 +3 4236 4263 4237 +3 4237 4263 4264 +3 4237 4264 4265 +3 4265 4266 4237 +3 4237 4266 4267 +3 4237 4267 4250 +3 4250 4267 4268 +3 4250 4268 4248 +3 4249 4269 4250 +3 4250 4269 4270 +3 4250 4270 4251 +3 4240 4271 4272 +3 4272 4273 4240 +3 4240 4273 4274 +3 4240 4274 4238 +3 4253 4275 4250 +3 4250 4275 4276 +3 4250 4276 4240 +3 4240 4276 4277 +3 4240 4277 4271 +3 4278 4279 4280 +3 4280 4279 4281 +3 4282 4283 4284 +3 4284 4283 4285 +3 4286 4287 4288 +3 4288 4289 4286 +3 4286 4289 4290 +3 4286 4290 4291 +3 4291 4292 4286 +3 4286 4292 4293 +3 4286 4293 4294 +3 4295 4296 4280 +3 4280 4296 4297 +3 4280 4297 4278 +3 4282 4298 4283 +3 4283 4298 4299 +3 4283 4299 4287 +3 4287 4299 4300 +3 4287 4300 4288 +3 4301 4302 4303 +3 4303 4302 4304 +3 4303 4304 4305 +3 4281 4306 4280 +3 4280 4306 4307 +3 4280 4307 4308 +3 4308 4307 4309 +3 4308 4309 4283 +3 4283 4309 4310 +3 4283 4310 4285 +3 4294 4311 4286 +3 4286 4311 4312 +3 4286 4312 4303 +3 4303 4312 4313 +3 4303 4313 4314 +3 4314 4315 4303 +3 4303 4315 4316 +3 4303 4316 4301 +3 4305 4317 4303 +3 4303 4317 4318 +3 4303 4318 4280 +3 4280 4318 4319 +3 4280 4319 4295 +3 4320 4321 4322 +3 4322 4321 4303 +3 4323 4324 4303 +3 4303 4324 4325 +3 4303 4325 4326 +3 4327 4328 4303 +3 4303 4328 4329 +3 4303 4329 4322 +3 4320 4330 4321 +3 4321 4330 4331 +3 4321 4331 4332 +3 4333 4334 4280 +3 4280 4334 4335 +3 4280 4335 4336 +3 4323 4303 4337 +3 4337 4303 4280 +3 4337 4280 4338 +3 4326 4339 4303 +3 4303 4339 4340 +3 4303 4340 4327 +3 4341 4342 4343 +3 4336 4344 4280 +3 4280 4344 4345 +3 4280 4345 4338 +3 4332 4346 4321 +3 4321 4346 4347 +3 4321 4347 4348 +3 4342 4349 4343 +3 4343 4349 4350 +3 4343 4350 4351 +3 4351 4352 4343 +3 4343 4352 4353 +3 4343 4353 4280 +3 4280 4353 4354 +3 4280 4354 4333 +3 4348 4355 4321 +3 4321 4355 4356 +3 4321 4356 4343 +3 4343 4356 4357 +3 4343 4357 4341 +3 4321 4358 4359 +3 4360 4361 4362 +3 4362 4361 4321 +3 4362 4321 4363 +3 4359 4364 4321 +3 4321 4364 4365 +3 4321 4365 4366 +3 4366 4367 4321 +3 4321 4367 4368 +3 4321 4368 4363 +3 4360 4369 4361 +3 4361 4369 4370 +3 4361 4370 4371 +3 4372 4343 4373 +3 4373 4343 4374 +3 4373 4374 4375 +3 4375 4374 4376 +3 4372 4377 4343 +3 4343 4377 4378 +3 4343 4378 4379 +3 4371 4380 4361 +3 4361 4380 4381 +3 4361 4381 4382 +3 4379 4383 4343 +3 4343 4383 4384 +3 4343 4384 4385 +3 4385 4386 4343 +3 4343 4386 4387 +3 4343 4387 4321 +3 4321 4387 4388 +3 4321 4388 4358 +3 4382 4389 4361 +3 4361 4389 4390 +3 4361 4390 4374 +3 4390 4391 4374 +3 4374 4391 4392 +3 4374 4392 4393 +3 4393 4394 4374 +3 4374 4394 4395 +3 4374 4395 4376 +3 4396 4397 4398 +3 4398 4397 4361 +3 4399 4400 4361 +3 4361 4400 4401 +3 4361 4401 4398 +3 4396 4402 4397 +3 4397 4402 4403 +3 4397 4403 4404 +3 4405 4406 4361 +3 4361 4406 4407 +3 4407 4408 4361 +3 4361 4408 4409 +3 4361 4409 4399 +3 4410 4374 4411 +3 4411 4374 4412 +3 4411 4412 4413 +3 4413 4412 4414 +3 4410 4415 4374 +3 4374 4415 4416 +3 4374 4416 4417 +3 4404 4418 4397 +3 4397 4418 4419 +3 4397 4419 4420 +3 4417 4421 4374 +3 4374 4421 4422 +3 4374 4422 4423 +3 4423 4424 4374 +3 4374 4424 4425 +3 4374 4425 4361 +3 4361 4425 4426 +3 4361 4426 4405 +3 4420 4427 4397 +3 4397 4427 4428 +3 4397 4428 4412 +3 4428 4429 4412 +3 4412 4429 4430 +3 4412 4430 4431 +3 4431 4432 4412 +3 4412 4432 4433 +3 4412 4433 4414 +3 4434 4435 4436 +3 4436 4435 4397 +3 4436 4397 4437 +3 4397 4438 4439 +3 4434 4440 4435 +3 4435 4440 4441 +3 4435 4441 4442 +3 4439 4443 4397 +3 4397 4443 4444 +3 4397 4444 4445 +3 4445 4446 4397 +3 4397 4446 4447 +3 4397 4447 4437 +3 4448 4412 4449 +3 4449 4412 4450 +3 4449 4450 4451 +3 4451 4450 4452 +3 4448 4453 4412 +3 4412 4453 4454 +3 4412 4454 4455 +3 4442 4456 4435 +3 4435 4456 4457 +3 4435 4457 4458 +3 4455 4459 4412 +3 4412 4459 4460 +3 4412 4460 4461 +3 4461 4462 4412 +3 4412 4462 4463 +3 4412 4463 4397 +3 4397 4463 4464 +3 4397 4464 4438 +3 4458 4465 4435 +3 4435 4465 4466 +3 4435 4466 4450 +3 4466 4467 4450 +3 4450 4467 4468 +3 4450 4468 4469 +3 4469 4470 4450 +3 4450 4470 4471 +3 4450 4471 4452 +3 4472 4473 4474 +3 4475 4476 4450 +3 4450 4476 4477 +3 4478 4479 4435 +3 4435 4479 4480 +3 4435 4480 4472 +3 4481 4482 4435 +3 4435 4482 4483 +3 4483 4484 4435 +3 4435 4484 4485 +3 4435 4485 4478 +3 4486 4487 4474 +3 4488 4489 4490 +3 4477 4491 4450 +3 4450 4491 4492 +3 4450 4492 4493 +3 4494 4495 4473 +3 4473 4495 4496 +3 4489 4497 4490 +3 4490 4497 4498 +3 4490 4498 4499 +3 4500 4501 4450 +3 4450 4501 4502 +3 4450 4502 4503 +3 4493 4504 4450 +3 4450 4504 4505 +3 4450 4505 4506 +3 4506 4507 4450 +3 4450 4507 4508 +3 4450 4508 4435 +3 4435 4508 4509 +3 4435 4509 4481 +3 4510 4511 4490 +3 4499 4512 4490 +3 4490 4512 4513 +3 4490 4513 4450 +3 4450 4513 4514 +3 4450 4514 4500 +3 4487 4515 4474 +3 4474 4515 4516 +3 4474 4516 4517 +3 4511 4518 4490 +3 4490 4518 4519 +3 4490 4519 4488 +3 4503 4520 4450 +3 4450 4520 4521 +3 4450 4521 4475 +3 4494 4473 4522 +3 4522 4473 4523 +3 4522 4523 4524 +3 4496 4525 4473 +3 4473 4525 4526 +3 4473 4526 4474 +3 4474 4526 4527 +3 4474 4527 4486 +3 4517 4528 4474 +3 4474 4528 4529 +3 4474 4529 4530 +3 4531 4532 4533 +3 4533 4532 4534 +3 4533 4534 4503 +3 4503 4534 4535 +3 4503 4535 4520 +3 4536 4537 4538 +3 4538 4537 4539 +3 4524 4523 4540 +3 4540 4523 4541 +3 4540 4541 4538 +3 4538 4541 4542 +3 4538 4542 4536 +3 4539 4543 4538 +3 4538 4543 4544 +3 4538 4544 4531 +3 4531 4544 4545 +3 4531 4545 4532 +3 4546 4547 4548 +3 4548 4547 4549 +3 4548 4549 4550 +3 4551 4552 4490 +3 4490 4552 4553 +3 4554 4555 4474 +3 4474 4555 4556 +3 4550 4557 4548 +3 4548 4557 4558 +3 4548 4558 4490 +3 4490 4558 4559 +3 4490 4559 4551 +3 4553 4560 4490 +3 4490 4560 4561 +3 4490 4561 4562 +3 4562 4563 4490 +3 4490 4563 4474 +3 4490 4474 4510 +3 4510 4474 4530 +3 4563 4564 4474 +3 4474 4564 4565 +3 4474 4565 4566 +3 4566 4567 4474 +3 4474 4567 4568 +3 4474 4568 4554 +3 4569 4570 4548 +3 4571 4572 4573 +3 4573 4572 4574 +3 4573 4574 4575 +3 4570 4576 4548 +3 4548 4576 4577 +3 4548 4577 4546 +3 4556 4578 4474 +3 4474 4578 4579 +3 4474 4579 4573 +3 4573 4579 4580 +3 4573 4580 4571 +3 4575 4581 4573 +3 4573 4581 4582 +3 4573 4582 4583 +3 4584 4585 4237 +3 4237 4585 4586 +3 4586 4587 4237 +3 4237 4587 4588 +3 4237 4588 4589 +3 4590 4591 4548 +3 4548 4591 4592 +3 4593 4594 4573 +3 4573 4594 4595 +3 4589 4596 4237 +3 4237 4596 4597 +3 4237 4597 4548 +3 4548 4597 4598 +3 4548 4598 4590 +3 4592 4599 4548 +3 4548 4599 4600 +3 4548 4600 4601 +3 4601 4602 4548 +3 4548 4602 4573 +3 4548 4573 4569 +3 4569 4573 4583 +3 4602 4603 4573 +3 4573 4603 4604 +3 4573 4604 4605 +3 4605 4606 4573 +3 4573 4606 4607 +3 4573 4607 4593 +3 4608 4609 4250 +3 4250 4609 4610 +3 4595 4611 4573 +3 4573 4611 4612 +3 4573 4612 4250 +3 4250 4612 4613 +3 4250 4613 4608 +3 4610 4614 4250 +3 4250 4614 4615 +3 4250 4615 4616 +3 4616 4617 4250 +3 4250 4617 4618 +3 4250 4618 4237 +3 4237 4618 4619 +3 4237 4619 4584 +3 4620 4621 4622 +3 4623 4624 4303 +3 4625 4626 4286 +3 4286 4626 4627 +3 4286 4627 4622 +3 4622 4627 4628 +3 4622 4628 4620 +3 4621 4629 4622 +3 4622 4629 4630 +3 4622 4630 4631 +3 4303 4632 4633 +3 4631 4634 4622 +3 4622 4634 4635 +3 4622 4635 4636 +3 4636 4635 4637 +3 4636 4637 4638 +3 4633 4639 4303 +3 4303 4639 4640 +3 4303 4640 4623 +3 4624 4641 4303 +3 4303 4641 4642 +3 4303 4642 4286 +3 4286 4642 4643 +3 4643 4644 4286 +3 4286 4644 4645 +3 4286 4645 4646 +3 4638 4647 4636 +3 4636 4647 4648 +3 4636 4648 4649 +3 4649 4650 4636 +3 4636 4650 4651 +3 4636 4651 4652 +3 4646 4653 4286 +3 4286 4653 4654 +3 4286 4654 4625 +3 4652 4655 4636 +3 4636 4655 4656 +3 4636 4656 4303 +3 4303 4656 4657 +3 4303 4657 4632 +3 4658 4659 4636 +3 4636 4659 4660 +3 4661 4662 4303 +3 4303 4662 4663 +3 4303 4663 4636 +3 4636 4663 4664 +3 4636 4664 4658 +3 4660 4665 4636 +3 4636 4665 4666 +3 4636 4666 4667 +3 4668 4669 4321 +3 4670 4671 4672 +3 4672 4671 4636 +3 4672 4636 4673 +3 4673 4636 4667 +3 4670 4674 4671 +3 4671 4674 4675 +3 4671 4675 4676 +3 4669 4677 4321 +3 4321 4677 4678 +3 4321 4678 4679 +3 4679 4680 4321 +3 4321 4680 4681 +3 4321 4681 4303 +3 4303 4681 4682 +3 4303 4682 4683 +3 4683 4684 4303 +3 4303 4684 4685 +3 4303 4685 4686 +3 4686 4687 4303 +3 4303 4687 4688 +3 4303 4688 4661 +3 4676 4689 4671 +3 4671 4689 4690 +3 4671 4690 4691 +3 4691 4692 4671 +3 4671 4692 4693 +3 4671 4693 4321 +3 4321 4693 4694 +3 4321 4694 4668 +3 4671 4695 4696 +3 4697 4698 4699 +3 4699 4698 4671 +3 4699 4671 4700 +3 4696 4701 4671 +3 4671 4701 4702 +3 4671 4702 4703 +3 4703 4704 4671 +3 4671 4704 4705 +3 4671 4705 4700 +3 4697 4706 4698 +3 4698 4706 4707 +3 4698 4707 4708 +3 4709 4321 4710 +3 4710 4321 4361 +3 4710 4361 4711 +3 4711 4361 4712 +3 4709 4713 4321 +3 4321 4713 4714 +3 4321 4714 4715 +3 4708 4716 4698 +3 4698 4716 4717 +3 4698 4717 4718 +3 4715 4719 4321 +3 4321 4719 4720 +3 4321 4720 4721 +3 4721 4722 4321 +3 4321 4722 4723 +3 4321 4723 4671 +3 4671 4723 4724 +3 4671 4724 4695 +3 4718 4725 4698 +3 4698 4725 4726 +3 4698 4726 4361 +3 4726 4727 4361 +3 4361 4727 4728 +3 4361 4728 4729 +3 4729 4730 4361 +3 4361 4730 4731 +3 4361 4731 4712 +3 4732 4733 4698 +3 4734 4735 4736 +3 4736 4735 4698 +3 4736 4698 4737 +3 4737 4698 4733 +3 4738 4739 4698 +3 4698 4739 4740 +3 4740 4741 4698 +3 4698 4741 4742 +3 4698 4742 4732 +3 4734 4743 4735 +3 4735 4743 4744 +3 4735 4744 4745 +3 4746 4361 4747 +3 4747 4361 4397 +3 4747 4397 4748 +3 4748 4397 4749 +3 4746 4750 4361 +3 4361 4750 4751 +3 4361 4751 4752 +3 4745 4753 4735 +3 4735 4753 4754 +3 4735 4754 4755 +3 4752 4756 4361 +3 4361 4756 4757 +3 4361 4757 4758 +3 4758 4759 4361 +3 4361 4759 4760 +3 4361 4760 4698 +3 4698 4760 4761 +3 4698 4761 4738 +3 4755 4762 4735 +3 4735 4762 4763 +3 4735 4763 4397 +3 4763 4764 4397 +3 4397 4764 4765 +3 4397 4765 4766 +3 4766 4767 4397 +3 4397 4767 4768 +3 4397 4768 4749 +3 4735 4769 4770 +3 4771 4772 4773 +3 4773 4772 4735 +3 4773 4735 4774 +3 4770 4775 4735 +3 4735 4775 4776 +3 4735 4776 4777 +3 4777 4778 4735 +3 4735 4778 4779 +3 4735 4779 4774 +3 4771 4780 4772 +3 4772 4780 4781 +3 4772 4781 4782 +3 4783 4397 4784 +3 4784 4397 4435 +3 4784 4435 4785 +3 4785 4435 4786 +3 4783 4787 4397 +3 4397 4787 4788 +3 4397 4788 4789 +3 4782 4790 4772 +3 4772 4790 4791 +3 4772 4791 4792 +3 4789 4793 4397 +3 4397 4793 4794 +3 4397 4794 4795 +3 4795 4796 4397 +3 4397 4796 4797 +3 4397 4797 4735 +3 4735 4797 4798 +3 4735 4798 4769 +3 4792 4799 4772 +3 4772 4799 4800 +3 4772 4800 4435 +3 4800 4801 4435 +3 4435 4801 4802 +3 4435 4802 4803 +3 4803 4804 4435 +3 4435 4804 4805 +3 4435 4805 4786 +3 4806 4807 4772 +3 4474 4808 4809 +3 4472 4474 4435 +3 4435 4474 4810 +3 4435 4810 4811 +3 4812 4813 4814 +3 4474 4809 4810 +3 4810 4809 4815 +3 4810 4815 4816 +3 4811 4817 4435 +3 4435 4817 4818 +3 4435 4818 4819 +3 4820 4821 4822 +3 4823 4824 4825 +3 4825 4824 4826 +3 4819 4827 4435 +3 4435 4827 4828 +3 4435 4828 4829 +3 4807 4830 4772 +3 4772 4830 4831 +3 4772 4831 4812 +3 4812 4831 4832 +3 4812 4832 4833 +3 4814 4834 4812 +3 4812 4834 4835 +3 4812 4835 4836 +3 4837 4838 4839 +3 4816 4840 4810 +3 4810 4840 4825 +3 4810 4825 4841 +3 4841 4825 4826 +3 4842 4772 4843 +3 4843 4772 4435 +3 4843 4435 4844 +3 4844 4435 4829 +3 4842 4845 4772 +3 4772 4845 4846 +3 4772 4846 4847 +3 4847 4848 4772 +3 4772 4848 4849 +3 4772 4849 4806 +3 4813 4812 4850 +3 4850 4812 4833 +3 4850 4833 4821 +3 4821 4833 4851 +3 4821 4851 4822 +3 4852 4853 4474 +3 4474 4853 4854 +3 4474 4854 4808 +3 4839 4838 4855 +3 4825 4856 4823 +3 4823 4856 4857 +3 4823 4857 4858 +3 4859 4822 4860 +3 4859 4861 4822 +3 4822 4861 4862 +3 4822 4862 4820 +3 4836 4863 4812 +3 4812 4863 4864 +3 4812 4864 4865 +3 4865 4866 4812 +3 4812 4866 4867 +3 4812 4867 4474 +3 4474 4867 4868 +3 4474 4868 4869 +3 4869 4870 4474 +3 4474 4870 4871 +3 4474 4871 4852 +3 4839 4872 4837 +3 4837 4872 4873 +3 4837 4873 4858 +3 4858 4873 4874 +3 4858 4874 4823 +3 4838 4875 4855 +3 4855 4875 4876 +3 4855 4876 4877 +3 4877 4876 4859 +3 4877 4859 4878 +3 4878 4859 4860 +3 4879 4880 4812 +3 4881 4882 4573 +3 4573 4882 4883 +3 4573 4883 4884 +3 4884 4885 4573 +3 4573 4885 4886 +3 4573 4886 4887 +3 4888 4889 4474 +3 4474 4889 4890 +3 4891 4892 4812 +3 4892 4893 4812 +3 4812 4893 4894 +3 4812 4894 4879 +3 4887 4895 4573 +3 4573 4895 4896 +3 4573 4896 4474 +3 4474 4896 4897 +3 4474 4897 4888 +3 4890 4898 4474 +3 4474 4898 4899 +3 4474 4899 4900 +3 4900 4901 4474 +3 4474 4901 4902 +3 4474 4902 4812 +3 4812 4902 4903 +3 4812 4903 4891 +3 4880 4904 4812 +3 4812 4904 4905 +3 4812 4905 4906 +3 4905 4907 4906 +3 4906 4907 4908 +3 4906 4908 4909 +3 4909 4910 4906 +3 4906 4910 4911 +3 4906 4911 4912 +3 4912 4913 4906 +3 4906 4913 4914 +3 4906 4914 4573 +3 4573 4914 4915 +3 4573 4915 4881 +3 4916 4917 4906 +3 4918 4919 4250 +3 4250 4919 4920 +3 4250 4920 4921 +3 4921 4922 4250 +3 4250 4922 4923 +3 4250 4923 4924 +3 4925 4926 4573 +3 4573 4926 4927 +3 4928 4929 4906 +3 4929 4930 4906 +3 4906 4930 4931 +3 4906 4931 4916 +3 4924 4932 4250 +3 4250 4932 4933 +3 4250 4933 4573 +3 4573 4933 4934 +3 4573 4934 4925 +3 4927 4935 4573 +3 4573 4935 4936 +3 4573 4936 4937 +3 4937 4938 4573 +3 4573 4938 4939 +3 4573 4939 4906 +3 4906 4939 4940 +3 4906 4940 4928 +3 4917 4941 4906 +3 4906 4941 4942 +3 4906 4942 4943 +3 4942 4944 4943 +3 4943 4944 4945 +3 4943 4945 4946 +3 4946 4947 4943 +3 4943 4947 4948 +3 4943 4948 4949 +3 4949 4950 4943 +3 4943 4950 4951 +3 4943 4951 4250 +3 4250 4951 4952 +3 4250 4952 4918 +3 4953 4954 4955 +3 4956 4240 4957 +3 4957 4240 4958 +3 4956 4959 4240 +3 4240 4959 4960 +3 4240 4960 4961 +3 4961 4962 4240 +3 4240 4962 4963 +3 4240 4963 4250 +3 4250 4963 4964 +3 4250 4964 4965 +3 4965 4966 4250 +3 4250 4966 4967 +3 4250 4967 4968 +3 4968 4969 4250 +3 4250 4969 4970 +3 4250 4970 4971 +3 4971 4972 4250 +3 4250 4972 4973 +3 4250 4973 4943 +3 4943 4973 4974 +3 4975 4976 4943 +3 4943 4976 4977 +3 4943 4977 4978 +3 4974 4979 4943 +3 4943 4979 4980 +3 4943 4980 4975 +3 4955 4981 4953 +3 4953 4981 4982 +3 4953 4982 4983 +3 4983 4984 4953 +3 4953 4984 4985 +3 4953 4985 4240 +3 4240 4985 4986 +3 4240 4986 4958 +3 4978 4987 4943 +3 4943 4987 4988 +3 4943 4988 4953 +3 4953 4988 4989 +3 4953 4989 4954 +3 4990 4991 4622 +3 4992 4993 4994 +3 4994 4993 4995 +3 4996 4997 4998 +3 4998 4997 4999 +3 4998 4999 5000 +3 5001 5002 4636 +3 4636 5002 5003 +3 5003 5004 4636 +3 4636 5004 5005 +3 4636 5005 5006 +3 5006 5007 4636 +3 4636 5007 5008 +3 4636 5008 4622 +3 4622 5008 5009 +3 4622 5009 4990 +3 4991 5010 4622 +3 4622 5010 5011 +3 4622 5011 5012 +3 5012 5013 4622 +3 4622 5013 5014 +3 4622 5014 4993 +3 4993 5014 5015 +3 4993 5015 4995 +3 5016 5017 4993 +3 4993 5017 5018 +3 4993 5018 4998 +3 4998 5018 5019 +3 4998 5019 4996 +3 5000 5020 4998 +3 4998 5020 5021 +3 4998 5021 5022 +3 4992 5023 4993 +3 4993 5023 5024 +3 4993 5024 5016 +3 5022 5025 4998 +3 4998 5025 5026 +3 4998 5026 4636 +3 4636 5026 5027 +3 4636 5027 5001 +3 5028 4998 5029 +3 5029 4998 5030 +3 5031 5032 5033 +3 5034 4636 5035 +3 5035 4636 5036 +3 5037 5038 4998 +3 4998 5038 5039 +3 4998 5039 5040 +3 5040 5041 5033 +3 5033 5041 5042 +3 5033 5042 5031 +3 5043 5044 4671 +3 4671 5044 5045 +3 4671 5045 4636 +3 4636 5045 5046 +3 4636 5046 5036 +3 5034 5047 4636 +3 4636 5047 5048 +3 4636 5048 5049 +3 5049 5050 4636 +3 4636 5050 5051 +3 4636 5051 4998 +3 4998 5051 5052 +3 4998 5052 5030 +3 5028 5053 4998 +3 4998 5053 5054 +3 4998 5054 5037 +3 5032 5055 5033 +3 5033 5055 5056 +3 5033 5056 5057 +3 5057 5058 5033 +3 5033 5058 5059 +3 5033 5059 4671 +3 5059 5060 4671 +3 4671 5060 5061 +3 4671 5061 5062 +3 5062 5063 4671 +3 4671 5063 5064 +3 4671 5064 5043 +3 5065 5066 5067 +3 5068 5069 5033 +3 5033 5069 5070 +3 5033 5070 5071 +3 5067 5072 5073 +3 5074 5075 4671 +3 4671 5075 5076 +3 5066 5077 5067 +3 5067 5077 5078 +3 5067 5078 5072 +3 5079 5080 4671 +3 4671 5080 5081 +3 4671 5081 5074 +3 5076 5082 4671 +3 4671 5082 5083 +3 4671 5083 5033 +3 5033 5083 5084 +3 5033 5084 5068 +3 5071 5085 5033 +3 5033 5085 5086 +3 5033 5086 5087 +3 5087 5088 5033 +3 5033 5088 5089 +3 5033 5089 5067 +3 5067 5089 5090 +3 5067 5090 5065 +3 5073 5091 5067 +3 5067 5091 5092 +3 5067 5092 4698 +3 5092 5093 4698 +3 4698 5093 5094 +3 4698 5094 5095 +3 5095 5096 4698 +3 4698 5096 5097 +3 4698 5097 5098 +3 5098 5099 4698 +3 4698 5099 5100 +3 4698 5100 4671 +3 4671 5100 5101 +3 4671 5101 5079 +3 5102 5103 5104 +3 5105 5106 4735 +3 5107 5108 5067 +3 5067 5108 5109 +3 5067 5109 5110 +3 5110 5111 5067 +3 5067 5111 5112 +3 5067 5112 5113 +3 5113 5114 5067 +3 5067 5114 5115 +3 5067 5115 5104 +3 5104 5115 5116 +3 5104 5116 5102 +3 5104 5117 5118 +3 5119 5120 4735 +3 4735 5120 5121 +3 4735 5121 5105 +3 5122 4698 5123 +3 5123 4698 5124 +3 5122 5125 4698 +3 4698 5125 5126 +3 4698 5126 5127 +3 5103 5128 5104 +3 5104 5128 5129 +3 5104 5129 5117 +3 5106 5130 4735 +3 4735 5130 5131 +3 4735 5131 4698 +3 4698 5131 5132 +3 4698 5132 5124 +3 5127 5133 4698 +3 4698 5133 5134 +3 4698 5134 5067 +3 5067 5134 5135 +3 5067 5135 5107 +3 5118 5136 5104 +3 5104 5136 5137 +3 5104 5137 4735 +3 4735 5137 5138 +3 4735 5138 5119 +3 5139 5140 5141 +3 5142 5143 5104 +3 5104 5143 5144 +3 5104 5144 5145 +3 5141 5146 5147 +3 5148 5149 4735 +3 4735 5149 5150 +3 5140 5151 5141 +3 5141 5151 5152 +3 5141 5152 5146 +3 5153 5154 4735 +3 4735 5154 5155 +3 4735 5155 5148 +3 5150 5156 4735 +3 4735 5156 5157 +3 4735 5157 5104 +3 5104 5157 5158 +3 5104 5158 5142 +3 5145 5159 5104 +3 5104 5159 5160 +3 5104 5160 5161 +3 5161 5162 5104 +3 5104 5162 5163 +3 5104 5163 5141 +3 5141 5163 5164 +3 5141 5164 5139 +3 5147 5165 5141 +3 5141 5165 5166 +3 5141 5166 4772 +3 5166 5167 4772 +3 4772 5167 5168 +3 4772 5168 5169 +3 5169 5170 4772 +3 4772 5170 5171 +3 4772 5171 5172 +3 5172 5173 4772 +3 4772 5173 5174 +3 4772 5174 4735 +3 4735 5174 5175 +3 4735 5175 5153 +3 5176 5177 5141 +3 5178 5179 5180 +3 5177 5181 5141 +3 5141 5181 5182 +3 5141 5182 5178 +3 5183 5184 5179 +3 4772 5185 5141 +3 5141 5185 5186 +3 5141 5186 5187 +3 5187 5188 5141 +3 5141 5188 5189 +3 5141 5189 5176 +3 5184 5190 5179 +3 5179 5190 5191 +3 5179 5191 5180 +3 5180 5191 5192 +3 5193 5194 5179 +3 5179 5194 5195 +3 5179 5195 5183 +3 5196 5197 4812 +3 4812 5197 5198 +3 4812 5198 5199 +3 5199 5200 4812 +3 4812 5200 5201 +3 4812 5201 4772 +3 4772 5201 5202 +3 4772 5202 5203 +3 5204 5205 4772 +3 4772 5205 5206 +3 5207 5208 4812 +3 4812 5208 5209 +3 4812 5209 5196 +3 5210 5211 5203 +3 5203 5211 5212 +3 5203 5212 4772 +3 4772 5212 5213 +3 4772 5213 5204 +3 5206 5214 4772 +3 4772 5214 5215 +3 4772 5215 5216 +3 5217 5218 5219 +3 5219 5218 5220 +3 5216 5221 4772 +3 4772 5221 5222 +3 4772 5222 5185 +3 5192 5223 5180 +3 5180 5223 5224 +3 5180 5224 5225 +3 5225 5226 5180 +3 5180 5226 5227 +3 5180 5227 5228 +3 5228 5229 5180 +3 5180 5229 5230 +3 5180 5230 4812 +3 4812 5230 5231 +3 4812 5231 5207 +3 5210 5232 5211 +3 5211 5232 5219 +3 5211 5219 5233 +3 5233 5219 5220 +3 5234 5235 5236 +3 5236 5235 5237 +3 5236 5237 5193 +3 5193 5237 5238 +3 5193 5238 5194 +3 5239 5240 5241 +3 5241 5240 5217 +3 5241 5217 5242 +3 5242 5217 5219 +3 5234 5243 5235 +3 5235 5243 5244 +3 5235 5244 5245 +3 5245 5246 5235 +3 5235 5246 5247 +3 5235 5247 5239 +3 5239 5247 5248 +3 5239 5248 5240 +3 4812 5249 5180 +3 5180 5249 5250 +3 5180 5250 5251 +3 5252 5253 5180 +3 5180 5253 5254 +3 5254 5255 5180 +3 5180 5255 5256 +3 5180 5256 5257 +3 5251 5258 5180 +3 5180 5258 5259 +3 5180 5259 5252 +3 5260 5261 4906 +3 4906 5261 5262 +3 4906 5262 5263 +3 5264 5265 4812 +3 5265 5266 4812 +3 4812 5266 5267 +3 4812 5267 5268 +3 5256 5269 5257 +3 5257 5269 5270 +3 5257 5270 5271 +3 5271 5272 5257 +3 5257 5272 5273 +3 5257 5273 5274 +3 5263 5275 4906 +3 4906 5275 5276 +3 4906 5276 5277 +3 5277 5278 4906 +3 4906 5278 5279 +3 4906 5279 4812 +3 4812 5279 5280 +3 4812 5280 5264 +3 5268 5281 4812 +3 4812 5281 5282 +3 4812 5282 5249 +3 5274 5283 5257 +3 5257 5283 5284 +3 5257 5284 4906 +3 4906 5284 5285 +3 4906 5285 5260 +3 4906 5286 5257 +3 5257 5286 5287 +3 5257 5287 5288 +3 5289 5290 4943 +3 4943 5290 5291 +3 5292 5293 5257 +3 5257 5293 5294 +3 5295 5296 5297 +3 5297 5296 5257 +3 5297 5257 5298 +3 5298 5257 5294 +3 5288 5299 5257 +3 5257 5299 5300 +3 5257 5300 5292 +3 5296 5301 5302 +3 5303 5304 4906 +3 5304 5305 4906 +3 4906 5305 5306 +3 4906 5306 5307 +3 5295 5308 5296 +3 5296 5308 5309 +3 5296 5309 5301 +3 5310 5311 4943 +3 4943 5311 5312 +3 4943 5312 5289 +3 5291 5313 4943 +3 4943 5313 5314 +3 4943 5314 5315 +3 5315 5316 4943 +3 4943 5316 5317 +3 4943 5317 4906 +3 4906 5317 5318 +3 4906 5318 5303 +3 5307 5319 4906 +3 4906 5319 5320 +3 4906 5320 5286 +3 5302 5321 5296 +3 5296 5321 5322 +3 5296 5322 5310 +3 5323 5324 5296 +3 5296 5324 5325 +3 5296 5325 5326 +3 5326 5327 5296 +3 5296 5327 5328 +3 5296 5328 5329 +3 5310 4943 5296 +3 5296 4943 5330 +3 5296 5330 5323 +3 5329 5331 5296 +3 5296 5331 5332 +3 5296 5332 5333 +3 5332 5334 5333 +3 5333 5334 5335 +3 5333 5335 5336 +3 5336 5337 5333 +3 5333 5337 5338 +3 5333 5338 5339 +3 4953 5333 5340 +3 5339 5341 5333 +3 5333 5341 5342 +3 5333 5342 5340 +3 5340 5343 4953 +3 4953 5343 5344 +3 4953 5344 5345 +3 5345 5346 4953 +3 4953 5346 5347 +3 4953 5347 5348 +3 5349 4943 5350 +3 5350 4943 4953 +3 5350 4953 5351 +3 5351 4953 5348 +3 5349 5352 4943 +3 4943 5352 5353 +3 4943 5353 5354 +3 5354 5355 4943 +3 4943 5355 5356 +3 4943 5356 5357 +3 5357 5358 4943 +3 4943 5358 5359 +3 4943 5359 5330 +3 5360 5361 4993 +3 5362 5363 5364 +3 5364 5363 5365 +3 5366 5367 4993 +3 4993 5367 5368 +3 4993 5368 5363 +3 5363 5368 5369 +3 5363 5369 5365 +3 5362 5370 5363 +3 5363 5370 5371 +3 5363 5371 5372 +3 5361 5373 4993 +3 4993 5373 5374 +3 4993 5374 5366 +3 5375 5376 4998 +3 4998 5376 5377 +3 5377 5378 4998 +3 4998 5378 5379 +3 4998 5379 5380 +3 5381 5382 5383 +3 5383 5382 5384 +3 5383 5384 5385 +3 5385 5386 5383 +3 5383 5386 5387 +3 5383 5387 5388 +3 5380 5389 4998 +3 4998 5389 5390 +3 4998 5390 4993 +3 4993 5390 5391 +3 4993 5391 5360 +3 5372 5392 5363 +3 5363 5392 5393 +3 5363 5393 5383 +3 5383 5393 5394 +3 5383 5394 5381 +3 5388 5395 5383 +3 5383 5395 5396 +3 5383 5396 4998 +3 4998 5396 5397 +3 4998 5397 5375 +3 5398 5399 5383 +3 5400 5401 4998 +3 4998 5401 5402 +3 4998 5402 5383 +3 5383 5402 5403 +3 5383 5403 5398 +3 5399 5404 5383 +3 5383 5404 5405 +3 5383 5405 5406 +3 4998 5407 5408 +3 5040 5033 4998 +3 4998 5033 5409 +3 4998 5409 5407 +3 5410 5411 5033 +3 5411 5412 5033 +3 5033 5412 5413 +3 5033 5413 5409 +3 5408 5414 4998 +3 4998 5414 5415 +3 4998 5415 5416 +3 5416 5417 4998 +3 4998 5417 5418 +3 4998 5418 5400 +3 5406 5419 5383 +3 5383 5419 5420 +3 5383 5420 4148 +3 4148 5420 5421 +3 5421 5422 4148 +3 4148 5422 5423 +3 4148 5423 5424 +3 5424 5425 4148 +3 4148 5425 5426 +3 4148 5426 5427 +3 5428 5429 5033 +3 5033 5429 5430 +3 5033 5430 5410 +3 5427 5431 4148 +3 4148 5431 5432 +3 4148 5432 5033 +3 5033 5432 5433 +3 5033 5433 5428 +3 5434 5435 5067 +3 5067 5435 5436 +3 5067 5436 5033 +3 5033 5436 5437 +3 5033 5437 5438 +3 5438 5439 5033 +3 5033 5439 5440 +3 5033 5440 5441 +3 5441 5442 5033 +3 5033 5442 5443 +3 5033 5443 5444 +3 5445 4148 5446 +3 5446 4148 5447 +3 5444 5448 5033 +3 5033 5448 5449 +3 5033 5449 4148 +3 4148 5449 5450 +3 5450 5451 4148 +3 4148 5451 5452 +3 4148 5452 5447 +3 5445 5453 4148 +3 4148 5453 5454 +3 4148 5454 5455 +3 5455 5454 5456 +3 5455 5456 5457 +3 5455 5458 5459 +3 5460 5461 5067 +3 5067 5461 5462 +3 5067 5462 5463 +3 5463 5464 5067 +3 5067 5464 5465 +3 5067 5465 5434 +3 5457 5466 5455 +3 5455 5466 5467 +3 5455 5467 5458 +3 5459 5468 5455 +3 5455 5468 5469 +3 5455 5469 5470 +3 5471 5472 5067 +3 5067 5472 5473 +3 5474 5455 5067 +3 5067 5455 5470 +3 5067 5470 5460 +3 5475 5476 5104 +3 5104 5476 5477 +3 5477 5478 5104 +3 5104 5478 5479 +3 5104 5479 5067 +3 5067 5479 5480 +3 5067 5480 5471 +3 5473 5481 5067 +3 5067 5481 5482 +3 5067 5482 5483 +3 5483 5484 5067 +3 5067 5484 5485 +3 5067 5485 5474 +3 5474 5486 5455 +3 5455 5486 5487 +3 5455 5487 5488 +3 5488 5489 5455 +3 5455 5489 5490 +3 5455 5490 5491 +3 5492 5493 5494 +3 5494 5493 5455 +3 5495 5496 5104 +3 5491 5497 5455 +3 5455 5497 5498 +3 5455 5498 5494 +3 5493 5499 5500 +3 5492 5501 5493 +3 5493 5501 5502 +3 5493 5502 5499 +3 5500 5503 5493 +3 5493 5503 5504 +3 5493 5504 5505 +3 5496 5506 5104 +3 5104 5506 5507 +3 5104 5507 5475 +3 5508 5493 5104 +3 5104 5493 5505 +3 5104 5505 5495 +3 5508 5509 5493 +3 5493 5509 5510 +3 5493 5510 5511 +3 5511 5512 5493 +3 5493 5512 5513 +3 5493 5513 5514 +3 5515 5493 5516 +3 5514 5517 5493 +3 5493 5517 5518 +3 5493 5518 5516 +3 5516 5519 5515 +3 5515 5519 5520 +3 5515 5520 5521 +3 5521 5522 5515 +3 5515 5522 5523 +3 5515 5523 5524 +3 5524 5525 5515 +3 5515 5525 5526 +3 5515 5526 5527 +3 5527 5528 5141 +3 5141 5528 5529 +3 5141 5529 5530 +3 5530 5531 5141 +3 5141 5531 5532 +3 5141 5532 5533 +3 5534 5104 5535 +3 5535 5104 5141 +3 5535 5141 5536 +3 5536 5141 5533 +3 5534 5537 5104 +3 5104 5537 5538 +3 5104 5538 5539 +3 5539 5540 5104 +3 5104 5540 5541 +3 5104 5541 5542 +3 5542 5543 5104 +3 5104 5543 5544 +3 5104 5544 5508 +3 5545 5546 5515 +3 5527 5141 5515 +3 5515 5141 5547 +3 5515 5547 5548 +3 5549 5550 5551 +3 5551 5550 5552 +3 5515 5553 5554 +3 5515 5546 5551 +3 5551 5546 5555 +3 5551 5555 5556 +3 5548 5557 5515 +3 5515 5557 5558 +3 5515 5558 5553 +3 5554 5559 5515 +3 5515 5559 5560 +3 5515 5560 5545 +3 5561 5562 5556 +3 5556 5562 5563 +3 5556 5563 5551 +3 5551 5563 5564 +3 5551 5564 5549 +3 5565 5566 5556 +3 5556 5566 5567 +3 5556 5567 5561 +3 5568 5569 5570 +3 5569 5571 5570 +3 5570 5571 5572 +3 5570 5572 5573 +3 5568 5570 5574 +3 5574 5570 5575 +3 5574 5575 5576 +3 5576 5577 5574 +3 5574 5577 5578 +3 5574 5578 5579 +3 5552 5580 5551 +3 5551 5580 5581 +3 5551 5581 5582 +3 5572 5583 5573 +3 5573 5583 5584 +3 5573 5584 5556 +3 5556 5584 5585 +3 5556 5585 5565 +3 5586 5587 5180 +3 5180 5587 5588 +3 5178 5180 5141 +3 5141 5180 5589 +3 5141 5589 5590 +3 5582 5591 5551 +3 5551 5591 5592 +3 5551 5592 5180 +3 5180 5592 5593 +3 5180 5593 5586 +3 5588 5594 5180 +3 5180 5594 5595 +3 5180 5595 5596 +3 5596 5597 5180 +3 5180 5597 5598 +3 5180 5598 5589 +3 5578 5599 5579 +3 5579 5599 5600 +3 5579 5600 5601 +3 5600 5602 5601 +3 5601 5602 5603 +3 5601 5603 5590 +3 5603 5604 5590 +3 5590 5604 5605 +3 5590 5605 5606 +3 5607 5141 5608 +3 5608 5141 5590 +3 5608 5590 5609 +3 5609 5590 5606 +3 5607 5610 5141 +3 5141 5610 5611 +3 5141 5611 5612 +3 5612 5613 5141 +3 5141 5613 5614 +3 5141 5614 5615 +3 5615 5616 5141 +3 5141 5616 5617 +3 5141 5617 5547 +3 5618 5619 5551 +3 5619 5620 5621 +3 5622 5623 5257 +3 5551 5624 5625 +3 5625 5626 5551 +3 5551 5626 5627 +3 5551 5627 5628 +3 5620 5629 5621 +3 5621 5629 5630 +3 5621 5630 5631 +3 5631 5632 5621 +3 5621 5632 5633 +3 5621 5633 5634 +3 5635 5636 5180 +3 5180 5636 5637 +3 5637 5638 5180 +3 5180 5638 5639 +3 5180 5639 5640 +3 5628 5641 5551 +3 5551 5641 5642 +3 5551 5642 5618 +3 5643 5644 5257 +3 5257 5644 5645 +3 5257 5645 5180 +3 5180 5645 5646 +3 5180 5646 5635 +3 5640 5647 5180 +3 5180 5647 5648 +3 5180 5648 5551 +3 5551 5648 5649 +3 5551 5649 5624 +3 5623 5650 5257 +3 5257 5650 5651 +3 5257 5651 5643 +3 5634 5652 5621 +3 5621 5652 5653 +3 5621 5653 5257 +3 5257 5653 5654 +3 5257 5654 5622 +3 5655 5656 5257 +3 5657 5658 5621 +3 5621 5658 5659 +3 5257 5660 5661 +3 5659 5662 5621 +3 5621 5662 5663 +3 5621 5663 5664 +3 5656 5665 5257 +3 5257 5665 5666 +3 5257 5666 5660 +3 5661 5667 5257 +3 5257 5667 5668 +3 5257 5668 5621 +3 5621 5668 5669 +3 5621 5669 5657 +3 5670 5671 5672 +3 5672 5671 5621 +3 5672 5621 5673 +3 5673 5621 5664 +3 5671 5674 5675 +3 5670 5676 5671 +3 5671 5676 5677 +3 5671 5677 5674 +3 5678 5679 5296 +3 5296 5679 5680 +3 5296 5680 5681 +3 5296 5682 5683 +3 5675 5684 5671 +3 5671 5684 5685 +3 5671 5685 5686 +3 5681 5687 5296 +3 5296 5687 5688 +3 5296 5688 5682 +3 5683 5689 5296 +3 5296 5689 5690 +3 5296 5690 5257 +3 5257 5690 5691 +3 5257 5691 5655 +3 5692 5693 5694 +3 5695 5671 5296 +3 5296 5671 5686 +3 5296 5686 5678 +3 5693 5696 5694 +3 5694 5696 5697 +3 5694 5697 5698 +3 5695 5699 5671 +3 5671 5699 5700 +3 5671 5700 5701 +3 5701 5702 5671 +3 5671 5702 5703 +3 5671 5703 5704 +3 5671 5705 5694 +3 5694 5705 5706 +3 5694 5706 5692 +3 5698 5707 5694 +3 5694 5707 5708 +3 5694 5708 5333 +3 5333 5708 5709 +3 5704 5710 5671 +3 5671 5710 5711 +3 5671 5711 5705 +3 5709 5712 5333 +3 5333 5712 5713 +3 5333 5713 5714 +3 5714 5715 5333 +3 5333 5715 5716 +3 5333 5716 5717 +3 5718 5296 5719 +3 5719 5296 5333 +3 5719 5333 5720 +3 5720 5333 5717 +3 5718 5721 5296 +3 5296 5721 5722 +3 5296 5722 5723 +3 5723 5724 5296 +3 5296 5724 5725 +3 5296 5725 5726 +3 5726 5727 5296 +3 5296 5727 5728 +3 5296 5728 5695 +3 5729 5730 5363 +3 5731 5732 5733 +3 5733 5732 5734 +3 5735 5736 5363 +3 5363 5736 5737 +3 5363 5737 5732 +3 5732 5737 5738 +3 5732 5738 5734 +3 5731 5739 5732 +3 5732 5739 5740 +3 5732 5740 5741 +3 5730 5742 5363 +3 5363 5742 5743 +3 5363 5743 5735 +3 5383 5744 5745 +3 5746 5747 5383 +3 5748 5749 5750 +3 5750 5749 5751 +3 5750 5751 5752 +3 5752 5753 5750 +3 5750 5753 5754 +3 5750 5754 5755 +3 5745 5756 5383 +3 5383 5756 5757 +3 5383 5757 5746 +3 5747 5758 5383 +3 5383 5758 5759 +3 5383 5759 5363 +3 5363 5759 5760 +3 5363 5760 5729 +3 5741 5761 5732 +3 5732 5761 5762 +3 5732 5762 5750 +3 5750 5762 5763 +3 5750 5763 5748 +3 5755 5764 5750 +3 5750 5764 5765 +3 5750 5765 5383 +3 5383 5765 5766 +3 5383 5766 5744 +3 5767 5768 5383 +3 5383 5768 5769 +3 5383 5769 5750 +3 5750 5769 5770 +3 5750 5770 5771 +3 5771 5772 5750 +3 5750 5772 5773 +3 5750 5773 5774 +3 5774 5775 5750 +3 5750 5775 5776 +3 5750 5776 5777 +3 5778 5779 4148 +3 5780 5383 5781 +3 5781 5383 5782 +3 5780 5783 5383 +3 5383 5783 5784 +3 5383 5784 5767 +3 5777 5785 5750 +3 5750 5785 5786 +3 5750 5786 5787 +3 5787 5786 5788 +3 5787 5788 5789 +3 5779 5790 4148 +3 4148 5790 5791 +3 4148 5791 5792 +3 5789 5793 5787 +3 5787 5793 5794 +3 5787 5794 5795 +3 5792 5796 4148 +3 4148 5796 5797 +3 4148 5797 5383 +3 5383 5797 5798 +3 5383 5798 5782 +3 5795 5799 5787 +3 5787 5799 5800 +3 5787 5800 5801 +3 5801 5802 4148 +3 4148 5802 5803 +3 4148 5803 5778 +3 5801 4148 5787 +3 5787 4148 4147 +3 5787 4147 5804 +3 5805 5806 5787 +3 5787 5806 5807 +3 5787 5807 5808 +3 5804 5809 5787 +3 5787 5809 5810 +3 5787 5810 5805 +3 5811 5812 4148 +3 5813 5814 5815 +3 5815 5814 5787 +3 5815 5787 5816 +3 5816 5787 5808 +3 5817 5818 5455 +3 5819 5820 5455 +3 5455 5820 5821 +3 5812 5822 4148 +3 4148 5822 5823 +3 4148 5823 4146 +3 5814 5824 5825 +3 5818 5826 5455 +3 5455 5826 5827 +3 5455 5827 5819 +3 5828 5829 4148 +3 4148 5829 5830 +3 4148 5830 5811 +3 5813 5831 5814 +3 5814 5831 5832 +3 5814 5832 5824 +3 5821 5833 5455 +3 5455 5833 5834 +3 5455 5834 4148 +3 4148 5834 5835 +3 4148 5835 5828 +3 5825 5836 5814 +3 5814 5836 5837 +3 5814 5837 5838 +3 5839 5814 5455 +3 5455 5814 5838 +3 5455 5838 5817 +3 5840 5493 5841 +3 5841 5493 5842 +3 5843 5844 5493 +3 5845 5455 5846 +3 5846 5455 5847 +3 5845 5848 5455 +3 5455 5848 5849 +3 5455 5849 5850 +3 5840 5851 5493 +3 5493 5851 5852 +3 5493 5852 5455 +3 5455 5852 5853 +3 5455 5853 5847 +3 5850 5854 5455 +3 5455 5854 5855 +3 5455 5855 5839 +3 5844 5856 5493 +3 5493 5856 5857 +3 5493 5857 5842 +3 5839 5858 5814 +3 5814 5858 5859 +3 5814 5859 5860 +3 5860 5861 5814 +3 5814 5861 5862 +3 5814 5862 5863 +3 5864 5865 5866 +3 5866 5865 5814 +3 5865 5867 5868 +3 5863 5869 5814 +3 5814 5869 5870 +3 5814 5870 5866 +3 5864 5871 5865 +3 5865 5871 5872 +3 5865 5872 5867 +3 5868 5873 5865 +3 5865 5873 5874 +3 5865 5874 5875 +3 5876 5865 5493 +3 5493 5865 5875 +3 5493 5875 5843 +3 5877 5878 5515 +3 5878 5879 5515 +3 5515 5879 5880 +3 5515 5880 5881 +3 5876 5882 5865 +3 5865 5882 5883 +3 5865 5883 5884 +3 5884 5885 5865 +3 5865 5885 5886 +3 5865 5886 5887 +3 5888 5865 5889 +3 5890 5493 5891 +3 5891 5493 5515 +3 5891 5515 5892 +3 5892 5515 5881 +3 5887 5893 5865 +3 5865 5893 5894 +3 5865 5894 5889 +3 5888 5895 5515 +3 5515 5895 5896 +3 5515 5896 5877 +3 5890 5897 5493 +3 5493 5897 5898 +3 5493 5898 5899 +3 5899 5900 5493 +3 5493 5900 5901 +3 5493 5901 5902 +3 5889 5903 5888 +3 5888 5903 5904 +3 5888 5904 5905 +3 5905 5906 5888 +3 5888 5906 5907 +3 5888 5907 5908 +3 5902 5909 5493 +3 5493 5909 5910 +3 5493 5910 5876 +3 5908 5911 5888 +3 5888 5911 5912 +3 5888 5912 5895 +3 5913 5914 5551 +3 5551 5914 5515 +3 5515 5914 5915 +3 5515 5915 5916 +3 5917 5918 5919 +3 5919 5918 5920 +3 5920 5921 5919 +3 5919 5921 5922 +3 5919 5922 5923 +3 5888 5924 5925 +3 5926 5927 5888 +3 5888 5927 5928 +3 5928 5929 5888 +3 5888 5929 5930 +3 5888 5930 5919 +3 5919 5930 5931 +3 5919 5931 5917 +3 5932 5933 5551 +3 5933 5934 5551 +3 5551 5934 5935 +3 5551 5935 5913 +3 5936 5937 5938 +3 5938 5937 5939 +3 5940 5941 5888 +3 5888 5941 5942 +3 5888 5942 5924 +3 5943 5944 5926 +3 5936 5938 5945 +3 5945 5938 5946 +3 5945 5946 5947 +3 5948 5949 5551 +3 5551 5949 5950 +3 5551 5950 5932 +3 5951 5952 5953 +3 5953 5952 5954 +3 5953 5954 5955 +3 5956 5515 5953 +3 5953 5515 5916 +3 5953 5916 5951 +3 5925 5957 5888 +3 5888 5957 5958 +3 5888 5958 5959 +3 5923 5960 5919 +3 5919 5960 5961 +3 5919 5961 5551 +3 5551 5961 5962 +3 5551 5962 5948 +3 5956 5963 5515 +3 5515 5963 5964 +3 5515 5964 5965 +3 5965 5966 5515 +3 5515 5966 5967 +3 5515 5967 5968 +3 5968 5969 5515 +3 5515 5969 5970 +3 5515 5970 5888 +3 5888 5970 5971 +3 5888 5971 5940 +3 5959 5972 5888 +3 5888 5972 5973 +3 5888 5973 5926 +3 5926 5973 5974 +3 5926 5974 5943 +3 5939 5975 5938 +3 5938 5975 5976 +3 5938 5976 5977 +3 5977 5976 5978 +3 5977 5978 5955 +3 5955 5978 5979 +3 5955 5979 5953 +3 5946 5980 5947 +3 5947 5980 5981 +3 5947 5981 5982 +3 5982 5981 5983 +3 5982 5983 5984 +3 5984 5983 5926 +3 5984 5926 5985 +3 5985 5926 5944 +3 5986 5987 5621 +3 5988 5989 5919 +3 5919 5989 5990 +3 5990 5991 5919 +3 5919 5991 5992 +3 5919 5992 5993 +3 5619 5621 5551 +3 5551 5621 5987 +3 5551 5987 5994 +3 5993 5995 5919 +3 5919 5995 5996 +3 5919 5996 5997 +3 5997 5996 5998 +3 5997 5998 5999 +3 5994 6000 5551 +3 5551 6000 6001 +3 5551 6001 6002 +3 6002 6003 5551 +3 5551 6003 6004 +3 5551 6004 6005 +3 6005 6006 5551 +3 5551 6006 6007 +3 5551 6007 5919 +3 5919 6007 6008 +3 5919 6008 5988 +3 6009 6010 5621 +3 5621 6010 6011 +3 5621 6011 6012 +3 5999 6013 5997 +3 5997 6013 6014 +3 5997 6014 6015 +3 6012 6016 5621 +3 5621 6016 6017 +3 5621 6017 5986 +3 6018 6019 5621 +3 5621 6019 6020 +3 5621 6020 6009 +3 6015 6021 5997 +3 5997 6021 6022 +3 5997 6022 6018 +3 6023 6024 5621 +3 5621 6024 6025 +3 6018 5621 5997 +3 5997 5621 6026 +3 5997 6026 6027 +3 6028 6029 5671 +3 5671 6029 6030 +3 6025 6031 5621 +3 5621 6031 6032 +3 5621 6032 6033 +3 6027 6034 5997 +3 5997 6034 6035 +3 5997 6035 6036 +3 6030 6037 5671 +3 5671 6037 6038 +3 5671 6038 5621 +3 5621 6038 6039 +3 5621 6039 6023 +3 6033 6040 5621 +3 5621 6040 6041 +3 5621 6041 6026 +3 6042 6043 5671 +3 6044 6045 6046 +3 6043 6047 5671 +3 5671 6047 6048 +3 5671 6048 6028 +3 6036 6049 5997 +3 5997 6049 6050 +3 5997 6050 6051 +3 6052 6044 6053 +3 6053 6044 5997 +3 6053 5997 6054 +3 6054 5997 6051 +3 6052 6055 6044 +3 6044 6055 6056 +3 6044 6056 6045 +3 6046 6057 6044 +3 6044 6057 6058 +3 6044 6058 6059 +3 6060 6044 5671 +3 5671 6044 6059 +3 5671 6059 6042 +3 6060 6061 6044 +3 6044 6061 6062 +3 6044 6062 6063 +3 6063 6064 6044 +3 6044 6064 6065 +3 6044 6065 6066 +3 6067 6044 6068 +3 6066 6069 6044 +3 6044 6069 6070 +3 6044 6070 6068 +3 6068 6071 6067 +3 6067 6071 6072 +3 6067 6072 6073 +3 6073 6074 6067 +3 6067 6074 6075 +3 6067 6075 6076 +3 6077 5694 6078 +3 6078 5694 6067 +3 6078 6067 6079 +3 6079 6067 6076 +3 6077 6080 5694 +3 5694 6080 6081 +3 5694 6081 6082 +3 6082 6083 5694 +3 5694 6083 6084 +3 5694 6084 6085 +3 6086 5671 6087 +3 6087 5671 5694 +3 6087 5694 6088 +3 6088 5694 6085 +3 6086 6089 5671 +3 5671 6089 6090 +3 5671 6090 6091 +3 6091 6092 5671 +3 5671 6092 6093 +3 5671 6093 6094 +3 6094 6095 5671 +3 5671 6095 6096 +3 5671 6096 6060 +3 6097 6098 6099 +3 6100 6101 5732 +3 6102 6103 6104 +3 6105 6106 5732 +3 5732 6106 6107 +3 5732 6107 6108 +3 6098 6109 6099 +3 6099 6109 6110 +3 6099 6110 6111 +3 6101 6112 5732 +3 5732 6112 6113 +3 5732 6113 6105 +3 6108 6114 5732 +3 5732 6114 6115 +3 5732 6115 6116 +3 6117 6118 5750 +3 6111 6119 6099 +3 6099 6119 6120 +3 6099 6120 6121 +3 6122 6104 6123 +3 6123 6104 6124 +3 6097 6099 6125 +3 6125 6099 5732 +3 6125 5732 6126 +3 6126 5732 6116 +3 6126 6116 6127 +3 6103 6128 6104 +3 6104 6128 6129 +3 6104 6129 6124 +3 6130 6131 5750 +3 5750 6131 6132 +3 5750 6132 6133 +3 6127 6134 6126 +3 6126 6134 6135 +3 6126 6135 6136 +3 6136 6135 6137 +3 6118 6138 5750 +3 5750 6138 6139 +3 5750 6139 5732 +3 5732 6139 6140 +3 5732 6140 6100 +3 6121 6141 6099 +3 6099 6141 6142 +3 6099 6142 6104 +3 6104 6142 6143 +3 6104 6143 6102 +3 6144 6145 5750 +3 5750 6145 6146 +3 5750 6146 6147 +3 6122 6148 6104 +3 6104 6148 6149 +3 6104 6149 5750 +3 5750 6149 6150 +3 5750 6150 6130 +3 6151 6152 6135 +3 6135 6152 6153 +3 6135 6153 6137 +3 6147 6154 5750 +3 5750 6154 6155 +3 5750 6155 6117 +3 6133 6156 6157 +3 6157 6158 6133 +3 6133 6158 6159 +3 6133 6159 5750 +3 5750 6159 6160 +3 5750 6160 6144 +3 6161 6162 6163 +3 6133 6164 6156 +3 6156 6164 6162 +3 6156 6162 6165 +3 6165 6162 6161 +3 6135 6166 6151 +3 6151 6166 6167 +3 6151 6167 6168 +3 6168 6167 6169 +3 6168 6169 6163 +3 6163 6169 6170 +3 6163 6170 6161 +3 6171 6172 5787 +3 5787 6172 6173 +3 6174 6175 6104 +3 5750 6176 6177 +3 6178 6179 6104 +3 6104 6179 6180 +3 6104 6180 6181 +3 6177 6182 5750 +3 5750 6182 6183 +3 5750 6183 6104 +3 6104 6183 6184 +3 6104 6184 6174 +3 6185 5750 6186 +3 6186 5750 5787 +3 6186 5787 6187 +3 6187 5787 6173 +3 6185 6188 5750 +3 5750 6188 6189 +3 5750 6189 6190 +3 6191 6192 6175 +3 6175 6192 6193 +3 6175 6193 6194 +3 6194 6195 6175 +3 6175 6195 6196 +3 6175 6196 6104 +3 6104 6196 6197 +3 6104 6197 6178 +3 6198 6199 6200 +3 6200 6199 6201 +3 6200 6201 6202 +3 6181 6203 6104 +3 6104 6203 6204 +3 6104 6204 6205 +3 6206 6207 6208 +3 6190 6209 5750 +3 5750 6209 6210 +3 5750 6210 6176 +3 6198 6211 6199 +3 6199 6211 6212 +3 6199 6212 6213 +3 6207 6214 6208 +3 6208 6214 6215 +3 6208 6215 6216 +3 6213 6217 6199 +3 6199 6217 6218 +3 6199 6218 6219 +3 6219 6218 6191 +3 6219 6191 6220 +3 6220 6191 6175 +3 6205 6221 6104 +3 6104 6221 6222 +3 6104 6222 6208 +3 6208 6222 6223 +3 6208 6223 6206 +3 6224 6225 6208 +3 6208 6225 6226 +3 6208 6226 6227 +3 6216 6228 6208 +3 6208 6228 6229 +3 6208 6229 6230 +3 6231 6232 5787 +3 5787 6232 6233 +3 5787 6233 6171 +3 6227 6234 6208 +3 6208 6234 6235 +3 6208 6235 5787 +3 5787 6235 6236 +3 5787 6236 6231 +3 6230 6237 6208 +3 6208 6237 6238 +3 6208 6238 6224 +3 6224 6238 6239 +3 6224 6239 6240 +3 6240 6239 6241 +3 6240 6241 6242 +3 6242 6241 6200 +3 6242 6200 6243 +3 6243 6200 6202 +3 6244 6245 6208 +3 5787 6246 6247 +3 6247 6248 5787 +3 5787 6248 6249 +3 5787 6249 6250 +3 6250 6251 5787 +3 5787 6251 6252 +3 5787 6252 6253 +3 6245 6254 6208 +3 6208 6254 6255 +3 6208 6255 6256 +3 6246 5787 6257 +3 6257 5787 5814 +3 6257 5814 6258 +3 6259 6260 5814 +3 5814 6260 6261 +3 5814 6261 6262 +3 6263 6264 5814 +3 5814 6264 6265 +3 5814 6265 6258 +3 6256 6266 6208 +3 6208 6266 6267 +3 6208 6267 6268 +3 6269 6270 6271 +3 6271 6270 6272 +3 6271 6272 5814 +3 5814 6272 6273 +3 5814 6273 6259 +3 6274 6244 6275 +3 6275 6244 6208 +3 6275 6208 6276 +3 6276 6208 5787 +3 6276 5787 6277 +3 6277 5787 6253 +3 6278 6279 6271 +3 6271 6279 6280 +3 6271 6280 6281 +3 6281 6282 6271 +3 6271 6282 6283 +3 6271 6283 6269 +3 6268 6284 6208 +3 6208 6284 6285 +3 6208 6285 6271 +3 6271 6285 6286 +3 6271 6286 6278 +3 6287 6288 6289 +3 6289 6288 6290 +3 6274 6275 6289 +3 6289 6275 6291 +3 6289 6291 6287 +3 6292 6293 5814 +3 6294 6295 6296 +3 6296 6295 6297 +3 6296 6297 6298 +3 6298 6297 6299 +3 6298 6299 6300 +3 6293 6301 5814 +3 5814 6301 6302 +3 5814 6302 6263 +3 6296 6303 6294 +3 6294 6303 6304 +3 6294 6304 6262 +3 6262 6304 6305 +3 6262 6305 6306 +3 6306 6307 6262 +3 6262 6307 6308 +3 6262 6308 5814 +3 5814 6308 6309 +3 5814 6309 6292 +3 6299 6310 6300 +3 6300 6310 6311 +3 6300 6311 6312 +3 6312 6311 6313 +3 6312 6313 6314 +3 6314 6313 6315 +3 6314 6315 6290 +3 6290 6315 6316 +3 6290 6316 6289 +3 6271 6317 6318 +3 6318 6319 6271 +3 6271 6319 6320 +3 6271 6320 6321 +3 6321 6322 6271 +3 6271 6322 6323 +3 6271 6323 6324 +3 6323 6325 6324 +3 6324 6325 6326 +3 6324 6326 6327 +3 6327 6328 6324 +3 6324 6328 6329 +3 6324 6329 6330 +3 6331 6332 5865 +3 5865 6332 6333 +3 6330 6334 6324 +3 6324 6334 6335 +3 6324 6335 6336 +3 6337 5865 6338 +3 6338 5865 6324 +3 6338 6324 6339 +3 6339 6324 6336 +3 6337 6340 5865 +3 5865 6340 6341 +3 5865 6341 6331 +3 5814 6342 6343 +3 6344 6345 5814 +3 5814 6345 6346 +3 5814 6346 6347 +3 6347 6348 5814 +3 5814 6348 6349 +3 5814 6349 6271 +3 6271 6349 6350 +3 6271 6350 6317 +3 6351 6352 6344 +3 6344 6352 6353 +3 6354 6355 6356 +3 5814 6343 6344 +3 6344 6343 6357 +3 6344 6357 6351 +3 6358 6359 6333 +3 6333 6359 6360 +3 6361 6362 6363 +3 6363 6362 6344 +3 6363 6344 6364 +3 6364 6344 6353 +3 6354 6356 6365 +3 6365 6356 6366 +3 6365 6366 6361 +3 6361 6366 6367 +3 6361 6367 6362 +3 6355 6354 6333 +3 6333 6354 6368 +3 6333 6368 6358 +3 6360 6369 6333 +3 6333 6369 6370 +3 6333 6370 5865 +3 5865 6370 6371 +3 5865 6371 6372 +3 6372 6373 5865 +3 5865 6373 6374 +3 5865 6374 6375 +3 6375 6376 5865 +3 5865 6376 6377 +3 5865 6377 6378 +3 6379 5814 6380 +3 6380 5814 5865 +3 6380 5865 6381 +3 6381 5865 6378 +3 6379 6382 5814 +3 5814 6382 6383 +3 5814 6383 6384 +3 6384 6385 5814 +3 5814 6385 6386 +3 5814 6386 6387 +3 6387 6388 5814 +3 5814 6388 6389 +3 5814 6389 6342 +3 5865 6390 6391 +3 5865 6392 6393 +3 6394 6395 6396 +3 6394 6397 6395 +3 6395 6397 6398 +3 6395 6398 6399 +3 6400 6324 6401 +3 6401 6324 5865 +3 6401 5865 6402 +3 6402 5865 6393 +3 6396 6403 6394 +3 6394 6403 6404 +3 6394 6404 6405 +3 6392 5865 6406 +3 6406 5865 6391 +3 6406 6391 6407 +3 6407 6391 6408 +3 6407 6408 6409 +3 6409 6410 6407 +3 6407 6410 6411 +3 6407 6411 6412 +3 6413 6414 5888 +3 5888 6414 6415 +3 6405 6416 6394 +3 6394 6416 6417 +3 6394 6417 6418 +3 6418 6417 6419 +3 6418 6419 6412 +3 6412 6419 6420 +3 6412 6420 6407 +3 6400 6421 6324 +3 6324 6421 6422 +3 6324 6422 6423 +3 6423 6424 6324 +3 6324 6424 6425 +3 6324 6425 6426 +3 6427 6413 6428 +3 6428 6413 6324 +3 6415 6429 5888 +3 5888 6429 6430 +3 5888 6430 6431 +3 6431 6432 5888 +3 5888 6432 6433 +3 5888 6433 6434 +3 6426 6435 6324 +3 6324 6435 6436 +3 6324 6436 6428 +3 6437 5865 6438 +3 6438 5865 5888 +3 6438 5888 6439 +3 6439 5888 6434 +3 6427 6440 6413 +3 6413 6440 6441 +3 6413 6441 6442 +3 6437 6443 5865 +3 5865 6443 6444 +3 5865 6444 6445 +3 6445 6446 5865 +3 5865 6446 6447 +3 5865 6447 6448 +3 6442 6449 6413 +3 6413 6449 6450 +3 6413 6450 6451 +3 6452 6453 6454 +3 6448 6455 5865 +3 5865 6455 6456 +3 5865 6456 6390 +3 6398 6457 6399 +3 6399 6457 6458 +3 6399 6458 6452 +3 6452 6458 6459 +3 6452 6459 6453 +3 6451 6460 6413 +3 6413 6460 6461 +3 6413 6461 6414 +3 6414 6461 6452 +3 6414 6452 6462 +3 6462 6452 6454 +3 6463 6464 6465 +3 6465 6464 6466 +3 6465 6466 6467 +3 6463 6465 6468 +3 6468 6465 6469 +3 6468 6469 6470 +3 6471 6472 6473 +3 6474 6475 6476 +3 6477 6478 6479 +3 6479 6478 6480 +3 5888 6481 6413 +3 6413 6481 6482 +3 6413 6482 6483 +3 6484 6485 5919 +3 5919 6485 6486 +3 5919 6486 6487 +3 6487 6488 5919 +3 5919 6488 6489 +3 5919 6489 6490 +3 6476 6475 6491 +3 6492 6493 6494 +3 6494 6493 6495 +3 6494 6495 6496 +3 6497 6498 6499 +3 6499 6498 6500 +3 6499 6500 6501 +3 6473 6472 6502 +3 6467 6503 6465 +3 6465 6503 6504 +3 6465 6504 6505 +3 6505 6504 6506 +3 6505 6506 6479 +3 6479 6506 6507 +3 6479 6507 6477 +3 6480 6508 6479 +3 6479 6508 6509 +3 6479 6509 6510 +3 6511 6512 6413 +3 6413 6512 6513 +3 6413 6513 6514 +3 6515 6516 6517 +3 6518 5888 6519 +3 6519 5888 5919 +3 6519 5919 6520 +3 6520 5919 6490 +3 6473 6521 6471 +3 6471 6521 6522 +3 6471 6522 6523 +3 6524 6525 6526 +3 6476 6527 6474 +3 6474 6527 6494 +3 6474 6494 6528 +3 6528 6494 6496 +3 6529 6509 6530 +3 6530 6509 6531 +3 6530 6531 6494 +3 6494 6531 6532 +3 6494 6532 6492 +3 6533 6534 6529 +3 6529 6534 6535 +3 6529 6535 6509 +3 6509 6535 6536 +3 6509 6536 6510 +3 6483 6537 6413 +3 6413 6537 6538 +3 6413 6538 6511 +3 6514 6539 6413 +3 6413 6539 6540 +3 6413 6540 6517 +3 6517 6540 6541 +3 6517 6541 6542 +3 6543 6544 6517 +3 6517 6516 5919 +3 5919 6516 6545 +3 5919 6545 6484 +3 6546 6547 6548 +3 6549 6550 6542 +3 6542 6550 6551 +3 6542 6552 6517 +3 6517 6552 6553 +3 6517 6553 6554 +3 6554 6555 6517 +3 6517 6555 6556 +3 6517 6556 6557 +3 6557 6558 6517 +3 6517 6558 6559 +3 6517 6559 6543 +3 6560 6561 6517 +3 6562 6563 6564 +3 6563 6565 6564 +3 6564 6565 6566 +3 6564 6566 6567 +3 6568 5888 6564 +3 6564 5888 6518 +3 6564 6518 6562 +3 6547 6546 6526 +3 6526 6546 6569 +3 6526 6569 6524 +3 5888 6570 6481 +3 6481 6570 6546 +3 6481 6546 6571 +3 6571 6546 6548 +3 6501 6572 6499 +3 6499 6572 6573 +3 6499 6573 6531 +3 6531 6573 6574 +3 6531 6574 6532 +3 6472 6575 6502 +3 6502 6575 6576 +3 6502 6576 6577 +3 6577 6576 6534 +3 6577 6534 6578 +3 6578 6534 6533 +3 6551 6579 6542 +3 6542 6579 6580 +3 6542 6580 6552 +3 6561 6581 6517 +3 6517 6581 6582 +3 6517 6582 6515 +3 6568 6583 5888 +3 5888 6583 6584 +3 5888 6584 6585 +3 6585 6586 5888 +3 5888 6586 6587 +3 5888 6587 6588 +3 6588 6589 5888 +3 5888 6589 6590 +3 5888 6590 6570 +3 6497 6499 6591 +3 6591 6499 6592 +3 6591 6592 6542 +3 6542 6592 6593 +3 6542 6593 6549 +3 6544 6594 6517 +3 6517 6594 6595 +3 6517 6595 6560 +3 6560 6595 6470 +3 6560 6470 6596 +3 6596 6470 6469 +3 6523 6597 6471 +3 6471 6597 6598 +3 6471 6598 6599 +3 6599 6598 6600 +3 6599 6600 6567 +3 6567 6600 6601 +3 6567 6601 6564 +3 6475 6602 6491 +3 6491 6602 6603 +3 6491 6603 6604 +3 6604 6603 6605 +3 6604 6605 6606 +3 6606 6605 6526 +3 6606 6526 6607 +3 6607 6526 6525 +3 6608 6609 6517 +3 6610 6611 6612 +3 6612 6611 6613 +3 6612 6613 6614 +3 6610 6615 6611 +3 6611 6615 6616 +3 6611 6616 6617 +3 6608 6517 6618 +3 6619 6620 6517 +3 6517 6620 6621 +3 6622 6623 5997 +3 5997 6623 6624 +3 6625 6626 5919 +3 5919 6626 6627 +3 5919 6627 6628 +3 6628 6629 5919 +3 5919 6629 6630 +3 5919 6630 6631 +3 6631 6632 5919 +3 5919 6632 6633 +3 5919 6633 6517 +3 6517 6633 6634 +3 6517 6634 6619 +3 6617 6635 6611 +3 6611 6635 6636 +3 6611 6636 6637 +3 6637 6636 6638 +3 6637 6638 6639 +3 6639 6638 6640 +3 6640 6641 6639 +3 6639 6641 6642 +3 6639 6642 6643 +3 6609 6644 6517 +3 6517 6644 6645 +3 6517 6645 6646 +3 6624 6647 5997 +3 5997 6647 6648 +3 5997 6648 5919 +3 5919 6648 6649 +3 5919 6649 6625 +3 6650 6651 5997 +3 5997 6651 6652 +3 5997 6652 6622 +3 6643 6653 6639 +3 6639 6653 6618 +3 6639 6618 6654 +3 6654 6618 6517 +3 6654 6517 6655 +3 6655 6517 6621 +3 6656 6657 5997 +3 5997 6657 6658 +3 5997 6658 6650 +3 6613 6659 6614 +3 6614 6659 6660 +3 6614 6660 6661 +3 6660 6662 6661 +3 6661 6662 6663 +3 6661 6663 6664 +3 6646 6665 6517 +3 6517 6665 6666 +3 6517 6666 6667 +3 6668 6669 6656 +3 6656 6669 6670 +3 6656 6670 6671 +3 6671 6672 6656 +3 6656 6672 6673 +3 6656 6673 6674 +3 6674 6675 6656 +3 6656 6675 6676 +3 6656 6676 6657 +3 6657 6676 6661 +3 6657 6661 6677 +3 6677 6661 6664 +3 6667 6678 6517 +3 6517 6678 6679 +3 6517 6679 6656 +3 6656 6679 6680 +3 6656 6680 6668 +3 5997 6681 6682 +3 6683 6684 6656 +3 6656 6684 6685 +3 6681 5997 6686 +3 6687 6688 6689 +3 6689 6688 6690 +3 6689 6690 6691 +3 6687 6692 6688 +3 6688 6692 6693 +3 6688 6693 6694 +3 6685 6695 6656 +3 6656 6695 6696 +3 6656 6696 6697 +3 6682 6698 5997 +3 5997 6698 6699 +3 5997 6699 6700 +3 6694 6683 6688 +3 6688 6683 6656 +3 6688 6656 6701 +3 6701 6656 5997 +3 6701 5997 6702 +3 6702 5997 6700 +3 6697 6703 6656 +3 6656 6703 6704 +3 6656 6704 6705 +3 6706 6707 6708 +3 6690 6709 6691 +3 6691 6709 6710 +3 6691 6710 6711 +3 6712 6713 6714 +3 6714 6713 6656 +3 6714 6656 6715 +3 6715 6656 6705 +3 6716 6717 6044 +3 6044 6717 6718 +3 6044 6718 6719 +3 6712 6720 6713 +3 6713 6720 6721 +3 6713 6721 6722 +3 6711 6723 6691 +3 6691 6723 6724 +3 6691 6724 6725 +3 6706 6708 6726 +3 6726 6708 6727 +3 6726 6727 6725 +3 6725 6727 6728 +3 6725 6728 6691 +3 6722 6729 6713 +3 6713 6729 6730 +3 6713 6730 6731 +3 6731 6732 6713 +3 6713 6732 6733 +3 6713 6733 6044 +3 6044 6733 6734 +3 6044 6734 6716 +3 6719 6735 6736 +3 6737 6738 6044 +3 6738 6739 6044 +3 6044 6739 6740 +3 6044 6740 6741 +3 6741 6742 6044 +3 6044 6742 6743 +3 6044 6743 6744 +3 6744 6745 6044 +3 6044 6745 6746 +3 6044 6746 5997 +3 5997 6746 6747 +3 5997 6747 6686 +3 6707 6706 6748 +3 6748 6706 6749 +3 6748 6749 6719 +3 6719 6749 6750 +3 6719 6750 6735 +3 6736 6751 6719 +3 6719 6751 6752 +3 6719 6752 6044 +3 6044 6752 6753 +3 6044 6753 6737 +3 6754 6755 6756 +3 6757 6758 6756 +3 6756 6758 6759 +3 6755 6760 6756 +3 6756 6760 6761 +3 6756 6761 6762 +3 6762 6763 6756 +3 6756 6763 6764 +3 6756 6764 6765 +3 6759 6766 6756 +3 6756 6766 6767 +3 6756 6767 6067 +3 6067 6767 6768 +3 6067 6768 6769 +3 6770 6771 6713 +3 6713 6771 6772 +3 6713 6772 6773 +3 6773 6774 6713 +3 6713 6774 6775 +3 6713 6775 6776 +3 6713 6777 6756 +3 6756 6777 6778 +3 6756 6778 6754 +3 6776 6779 6713 +3 6713 6779 6780 +3 6713 6780 6777 +3 6757 6781 6782 +3 6783 6784 6785 +3 6769 6786 6067 +3 6067 6786 6787 +3 6067 6787 6788 +3 6788 6789 6067 +3 6067 6789 6790 +3 6067 6790 6791 +3 6770 6713 6792 +3 6792 6713 6044 +3 6792 6044 6793 +3 6794 6044 6795 +3 6795 6044 6067 +3 6795 6067 6796 +3 6796 6067 6791 +3 6765 6797 6756 +3 6756 6797 6798 +3 6756 6798 6757 +3 6757 6798 6799 +3 6757 6799 6781 +3 6794 6800 6044 +3 6044 6800 6801 +3 6044 6801 6802 +3 6802 6803 6044 +3 6044 6803 6804 +3 6044 6804 6805 +3 6806 6807 6808 +3 6808 6807 6757 +3 6808 6757 6809 +3 6809 6757 6782 +3 6783 6785 6810 +3 6810 6785 6811 +3 6810 6811 6806 +3 6806 6811 6812 +3 6806 6812 6807 +3 6805 6813 6044 +3 6044 6813 6814 +3 6044 6814 6793 +3 6793 6815 6792 +3 6792 6815 6816 +3 6792 6816 6817 +3 6818 6819 6820 +3 6820 6819 6821 +3 6821 6819 6822 +3 6821 6822 6823 +3 6817 6824 6792 +3 6792 6824 6821 +3 6792 6821 6825 +3 6825 6821 6823 +3 6784 6783 6820 +3 6820 6783 6826 +3 6820 6826 6818 +3 6827 6828 6099 +3 6829 6830 6831 +3 6831 6830 6099 +3 6831 6099 6832 +3 6832 6099 6833 +3 6829 6834 6830 +3 6830 6834 6835 +3 6830 6835 6836 +3 6836 6837 6830 +3 6830 6837 6838 +3 6830 6838 6839 +3 6104 6840 6841 +3 6842 6843 6104 +3 6828 6844 6099 +3 6099 6844 6845 +3 6099 6845 6833 +3 6846 6847 6848 +3 6848 6847 6849 +3 6848 6849 6850 +3 6850 6851 6848 +3 6848 6851 6852 +3 6848 6852 6853 +3 6841 6854 6104 +3 6104 6854 6855 +3 6104 6855 6842 +3 6853 6856 6848 +3 6848 6856 6857 +3 6848 6857 6104 +3 6104 6857 6858 +3 6104 6858 6840 +3 6843 6859 6104 +3 6104 6859 6860 +3 6104 6860 6099 +3 6099 6860 6861 +3 6099 6861 6827 +3 6839 6862 6830 +3 6830 6862 6863 +3 6830 6863 6848 +3 6848 6863 6864 +3 6848 6864 6846 +3 6865 6848 6866 +3 6866 6848 6867 +3 6868 6869 6104 +3 6104 6869 6870 +3 6104 6870 6848 +3 6848 6870 6871 +3 6848 6871 6867 +3 6865 6872 6848 +3 6848 6872 6873 +3 6848 6873 6874 +3 6875 6876 6877 +3 6876 6878 6877 +3 6877 6878 6879 +3 6877 6879 6880 +3 6881 6882 6104 +3 6104 6882 6883 +3 6104 6883 6868 +3 6874 6884 6848 +3 6848 6884 6885 +3 6848 6885 6877 +3 6877 6885 6886 +3 6877 6886 6875 +3 6887 6888 6208 +3 6208 6888 6889 +3 6208 6889 6890 +3 6890 6891 6208 +3 6208 6891 6892 +3 6208 6892 6893 +3 6877 6894 6887 +3 6893 6895 6208 +3 6208 6895 6896 +3 6208 6896 6104 +3 6104 6896 6897 +3 6880 6898 6877 +3 6877 6898 6899 +3 6877 6899 6894 +3 6897 6900 6104 +3 6104 6900 6901 +3 6104 6901 6881 +3 6887 6208 6877 +3 6877 6208 6902 +3 6877 6902 6903 +3 6904 6905 6906 +3 6903 6907 6877 +3 6877 6907 6908 +3 6877 6908 6909 +3 6905 6910 6906 +3 6906 6910 6911 +3 6906 6911 6912 +3 6912 6913 6906 +3 6906 6913 6914 +3 6906 6914 6915 +3 6909 6916 6877 +3 6877 6916 6917 +3 6877 6917 6918 +3 6918 6919 6877 +3 6877 6919 6920 +3 6877 6920 6906 +3 6906 6920 6921 +3 6906 6921 6904 +3 6915 6922 6271 +3 6271 6922 6923 +3 6271 6923 6924 +3 6924 6925 6271 +3 6271 6925 6926 +3 6271 6926 6927 +3 6928 6208 6929 +3 6929 6208 6271 +3 6929 6271 6930 +3 6930 6271 6927 +3 6928 6931 6208 +3 6208 6931 6932 +3 6208 6932 6933 +3 6933 6934 6208 +3 6208 6934 6935 +3 6208 6935 6936 +3 6936 6937 6208 +3 6208 6937 6938 +3 6208 6938 6902 +3 6915 6271 6906 +3 6906 6271 6939 +3 6906 6939 6940 +3 6941 6942 6943 +3 6940 6944 6906 +3 6906 6944 6945 +3 6906 6945 6946 +3 6942 6947 6943 +3 6943 6947 6948 +3 6943 6948 6949 +3 6949 6950 6943 +3 6943 6950 6951 +3 6943 6951 6952 +3 6946 6953 6906 +3 6906 6953 6954 +3 6906 6954 6955 +3 6955 6956 6906 +3 6906 6956 6957 +3 6906 6957 6943 +3 6943 6957 6958 +3 6943 6958 6941 +3 6952 6959 6324 +3 6324 6959 6960 +3 6324 6960 6961 +3 6961 6962 6324 +3 6324 6962 6963 +3 6324 6963 6964 +3 6965 6271 6966 +3 6966 6271 6324 +3 6966 6324 6967 +3 6967 6324 6964 +3 6965 6968 6271 +3 6271 6968 6969 +3 6271 6969 6970 +3 6970 6971 6271 +3 6271 6971 6972 +3 6271 6972 6973 +3 6973 6974 6271 +3 6271 6974 6975 +3 6271 6975 6939 +3 6952 6324 6943 +3 6943 6324 6976 +3 6943 6976 6977 +3 6978 6979 6980 +3 6977 6981 6943 +3 6943 6981 6982 +3 6943 6982 6983 +3 6979 6984 6980 +3 6980 6984 6985 +3 6980 6985 6986 +3 6986 6987 6980 +3 6980 6987 6988 +3 6980 6988 6989 +3 6983 6990 6943 +3 6943 6990 6991 +3 6943 6991 6992 +3 6992 6993 6943 +3 6943 6993 6994 +3 6943 6994 6980 +3 6980 6994 6995 +3 6980 6995 6978 +3 6996 6997 6413 +3 6413 6997 6998 +3 6998 6999 6413 +3 6413 6999 7000 +3 6413 7000 7001 +3 7002 6324 7003 +3 7003 6324 6413 +3 7003 6413 7004 +3 7004 6413 7001 +3 7002 7005 6324 +3 6324 7005 7006 +3 6324 7006 7007 +3 7007 7008 6324 +3 6324 7008 7009 +3 6324 7009 7010 +3 7010 7011 6324 +3 6324 7011 7012 +3 6324 7012 6976 +3 7013 6980 6413 +3 6413 6980 6989 +3 6413 6989 6996 +3 7014 7015 6517 +3 7016 7017 7018 +3 7018 7019 7016 +3 7016 7019 7020 +3 7016 7020 7021 +3 7021 7022 7016 +3 7016 7022 7023 +3 7016 7023 7024 +3 7024 7023 7025 +3 7024 7025 7026 +3 7025 7027 7026 +3 7026 7027 7028 +3 7026 7028 7029 +3 7015 7030 6517 +3 6517 7030 7031 +3 6517 7031 7032 +3 7032 7033 6517 +3 6517 7033 7034 +3 6517 7034 7035 +3 6413 7036 7037 +3 7038 7039 6413 +3 6413 7039 7040 +3 6413 7040 7041 +3 7041 7042 6413 +3 6413 7042 7043 +3 6413 7043 7013 +3 7013 7044 6980 +3 6980 7044 7045 +3 6980 7045 7046 +3 7046 7047 6980 +3 6980 7047 7048 +3 6980 7048 7049 +3 7050 7051 7052 +3 7052 7051 6980 +3 7035 7053 6517 +3 6517 7053 7054 +3 6517 7054 6413 +3 6413 7054 7055 +3 6413 7055 7056 +3 7056 7057 6413 +3 6413 7057 7058 +3 6413 7058 7059 +3 7029 7060 7026 +3 7026 7060 7061 +3 7026 7061 7062 +3 7062 7061 7063 +3 7036 6413 7064 +3 7064 6413 7059 +3 7064 7059 7063 +3 7063 7059 7065 +3 7063 7065 7062 +3 7037 7066 6413 +3 6413 7066 7067 +3 6413 7067 7038 +3 7049 7068 6980 +3 6980 7068 7069 +3 6980 7069 7052 +3 7070 7071 7051 +3 7050 7072 7073 +3 7016 7074 7017 +3 7017 7074 7075 +3 7017 7075 7050 +3 7050 7075 7076 +3 7050 7076 7072 +3 7073 7077 7050 +3 7050 7077 7078 +3 7050 7078 7051 +3 7078 7079 7051 +3 7051 7079 7080 +3 7051 7080 7081 +3 7071 7082 7051 +3 7051 7082 7083 +3 7051 7083 7014 +3 7081 7084 7051 +3 7051 7084 7085 +3 7051 7085 7070 +3 7014 6517 7051 +3 7051 6517 7086 +3 7051 7086 7087 +3 7087 7088 7051 +3 7051 7088 7089 +3 7051 7089 7090 +3 7090 7091 7051 +3 7051 7091 7092 +3 7051 7092 7093 +3 7093 7094 7051 +3 7051 7094 7095 +3 7051 7095 7096 +3 7096 7095 7097 +3 7096 7097 7098 +3 7099 7100 6656 +3 7098 7101 7096 +3 7096 7101 7102 +3 7096 7102 7103 +3 7103 7104 7096 +3 7096 7104 7105 +3 7096 7105 7106 +3 6656 7107 7108 +3 7106 7109 6656 +3 6656 7109 7110 +3 6656 7110 7099 +3 7100 7111 6656 +3 6656 7111 7112 +3 6656 7112 7107 +3 7113 7114 6517 +3 7114 7115 6517 +3 6517 7115 7116 +3 6517 7116 7117 +3 7108 7118 6656 +3 6656 7118 7119 +3 6656 7119 6517 +3 6517 7119 7120 +3 6517 7120 7113 +3 7117 7121 6517 +3 6517 7121 7122 +3 6517 7122 7086 +3 7106 6656 7096 +3 7096 6656 7123 +3 7096 7123 7124 +3 7124 7125 7096 +3 7096 7125 7126 +3 7096 7126 7127 +3 7127 7128 7096 +3 7096 7128 7129 +3 7096 7129 7130 +3 7130 7131 7096 +3 7096 7131 7132 +3 7096 7132 7133 +3 7133 7132 7134 +3 7133 7134 7135 +3 7136 7137 6713 +3 7135 7138 7133 +3 7133 7138 7139 +3 7133 7139 7140 +3 7140 7141 7133 +3 7133 7141 7142 +3 7133 7142 7143 +3 6713 7144 7145 +3 7143 7146 6713 +3 6713 7146 7147 +3 6713 7147 7136 +3 7137 7148 6713 +3 6713 7148 7149 +3 6713 7149 7144 +3 7150 7151 6656 +3 7151 7152 6656 +3 6656 7152 7153 +3 6656 7153 7154 +3 7145 7155 6713 +3 6713 7155 7156 +3 6713 7156 6656 +3 6656 7156 7157 +3 6656 7157 7150 +3 7154 7158 6656 +3 6656 7158 7159 +3 6656 7159 7123 +3 7160 7161 7162 +3 7163 7164 7133 +3 7133 7164 7165 +3 7133 7165 7166 +3 7143 6713 7133 +3 7133 6713 7167 +3 7133 7167 7168 +3 7161 7169 7162 +3 7162 7169 7170 +3 7162 7170 7171 +3 7171 7172 7162 +3 7162 7172 7173 +3 7162 7173 6756 +3 6756 7173 7174 +3 7168 7175 7133 +3 7133 7175 7176 +3 7133 7176 7163 +3 7166 7177 7133 +3 7133 7177 7178 +3 7133 7178 7162 +3 7162 7178 7179 +3 7162 7179 7160 +3 7174 7180 6756 +3 6756 7180 7181 +3 6756 7181 7182 +3 7182 7183 6756 +3 6756 7183 7184 +3 6756 7184 7185 +3 7186 6713 7187 +3 7187 6713 6756 +3 7187 6756 7188 +3 7188 6756 7185 +3 7186 7189 6713 +3 6713 7189 7190 +3 6713 7190 7191 +3 7191 7192 6713 +3 6713 7192 7193 +3 6713 7193 7194 +3 7194 7195 6713 +3 6713 7195 7196 +3 6713 7196 7167 +3 7197 7198 6830 +3 7199 4151 7200 +3 7200 4151 6830 +3 7200 6830 7201 +3 7201 6830 7202 +3 7199 7203 4151 +3 4151 7203 7204 +3 4151 7204 7205 +3 7205 7206 4151 +3 4151 7206 7207 +3 4151 7207 7208 +3 6848 7209 7210 +3 7211 7212 6848 +3 7198 7213 6830 +3 6830 7213 7214 +3 6830 7214 7202 +3 7215 7216 4162 +3 4162 7216 7217 +3 4162 7217 7218 +3 7218 7219 4162 +3 4162 7219 7220 +3 4162 7220 7221 +3 7210 7222 6848 +3 6848 7222 7223 +3 6848 7223 7211 +3 7221 7224 4162 +3 4162 7224 7225 +3 4162 7225 6848 +3 6848 7225 7226 +3 6848 7226 7209 +3 7212 7227 6848 +3 6848 7227 7228 +3 6848 7228 6830 +3 6830 7228 7229 +3 6830 7229 7197 +3 7208 7230 4151 +3 4151 7230 7231 +3 4151 7231 4162 +3 4162 7231 7232 +3 4162 7232 7215 +3 7233 4162 7234 +3 7234 4162 7235 +3 7236 7237 6877 +3 6877 7237 7238 +3 7239 7240 6848 +3 6848 7240 7241 +3 6848 7241 4162 +3 4162 7241 7242 +3 4162 7242 7235 +3 7233 7243 4162 +3 4162 7243 7244 +3 4162 7244 7245 +3 7246 7247 7248 +3 7249 7250 6848 +3 6848 7250 7251 +3 6848 7251 7239 +3 7247 7252 7248 +3 7248 7252 7253 +3 7248 7253 7254 +3 7255 7256 6877 +3 7238 7257 6877 +3 6877 7257 7258 +3 6877 7258 6848 +3 6848 7258 7259 +3 7245 7260 4162 +3 4162 7260 7261 +3 4162 7261 7248 +3 7248 7261 7262 +3 7248 7262 7246 +3 7256 7263 6877 +3 6877 7263 7264 +3 6877 7264 7236 +3 7259 7265 6848 +3 6848 7265 7266 +3 6848 7266 7249 +3 7248 7267 7255 +3 7254 7268 7248 +3 7248 7268 7269 +3 7248 7269 7267 +3 7255 6877 7248 +3 7248 6877 7270 +3 7248 7270 7271 +3 7272 7273 7274 +3 7271 7275 7248 +3 7248 7275 7276 +3 7248 7276 7277 +3 7273 7278 7274 +3 7274 7278 7279 +3 7274 7279 7280 +3 7280 7281 7274 +3 7274 7281 7282 +3 7274 7282 7283 +3 7284 7285 6877 +3 6877 7285 7286 +3 7277 7287 7248 +3 7248 7287 7288 +3 7248 7288 7289 +3 7289 7290 7248 +3 7248 7290 7291 +3 7248 7291 7274 +3 7274 7291 7292 +3 7274 7292 7272 +3 7293 7294 6877 +3 6877 7294 7295 +3 6877 7295 7284 +3 7286 7296 6877 +3 6877 7296 7297 +3 6877 7297 7270 +3 7283 7298 6906 +3 6906 7298 7299 +3 6906 7299 7300 +3 7300 7301 6906 +3 6906 7301 7302 +3 6906 7302 7303 +3 7303 7304 6906 +3 6906 7304 7305 +3 6906 7305 6877 +3 6877 7305 7306 +3 6877 7306 7293 +3 7283 6906 7274 +3 7274 6906 7307 +3 7274 7307 7308 +3 7309 7310 7311 +3 7308 7312 7274 +3 7274 7312 7313 +3 7274 7313 7314 +3 7310 7315 7311 +3 7311 7315 7316 +3 7311 7316 7317 +3 7317 7318 7311 +3 7311 7318 7319 +3 7311 7319 7320 +3 7320 7321 6943 +3 6943 7321 7322 +3 6943 7322 7323 +3 7323 7324 6943 +3 6943 7324 7325 +3 6943 7325 7326 +3 7314 7327 7274 +3 7274 7327 7328 +3 7274 7328 7329 +3 7329 7330 7274 +3 7274 7330 7331 +3 7274 7331 7311 +3 7311 7331 7332 +3 7311 7332 7309 +3 7333 7334 6906 +3 6906 7334 7335 +3 7336 7337 6906 +3 6906 7337 7338 +3 6906 7338 7333 +3 7335 7339 6906 +3 6906 7339 7340 +3 6906 7340 7307 +3 7326 7341 6943 +3 6943 7341 7342 +3 6943 7342 6906 +3 6906 7342 7343 +3 6906 7343 7336 +3 7320 6943 7311 +3 7311 6943 7344 +3 7311 7344 7345 +3 7346 7347 7348 +3 7345 7349 7311 +3 7311 7349 7350 +3 7311 7350 7351 +3 7347 7352 7348 +3 7348 7352 7353 +3 7348 7353 7354 +3 7354 7355 7348 +3 7348 7355 7356 +3 7348 7356 7357 +3 7358 7359 6943 +3 6943 7359 7360 +3 7351 7361 7311 +3 7311 7361 7362 +3 7311 7362 7363 +3 7363 7364 7311 +3 7311 7364 7365 +3 7311 7365 7348 +3 7348 7365 7366 +3 7348 7366 7346 +3 7367 7368 6943 +3 6943 7368 7369 +3 6943 7369 7358 +3 7360 7370 6943 +3 6943 7370 7371 +3 6943 7371 7344 +3 7372 7373 6980 +3 6980 7373 7374 +3 7374 7375 6980 +3 6980 7375 7376 +3 6980 7376 7377 +3 7377 7378 6980 +3 6980 7378 7379 +3 6980 7379 6943 +3 6943 7379 7380 +3 6943 7380 7367 +3 7381 7348 6980 +3 6980 7348 7357 +3 6980 7357 7372 +3 7382 7383 7051 +3 7384 7385 7386 +3 7386 7387 7384 +3 7384 7387 7388 +3 7384 7388 7389 +3 7389 7390 7384 +3 7384 7390 7391 +3 7384 7391 7392 +3 7392 7391 7393 +3 7392 7393 7394 +3 7381 7395 7348 +3 7348 7395 7396 +3 7348 7396 7397 +3 7397 7398 7348 +3 7348 7398 7399 +3 7348 7399 7400 +3 7401 7402 7403 +3 7403 7402 7348 +3 7400 7404 7348 +3 7348 7404 7405 +3 7348 7405 7403 +3 7406 7407 7402 +3 7383 7408 7051 +3 7051 7408 7409 +3 7051 7409 7410 +3 7393 7411 7394 +3 7394 7411 7412 +3 7394 7412 7413 +3 7401 7414 7415 +3 6980 7416 7417 +3 7384 7418 7385 +3 7385 7418 7419 +3 7385 7419 7401 +3 7401 7419 7420 +3 7401 7420 7414 +3 7415 7421 7401 +3 7401 7421 7422 +3 7401 7422 7402 +3 7422 7423 7402 +3 7402 7423 7424 +3 7402 7424 7425 +3 7407 7426 7402 +3 7402 7426 7427 +3 7402 7427 7382 +3 6980 7428 7429 +3 7417 7430 6980 +3 6980 7430 7431 +3 6980 7431 7381 +3 7425 7432 7402 +3 7402 7432 7433 +3 7402 7433 7406 +3 7410 7434 7051 +3 7051 7434 7435 +3 7051 7435 7436 +3 7436 7437 7051 +3 7051 7437 7438 +3 7051 7438 6980 +3 6980 7438 7439 +3 6980 7439 7440 +3 7441 7442 6980 +3 6980 7442 7443 +3 7440 7444 6980 +3 6980 7444 7445 +3 6980 7445 7428 +3 7443 7446 6980 +3 6980 7446 7447 +3 6980 7447 7416 +3 7413 7448 7394 +3 7394 7448 7449 +3 7394 7449 7450 +3 7450 7449 7451 +3 7450 7451 7429 +3 7429 7451 7452 +3 7429 7452 6980 +3 6980 7452 7453 +3 6980 7453 7441 +3 7382 7051 7402 +3 7402 7051 7454 +3 7402 7454 7455 +3 7455 7456 7402 +3 7402 7456 7457 +3 7402 7457 7458 +3 7458 7459 7402 +3 7402 7459 7460 +3 7402 7460 7461 +3 7461 7462 7402 +3 7402 7462 7463 +3 7402 7463 7464 +3 7464 7463 7465 +3 7464 7465 7466 +3 7467 7468 7096 +3 7096 7468 7469 +3 7466 7470 7464 +3 7464 7470 7471 +3 7464 7471 7472 +3 7472 7473 7464 +3 7464 7473 7474 +3 7464 7474 7475 +3 7476 7477 7051 +3 7475 7478 7096 +3 7096 7478 7479 +3 7096 7479 7467 +3 7477 7480 7051 +3 7051 7480 7481 +3 7051 7481 7482 +3 7469 7483 7096 +3 7096 7483 7484 +3 7096 7484 7485 +3 7485 7486 7096 +3 7096 7486 7487 +3 7096 7487 7051 +3 7051 7487 7488 +3 7051 7488 7476 +3 7482 7489 7051 +3 7051 7489 7490 +3 7051 7490 7454 +3 7475 7096 7464 +3 7464 7096 7491 +3 7464 7491 7492 +3 7492 7493 7464 +3 7464 7493 7494 +3 7464 7494 7495 +3 7495 7496 7464 +3 7464 7496 7497 +3 7464 7497 7498 +3 7498 7499 7464 +3 7464 7499 7500 +3 7464 7500 4209 +3 4209 7500 7501 +3 4209 7501 7502 +3 7503 7504 7133 +3 7133 7504 7505 +3 7502 7506 4209 +3 4209 7506 7507 +3 4209 7507 7508 +3 7508 7509 4209 +3 4209 7509 7510 +3 4209 7510 7511 +3 7512 7513 7096 +3 7511 7514 7133 +3 7133 7514 7515 +3 7133 7515 7503 +3 7513 7516 7096 +3 7096 7516 7517 +3 7096 7517 7518 +3 7505 7519 7133 +3 7133 7519 7520 +3 7133 7520 7521 +3 7521 7522 7133 +3 7133 7522 7523 +3 7133 7523 7096 +3 7096 7523 7524 +3 7096 7524 7512 +3 7518 7525 7096 +3 7096 7525 7526 +3 7096 7526 7491 +3 7527 7528 4202 +3 7529 7530 4209 +3 4209 7530 7531 +3 4209 7531 7532 +3 7511 7133 4209 +3 4209 7133 7533 +3 4209 7533 7534 +3 7528 7535 4202 +3 4202 7535 7536 +3 4202 7536 7537 +3 7537 7538 4202 +3 4202 7538 7539 +3 4202 7539 7162 +3 7162 7539 7540 +3 7534 7541 4209 +3 4209 7541 7542 +3 4209 7542 7529 +3 7540 7543 7162 +3 7162 7543 7544 +3 7162 7544 7545 +3 7545 7546 7162 +3 7162 7546 7547 +3 7162 7547 7548 +3 7532 7549 4209 +3 4209 7549 7550 +3 4209 7550 4202 +3 4202 7550 7551 +3 4202 7551 7527 +3 7552 7553 7133 +3 7133 7553 7554 +3 7555 7556 7133 +3 7133 7556 7557 +3 7133 7557 7552 +3 7554 7558 7133 +3 7133 7558 7559 +3 7133 7559 7533 +3 7548 7560 7162 +3 7162 7560 7561 +3 7162 7561 7133 +3 7133 7561 7562 +3 7133 7562 7555 +3 4208 4219 4194 +3 4194 4219 4202 +3 4194 4202 4233 +3 4233 4202 7162 +3 4233 7162 7563 +3 7563 7162 6756 +3 7563 6756 7564 +3 7564 6756 6067 +3 7564 6067 7565 +3 7565 6067 5694 +3 7565 5694 7566 +3 7566 5694 5333 +3 7566 5333 7567 +3 7567 5333 4953 +3 7567 4953 7568 +3 7568 4953 4240 +3 7568 4240 7569 +3 7569 4240 4254 +3 7570 7571 4175 +3 4175 7571 7572 +3 7573 4162 7574 +3 7574 4162 7575 +3 4162 7576 7577 +3 7573 7578 4162 +3 4162 7578 7579 +3 4162 7579 7576 +3 7577 7580 4162 +3 4162 7580 7581 +3 4162 7581 4175 +3 4175 7581 7582 +3 4175 7582 7570 +3 7572 7583 4175 +3 4175 7583 7584 +3 4175 7584 7585 +3 7586 7587 7248 +3 7588 7589 7590 +3 7590 7589 7591 +3 7590 7591 7592 +3 7587 7593 7248 +3 7248 7593 7594 +3 7248 7594 7595 +3 7595 7596 7248 +3 7248 7596 7597 +3 7248 7597 4162 +3 4162 7597 7598 +3 4162 7598 7575 +3 7585 7599 4175 +3 4175 7599 7600 +3 4175 7600 7590 +3 7590 7600 7601 +3 7590 7601 7588 +3 7592 7602 7590 +3 7590 7602 7603 +3 7590 7603 7604 +3 7604 7605 7248 +3 7248 7605 7606 +3 7248 7606 7586 +3 7607 7608 7590 +3 7590 7608 7609 +3 7590 7609 7610 +3 7604 7248 7590 +3 7590 7248 7611 +3 7590 7611 7607 +3 7610 7612 7590 +3 7590 7612 7613 +3 7590 7613 7614 +3 7615 7616 7617 +3 7617 7616 7590 +3 7617 7590 7618 +3 7618 7590 7614 +3 7619 7620 7248 +3 7248 7620 7621 +3 7616 7622 7623 +3 7621 7624 7248 +3 7248 7624 7625 +3 7248 7625 7611 +3 7615 7626 7616 +3 7616 7626 7627 +3 7616 7627 7622 +3 7623 7628 7616 +3 7616 7628 7629 +3 7616 7629 7630 +3 7631 7632 7248 +3 7248 7632 7633 +3 7248 7633 7619 +3 7634 7635 7274 +3 7274 7635 7636 +3 7274 7636 7637 +3 7637 7638 7274 +3 7274 7638 7639 +3 7274 7639 7640 +3 7640 7641 7274 +3 7274 7641 7642 +3 7274 7642 7248 +3 7248 7642 7643 +3 7248 7643 7631 +3 7644 7616 7274 +3 7274 7616 7630 +3 7274 7630 7634 +3 7645 7646 7311 +3 7647 7648 7311 +3 7311 7648 7649 +3 7650 7651 7652 +3 7652 7651 7616 +3 7651 7653 7654 +3 7644 7655 7616 +3 7616 7655 7656 +3 7616 7656 7657 +3 7657 7658 7616 +3 7616 7658 7659 +3 7616 7659 7660 +3 7650 7661 7651 +3 7651 7661 7662 +3 7651 7662 7653 +3 7645 7311 7663 +3 7646 7664 7311 +3 7311 7664 7665 +3 7311 7665 7647 +3 7660 7666 7616 +3 7616 7666 7667 +3 7616 7667 7652 +3 7654 7668 7651 +3 7651 7668 7669 +3 7651 7669 7663 +3 7670 7274 7671 +3 7671 7274 7672 +3 7670 7673 7274 +3 7274 7673 7674 +3 7274 7674 7675 +3 7649 7676 7311 +3 7311 7676 7677 +3 7311 7677 7274 +3 7274 7677 7678 +3 7274 7678 7672 +3 7675 7679 7274 +3 7274 7679 7680 +3 7274 7680 7644 +3 7681 7682 7651 +3 7651 7682 7683 +3 7663 7311 7651 +3 7651 7311 7684 +3 7651 7684 7681 +3 7683 7685 7651 +3 7651 7685 7686 +3 7651 7686 7687 +3 7688 7689 7690 +3 7690 7689 7651 +3 7687 7691 7651 +3 7651 7691 7692 +3 7651 7692 7690 +3 7689 7693 7694 +3 7695 7696 7311 +3 7311 7696 7697 +3 7688 7698 7689 +3 7689 7698 7699 +3 7689 7699 7693 +3 7697 7700 7311 +3 7311 7700 7701 +3 7311 7701 7684 +3 7694 7702 7689 +3 7689 7702 7703 +3 7689 7703 7704 +3 7705 7706 7311 +3 7311 7706 7707 +3 7311 7707 7695 +3 7708 7709 7348 +3 7348 7709 7710 +3 7348 7710 7711 +3 7711 7712 7348 +3 7348 7712 7713 +3 7348 7713 7714 +3 7714 7715 7348 +3 7348 7715 7716 +3 7348 7716 7311 +3 7311 7716 7717 +3 7311 7717 7705 +3 7718 7719 7689 +3 7720 7689 7348 +3 7348 7689 7704 +3 7348 7704 7708 +3 7689 7719 7721 +3 7721 7719 7722 +3 7721 7722 7723 +3 7721 7724 7725 +3 7726 7727 7402 +3 7402 7727 7728 +3 7402 7728 7729 +3 7720 7730 7689 +3 7689 7730 7731 +3 7689 7731 7732 +3 7732 7733 7689 +3 7689 7733 7734 +3 7689 7734 7735 +3 7736 7737 7723 +3 7723 7737 7738 +3 7738 7739 7723 +3 7723 7739 7740 +3 7723 7740 7721 +3 7721 7740 7741 +3 7721 7741 7724 +3 7725 7742 7721 +3 7721 7742 7743 +3 7721 7743 7744 +3 7744 7745 7721 +3 7721 7745 7746 +3 7721 7746 7747 +3 7748 7749 7402 +3 7402 7749 7750 +3 7402 7750 7726 +3 7751 7752 7348 +3 7348 7752 7753 +3 7348 7753 7754 +3 7735 7755 7689 +3 7689 7755 7756 +3 7689 7756 7718 +3 7747 7757 7721 +3 7721 7757 7758 +3 7721 7758 7402 +3 7402 7758 7759 +3 7402 7759 7748 +3 7760 7761 7754 +3 7754 7761 7762 +3 7729 7763 7402 +3 7402 7763 7764 +3 7402 7764 7348 +3 7348 7764 7765 +3 7348 7765 7751 +3 7766 7767 7723 +3 7723 7767 7768 +3 7723 7768 7736 +3 7769 7770 7771 +3 7771 7770 7760 +3 7771 7760 7772 +3 7772 7760 7754 +3 7766 7773 7767 +3 7767 7773 7774 +3 7767 7774 7775 +3 7775 7776 7767 +3 7767 7776 7777 +3 7767 7777 7769 +3 7769 7777 7778 +3 7769 7778 7770 +3 7762 7779 7754 +3 7754 7779 7780 +3 7754 7780 7348 +3 7348 7780 7781 +3 7348 7781 7782 +3 7782 7783 7348 +3 7348 7783 7784 +3 7348 7784 7785 +3 7785 7786 7348 +3 7348 7786 7787 +3 7348 7787 7788 +3 7788 7789 7348 +3 7348 7789 7790 +3 7348 7790 7720 +3 7791 7792 7793 +3 7794 7795 7402 +3 7402 7796 7721 +3 7721 7796 7797 +3 7721 7797 7798 +3 7792 7799 7793 +3 7793 7799 7800 +3 7793 7800 7801 +3 7802 7803 7721 +3 7721 7803 7804 +3 7804 7805 7721 +3 7721 7805 7806 +3 7721 7806 7793 +3 7793 7806 7807 +3 7793 7807 7791 +3 7795 7808 7402 +3 7402 7808 7809 +3 7402 7809 7810 +3 7798 7811 7721 +3 7721 7811 7812 +3 7721 7812 7802 +3 7813 7814 7464 +3 7464 7814 7815 +3 7464 7815 7816 +3 7810 7817 7402 +3 7402 7817 7818 +3 7402 7818 7796 +3 7801 7819 7793 +3 7793 7819 7820 +3 7793 7820 7464 +3 7464 7820 7821 +3 7464 7821 7813 +3 7816 7822 7464 +3 7464 7822 7823 +3 7464 7823 7824 +3 7824 7825 7464 +3 7464 7825 7826 +3 7464 7826 7402 +3 7402 7826 7827 +3 7402 7827 7794 +3 7828 7829 4193 +3 7830 7831 7464 +3 7464 7832 7793 +3 7793 7832 7833 +3 7793 7833 7834 +3 7829 7835 4193 +3 4193 7835 7836 +3 4193 7836 7837 +3 7838 7839 7793 +3 7793 7839 7840 +3 7840 7841 7793 +3 7793 7841 7842 +3 7793 7842 4193 +3 4193 7842 7843 +3 4193 7843 7828 +3 7831 7844 7464 +3 7464 7844 7845 +3 7464 7845 7846 +3 7834 7847 7793 +3 7793 7847 7848 +3 7793 7848 7838 +3 7849 7850 4209 +3 4209 7850 7851 +3 4209 7851 7852 +3 7846 7853 7464 +3 7464 7853 7854 +3 7464 7854 7832 +3 7837 7855 4193 +3 4193 7855 7856 +3 4193 7856 4209 +3 4209 7856 7857 +3 4209 7857 7849 +3 7852 7858 4209 +3 4209 7858 7859 +3 4209 7859 7860 +3 7860 7861 4209 +3 4209 7861 7862 +3 4209 7862 7464 +3 7464 7862 7863 +3 7464 7863 7830 +3 4214 7864 4193 +3 4193 7864 7865 +3 4193 7865 7793 +3 7793 7865 7866 +3 7793 7866 7721 +3 7721 7866 7867 +3 7721 7867 7689 +3 7689 7867 7868 +3 7689 7868 7651 +3 7651 7868 7869 +3 7651 7869 7616 +3 7616 7869 7870 +3 7616 7870 7590 +3 7590 7870 7871 +3 7590 7871 4175 +3 4175 7871 7872 +3 4175 7872 4170 +3 4170 7872 7873 +3 7874 3929 3961 +3 3961 60 7874 +3 7874 60 28 +3 7874 28 7875 +3 7875 28 475 +3 7875 475 3928 +3 326 3955 355 +3 355 3955 3928 +3 355 3928 433 +3 433 3928 475 +3 4029 3992 117 +3 117 3992 7876 +3 117 7876 99 +3 99 7876 7877 +3 99 7877 200 +3 200 7877 3985 +3 200 3985 238 +3 238 3985 3955 +3 238 3955 278 +3 278 3955 326 +3 4308 3953 4280 +3 4280 3953 3954 +3 4280 3954 4343 +3 4343 3954 3956 +3 4343 3956 4374 +3 4245 4237 3956 +3 3956 4237 4548 +3 3956 4548 4490 +3 4490 4450 3956 +3 3956 4450 4412 +3 3956 4412 4374 +3 4151 4150 4092 +3 5363 5732 4090 +3 4090 5732 6099 +3 4090 6099 4092 +3 4092 6099 6830 +3 4092 6830 4151 +3 4287 4286 3936 +3 3936 4286 4622 +3 3936 4622 4090 +3 4090 4622 4993 +3 4090 4993 5363 +3 4113 4112 3916 +3 3916 4112 7878 +3 3916 7878 3917 +3 3917 7878 7879 +3 4035 4038 7880 +3 7880 4038 3926 +3 7880 3926 7881 +3 7881 3926 3925 +3 3925 3924 7881 +3 7881 3924 3923 +3 7881 3923 4037 +3 4037 3923 3922 +3 4037 3922 4094 +3 3922 3921 4094 +3 4094 3921 3920 +3 4094 3920 4096 +3 4096 3920 3919 +3 4096 3919 7879 +3 7879 3919 3918 +3 7879 3918 3917 +3 7569 4254 3999 +3 4069 4234 4233 +3 7565 4075 7564 +3 7564 4075 4069 +3 7564 4069 7563 +3 7563 4069 4233 +3 7565 7566 4075 +3 4075 7566 7567 +3 4075 7567 3999 +3 3999 7567 7568 +3 3999 7568 7569 +3 7865 7864 4050 +3 7873 7872 4095 +3 4095 7872 7871 +3 4095 7871 4093 +3 4093 7871 7870 +3 4093 7870 7869 +3 7869 7868 4093 +3 4093 7868 7867 +3 4093 7867 4050 +3 4050 7867 7866 +3 4050 7866 7865 +3 3926 4038 4041 +3 3926 4041 196 +3 196 4041 4043 +3 196 4043 197 +3 197 4043 4045 +3 197 4045 195 +3 195 4045 4047 +3 195 4047 194 +3 194 4047 151 +3 151 4047 4046 +3 151 4046 166 +3 166 4046 4044 +3 166 4044 164 +3 164 4044 4042 +3 164 4042 162 +3 162 4042 4040 +3 162 4040 160 +3 160 4040 4039 +3 160 4039 188 +3 1278 1647 4074 +3 4074 1647 2020 +3 4074 2020 4039 +3 4039 2020 2746 +3 2746 3116 4039 +3 4039 3116 154 +3 4039 154 188 +3 69 63 4027 +3 4027 63 538 +3 4027 538 4074 +3 4074 538 910 +3 4074 910 1278 +3 69 4027 4025 +3 69 4025 124 +3 124 4025 4023 +3 124 4023 122 +3 122 4023 4021 +3 122 4021 120 +3 120 4021 4017 +3 120 4017 118 +3 118 4017 4031 +3 118 4031 146 +3 146 4031 4032 +3 146 4032 144 +3 144 4032 4033 +3 144 4033 142 +3 142 4033 4034 +3 142 4034 140 +3 140 4034 4030 +3 140 4030 138 +3 138 4030 4029 +3 138 4029 117 +3 60 3961 3963 +3 60 3963 58 +3 58 3963 3965 +3 58 3965 56 +3 56 3965 3967 +3 56 3967 54 +3 54 3967 3969 +3 54 3969 52 +3 52 3969 18 +3 18 3969 3971 +3 18 3971 17 +3 17 3971 3973 +3 17 3973 16 +3 16 3973 3976 +3 16 3976 14 +3 14 3976 3978 +3 14 3978 12 +3 12 3978 3980 +3 12 3980 13 +3 13 3980 3982 +3 13 3982 15 +3 15 3982 3861 +3 3861 3982 4089 +3 3861 4089 3862 +3 3862 4089 4091 +3 3862 4091 3863 +3 3863 4091 3864 +3 3870 3869 4091 +3 4091 3869 3868 +3 4091 3868 3867 +3 3867 3866 4091 +3 4091 3866 3865 +3 4091 3865 3864 +3 3870 4091 4125 +3 3870 4125 3 +3 3 4125 4127 +3 3 4127 4 +3 4 4127 4129 +3 4 4129 11 +3 11 4129 4131 +3 11 4131 10 +3 10 4131 8 +3 8 4131 4133 +3 8 4133 6 +3 6 4133 7 +3 7 4133 4134 +3 7 4134 0 +3 0 4134 4135 +3 0 4135 1 +3 1 4135 4136 +3 1 4136 2 +3 2 4136 4114 +3 2 4114 3915 +3 3915 4114 4113 +3 3915 4113 3916 +3 3522 4210 3523 +3 3523 4210 4232 +3 3523 4232 3515 +3 3515 4232 4231 +3 3515 4231 3516 +3 3516 4231 4227 +3 3516 4227 3517 +3 3517 4227 4226 +3 3517 4226 3511 +3 3511 4226 4225 +3 3511 4225 3512 +3 3512 4225 4222 +3 3512 4222 3513 +3 3513 4222 4223 +3 3513 4223 3514 +3 3514 4223 4224 +3 3514 4224 3524 +3 3524 4224 4230 +3 3524 4230 3525 +3 3525 4230 4229 +3 3525 4229 3526 +3 3526 4229 4228 +3 3526 4228 3503 +3 3503 4228 4205 +3 3503 4205 3504 +3 3504 4205 4204 +3 3504 4204 3518 +3 3518 4204 4203 +3 3518 4203 3519 +3 3519 4203 4221 +3 3519 4221 3520 +3 3520 4221 4220 +3 3520 4220 3527 +3 3527 4220 4201 +3 3527 4201 3528 +3 3528 4201 4200 +3 3528 4200 3496 +3 3496 4200 4219 +3 3496 4219 3497 +3 3497 4219 4208 +3 3497 4208 3498 +3 3498 4208 4207 +3 3498 4207 3499 +3 3499 4207 4206 +3 3499 4206 3495 +3 3495 4206 4196 +3 3495 4196 3494 +3 3494 4196 4218 +3 3494 4218 3493 +3 3493 4218 4217 +3 3493 4217 3505 +3 3505 4217 4216 +3 3505 4216 3506 +3 3506 4216 4215 +3 3506 4215 3507 +3 3507 4215 4213 +3 3507 4213 3508 +3 3508 4213 4212 +3 3508 4212 3509 +3 3509 4212 4199 +3 3509 4199 3510 +3 3510 4199 4198 +3 3510 4198 3500 +3 3500 4198 4197 +3 3500 4197 3501 +3 3501 4197 4192 +3 3501 4192 3502 +3 3502 4192 4191 +3 3502 4191 3521 +3 3521 4191 4211 +3 3521 4211 3522 +3 3522 4211 4210 +3 3137 7533 3124 +3 3124 7533 7559 +3 3124 7559 3125 +3 3125 7559 7558 +3 3125 7558 3138 +3 3138 7558 7554 +3 3138 7554 3139 +3 3139 7554 7553 +3 3139 7553 3140 +3 3140 7553 7552 +3 3140 7552 3143 +3 3143 7552 7557 +3 3143 7557 3144 +3 3144 7557 7556 +3 3144 7556 3145 +3 3145 7556 7555 +3 3145 7555 3151 +3 3151 7555 7562 +3 3151 7562 3152 +3 3152 7562 7561 +3 3152 7561 3153 +3 3153 7561 7560 +3 3153 7560 3141 +3 3141 7560 7548 +3 3141 7548 3142 +3 3142 7548 7547 +3 3142 7547 3146 +3 3146 7547 7546 +3 3146 7546 3147 +3 3147 7546 7545 +3 3147 7545 3148 +3 3148 7545 7544 +3 3148 7544 3149 +3 3149 7544 7543 +3 3149 7543 3150 +3 3150 7543 7540 +3 3150 7540 3117 +3 3117 7540 7539 +3 3117 7539 3118 +3 3118 7539 7538 +3 3118 7538 3119 +3 3119 7538 7537 +3 3119 7537 3120 +3 3120 7537 7536 +3 3120 7536 3126 +3 3126 7536 7535 +3 3126 7535 3127 +3 3127 7535 7528 +3 3127 7528 3128 +3 3128 7528 7527 +3 3128 7527 3132 +3 3132 7527 7551 +3 3132 7551 3133 +3 3133 7551 7550 +3 3133 7550 3134 +3 3134 7550 7549 +3 3134 7549 3129 +3 3129 7549 7532 +3 3129 7532 3130 +3 3130 7532 7531 +3 3130 7531 3131 +3 3131 7531 7530 +3 3131 7530 3121 +3 3121 7530 7529 +3 3121 7529 3122 +3 3122 7529 7542 +3 3122 7542 3135 +3 3135 7542 7541 +3 3135 7541 3136 +3 3136 7541 7534 +3 3136 7534 3137 +3 3137 7534 7533 +3 2765 7167 2766 +3 2766 7167 7196 +3 2766 7196 2767 +3 2767 7196 7195 +3 2767 7195 2768 +3 2768 7195 7194 +3 2768 7194 2769 +3 2769 7194 7193 +3 2769 7193 2770 +3 2770 7193 7192 +3 2770 7192 2771 +3 2771 7192 7191 +3 2771 7191 2772 +3 2772 7191 7190 +3 2772 7190 2774 +3 2774 7190 7189 +3 2774 7189 2775 +3 2775 7189 7186 +3 2775 7186 2773 +3 2773 7186 7187 +3 2773 7187 2776 +3 2776 7187 7188 +3 2776 7188 2777 +3 2777 7188 7185 +3 2777 7185 2778 +3 2778 7185 7184 +3 2778 7184 2779 +3 2779 7184 7183 +3 2779 7183 2780 +3 2780 7183 7182 +3 2780 7182 2781 +3 2781 7182 7181 +3 2781 7181 2782 +3 2782 7181 7180 +3 2782 7180 2783 +3 2783 7180 7174 +3 2783 7174 2747 +3 2747 7174 7173 +3 2747 7173 2748 +3 2748 7173 7172 +3 2748 7172 2749 +3 2749 7172 7171 +3 2749 7171 2750 +3 2750 7171 7170 +3 2750 7170 2751 +3 2751 7170 7169 +3 2751 7169 2752 +3 2752 7169 7161 +3 2752 7161 2753 +3 2753 7161 7160 +3 2753 7160 2759 +3 2759 7160 7179 +3 2759 7179 2760 +3 2760 7179 7178 +3 2760 7178 2761 +3 2761 7178 7177 +3 2761 7177 2754 +3 2754 7177 7166 +3 2754 7166 2755 +3 2755 7166 7165 +3 2755 7165 2757 +3 2757 7165 7164 +3 2757 7164 2758 +3 2758 7164 7163 +3 2758 7163 2762 +3 2762 7163 7176 +3 2762 7176 2763 +3 2763 7176 7175 +3 2763 7175 2764 +3 2764 7175 7168 +3 2764 7168 2765 +3 2765 7168 7167 +3 2043 6770 2041 +3 2041 6770 6792 +3 2041 6792 2040 +3 2040 6792 6825 +3 2040 6825 2047 +3 2047 6825 6823 +3 2047 6823 2048 +3 2048 6823 6822 +3 2048 6822 2050 +3 2050 6822 6819 +3 2050 6819 2051 +3 2051 6819 6818 +3 2051 6818 2052 +3 2052 6818 6826 +3 2052 6826 2077 +3 2077 6826 6783 +3 2077 6783 2060 +3 2060 6783 6810 +3 2060 6810 2058 +3 2058 6810 6806 +3 2058 6806 2044 +3 2044 6806 6808 +3 2044 6808 2061 +3 2061 6808 6809 +3 2061 6809 2054 +3 2054 6809 6782 +3 2054 6782 2055 +3 2055 6782 6781 +3 2055 6781 2056 +3 2056 6781 6799 +3 2056 6799 2057 +3 2057 6799 6798 +3 2057 6798 2062 +3 2062 6798 6797 +3 2062 6797 2063 +3 2063 6797 6765 +3 2063 6765 2064 +3 2064 6765 6764 +3 2064 6764 2026 +3 2026 6764 6763 +3 2026 6763 2027 +3 2027 6763 6762 +3 2027 6762 2028 +3 2028 6762 6761 +3 2028 6761 2029 +3 2029 6761 6760 +3 2029 6760 2030 +3 2030 6760 6755 +3 2030 6755 2031 +3 2031 6755 6754 +3 2031 6754 2018 +3 2018 6754 6778 +3 2018 6778 2019 +3 2019 6778 6777 +3 2019 6777 2032 +3 2032 6777 6780 +3 2032 6780 2033 +3 2033 6780 6779 +3 2033 6779 2035 +3 2035 6779 6776 +3 2035 6776 2036 +3 2036 6776 6775 +3 2036 6775 2037 +3 2037 6775 6774 +3 2037 6774 2038 +3 2038 6774 6773 +3 2038 6773 2039 +3 2039 6773 6772 +3 2039 6772 2042 +3 2042 6772 6771 +3 2042 6771 2043 +3 2043 6771 6770 +3 2049 6793 2053 +3 2053 6793 6814 +3 2053 6814 2065 +3 2065 6814 6813 +3 2065 6813 2066 +3 2066 6813 6805 +3 2066 6805 2067 +3 2067 6805 6804 +3 2067 6804 2068 +3 2068 6804 6803 +3 2068 6803 2069 +3 2069 6803 6802 +3 2069 6802 2070 +3 2070 6802 6801 +3 2070 6801 2080 +3 2080 6801 6800 +3 2080 6800 2081 +3 2081 6800 6794 +3 2081 6794 2071 +3 2071 6794 6795 +3 2071 6795 2082 +3 2082 6795 6796 +3 2082 6796 2083 +3 2083 6796 6791 +3 2083 6791 2084 +3 2084 6791 6790 +3 2084 6790 2085 +3 2085 6790 6789 +3 2085 6789 2086 +3 2086 6789 6788 +3 2086 6788 2087 +3 2087 6788 6787 +3 2087 6787 2088 +3 2088 6787 6786 +3 2088 6786 2089 +3 2089 6786 6769 +3 2089 6769 2016 +3 2016 6769 6768 +3 2016 6768 2017 +3 2017 6768 6767 +3 2017 6767 2021 +3 2021 6767 6766 +3 2021 6766 2022 +3 2022 6766 6759 +3 2022 6759 2023 +3 2023 6759 6758 +3 2023 6758 2024 +3 2024 6758 6757 +3 2024 6757 2025 +3 2025 6757 6807 +3 2025 6807 2045 +3 2045 6807 6812 +3 2045 6812 2046 +3 2046 6812 6811 +3 2046 6811 2059 +3 2059 6811 6785 +3 2059 6785 2072 +3 2072 6785 6784 +3 2072 6784 2073 +3 2073 6784 6820 +3 2073 6820 2074 +3 2074 6820 6821 +3 2074 6821 2075 +3 2075 6821 6824 +3 2075 6824 2076 +3 2076 6824 6817 +3 2076 6817 2078 +3 2078 6817 6816 +3 2078 6816 2079 +3 2079 6816 6815 +3 2079 6815 2049 +3 2049 6815 6793 +3 1683 6060 1654 +3 1654 6060 6096 +3 1654 6096 1655 +3 1655 6096 6095 +3 1655 6095 1656 +3 1656 6095 6094 +3 1656 6094 1657 +3 1657 6094 6093 +3 1657 6093 1658 +3 1658 6093 6092 +3 1658 6092 1659 +3 1659 6092 6091 +3 1659 6091 1660 +3 1660 6091 6090 +3 1660 6090 1664 +3 1664 6090 6089 +3 1664 6089 1665 +3 1665 6089 6086 +3 1665 6086 1661 +3 1661 6086 6087 +3 1661 6087 1671 +3 1671 6087 6088 +3 1671 6088 1672 +3 1672 6088 6085 +3 1672 6085 1673 +3 1673 6085 6084 +3 1673 6084 1674 +3 1674 6084 6083 +3 1674 6083 1675 +3 1675 6083 6082 +3 1675 6082 1676 +3 1676 6082 6081 +3 1676 6081 1679 +3 1679 6081 6080 +3 1679 6080 1680 +3 1680 6080 6077 +3 1680 6077 1646 +3 1646 6077 6078 +3 1646 6078 1648 +3 1648 6078 6079 +3 1648 6079 1662 +3 1662 6079 6076 +3 1662 6076 1663 +3 1663 6076 6075 +3 1663 6075 1652 +3 1652 6075 6074 +3 1652 6074 1653 +3 1653 6074 6073 +3 1653 6073 1666 +3 1666 6073 6072 +3 1666 6072 1667 +3 1667 6072 6071 +3 1667 6071 1668 +3 1668 6071 6068 +3 1668 6068 1649 +3 1649 6068 6070 +3 1649 6070 1650 +3 1650 6070 6069 +3 1650 6069 1677 +3 1677 6069 6066 +3 1677 6066 1678 +3 1678 6066 6065 +3 1678 6065 1669 +3 1669 6065 6064 +3 1669 6064 1670 +3 1670 6064 6063 +3 1670 6063 1681 +3 1681 6063 6062 +3 1681 6062 1682 +3 1682 6062 6061 +3 1682 6061 1683 +3 1683 6061 6060 +3 1295 5695 1294 +3 1294 5695 5728 +3 1294 5728 1297 +3 1297 5728 5727 +3 1297 5727 1298 +3 1298 5727 5726 +3 1298 5726 1299 +3 1299 5726 5725 +3 1299 5725 1300 +3 1300 5725 5724 +3 1300 5724 1301 +3 1301 5724 5723 +3 1301 5723 1302 +3 1302 5723 5722 +3 1302 5722 1304 +3 1304 5722 5721 +3 1304 5721 1305 +3 1305 5721 5718 +3 1305 5718 1303 +3 1303 5718 5719 +3 1303 5719 1306 +3 1306 5719 5720 +3 1306 5720 1307 +3 1307 5720 5717 +3 1307 5717 1308 +3 1308 5717 5716 +3 1308 5716 1309 +3 1309 5716 5715 +3 1309 5715 1310 +3 1310 5715 5714 +3 1310 5714 1311 +3 1311 5714 5713 +3 1311 5713 1312 +3 1312 5713 5712 +3 1312 5712 1313 +3 1313 5712 5709 +3 1313 5709 1279 +3 1279 5709 5708 +3 1279 5708 1280 +3 1280 5708 5707 +3 1280 5707 1281 +3 1281 5707 5698 +3 1281 5698 1282 +3 1282 5698 5697 +3 1282 5697 1283 +3 1283 5697 5696 +3 1283 5696 1284 +3 1284 5696 5693 +3 1284 5693 1285 +3 1285 5693 5692 +3 1285 5692 1276 +3 1276 5692 5706 +3 1276 5706 1277 +3 1277 5706 5705 +3 1277 5705 1286 +3 1286 5705 5711 +3 1286 5711 1287 +3 1287 5711 5710 +3 1287 5710 1289 +3 1289 5710 5704 +3 1289 5704 1290 +3 1290 5704 5703 +3 1290 5703 1291 +3 1291 5703 5702 +3 1291 5702 1292 +3 1292 5702 5701 +3 1292 5701 1293 +3 1293 5701 5700 +3 1293 5700 1296 +3 1296 5700 5699 +3 1296 5699 1295 +3 1295 5699 5695 +3 914 5330 921 +3 921 5330 5359 +3 921 5359 922 +3 922 5359 5358 +3 922 5358 923 +3 923 5358 5357 +3 923 5357 924 +3 924 5357 5356 +3 924 5356 925 +3 925 5356 5355 +3 925 5355 926 +3 926 5355 5354 +3 926 5354 927 +3 927 5354 5353 +3 927 5353 931 +3 931 5353 5352 +3 931 5352 932 +3 932 5352 5349 +3 932 5349 928 +3 928 5349 5350 +3 928 5350 936 +3 936 5350 5351 +3 936 5351 937 +3 937 5351 5348 +3 937 5348 938 +3 938 5348 5347 +3 938 5347 939 +3 939 5347 5346 +3 939 5346 940 +3 940 5346 5345 +3 940 5345 941 +3 941 5345 5344 +3 941 5344 942 +3 942 5344 5343 +3 942 5343 943 +3 943 5343 5340 +3 943 5340 909 +3 909 5340 5342 +3 909 5342 911 +3 911 5342 5341 +3 911 5341 929 +3 929 5341 5339 +3 929 5339 930 +3 930 5339 5338 +3 930 5338 917 +3 917 5338 5337 +3 917 5337 918 +3 918 5337 5336 +3 918 5336 933 +3 933 5336 5335 +3 933 5335 934 +3 934 5335 5334 +3 934 5334 935 +3 935 5334 5332 +3 935 5332 915 +3 915 5332 5331 +3 915 5331 916 +3 916 5331 5329 +3 916 5329 919 +3 919 5329 5328 +3 919 5328 920 +3 920 5328 5327 +3 920 5327 906 +3 906 5327 5326 +3 906 5326 907 +3 907 5326 5325 +3 907 5325 912 +3 912 5325 5324 +3 912 5324 913 +3 913 5324 5323 +3 913 5323 914 +3 914 5323 5330 +3 572 4973 573 +3 573 4973 4972 +3 573 4972 568 +3 568 4972 4971 +3 568 4971 569 +3 569 4971 4970 +3 569 4970 570 +3 570 4970 4969 +3 570 4969 542 +3 542 4969 4968 +3 542 4968 543 +3 543 4968 4967 +3 543 4967 544 +3 544 4967 4966 +3 544 4966 545 +3 545 4966 4965 +3 545 4965 546 +3 546 4965 4964 +3 546 4964 547 +3 547 4964 4963 +3 547 4963 548 +3 548 4963 4962 +3 548 4962 539 +3 539 4962 4961 +3 539 4961 540 +3 540 4961 4960 +3 540 4960 541 +3 541 4960 4959 +3 541 4959 549 +3 549 4959 4956 +3 549 4956 550 +3 550 4956 4957 +3 550 4957 551 +3 551 4957 4958 +3 551 4958 552 +3 552 4958 4986 +3 552 4986 553 +3 553 4986 4985 +3 553 4985 554 +3 554 4985 4984 +3 554 4984 536 +3 536 4984 4983 +3 536 4983 537 +3 537 4983 4982 +3 537 4982 558 +3 558 4982 4981 +3 558 4981 559 +3 559 4981 4955 +3 559 4955 555 +3 555 4955 4954 +3 555 4954 556 +3 556 4954 4989 +3 556 4989 557 +3 557 4989 4988 +3 557 4988 560 +3 560 4988 4987 +3 560 4987 561 +3 561 4987 4978 +3 561 4978 563 +3 563 4978 4977 +3 563 4977 564 +3 564 4977 4976 +3 564 4976 565 +3 565 4976 4975 +3 565 4975 566 +3 566 4975 4980 +3 566 4980 567 +3 567 4980 4979 +3 567 4979 571 +3 571 4979 4974 +3 571 4974 572 +3 572 4974 4973 +3 129 4268 97 +3 97 4268 4267 +3 97 4267 98 +3 98 4267 4266 +3 98 4266 100 +3 100 4266 4265 +3 100 4265 101 +3 101 4265 4264 +3 101 4264 102 +3 102 4264 4263 +3 102 4263 103 +3 103 4263 4236 +3 103 4236 104 +3 104 4236 4235 +3 104 4235 106 +3 106 4235 4262 +3 106 4262 73 +3 73 4262 4261 +3 73 4261 66 +3 66 4261 4260 +3 66 4260 79 +3 79 4260 4247 +3 79 4247 78 +3 78 4247 4246 +3 78 4246 76 +3 76 4246 4259 +3 76 4259 86 +3 86 4259 4258 +3 86 4258 87 +3 87 4258 4257 +3 87 4257 89 +3 89 4257 4244 +3 89 4244 90 +3 90 4244 4243 +3 90 4243 91 +3 91 4243 4256 +3 91 4256 92 +3 92 4256 4241 +3 92 4241 93 +3 93 4241 4239 +3 93 4239 64 +3 64 4239 4238 +3 64 4238 65 +3 65 4238 4274 +3 65 4274 94 +3 94 4274 4273 +3 94 4273 95 +3 95 4273 4272 +3 95 4272 96 +3 96 4272 4271 +3 96 4271 133 +3 133 4271 4277 +3 133 4277 134 +3 134 4277 4276 +3 134 4276 135 +3 135 4276 4275 +3 135 4275 83 +3 83 4275 4253 +3 83 4253 84 +3 84 4253 4252 +3 84 4252 112 +3 112 4252 4251 +3 112 4251 113 +3 113 4251 4270 +3 113 4270 114 +3 114 4270 4269 +3 114 4269 127 +3 127 4269 4249 +3 127 4249 128 +3 128 4249 4248 +3 128 4248 129 +3 129 4248 4268 +3 225 4603 221 +3 221 4603 4602 +3 221 4602 222 +3 222 4602 4601 +3 222 4601 226 +3 226 4601 4600 +3 226 4600 227 +3 227 4600 4599 +3 227 4599 206 +3 206 4599 4592 +3 206 4592 198 +3 198 4592 4591 +3 198 4591 199 +3 199 4591 4590 +3 199 4590 207 +3 207 4590 4598 +3 207 4598 208 +3 208 4598 4597 +3 208 4597 209 +3 209 4597 4596 +3 209 4596 210 +3 210 4596 4589 +3 210 4589 211 +3 211 4589 4588 +3 211 4588 212 +3 212 4588 4587 +3 212 4587 201 +3 201 4587 4586 +3 201 4586 202 +3 202 4586 4585 +3 202 4585 203 +3 203 4585 4584 +3 203 4584 204 +3 204 4584 4619 +3 204 4619 205 +3 205 4619 4618 +3 205 4618 228 +3 228 4618 4617 +3 228 4617 229 +3 229 4617 4616 +3 229 4616 230 +3 230 4616 4615 +3 230 4615 231 +3 231 4615 4614 +3 231 4614 232 +3 232 4614 4610 +3 232 4610 216 +3 216 4610 4609 +3 216 4609 217 +3 217 4609 4608 +3 217 4608 233 +3 233 4608 4613 +3 233 4613 234 +3 234 4613 4612 +3 234 4612 235 +3 235 4612 4611 +3 235 4611 213 +3 213 4611 4595 +3 213 4595 214 +3 214 4595 4594 +3 214 4594 218 +3 218 4594 4593 +3 218 4593 219 +3 219 4593 4607 +3 219 4607 220 +3 220 4607 4606 +3 220 4606 223 +3 223 4606 4605 +3 223 4605 224 +3 224 4605 4604 +3 224 4604 225 +3 225 4604 4603 +3 271 4564 272 +3 272 4564 4563 +3 272 4563 273 +3 273 4563 4562 +3 273 4562 236 +3 236 4562 4561 +3 236 4561 237 +3 237 4561 4560 +3 237 4560 244 +3 244 4560 4553 +3 244 4553 245 +3 245 4553 4552 +3 245 4552 246 +3 246 4552 4551 +3 246 4551 247 +3 247 4551 4559 +3 247 4559 248 +3 248 4559 4558 +3 248 4558 249 +3 249 4558 4557 +3 249 4557 250 +3 250 4557 4550 +3 250 4550 251 +3 251 4550 4549 +3 251 4549 252 +3 252 4549 4547 +3 252 4547 239 +3 239 4547 4546 +3 239 4546 240 +3 240 4546 4577 +3 240 4577 241 +3 241 4577 4576 +3 241 4576 242 +3 242 4576 4570 +3 242 4570 243 +3 243 4570 4569 +3 243 4569 263 +3 263 4569 4583 +3 263 4583 264 +3 264 4583 4582 +3 264 4582 265 +3 265 4582 4581 +3 265 4581 266 +3 266 4581 4575 +3 266 4575 267 +3 267 4575 4574 +3 267 4574 253 +3 253 4574 4572 +3 253 4572 254 +3 254 4572 4571 +3 254 4571 268 +3 268 4571 4580 +3 268 4580 269 +3 269 4580 4579 +3 269 4579 270 +3 270 4579 4578 +3 270 4578 255 +3 255 4578 4556 +3 255 4556 256 +3 256 4556 4555 +3 256 4555 258 +3 258 4555 4554 +3 258 4554 259 +3 259 4554 4568 +3 259 4568 260 +3 260 4568 4567 +3 260 4567 261 +3 261 4567 4566 +3 261 4566 262 +3 262 4566 4565 +3 262 4565 271 +3 271 4565 4564 +3 309 4538 310 +3 310 4538 4531 +3 310 4531 311 +3 311 4531 4533 +3 311 4533 276 +3 276 4533 4503 +3 276 4503 277 +3 277 4503 4502 +3 277 4502 279 +3 279 4502 4501 +3 279 4501 280 +3 280 4501 4500 +3 280 4500 281 +3 281 4500 4514 +3 281 4514 282 +3 282 4514 4513 +3 282 4513 287 +3 287 4513 4512 +3 287 4512 288 +3 288 4512 4499 +3 288 4499 289 +3 289 4499 4498 +3 289 4498 274 +3 274 4498 4497 +3 274 4497 275 +3 275 4497 4489 +3 275 4489 290 +3 290 4489 4488 +3 290 4488 291 +3 291 4488 4519 +3 291 4519 292 +3 292 4519 4518 +3 292 4518 293 +3 293 4518 4511 +3 293 4511 294 +3 294 4511 4510 +3 294 4510 295 +3 295 4510 4530 +3 295 4530 296 +3 296 4530 4529 +3 296 4529 297 +3 297 4529 4528 +3 297 4528 298 +3 298 4528 4517 +3 298 4517 299 +3 299 4517 4516 +3 299 4516 300 +3 300 4516 4515 +3 300 4515 301 +3 301 4515 4487 +3 301 4487 302 +3 302 4487 4486 +3 302 4486 306 +3 306 4486 4527 +3 306 4527 307 +3 307 4527 4526 +3 307 4526 308 +3 308 4526 4525 +3 308 4525 283 +3 283 4525 4496 +3 283 4496 284 +3 284 4496 4495 +3 284 4495 286 +3 286 4495 4494 +3 286 4494 303 +3 303 4494 4522 +3 303 4522 304 +3 304 4522 4524 +3 304 4524 305 +3 305 4524 4540 +3 305 4540 309 +3 309 4540 4538 +3 343 4509 344 +3 344 4509 4508 +3 344 4508 345 +3 345 4508 4507 +3 345 4507 346 +3 346 4507 4506 +3 346 4506 347 +3 347 4506 4505 +3 347 4505 348 +3 348 4505 4504 +3 348 4504 349 +3 349 4504 4493 +3 349 4493 328 +3 328 4493 4492 +3 328 4492 329 +3 329 4492 4491 +3 329 4491 330 +3 330 4491 4477 +3 330 4477 327 +3 327 4477 4476 +3 327 4476 331 +3 331 4476 4475 +3 331 4475 332 +3 332 4475 4521 +3 332 4521 333 +3 333 4521 4520 +3 333 4520 337 +3 337 4520 4535 +3 337 4535 338 +3 338 4535 4534 +3 338 4534 339 +3 339 4534 4532 +3 339 4532 340 +3 340 4532 4545 +3 340 4545 341 +3 341 4545 4544 +3 341 4544 342 +3 342 4544 4543 +3 342 4543 315 +3 315 4543 4539 +3 315 4539 316 +3 316 4539 4537 +3 316 4537 317 +3 317 4537 4536 +3 317 4536 318 +3 318 4536 4542 +3 318 4542 320 +3 320 4542 4541 +3 320 4541 321 +3 321 4541 4523 +3 321 4523 322 +3 322 4523 4473 +3 322 4473 319 +3 319 4473 4472 +3 319 4472 312 +3 312 4472 4480 +3 312 4480 313 +3 313 4480 4479 +3 313 4479 323 +3 323 4479 4478 +3 323 4478 324 +3 324 4478 4485 +3 324 4485 325 +3 325 4485 4484 +3 325 4484 334 +3 334 4484 4483 +3 334 4483 335 +3 335 4483 4482 +3 335 4482 336 +3 336 4482 4481 +3 336 4481 343 +3 343 4481 4509 +3 421 4464 422 +3 422 4464 4463 +3 422 4463 423 +3 423 4463 4462 +3 423 4462 418 +3 418 4462 4461 +3 418 4461 409 +3 409 4461 4460 +3 409 4460 411 +3 411 4460 4459 +3 411 4459 412 +3 412 4459 4455 +3 412 4455 413 +3 413 4455 4454 +3 413 4454 375 +3 375 4454 4453 +3 375 4453 376 +3 376 4453 4448 +3 376 4448 377 +3 377 4448 4449 +3 377 4449 400 +3 400 4449 4451 +3 400 4451 401 +3 401 4451 4452 +3 401 4452 402 +3 402 4452 4471 +3 402 4471 403 +3 403 4471 4470 +3 403 4470 404 +3 404 4470 4469 +3 404 4469 405 +3 405 4469 4468 +3 405 4468 406 +3 406 4468 4467 +3 406 4467 407 +3 407 4467 4466 +3 407 4466 408 +3 408 4466 4465 +3 408 4465 362 +3 362 4465 4458 +3 362 4458 363 +3 363 4458 4457 +3 363 4457 364 +3 364 4457 4456 +3 364 4456 365 +3 365 4456 4442 +3 365 4442 366 +3 366 4442 4441 +3 366 4441 357 +3 357 4441 4440 +3 357 4440 358 +3 358 4440 4434 +3 358 4434 367 +3 367 4434 4436 +3 367 4436 368 +3 368 4436 4437 +3 368 4437 359 +3 359 4437 4447 +3 359 4447 383 +3 383 4447 4446 +3 383 4446 381 +3 381 4446 4445 +3 381 4445 379 +3 379 4445 4444 +3 379 4444 414 +3 414 4444 4443 +3 414 4443 415 +3 415 4443 4439 +3 415 4439 416 +3 416 4439 4438 +3 416 4438 421 +3 421 4438 4464 +3 393 4426 394 +3 394 4426 4425 +3 394 4425 395 +3 395 4425 4424 +3 395 4424 396 +3 396 4424 4423 +3 396 4423 397 +3 397 4423 4422 +3 397 4422 398 +3 398 4422 4421 +3 398 4421 399 +3 399 4421 4417 +3 399 4417 378 +3 378 4417 4416 +3 378 4416 353 +3 353 4416 4415 +3 353 4415 354 +3 354 4415 4410 +3 354 4410 390 +3 390 4410 4411 +3 390 4411 391 +3 391 4411 4413 +3 391 4413 392 +3 392 4413 4414 +3 392 4414 373 +3 373 4414 4433 +3 373 4433 374 +3 374 4433 4432 +3 374 4432 410 +3 410 4432 4431 +3 410 4431 420 +3 420 4431 4430 +3 420 4430 419 +3 419 4430 4429 +3 419 4429 417 +3 417 4429 4428 +3 417 4428 380 +3 380 4428 4427 +3 380 4427 382 +3 382 4427 4420 +3 382 4420 384 +3 384 4420 4419 +3 384 4419 385 +3 385 4419 4418 +3 385 4418 386 +3 386 4418 4404 +3 386 4404 360 +3 360 4404 4403 +3 360 4403 361 +3 361 4403 4402 +3 361 4402 369 +3 369 4402 4396 +3 369 4396 356 +3 356 4396 4398 +3 356 4398 350 +3 350 4398 4401 +3 350 4401 351 +3 351 4401 4400 +3 351 4400 370 +3 370 4400 4399 +3 370 4399 371 +3 371 4399 4409 +3 371 4409 372 +3 372 4409 4408 +3 372 4408 387 +3 387 4408 4407 +3 387 4407 388 +3 388 4407 4406 +3 388 4406 389 +3 389 4406 4405 +3 389 4405 393 +3 393 4405 4426 +3 455 4388 456 +3 456 4388 4387 +3 456 4387 457 +3 457 4387 4386 +3 457 4386 458 +3 458 4386 4385 +3 458 4385 459 +3 459 4385 4384 +3 459 4384 460 +3 460 4384 4383 +3 460 4383 461 +3 461 4383 4379 +3 461 4379 443 +3 443 4379 4378 +3 443 4378 444 +3 444 4378 4377 +3 444 4377 445 +3 445 4377 4372 +3 445 4372 434 +3 434 4372 4373 +3 434 4373 440 +3 440 4373 4375 +3 440 4375 441 +3 441 4375 4376 +3 441 4376 442 +3 442 4376 4395 +3 442 4395 446 +3 446 4395 4394 +3 446 4394 447 +3 447 4394 4393 +3 447 4393 448 +3 448 4393 4392 +3 448 4392 449 +3 449 4392 4391 +3 449 4391 450 +3 450 4391 4390 +3 450 4390 451 +3 451 4390 4389 +3 451 4389 435 +3 435 4389 4382 +3 435 4382 436 +3 436 4382 4381 +3 436 4381 437 +3 437 4381 4380 +3 437 4380 438 +3 438 4380 4371 +3 438 4371 439 +3 439 4371 4370 +3 439 4370 424 +3 424 4370 4369 +3 424 4369 425 +3 425 4369 4360 +3 425 4360 426 +3 426 4360 4362 +3 426 4362 427 +3 427 4362 4363 +3 427 4363 428 +3 428 4363 4368 +3 428 4368 429 +3 429 4368 4367 +3 429 4367 431 +3 431 4367 4366 +3 431 4366 432 +3 432 4366 4365 +3 432 4365 452 +3 452 4365 4364 +3 452 4364 453 +3 453 4364 4359 +3 453 4359 454 +3 454 4359 4358 +3 454 4358 455 +3 455 4358 4388 +3 493 4323 494 +3 494 4323 4337 +3 494 4337 495 +3 495 4337 4338 +3 495 4338 473 +3 473 4338 4345 +3 473 4345 474 +3 474 4345 4344 +3 474 4344 496 +3 496 4344 4336 +3 496 4336 497 +3 497 4336 4335 +3 497 4335 484 +3 484 4335 4334 +3 484 4334 485 +3 485 4334 4333 +3 485 4333 486 +3 486 4333 4354 +3 486 4354 487 +3 487 4354 4353 +3 487 4353 488 +3 488 4353 4352 +3 488 4352 489 +3 489 4352 4351 +3 489 4351 498 +3 498 4351 4350 +3 498 4350 499 +3 499 4350 4349 +3 499 4349 476 +3 476 4349 4342 +3 476 4342 477 +3 477 4342 4341 +3 477 4341 490 +3 490 4341 4357 +3 490 4357 491 +3 491 4357 4356 +3 491 4356 492 +3 492 4356 4355 +3 492 4355 470 +3 470 4355 4348 +3 470 4348 471 +3 471 4348 4347 +3 471 4347 472 +3 472 4347 4346 +3 472 4346 462 +3 462 4346 4332 +3 462 4332 463 +3 463 4332 4331 +3 463 4331 464 +3 464 4331 4330 +3 464 4330 465 +3 465 4330 4320 +3 465 4320 466 +3 466 4320 4322 +3 466 4322 468 +3 468 4322 4329 +3 468 4329 469 +3 469 4329 4328 +3 469 4328 478 +3 478 4328 4327 +3 478 4327 479 +3 479 4327 4340 +3 479 4340 480 +3 480 4340 4339 +3 480 4339 481 +3 481 4339 4326 +3 481 4326 482 +3 482 4326 4325 +3 482 4325 483 +3 483 4325 4324 +3 483 4324 493 +3 493 4324 4323 +3 530 4288 531 +3 531 4288 4300 +3 531 4300 532 +3 532 4300 4299 +3 532 4299 525 +3 525 4299 4298 +3 525 4298 526 +3 526 4298 4282 +3 526 4282 527 +3 527 4282 4284 +3 527 4284 528 +3 528 4284 4285 +3 528 4285 529 +3 529 4285 4310 +3 529 4310 533 +3 533 4310 4309 +3 533 4309 534 +3 534 4309 4307 +3 534 4307 535 +3 535 4307 4306 +3 535 4306 503 +3 503 4306 4281 +3 503 4281 504 +3 504 4281 4279 +3 504 4279 512 +3 512 4279 4278 +3 512 4278 513 +3 513 4278 4297 +3 513 4297 505 +3 505 4297 4296 +3 505 4296 506 +3 506 4296 4295 +3 506 4295 509 +3 509 4295 4319 +3 509 4319 508 +3 508 4319 4318 +3 508 4318 507 +3 507 4318 4317 +3 507 4317 514 +3 514 4317 4305 +3 514 4305 515 +3 515 4305 4304 +3 515 4304 510 +3 510 4304 4302 +3 510 4302 511 +3 511 4302 4301 +3 511 4301 516 +3 516 4301 4316 +3 516 4316 517 +3 517 4316 4315 +3 517 4315 518 +3 518 4315 4314 +3 518 4314 522 +3 522 4314 4313 +3 522 4313 523 +3 523 4313 4312 +3 523 4312 524 +3 524 4312 4311 +3 524 4311 500 +3 500 4311 4294 +3 500 4294 501 +3 501 4294 4293 +3 501 4293 502 +3 502 4293 4292 +3 502 4292 519 +3 519 4292 4291 +3 519 4291 520 +3 520 4291 4290 +3 520 4290 521 +3 521 4290 4289 +3 521 4289 530 +3 530 4289 4288 +3 3561 7832 3562 +3 3562 7832 7854 +3 3562 7854 3563 +3 3563 7854 7853 +3 3563 7853 3564 +3 3564 7853 7846 +3 3564 7846 3565 +3 3565 7846 7845 +3 3565 7845 3551 +3 3551 7845 7844 +3 3551 7844 3552 +3 3552 7844 7831 +3 3552 7831 3553 +3 3553 7831 7830 +3 3553 7830 3554 +3 3554 7830 7863 +3 3554 7863 3555 +3 3555 7863 7862 +3 3555 7862 3556 +3 3556 7862 7861 +3 3556 7861 3545 +3 3545 7861 7860 +3 3545 7860 3546 +3 3546 7860 7859 +3 3546 7859 3547 +3 3547 7859 7858 +3 3547 7858 3538 +3 3538 7858 7852 +3 3538 7852 3539 +3 3539 7852 7851 +3 3539 7851 3540 +3 3540 7851 7850 +3 3540 7850 3541 +3 3541 7850 7849 +3 3541 7849 3548 +3 3548 7849 7857 +3 3548 7857 3549 +3 3549 7857 7856 +3 3549 7856 3550 +3 3550 7856 7855 +3 3550 7855 3529 +3 3529 7855 7837 +3 3529 7837 3530 +3 3530 7837 7836 +3 3530 7836 3531 +3 3531 7836 7835 +3 3531 7835 3532 +3 3532 7835 7829 +3 3532 7829 3533 +3 3533 7829 7828 +3 3533 7828 3534 +3 3534 7828 7843 +3 3534 7843 3535 +3 3535 7843 7842 +3 3535 7842 3537 +3 3537 7842 7841 +3 3537 7841 3542 +3 3542 7841 7840 +3 3542 7840 3543 +3 3543 7840 7839 +3 3543 7839 3544 +3 3544 7839 7838 +3 3544 7838 3557 +3 3557 7838 7848 +3 3557 7848 3558 +3 3558 7848 7847 +3 3558 7847 3559 +3 3559 7847 7834 +3 3559 7834 3560 +3 3560 7834 7833 +3 3560 7833 3561 +3 3561 7833 7832 +3 3600 7796 3587 +3 3587 7796 7818 +3 3587 7818 3588 +3 3588 7818 7817 +3 3588 7817 3601 +3 3601 7817 7810 +3 3601 7810 3602 +3 3602 7810 7809 +3 3602 7809 3589 +3 3589 7809 7808 +3 3589 7808 3590 +3 3590 7808 7795 +3 3590 7795 3591 +3 3591 7795 7794 +3 3591 7794 3592 +3 3592 7794 7827 +3 3592 7827 3593 +3 3593 7827 7826 +3 3593 7826 3594 +3 3594 7826 7825 +3 3594 7825 3581 +3 3581 7825 7824 +3 3581 7824 3582 +3 3582 7824 7823 +3 3582 7823 3583 +3 3583 7823 7822 +3 3583 7822 3577 +3 3577 7822 7816 +3 3577 7816 3578 +3 3578 7816 7815 +3 3578 7815 3579 +3 3579 7815 7814 +3 3579 7814 3580 +3 3580 7814 7813 +3 3580 7813 3584 +3 3584 7813 7821 +3 3584 7821 3585 +3 3585 7821 7820 +3 3585 7820 3586 +3 3586 7820 7819 +3 3586 7819 3566 +3 3566 7819 7801 +3 3566 7801 3567 +3 3567 7801 7800 +3 3567 7800 3568 +3 3568 7800 7799 +3 3568 7799 3569 +3 3569 7799 7792 +3 3569 7792 3570 +3 3570 7792 7791 +3 3570 7791 3571 +3 3571 7791 7807 +3 3571 7807 3572 +3 3572 7807 7806 +3 3572 7806 3574 +3 3574 7806 7805 +3 3574 7805 3575 +3 3575 7805 7804 +3 3575 7804 3576 +3 3576 7804 7803 +3 3576 7803 3595 +3 3595 7803 7802 +3 3595 7802 3596 +3 3596 7802 7812 +3 3596 7812 3597 +3 3597 7812 7811 +3 3597 7811 3598 +3 3598 7811 7798 +3 3598 7798 3599 +3 3599 7798 7797 +3 3599 7797 3600 +3 3600 7797 7796 +3 3629 7767 3613 +3 3613 7767 7769 +3 3613 7769 3614 +3 3614 7769 7771 +3 3614 7771 3630 +3 3630 7771 7772 +3 3630 7772 3631 +3 3631 7772 7754 +3 3631 7754 3623 +3 3623 7754 7753 +3 3623 7753 3624 +3 3624 7753 7752 +3 3624 7752 3625 +3 3625 7752 7751 +3 3625 7751 3626 +3 3626 7751 7765 +3 3626 7765 3635 +3 3635 7765 7764 +3 3635 7764 3636 +3 3636 7764 7763 +3 3636 7763 3637 +3 3637 7763 7729 +3 3637 7729 3615 +3 3615 7729 7728 +3 3615 7728 3616 +3 3616 7728 7727 +3 3616 7727 3632 +3 3632 7727 7726 +3 3632 7726 3633 +3 3633 7726 7750 +3 3633 7750 3634 +3 3634 7750 7749 +3 3634 7749 3638 +3 3638 7749 7748 +3 3638 7748 3639 +3 3639 7748 7759 +3 3639 7759 3603 +3 3603 7759 7758 +3 3603 7758 3607 +3 3607 7758 7757 +3 3607 7757 3608 +3 3608 7757 7747 +3 3608 7747 3609 +3 3609 7747 7746 +3 3609 7746 3610 +3 3610 7746 7745 +3 3610 7745 3611 +3 3611 7745 7744 +3 3611 7744 3612 +3 3612 7744 7743 +3 3612 7743 3617 +3 3617 7743 7742 +3 3617 7742 3618 +3 3618 7742 7725 +3 3618 7725 3619 +3 3619 7725 7724 +3 3619 7724 3605 +3 3605 7724 7741 +3 3605 7741 3606 +3 3606 7741 7740 +3 3606 7740 3620 +3 3620 7740 7739 +3 3620 7739 3621 +3 3621 7739 7738 +3 3621 7738 3622 +3 3622 7738 7737 +3 3622 7737 3627 +3 3627 7737 7736 +3 3627 7736 3628 +3 3628 7736 7768 +3 3628 7768 3629 +3 3629 7768 7767 +3 3664 7720 3654 +3 3654 7720 7790 +3 3654 7790 3655 +3 3655 7790 7789 +3 3655 7789 3665 +3 3665 7789 7788 +3 3665 7788 3666 +3 3666 7788 7787 +3 3666 7787 3656 +3 3656 7787 7786 +3 3656 7786 3657 +3 3657 7786 7785 +3 3657 7785 3658 +3 3658 7785 7784 +3 3658 7784 3659 +3 3659 7784 7783 +3 3659 7783 3672 +3 3672 7783 7782 +3 3672 7782 3673 +3 3673 7782 7781 +3 3673 7781 3674 +3 3674 7781 7780 +3 3674 7780 3647 +3 3647 7780 7779 +3 3647 7779 3648 +3 3648 7779 7762 +3 3648 7762 3667 +3 3667 7762 7761 +3 3667 7761 3668 +3 3668 7761 7760 +3 3668 7760 3669 +3 3669 7760 7770 +3 3669 7770 3675 +3 3675 7770 7778 +3 3675 7778 3676 +3 3676 7778 7777 +3 3676 7777 3640 +3 3640 7777 7776 +3 3640 7776 3641 +3 3641 7776 7775 +3 3641 7775 3645 +3 3645 7775 7774 +3 3645 7774 3646 +3 3646 7774 7773 +3 3646 7773 3644 +3 3644 7773 7766 +3 3644 7766 3643 +3 3643 7766 7723 +3 3643 7723 3642 +3 3642 7723 7722 +3 3642 7722 3649 +3 3649 7722 7719 +3 3649 7719 3650 +3 3650 7719 7718 +3 3650 7718 3652 +3 3652 7718 7756 +3 3652 7756 3653 +3 3653 7756 7755 +3 3653 7755 3662 +3 3662 7755 7735 +3 3662 7735 3663 +3 3663 7735 7734 +3 3663 7734 3660 +3 3660 7734 7733 +3 3660 7733 3661 +3 3661 7733 7732 +3 3661 7732 3670 +3 3670 7732 7731 +3 3670 7731 3671 +3 3671 7731 7730 +3 3671 7730 3664 +3 3664 7730 7720 +3 3716 7684 3745 +3 3745 7684 7701 +3 3745 7701 3746 +3 3746 7701 7700 +3 3746 7700 3747 +3 3747 7700 7697 +3 3747 7697 3689 +3 3689 7697 7696 +3 3689 7696 3690 +3 3690 7696 7695 +3 3690 7695 3699 +3 3699 7695 7707 +3 3699 7707 3700 +3 3700 7707 7706 +3 3700 7706 3726 +3 3726 7706 7705 +3 3726 7705 3727 +3 3727 7705 7717 +3 3727 7717 3728 +3 3728 7717 7716 +3 3728 7716 3739 +3 3739 7716 7715 +3 3739 7715 3740 +3 3740 7715 7714 +3 3740 7714 3741 +3 3741 7714 7713 +3 3741 7713 3742 +3 3742 7713 7712 +3 3742 7712 3743 +3 3743 7712 7711 +3 3743 7711 3744 +3 3744 7711 7710 +3 3744 7710 3748 +3 3748 7710 7709 +3 3748 7709 3749 +3 3749 7709 7708 +3 3749 7708 3682 +3 3682 7708 7704 +3 3682 7704 3683 +3 3683 7704 7703 +3 3683 7703 3692 +3 3692 7703 7702 +3 3692 7702 3693 +3 3693 7702 7694 +3 3693 7694 3687 +3 3687 7694 7693 +3 3687 7693 3688 +3 3688 7693 7699 +3 3688 7699 3694 +3 3694 7699 7698 +3 3694 7698 3695 +3 3695 7698 7688 +3 3695 7688 3696 +3 3696 7688 7690 +3 3696 7690 3704 +3 3704 7690 7692 +3 3704 7692 3705 +3 3705 7692 7691 +3 3705 7691 3706 +3 3706 7691 7687 +3 3706 7687 3686 +3 3686 7687 7686 +3 3686 7686 3679 +3 3679 7686 7685 +3 3679 7685 3677 +3 3677 7685 7683 +3 3677 7683 3714 +3 3714 7683 7682 +3 3714 7682 3715 +3 3715 7682 7681 +3 3715 7681 3716 +3 3716 7681 7684 +3 3735 7644 3712 +3 3712 7644 7680 +3 3712 7680 3713 +3 3713 7680 7679 +3 3713 7679 3731 +3 3731 7679 7675 +3 3731 7675 3732 +3 3732 7675 7674 +3 3732 7674 3697 +3 3697 7674 7673 +3 3697 7673 3698 +3 3698 7673 7670 +3 3698 7670 3723 +3 3723 7670 7671 +3 3723 7671 3724 +3 3724 7671 7672 +3 3724 7672 3725 +3 3725 7672 7678 +3 3725 7678 3736 +3 3736 7678 7677 +3 3736 7677 3737 +3 3737 7677 7676 +3 3737 7676 3738 +3 3738 7676 7649 +3 3738 7649 3691 +3 3691 7649 7648 +3 3691 7648 3678 +3 3678 7648 7647 +3 3678 7647 3680 +3 3680 7647 7665 +3 3680 7665 3681 +3 3681 7665 7664 +3 3681 7664 3684 +3 3684 7664 7646 +3 3684 7646 3685 +3 3685 7646 7645 +3 3685 7645 3717 +3 3717 7645 7663 +3 3717 7663 3718 +3 3718 7663 7669 +3 3718 7669 3719 +3 3719 7669 7668 +3 3719 7668 3720 +3 3720 7668 7654 +3 3720 7654 3701 +3 3701 7654 7653 +3 3701 7653 3702 +3 3702 7653 7662 +3 3702 7662 3703 +3 3703 7662 7661 +3 3703 7661 3707 +3 3707 7661 7650 +3 3707 7650 3708 +3 3708 7650 7652 +3 3708 7652 3710 +3 3710 7652 7667 +3 3710 7667 3711 +3 3711 7667 7666 +3 3711 7666 3729 +3 3729 7666 7660 +3 3729 7660 3730 +3 3730 7660 7659 +3 3730 7659 3721 +3 3721 7659 7658 +3 3721 7658 3722 +3 3722 7658 7657 +3 3722 7657 3733 +3 3733 7657 7656 +3 3733 7656 3734 +3 3734 7656 7655 +3 3734 7655 3735 +3 3735 7655 7644 +3 3769 7611 3770 +3 3770 7611 7625 +3 3770 7625 3771 +3 3771 7625 7624 +3 3771 7624 3772 +3 3772 7624 7621 +3 3772 7621 3773 +3 3773 7621 7620 +3 3773 7620 3757 +3 3757 7620 7619 +3 3757 7619 3758 +3 3758 7619 7633 +3 3758 7633 3759 +3 3759 7633 7632 +3 3759 7632 3776 +3 3776 7632 7631 +3 3776 7631 3777 +3 3777 7631 7643 +3 3777 7643 3778 +3 3778 7643 7642 +3 3778 7642 3779 +3 3779 7642 7641 +3 3779 7641 3780 +3 3780 7641 7640 +3 3780 7640 3781 +3 3781 7640 7639 +3 3781 7639 3782 +3 3782 7639 7638 +3 3782 7638 3783 +3 3783 7638 7637 +3 3783 7637 3784 +3 3784 7637 7636 +3 3784 7636 3785 +3 3785 7636 7635 +3 3785 7635 3786 +3 3786 7635 7634 +3 3786 7634 3750 +3 3750 7634 7630 +3 3750 7630 3762 +3 3762 7630 7629 +3 3762 7629 3763 +3 3763 7629 7628 +3 3763 7628 3764 +3 3764 7628 7623 +3 3764 7623 3765 +3 3765 7623 7622 +3 3765 7622 3766 +3 3766 7622 7627 +3 3766 7627 3767 +3 3767 7627 7626 +3 3767 7626 3774 +3 3774 7626 7615 +3 3774 7615 3775 +3 3775 7615 7617 +3 3775 7617 3760 +3 3760 7617 7618 +3 3760 7618 3761 +3 3761 7618 7614 +3 3761 7614 3751 +3 3751 7614 7613 +3 3751 7613 3752 +3 3752 7613 7612 +3 3752 7612 3754 +3 3754 7612 7610 +3 3754 7610 3755 +3 3755 7610 7609 +3 3755 7609 3756 +3 3756 7609 7608 +3 3756 7608 3768 +3 3768 7608 7607 +3 3768 7607 3769 +3 3769 7607 7611 +3 3807 7581 3808 +3 3808 7581 7580 +3 3808 7580 3809 +3 3809 7580 7577 +3 3809 7577 3810 +3 3810 7577 7576 +3 3810 7576 3811 +3 3811 7576 7579 +3 3811 7579 3802 +3 3802 7579 7578 +3 3802 7578 3801 +3 3801 7578 7573 +3 3801 7573 3800 +3 3800 7573 7574 +3 3800 7574 3812 +3 3812 7574 7575 +3 3812 7575 3813 +3 3813 7575 7598 +3 3813 7598 3814 +3 3814 7598 7597 +3 3814 7597 3793 +3 3793 7597 7596 +3 3793 7596 3794 +3 3794 7596 7595 +3 3794 7595 3795 +3 3795 7595 7594 +3 3795 7594 3796 +3 3796 7594 7593 +3 3796 7593 3790 +3 3790 7593 7587 +3 3790 7587 3791 +3 3791 7587 7586 +3 3791 7586 3792 +3 3792 7586 7606 +3 3792 7606 3815 +3 3815 7606 7605 +3 3815 7605 3816 +3 3816 7605 7604 +3 3816 7604 3817 +3 3817 7604 7603 +3 3817 7603 3797 +3 3797 7603 7602 +3 3797 7602 3798 +3 3798 7602 7592 +3 3798 7592 3803 +3 3803 7592 7591 +3 3803 7591 3804 +3 3804 7591 7589 +3 3804 7589 3805 +3 3805 7589 7588 +3 3805 7588 3821 +3 3821 7588 7601 +3 3821 7601 3822 +3 3822 7601 7600 +3 3822 7600 3823 +3 3823 7600 7599 +3 3823 7599 3818 +3 3818 7599 7585 +3 3818 7585 3819 +3 3819 7585 7584 +3 3819 7584 3820 +3 3820 7584 7583 +3 3820 7583 3799 +3 3799 7583 7572 +3 3799 7572 3787 +3 3787 7572 7571 +3 3787 7571 3788 +3 3788 7571 7570 +3 3788 7570 3806 +3 3806 7570 7582 +3 3806 7582 3807 +3 3807 7582 7581 +3 3851 4164 3827 +3 3827 4164 4163 +3 3827 4163 3828 +3 3828 4163 4155 +3 3828 4155 3839 +3 3839 4155 4154 +3 3839 4154 3840 +3 3840 4154 4159 +3 3840 4159 3826 +3 3826 4159 4158 +3 3826 4158 3825 +3 3825 4158 4153 +3 3825 4153 3824 +3 3824 4153 4152 +3 3824 4152 3852 +3 3852 4152 4182 +3 3852 4182 3853 +3 3853 4182 4181 +3 3853 4181 3854 +3 3854 4181 4180 +3 3854 4180 3829 +3 3829 4180 4161 +3 3829 4161 3830 +3 3830 4161 4160 +3 3830 4160 3831 +3 3831 4160 4179 +3 3831 4179 3832 +3 3832 4179 4178 +3 3832 4178 3833 +3 3833 4178 4168 +3 3833 4168 3834 +3 3834 4168 4167 +3 3834 4167 3835 +3 3835 4167 4166 +3 3835 4166 3836 +3 3836 4166 4187 +3 3836 4187 3837 +3 3837 4187 4186 +3 3837 4186 3838 +3 3838 4186 4185 +3 3838 4185 3841 +3 3841 4185 4177 +3 3841 4177 3842 +3 3842 4177 4176 +3 3842 4176 3843 +3 3843 4176 4184 +3 3843 4184 3855 +3 3855 4184 4183 +3 3855 4183 3856 +3 3856 4183 4174 +3 3856 4174 3857 +3 3857 4174 4173 +3 3857 4173 3858 +3 3858 4173 4190 +3 3858 4190 3859 +3 3859 4190 4189 +3 3859 4189 3860 +3 3860 4189 4188 +3 3860 4188 3844 +3 3844 4188 4169 +3 3844 4169 3845 +3 3845 4169 4171 +3 3845 4171 3847 +3 3847 4171 4172 +3 3847 4172 3848 +3 3848 4172 4157 +3 3848 4157 3849 +3 3849 4157 4156 +3 3849 4156 3850 +3 3850 4156 4165 +3 3850 4165 3851 +3 3851 4165 4164 +3 3170 7491 3158 +3 3158 7491 7526 +3 3158 7526 3159 +3 3159 7526 7525 +3 3159 7525 3160 +3 3160 7525 7518 +3 3160 7518 3161 +3 3161 7518 7517 +3 3161 7517 3162 +3 3162 7517 7516 +3 3162 7516 3163 +3 3163 7516 7513 +3 3163 7513 3164 +3 3164 7513 7512 +3 3164 7512 3185 +3 3185 7512 7524 +3 3185 7524 3186 +3 3186 7524 7523 +3 3186 7523 3187 +3 3187 7523 7522 +3 3187 7522 3188 +3 3188 7522 7521 +3 3188 7521 3189 +3 3189 7521 7520 +3 3189 7520 3190 +3 3190 7520 7519 +3 3190 7519 3171 +3 3171 7519 7505 +3 3171 7505 3172 +3 3172 7505 7504 +3 3172 7504 3173 +3 3173 7504 7503 +3 3173 7503 3174 +3 3174 7503 7515 +3 3174 7515 3175 +3 3175 7515 7514 +3 3175 7514 3154 +3 3154 7514 7511 +3 3154 7511 3165 +3 3165 7511 7510 +3 3165 7510 3166 +3 3166 7510 7509 +3 3166 7509 3167 +3 3167 7509 7508 +3 3167 7508 3176 +3 3176 7508 7507 +3 3176 7507 3177 +3 3177 7507 7506 +3 3177 7506 3178 +3 3178 7506 7502 +3 3178 7502 3179 +3 3179 7502 7501 +3 3179 7501 3180 +3 3180 7501 7500 +3 3180 7500 3181 +3 3181 7500 7499 +3 3181 7499 3182 +3 3182 7499 7498 +3 3182 7498 3183 +3 3183 7498 7497 +3 3183 7497 3184 +3 3184 7497 7496 +3 3184 7496 3156 +3 3156 7496 7495 +3 3156 7495 3157 +3 3157 7495 7494 +3 3157 7494 3168 +3 3168 7494 7493 +3 3168 7493 3169 +3 3169 7493 7492 +3 3169 7492 3170 +3 3170 7492 7491 +3 3206 7454 3207 +3 3207 7454 7490 +3 3207 7490 3192 +3 3192 7490 7489 +3 3192 7489 3193 +3 3193 7489 7482 +3 3193 7482 3194 +3 3194 7482 7481 +3 3194 7481 3195 +3 3195 7481 7480 +3 3195 7480 3196 +3 3196 7480 7477 +3 3196 7477 3197 +3 3197 7477 7476 +3 3197 7476 3222 +3 3222 7476 7488 +3 3222 7488 3223 +3 3223 7488 7487 +3 3223 7487 3224 +3 3224 7487 7486 +3 3224 7486 3225 +3 3225 7486 7485 +3 3225 7485 3226 +3 3226 7485 7484 +3 3226 7484 3227 +3 3227 7484 7483 +3 3227 7483 3208 +3 3208 7483 7469 +3 3208 7469 3209 +3 3209 7469 7468 +3 3209 7468 3210 +3 3210 7468 7467 +3 3210 7467 3211 +3 3211 7467 7479 +3 3211 7479 3212 +3 3212 7479 7478 +3 3212 7478 3191 +3 3191 7478 7475 +3 3191 7475 3198 +3 3198 7475 7474 +3 3198 7474 3199 +3 3199 7474 7473 +3 3199 7473 3200 +3 3200 7473 7472 +3 3200 7472 3213 +3 3213 7472 7471 +3 3213 7471 3214 +3 3214 7471 7470 +3 3214 7470 3215 +3 3215 7470 7466 +3 3215 7466 3216 +3 3216 7466 7465 +3 3216 7465 3217 +3 3217 7465 7463 +3 3217 7463 3218 +3 3218 7463 7462 +3 3218 7462 3219 +3 3219 7462 7461 +3 3219 7461 3220 +3 3220 7461 7460 +3 3220 7460 3221 +3 3221 7460 7459 +3 3221 7459 3201 +3 3201 7459 7458 +3 3201 7458 3202 +3 3202 7458 7457 +3 3202 7457 3204 +3 3204 7457 7456 +3 3204 7456 3205 +3 3205 7456 7455 +3 3205 7455 3206 +3 3206 7455 7454 +3 3264 7392 3229 +3 3229 7392 7394 +3 3229 7394 3228 +3 3228 7394 7450 +3 3228 7450 3231 +3 3231 7450 7429 +3 3231 7429 3232 +3 3232 7429 7428 +3 3232 7428 3233 +3 3233 7428 7445 +3 3233 7445 3248 +3 3248 7445 7444 +3 3248 7444 3249 +3 3249 7444 7440 +3 3249 7440 3250 +3 3250 7440 7439 +3 3250 7439 3251 +3 3251 7439 7438 +3 3251 7438 3252 +3 3252 7438 7437 +3 3252 7437 3253 +3 3253 7437 7436 +3 3253 7436 3254 +3 3254 7436 7435 +3 3254 7435 3261 +3 3261 7435 7434 +3 3261 7434 3262 +3 3262 7434 7410 +3 3262 7410 3234 +3 3234 7410 7409 +3 3234 7409 3235 +3 3235 7409 7408 +3 3235 7408 3240 +3 3240 7408 7383 +3 3240 7383 3241 +3 3241 7383 7382 +3 3241 7382 3242 +3 3242 7382 7427 +3 3242 7427 3236 +3 3236 7427 7426 +3 3236 7426 3237 +3 3237 7426 7407 +3 3237 7407 3238 +3 3238 7407 7406 +3 3238 7406 3239 +3 3239 7406 7433 +3 3239 7433 3243 +3 3243 7433 7432 +3 3243 7432 3244 +3 3244 7432 7425 +3 3244 7425 3245 +3 3245 7425 7424 +3 3245 7424 3246 +3 3246 7424 7423 +3 3246 7423 3247 +3 3247 7423 7422 +3 3247 7422 3255 +3 3255 7422 7421 +3 3255 7421 3256 +3 3256 7421 7415 +3 3256 7415 3257 +3 3257 7415 7414 +3 3257 7414 3258 +3 3258 7414 7420 +3 3258 7420 3259 +3 3259 7420 7419 +3 3259 7419 3260 +3 3260 7419 7418 +3 3260 7418 3263 +3 3263 7418 7384 +3 3263 7384 3264 +3 3264 7384 7392 +3 3300 7381 3301 +3 3301 7381 7431 +3 3301 7431 3268 +3 3268 7431 7430 +3 3268 7430 3269 +3 3269 7430 7417 +3 3269 7417 3270 +3 3270 7417 7416 +3 3270 7416 3271 +3 3271 7416 7447 +3 3271 7447 3284 +3 3284 7447 7446 +3 3284 7446 3285 +3 3285 7446 7443 +3 3285 7443 3286 +3 3286 7443 7442 +3 3286 7442 3287 +3 3287 7442 7441 +3 3287 7441 3288 +3 3288 7441 7453 +3 3288 7453 3289 +3 3289 7453 7452 +3 3289 7452 3290 +3 3290 7452 7451 +3 3290 7451 3297 +3 3297 7451 7449 +3 3297 7449 3298 +3 3298 7449 7448 +3 3298 7448 3272 +3 3272 7448 7413 +3 3272 7413 3273 +3 3273 7413 7412 +3 3273 7412 3274 +3 3274 7412 7411 +3 3274 7411 3275 +3 3275 7411 7393 +3 3275 7393 3276 +3 3276 7393 7391 +3 3276 7391 3265 +3 3265 7391 7390 +3 3265 7390 3266 +3 3266 7390 7389 +3 3266 7389 3267 +3 3267 7389 7388 +3 3267 7388 3277 +3 3277 7388 7387 +3 3277 7387 3278 +3 3278 7387 7386 +3 3278 7386 3279 +3 3279 7386 7385 +3 3279 7385 3280 +3 3280 7385 7401 +3 3280 7401 3281 +3 3281 7401 7403 +3 3281 7403 3283 +3 3283 7403 7405 +3 3283 7405 3291 +3 3291 7405 7404 +3 3291 7404 3292 +3 3292 7404 7400 +3 3292 7400 3293 +3 3293 7400 7399 +3 3293 7399 3294 +3 3294 7399 7398 +3 3294 7398 3295 +3 3295 7398 7397 +3 3295 7397 3296 +3 3296 7397 7396 +3 3296 7396 3299 +3 3299 7396 7395 +3 3299 7395 3300 +3 3300 7395 7381 +3 3323 7344 3337 +3 3337 7344 7371 +3 3337 7371 3338 +3 3338 7371 7370 +3 3338 7370 3365 +3 3365 7370 7360 +3 3365 7360 3356 +3 3356 7360 7359 +3 3356 7359 3357 +3 3357 7359 7358 +3 3357 7358 3358 +3 3358 7358 7369 +3 3358 7369 3359 +3 3359 7369 7368 +3 3359 7368 3360 +3 3360 7368 7367 +3 3360 7367 3361 +3 3361 7367 7380 +3 3361 7380 3362 +3 3362 7380 7379 +3 3362 7379 3366 +3 3366 7379 7378 +3 3366 7378 3367 +3 3367 7378 7377 +3 3367 7377 3368 +3 3368 7377 7376 +3 3368 7376 3369 +3 3369 7376 7375 +3 3369 7375 3370 +3 3370 7375 7374 +3 3370 7374 3371 +3 3371 7374 7373 +3 3371 7373 3372 +3 3372 7373 7372 +3 3372 7372 3373 +3 3373 7372 7357 +3 3373 7357 3374 +3 3374 7357 7356 +3 3374 7356 3302 +3 3302 7356 7355 +3 3302 7355 3303 +3 3303 7355 7354 +3 3303 7354 3304 +3 3304 7354 7353 +3 3304 7353 3305 +3 3305 7353 7352 +3 3305 7352 3320 +3 3320 7352 7347 +3 3320 7347 3321 +3 3321 7347 7346 +3 3321 7346 3306 +3 3306 7346 7366 +3 3306 7366 3307 +3 3307 7366 7365 +3 3307 7365 3350 +3 3350 7365 7364 +3 3350 7364 3351 +3 3351 7364 7363 +3 3351 7363 3331 +3 3331 7363 7362 +3 3331 7362 3329 +3 3329 7362 7361 +3 3329 7361 3327 +3 3327 7361 7351 +3 3327 7351 3317 +3 3317 7351 7350 +3 3317 7350 3315 +3 3315 7350 7349 +3 3315 7349 3322 +3 3322 7349 7345 +3 3322 7345 3323 +3 3323 7345 7344 +3 3313 7307 3311 +3 3311 7307 7340 +3 3311 7340 3310 +3 3310 7340 7339 +3 3310 7339 3348 +3 3348 7339 7335 +3 3348 7335 3349 +3 3349 7335 7334 +3 3349 7334 3344 +3 3344 7334 7333 +3 3344 7333 3345 +3 3345 7333 7338 +3 3345 7338 3353 +3 3353 7338 7337 +3 3353 7337 3354 +3 3354 7337 7336 +3 3354 7336 3355 +3 3355 7336 7343 +3 3355 7343 3363 +3 3363 7343 7342 +3 3363 7342 3364 +3 3364 7342 7341 +3 3364 7341 3339 +3 3339 7341 7326 +3 3339 7326 3324 +3 3324 7326 7325 +3 3324 7325 3316 +3 3316 7325 7324 +3 3316 7324 3318 +3 3318 7324 7323 +3 3318 7323 3319 +3 3319 7323 7322 +3 3319 7322 3325 +3 3325 7322 7321 +3 3325 7321 3326 +3 3326 7321 7320 +3 3326 7320 3328 +3 3328 7320 7319 +3 3328 7319 3330 +3 3330 7319 7318 +3 3330 7318 3352 +3 3352 7318 7317 +3 3352 7317 3340 +3 3340 7317 7316 +3 3340 7316 3341 +3 3341 7316 7315 +3 3341 7315 3346 +3 3346 7315 7310 +3 3346 7310 3347 +3 3347 7310 7309 +3 3347 7309 3308 +3 3308 7309 7332 +3 3308 7332 3309 +3 3309 7332 7331 +3 3309 7331 3332 +3 3332 7331 7330 +3 3332 7330 3333 +3 3333 7330 7329 +3 3333 7329 3342 +3 3342 7329 7328 +3 3342 7328 3343 +3 3343 7328 7327 +3 3343 7327 3334 +3 3334 7327 7314 +3 3334 7314 3335 +3 3335 7314 7313 +3 3335 7313 3336 +3 3336 7313 7312 +3 3336 7312 3314 +3 3314 7312 7308 +3 3314 7308 3313 +3 3313 7308 7307 +3 3380 7270 3393 +3 3393 7270 7297 +3 3393 7297 3394 +3 3394 7297 7296 +3 3394 7296 3395 +3 3395 7296 7286 +3 3395 7286 3396 +3 3396 7286 7285 +3 3396 7285 3397 +3 3397 7285 7284 +3 3397 7284 3398 +3 3398 7284 7295 +3 3398 7295 3399 +3 3399 7295 7294 +3 3399 7294 3400 +3 3400 7294 7293 +3 3400 7293 3401 +3 3401 7293 7306 +3 3401 7306 3402 +3 3402 7306 7305 +3 3402 7305 3403 +3 3403 7305 7304 +3 3403 7304 3404 +3 3404 7304 7303 +3 3404 7303 3405 +3 3405 7303 7302 +3 3405 7302 3406 +3 3406 7302 7301 +3 3406 7301 3407 +3 3407 7301 7300 +3 3407 7300 3408 +3 3408 7300 7299 +3 3408 7299 3409 +3 3409 7299 7298 +3 3409 7298 3410 +3 3410 7298 7283 +3 3410 7283 3411 +3 3411 7283 7282 +3 3411 7282 3381 +3 3381 7282 7281 +3 3381 7281 3382 +3 3382 7281 7280 +3 3382 7280 3383 +3 3383 7280 7279 +3 3383 7279 3384 +3 3384 7279 7278 +3 3384 7278 3385 +3 3385 7278 7273 +3 3385 7273 3386 +3 3386 7273 7272 +3 3386 7272 3387 +3 3387 7272 7292 +3 3387 7292 3390 +3 3390 7292 7291 +3 3390 7291 3389 +3 3389 7291 7290 +3 3389 7290 3388 +3 3388 7290 7289 +3 3388 7289 3391 +3 3391 7289 7288 +3 3391 7288 3392 +3 3392 7288 7287 +3 3392 7287 3375 +3 3375 7287 7277 +3 3375 7277 3376 +3 3376 7277 7276 +3 3376 7276 3378 +3 3378 7276 7275 +3 3378 7275 3379 +3 3379 7275 7271 +3 3379 7271 3380 +3 3380 7271 7270 +3 3429 7242 3430 +3 3430 7242 7241 +3 3430 7241 3431 +3 3431 7241 7240 +3 3431 7240 3423 +3 3423 7240 7239 +3 3423 7239 3424 +3 3424 7239 7251 +3 3424 7251 3425 +3 3425 7251 7250 +3 3425 7250 3443 +3 3443 7250 7249 +3 3443 7249 3444 +3 3444 7249 7266 +3 3444 7266 3445 +3 3445 7266 7265 +3 3445 7265 3446 +3 3446 7265 7259 +3 3446 7259 3447 +3 3447 7259 7258 +3 3447 7258 3448 +3 3448 7258 7257 +3 3448 7257 3432 +3 3432 7257 7238 +3 3432 7238 3433 +3 3433 7238 7237 +3 3433 7237 3434 +3 3434 7237 7236 +3 3434 7236 3412 +3 3412 7236 7264 +3 3412 7264 3413 +3 3413 7264 7263 +3 3413 7263 3414 +3 3414 7263 7256 +3 3414 7256 3419 +3 3419 7256 7255 +3 3419 7255 3435 +3 3435 7255 7267 +3 3435 7267 3436 +3 3436 7267 7269 +3 3436 7269 3437 +3 3437 7269 7268 +3 3437 7268 3438 +3 3438 7268 7254 +3 3438 7254 3439 +3 3439 7254 7253 +3 3439 7253 3426 +3 3426 7253 7252 +3 3426 7252 3427 +3 3427 7252 7247 +3 3427 7247 3428 +3 3428 7247 7246 +3 3428 7246 3440 +3 3440 7246 7262 +3 3440 7262 3441 +3 3441 7262 7261 +3 3441 7261 3442 +3 3442 7261 7260 +3 3442 7260 3415 +3 3415 7260 7245 +3 3415 7245 3416 +3 3416 7245 7244 +3 3416 7244 3418 +3 3418 7244 7243 +3 3418 7243 3420 +3 3420 7243 7233 +3 3420 7233 3421 +3 3421 7233 7234 +3 3421 7234 3422 +3 3422 7234 7235 +3 3422 7235 3429 +3 3429 7235 7242 +3 3477 7199 3478 +3 3478 7199 7200 +3 3478 7200 3479 +3 3479 7200 7201 +3 3479 7201 3449 +3 3449 7201 7202 +3 3449 7202 3450 +3 3450 7202 7214 +3 3450 7214 3463 +3 3463 7214 7213 +3 3463 7213 3464 +3 3464 7213 7198 +3 3464 7198 3465 +3 3465 7198 7197 +3 3465 7197 3480 +3 3480 7197 7229 +3 3480 7229 3481 +3 3481 7229 7228 +3 3481 7228 3482 +3 3482 7228 7227 +3 3482 7227 3451 +3 3451 7227 7212 +3 3451 7212 3452 +3 3452 7212 7211 +3 3452 7211 3466 +3 3466 7211 7223 +3 3466 7223 3467 +3 3467 7223 7222 +3 3467 7222 3453 +3 3453 7222 7210 +3 3453 7210 3454 +3 3454 7210 7209 +3 3454 7209 3455 +3 3455 7209 7226 +3 3455 7226 3456 +3 3456 7226 7225 +3 3456 7225 3457 +3 3457 7225 7224 +3 3457 7224 3458 +3 3458 7224 7221 +3 3458 7221 3471 +3 3471 7221 7220 +3 3471 7220 3472 +3 3472 7220 7219 +3 3472 7219 3473 +3 3473 7219 7218 +3 3473 7218 3474 +3 3474 7218 7217 +3 3474 7217 3475 +3 3475 7217 7216 +3 3475 7216 3476 +3 3476 7216 7215 +3 3476 7215 3483 +3 3483 7215 7232 +3 3483 7232 3484 +3 3484 7232 7231 +3 3484 7231 3485 +3 3485 7231 7230 +3 3485 7230 3459 +3 3459 7230 7208 +3 3459 7208 3460 +3 3460 7208 7207 +3 3460 7207 3462 +3 3462 7207 7206 +3 3462 7206 3468 +3 3468 7206 7205 +3 3468 7205 3469 +3 3469 7205 7204 +3 3469 7204 3470 +3 3470 7204 7203 +3 3470 7203 3477 +3 3477 7203 7199 +3 2787 7123 2788 +3 2788 7123 7159 +3 2788 7159 2789 +3 2789 7159 7158 +3 2789 7158 2790 +3 2790 7158 7154 +3 2790 7154 2791 +3 2791 7154 7153 +3 2791 7153 2792 +3 2792 7153 7152 +3 2792 7152 2793 +3 2793 7152 7151 +3 2793 7151 2794 +3 2794 7151 7150 +3 2794 7150 2812 +3 2812 7150 7157 +3 2812 7157 2813 +3 2813 7157 7156 +3 2813 7156 2814 +3 2814 7156 7155 +3 2814 7155 2815 +3 2815 7155 7145 +3 2815 7145 2816 +3 2816 7145 7144 +3 2816 7144 2817 +3 2817 7144 7149 +3 2817 7149 2818 +3 2818 7149 7148 +3 2818 7148 2819 +3 2819 7148 7137 +3 2819 7137 2820 +3 2820 7137 7136 +3 2820 7136 2784 +3 2784 7136 7147 +3 2784 7147 2785 +3 2785 7147 7146 +3 2785 7146 2786 +3 2786 7146 7143 +3 2786 7143 2795 +3 2795 7143 7142 +3 2795 7142 2796 +3 2796 7142 7141 +3 2796 7141 2797 +3 2797 7141 7140 +3 2797 7140 2803 +3 2803 7140 7139 +3 2803 7139 2804 +3 2804 7139 7138 +3 2804 7138 2805 +3 2805 7138 7135 +3 2805 7135 2806 +3 2806 7135 7134 +3 2806 7134 2807 +3 2807 7134 7132 +3 2807 7132 2808 +3 2808 7132 7131 +3 2808 7131 2809 +3 2809 7131 7130 +3 2809 7130 2810 +3 2810 7130 7129 +3 2810 7129 2811 +3 2811 7129 7128 +3 2811 7128 2798 +3 2798 7128 7127 +3 2798 7127 2799 +3 2799 7127 7126 +3 2799 7126 2801 +3 2801 7126 7125 +3 2801 7125 2802 +3 2802 7125 7124 +3 2802 7124 2787 +3 2787 7124 7123 +3 2838 7086 2839 +3 2839 7086 7122 +3 2839 7122 2824 +3 2824 7122 7121 +3 2824 7121 2825 +3 2825 7121 7117 +3 2825 7117 2826 +3 2826 7117 7116 +3 2826 7116 2827 +3 2827 7116 7115 +3 2827 7115 2828 +3 2828 7115 7114 +3 2828 7114 2829 +3 2829 7114 7113 +3 2829 7113 2849 +3 2849 7113 7120 +3 2849 7120 2850 +3 2850 7120 7119 +3 2850 7119 2851 +3 2851 7119 7118 +3 2851 7118 2852 +3 2852 7118 7108 +3 2852 7108 2853 +3 2853 7108 7107 +3 2853 7107 2854 +3 2854 7107 7112 +3 2854 7112 2855 +3 2855 7112 7111 +3 2855 7111 2856 +3 2856 7111 7100 +3 2856 7100 2857 +3 2857 7100 7099 +3 2857 7099 2821 +3 2821 7099 7110 +3 2821 7110 2822 +3 2822 7110 7109 +3 2822 7109 2823 +3 2823 7109 7106 +3 2823 7106 2830 +3 2830 7106 7105 +3 2830 7105 2831 +3 2831 7105 7104 +3 2831 7104 2832 +3 2832 7104 7103 +3 2832 7103 2840 +3 2840 7103 7102 +3 2840 7102 2841 +3 2841 7102 7101 +3 2841 7101 2842 +3 2842 7101 7098 +3 2842 7098 2843 +3 2843 7098 7097 +3 2843 7097 2844 +3 2844 7097 7095 +3 2844 7095 2845 +3 2845 7095 7094 +3 2845 7094 2846 +3 2846 7094 7093 +3 2846 7093 2847 +3 2847 7093 7092 +3 2847 7092 2848 +3 2848 7092 7091 +3 2848 7091 2833 +3 2833 7091 7090 +3 2833 7090 2834 +3 2834 7090 7089 +3 2834 7089 2836 +3 2836 7089 7088 +3 2836 7088 2837 +3 2837 7088 7087 +3 2837 7087 2838 +3 2838 7087 7086 +3 2894 7024 2861 +3 2861 7024 7026 +3 2861 7026 2860 +3 2860 7026 7062 +3 2860 7062 2873 +3 2873 7062 7065 +3 2873 7065 2874 +3 2874 7065 7059 +3 2874 7059 2875 +3 2875 7059 7058 +3 2875 7058 2881 +3 2881 7058 7057 +3 2881 7057 2882 +3 2882 7057 7056 +3 2882 7056 2883 +3 2883 7056 7055 +3 2883 7055 2884 +3 2884 7055 7054 +3 2884 7054 2885 +3 2885 7054 7053 +3 2885 7053 2886 +3 2886 7053 7035 +3 2886 7035 2863 +3 2863 7035 7034 +3 2863 7034 2864 +3 2864 7034 7033 +3 2864 7033 2865 +3 2865 7033 7032 +3 2865 7032 2858 +3 2858 7032 7031 +3 2858 7031 2859 +3 2859 7031 7030 +3 2859 7030 2866 +3 2866 7030 7015 +3 2866 7015 2867 +3 2867 7015 7014 +3 2867 7014 2868 +3 2868 7014 7083 +3 2868 7083 2869 +3 2869 7083 7082 +3 2869 7082 2870 +3 2870 7082 7071 +3 2870 7071 2871 +3 2871 7071 7070 +3 2871 7070 2872 +3 2872 7070 7085 +3 2872 7085 2876 +3 2876 7085 7084 +3 2876 7084 2877 +3 2877 7084 7081 +3 2877 7081 2878 +3 2878 7081 7080 +3 2878 7080 2879 +3 2879 7080 7079 +3 2879 7079 2880 +3 2880 7079 7078 +3 2880 7078 2887 +3 2887 7078 7077 +3 2887 7077 2888 +3 2888 7077 7073 +3 2888 7073 2889 +3 2889 7073 7072 +3 2889 7072 2890 +3 2890 7072 7076 +3 2890 7076 2891 +3 2891 7076 7075 +3 2891 7075 2892 +3 2892 7075 7074 +3 2892 7074 2893 +3 2893 7074 7016 +3 2893 7016 2894 +3 2894 7016 7024 +3 2930 7013 2931 +3 2931 7013 7043 +3 2931 7043 2900 +3 2900 7043 7042 +3 2900 7042 2901 +3 2901 7042 7041 +3 2901 7041 2902 +3 2902 7041 7040 +3 2902 7040 2903 +3 2903 7040 7039 +3 2903 7039 2904 +3 2904 7039 7038 +3 2904 7038 2905 +3 2905 7038 7067 +3 2905 7067 2906 +3 2906 7067 7066 +3 2906 7066 2913 +3 2913 7066 7037 +3 2913 7037 2914 +3 2914 7037 7036 +3 2914 7036 2915 +3 2915 7036 7064 +3 2915 7064 2895 +3 2895 7064 7063 +3 2895 7063 2896 +3 2896 7063 7061 +3 2896 7061 2907 +3 2907 7061 7060 +3 2907 7060 2908 +3 2908 7060 7029 +3 2908 7029 2909 +3 2909 7029 7028 +3 2909 7028 2916 +3 2916 7028 7027 +3 2916 7027 2917 +3 2917 7027 7025 +3 2917 7025 2918 +3 2918 7025 7023 +3 2918 7023 2897 +3 2897 7023 7022 +3 2897 7022 2898 +3 2898 7022 7021 +3 2898 7021 2899 +3 2899 7021 7020 +3 2899 7020 2910 +3 2910 7020 7019 +3 2910 7019 2911 +3 2911 7019 7018 +3 2911 7018 2912 +3 2912 7018 7017 +3 2912 7017 2919 +3 2919 7017 7050 +3 2919 7050 2920 +3 2920 7050 7052 +3 2920 7052 2922 +3 2922 7052 7069 +3 2922 7069 2923 +3 2923 7069 7068 +3 2923 7068 2924 +3 2924 7068 7049 +3 2924 7049 2925 +3 2925 7049 7048 +3 2925 7048 2926 +3 2926 7048 7047 +3 2926 7047 2927 +3 2927 7047 7046 +3 2927 7046 2928 +3 2928 7046 7045 +3 2928 7045 2929 +3 2929 7045 7044 +3 2929 7044 2930 +3 2930 7044 7013 +3 2952 6976 2966 +3 2966 6976 7012 +3 2966 7012 2967 +3 2967 7012 7011 +3 2967 7011 2990 +3 2990 7011 7010 +3 2990 7010 2991 +3 2991 7010 7009 +3 2991 7009 2992 +3 2992 7009 7008 +3 2992 7008 2988 +3 2988 7008 7007 +3 2988 7007 2989 +3 2989 7007 7006 +3 2989 7006 2995 +3 2995 7006 7005 +3 2995 7005 2994 +3 2994 7005 7002 +3 2994 7002 2993 +3 2993 7002 7003 +3 2993 7003 2996 +3 2996 7003 7004 +3 2996 7004 2997 +3 2997 7004 7001 +3 2997 7001 2998 +3 2998 7001 7000 +3 2998 7000 2999 +3 2999 7000 6999 +3 2999 6999 3000 +3 3000 6999 6998 +3 3000 6998 3001 +3 3001 6998 6997 +3 3001 6997 3002 +3 3002 6997 6996 +3 3002 6996 3003 +3 3003 6996 6989 +3 3003 6989 3004 +3 3004 6989 6988 +3 3004 6988 2932 +3 2932 6988 6987 +3 2932 6987 2933 +3 2933 6987 6986 +3 2933 6986 2934 +3 2934 6986 6985 +3 2934 6985 2935 +3 2935 6985 6984 +3 2935 6984 2949 +3 2949 6984 6979 +3 2949 6979 2950 +3 2950 6979 6978 +3 2950 6978 2936 +3 2936 6978 6995 +3 2936 6995 2937 +3 2937 6995 6994 +3 2937 6994 2975 +3 2975 6994 6993 +3 2975 6993 2976 +3 2976 6993 6992 +3 2976 6992 2960 +3 2960 6992 6991 +3 2960 6991 2958 +3 2958 6991 6990 +3 2958 6990 2956 +3 2956 6990 6983 +3 2956 6983 2946 +3 2946 6983 6982 +3 2946 6982 2944 +3 2944 6982 6981 +3 2944 6981 2951 +3 2951 6981 6977 +3 2951 6977 2952 +3 2952 6977 6976 +3 2941 6939 2943 +3 2943 6939 6975 +3 2943 6975 2978 +3 2978 6975 6974 +3 2978 6974 2979 +3 2979 6974 6973 +3 2979 6973 2980 +3 2980 6973 6972 +3 2980 6972 2981 +3 2981 6972 6971 +3 2981 6971 2982 +3 2982 6971 6970 +3 2982 6970 2983 +3 2983 6970 6969 +3 2983 6969 2986 +3 2986 6969 6968 +3 2986 6968 2987 +3 2987 6968 6965 +3 2987 6965 2984 +3 2984 6965 6966 +3 2984 6966 2985 +3 2985 6966 6967 +3 2985 6967 2968 +3 2968 6967 6964 +3 2968 6964 2953 +3 2953 6964 6963 +3 2953 6963 2945 +3 2945 6963 6962 +3 2945 6962 2947 +3 2947 6962 6961 +3 2947 6961 2948 +3 2948 6961 6960 +3 2948 6960 2954 +3 2954 6960 6959 +3 2954 6959 2955 +3 2955 6959 6952 +3 2955 6952 2957 +3 2957 6952 6951 +3 2957 6951 2959 +3 2959 6951 6950 +3 2959 6950 2977 +3 2977 6950 6949 +3 2977 6949 2969 +3 2969 6949 6948 +3 2969 6948 2970 +3 2970 6948 6947 +3 2970 6947 2973 +3 2973 6947 6942 +3 2973 6942 2974 +3 2974 6942 6941 +3 2974 6941 2938 +3 2938 6941 6958 +3 2938 6958 2939 +3 2939 6958 6957 +3 2939 6957 2961 +3 2961 6957 6956 +3 2961 6956 2962 +3 2962 6956 6955 +3 2962 6955 2971 +3 2971 6955 6954 +3 2971 6954 2972 +3 2972 6954 6953 +3 2972 6953 2963 +3 2963 6953 6946 +3 2963 6946 2964 +3 2964 6946 6945 +3 2964 6945 2965 +3 2965 6945 6944 +3 2965 6944 2940 +3 2940 6944 6940 +3 2940 6940 2941 +3 2941 6940 6939 +3 3010 6902 3023 +3 3023 6902 6938 +3 3023 6938 3024 +3 3024 6938 6937 +3 3024 6937 3025 +3 3025 6937 6936 +3 3025 6936 3026 +3 3026 6936 6935 +3 3026 6935 3027 +3 3027 6935 6934 +3 3027 6934 3028 +3 3028 6934 6933 +3 3028 6933 3029 +3 3029 6933 6932 +3 3029 6932 3032 +3 3032 6932 6931 +3 3032 6931 3031 +3 3031 6931 6928 +3 3031 6928 3030 +3 3030 6928 6929 +3 3030 6929 3033 +3 3033 6929 6930 +3 3033 6930 3034 +3 3034 6930 6927 +3 3034 6927 3035 +3 3035 6927 6926 +3 3035 6926 3036 +3 3036 6926 6925 +3 3036 6925 3037 +3 3037 6925 6924 +3 3037 6924 3038 +3 3038 6924 6923 +3 3038 6923 3039 +3 3039 6923 6922 +3 3039 6922 3040 +3 3040 6922 6915 +3 3040 6915 3041 +3 3041 6915 6914 +3 3041 6914 3011 +3 3011 6914 6913 +3 3011 6913 3012 +3 3012 6913 6912 +3 3012 6912 3013 +3 3013 6912 6911 +3 3013 6911 3014 +3 3014 6911 6910 +3 3014 6910 3015 +3 3015 6910 6905 +3 3015 6905 3016 +3 3016 6905 6904 +3 3016 6904 3017 +3 3017 6904 6921 +3 3017 6921 3020 +3 3020 6921 6920 +3 3020 6920 3019 +3 3019 6920 6919 +3 3019 6919 3018 +3 3018 6919 6918 +3 3018 6918 3021 +3 3021 6918 6917 +3 3021 6917 3022 +3 3022 6917 6916 +3 3022 6916 3005 +3 3005 6916 6909 +3 3005 6909 3006 +3 3006 6909 6908 +3 3006 6908 3008 +3 3008 6908 6907 +3 3008 6907 3009 +3 3009 6907 6903 +3 3009 6903 3010 +3 3010 6903 6902 +3 3052 6871 3053 +3 3053 6871 6870 +3 3053 6870 3054 +3 3054 6870 6869 +3 3054 6869 3045 +3 3045 6869 6868 +3 3045 6868 3046 +3 3046 6868 6883 +3 3046 6883 3047 +3 3047 6883 6882 +3 3047 6882 3068 +3 3068 6882 6881 +3 3068 6881 3069 +3 3069 6881 6901 +3 3069 6901 3070 +3 3070 6901 6900 +3 3070 6900 3076 +3 3076 6900 6897 +3 3076 6897 3077 +3 3077 6897 6896 +3 3077 6896 3078 +3 3078 6896 6895 +3 3078 6895 3060 +3 3060 6895 6893 +3 3060 6893 3061 +3 3061 6893 6892 +3 3061 6892 3062 +3 3062 6892 6891 +3 3062 6891 3063 +3 3063 6891 6890 +3 3063 6890 3064 +3 3064 6890 6889 +3 3064 6889 3055 +3 3055 6889 6888 +3 3055 6888 3056 +3 3056 6888 6887 +3 3056 6887 3065 +3 3065 6887 6894 +3 3065 6894 3066 +3 3066 6894 6899 +3 3066 6899 3067 +3 3067 6899 6898 +3 3067 6898 3071 +3 3071 6898 6880 +3 3071 6880 3072 +3 3072 6880 6879 +3 3072 6879 3057 +3 3057 6879 6878 +3 3057 6878 3058 +3 3058 6878 6876 +3 3058 6876 3059 +3 3059 6876 6875 +3 3059 6875 3073 +3 3073 6875 6886 +3 3073 6886 3074 +3 3074 6886 6885 +3 3074 6885 3075 +3 3075 6885 6884 +3 3075 6884 3042 +3 3042 6884 6874 +3 3042 6874 3043 +3 3043 6874 6873 +3 3043 6873 3050 +3 3050 6873 6872 +3 3050 6872 3051 +3 3051 6872 6865 +3 3051 6865 3048 +3 3048 6865 6866 +3 3048 6866 3049 +3 3049 6866 6867 +3 3049 6867 3052 +3 3052 6867 6871 +3 3107 6829 3108 +3 3108 6829 6831 +3 3108 6831 3109 +3 3109 6831 6832 +3 3109 6832 3079 +3 3079 6832 6833 +3 3079 6833 3080 +3 3080 6833 6845 +3 3080 6845 3093 +3 3093 6845 6844 +3 3093 6844 3094 +3 3094 6844 6828 +3 3094 6828 3095 +3 3095 6828 6827 +3 3095 6827 3110 +3 3110 6827 6861 +3 3110 6861 3111 +3 3111 6861 6860 +3 3111 6860 3112 +3 3112 6860 6859 +3 3112 6859 3081 +3 3081 6859 6843 +3 3081 6843 3082 +3 3082 6843 6842 +3 3082 6842 3096 +3 3096 6842 6855 +3 3096 6855 3097 +3 3097 6855 6854 +3 3097 6854 3083 +3 3083 6854 6841 +3 3083 6841 3084 +3 3084 6841 6840 +3 3084 6840 3085 +3 3085 6840 6858 +3 3085 6858 3086 +3 3086 6858 6857 +3 3086 6857 3087 +3 3087 6857 6856 +3 3087 6856 3088 +3 3088 6856 6853 +3 3088 6853 3101 +3 3101 6853 6852 +3 3101 6852 3102 +3 3102 6852 6851 +3 3102 6851 3103 +3 3103 6851 6850 +3 3103 6850 3104 +3 3104 6850 6849 +3 3104 6849 3105 +3 3105 6849 6847 +3 3105 6847 3106 +3 3106 6847 6846 +3 3106 6846 3113 +3 3113 6846 6864 +3 3113 6864 3114 +3 3114 6864 6863 +3 3114 6863 3115 +3 3115 6863 6862 +3 3115 6862 3089 +3 3089 6862 6839 +3 3089 6839 3090 +3 3090 6839 6838 +3 3090 6838 3092 +3 3092 6838 6837 +3 3092 6837 3098 +3 3098 6837 6836 +3 3098 6836 3099 +3 3099 6836 6835 +3 3099 6835 3100 +3 3100 6835 6834 +3 3100 6834 3107 +3 3107 6834 6829 +3 2111 6684 2153 +3 2153 6684 6683 +3 2153 6683 2155 +3 2155 6683 6694 +3 2155 6694 2156 +3 2156 6694 6693 +3 2156 6693 2157 +3 2157 6693 6692 +3 2157 6692 2158 +3 2158 6692 6687 +3 2158 6687 2159 +3 2159 6687 6689 +3 2159 6689 2148 +3 2148 6689 6691 +3 2148 6691 2108 +3 2108 6691 6728 +3 2108 6728 2131 +3 2131 6728 6727 +3 2131 6727 2102 +3 2102 6727 6708 +3 2102 6708 2160 +3 2160 6708 6707 +3 2160 6707 2161 +3 2161 6707 6748 +3 2161 6748 2162 +3 2162 6748 6719 +3 2162 6719 2093 +3 2093 6719 6718 +3 2093 6718 2094 +3 2094 6718 6717 +3 2094 6717 2095 +3 2095 6717 6716 +3 2095 6716 2105 +3 2105 6716 6734 +3 2105 6734 2104 +3 2104 6734 6733 +3 2104 6733 2103 +3 2103 6733 6732 +3 2103 6732 2134 +3 2134 6732 6731 +3 2134 6731 2135 +3 2135 6731 6730 +3 2135 6730 2136 +3 2136 6730 6729 +3 2136 6729 2137 +3 2137 6729 6722 +3 2137 6722 2138 +3 2138 6722 6721 +3 2138 6721 2139 +3 2139 6721 6720 +3 2139 6720 2150 +3 2150 6720 6712 +3 2150 6712 2151 +3 2151 6712 6714 +3 2151 6714 2152 +3 2152 6714 6715 +3 2152 6715 2140 +3 2140 6715 6705 +3 2140 6705 2141 +3 2141 6705 6704 +3 2141 6704 2142 +3 2142 6704 6703 +3 2142 6703 2143 +3 2143 6703 6697 +3 2143 6697 2144 +3 2144 6697 6696 +3 2144 6696 2145 +3 2145 6696 6695 +3 2145 6695 2110 +3 2110 6695 6685 +3 2110 6685 2111 +3 2111 6685 6684 +3 2190 6609 2232 +3 2232 6609 6608 +3 2232 6608 2233 +3 2233 6608 6618 +3 2233 6618 2234 +3 2234 6618 6653 +3 2234 6653 2235 +3 2235 6653 6643 +3 2235 6643 2174 +3 2174 6643 6642 +3 2174 6642 2175 +3 2175 6642 6641 +3 2175 6641 2177 +3 2177 6641 6640 +3 2177 6640 2178 +3 2178 6640 6638 +3 2178 6638 2179 +3 2179 6638 6636 +3 2179 6636 2180 +3 2180 6636 6635 +3 2180 6635 2163 +3 2163 6635 6617 +3 2163 6617 2164 +3 2164 6617 6616 +3 2164 6616 2170 +3 2170 6616 6615 +3 2170 6615 2171 +3 2171 6615 6610 +3 2171 6610 2172 +3 2172 6610 6612 +3 2172 6612 2173 +3 2173 6612 6614 +3 2173 6614 2183 +3 2183 6614 6661 +3 2183 6661 2184 +3 2184 6661 6676 +3 2184 6676 2185 +3 2185 6676 6675 +3 2185 6675 2186 +3 2186 6675 6674 +3 2186 6674 2219 +3 2219 6674 6673 +3 2219 6673 2220 +3 2220 6673 6672 +3 2220 6672 2221 +3 2221 6672 6671 +3 2221 6671 2224 +3 2224 6671 6670 +3 2224 6670 2225 +3 2225 6670 6669 +3 2225 6669 2226 +3 2226 6669 6668 +3 2226 6668 2229 +3 2229 6668 6680 +3 2229 6680 2230 +3 2230 6680 6679 +3 2230 6679 2231 +3 2231 6679 6678 +3 2231 6678 2222 +3 2222 6678 6667 +3 2222 6667 2223 +3 2223 6667 6666 +3 2223 6666 2227 +3 2227 6666 6665 +3 2227 6665 2228 +3 2228 6665 6646 +3 2228 6646 2187 +3 2187 6646 6645 +3 2187 6645 2188 +3 2188 6645 6644 +3 2188 6644 2190 +3 2190 6644 6609 +3 2305 6499 2306 +3 2306 6499 6531 +3 2306 6531 2307 +3 2307 6531 6509 +3 2307 6509 2240 +3 2240 6509 6508 +3 2240 6508 2238 +3 2238 6508 6480 +3 2238 6480 2236 +3 2236 6480 6478 +3 2236 6478 2261 +3 2261 6478 6477 +3 2261 6477 2262 +3 2262 6477 6507 +3 2262 6507 2263 +3 2263 6507 6506 +3 2263 6506 2264 +3 2264 6506 6504 +3 2264 6504 2265 +3 2265 6504 6503 +3 2265 6503 2267 +3 2267 6503 6467 +3 2267 6467 2243 +3 2243 6467 6466 +3 2243 6466 2270 +3 2270 6466 6464 +3 2270 6464 2258 +3 2258 6464 6463 +3 2258 6463 2259 +3 2259 6463 6468 +3 2259 6468 2260 +3 2260 6468 6470 +3 2260 6470 2254 +3 2254 6470 6595 +3 2254 6595 2244 +3 2244 6595 6594 +3 2244 6594 2245 +3 2245 6594 6544 +3 2245 6544 2246 +3 2246 6544 6543 +3 2246 6543 2273 +3 2273 6543 6559 +3 2273 6559 2274 +3 2274 6559 6558 +3 2274 6558 2275 +3 2275 6558 6557 +3 2275 6557 2280 +3 2280 6557 6556 +3 2280 6556 2281 +3 2281 6556 6555 +3 2281 6555 2282 +3 2282 6555 6554 +3 2282 6554 2283 +3 2283 6554 6553 +3 2283 6553 2284 +3 2284 6553 6552 +3 2284 6552 2285 +3 2285 6552 6580 +3 2285 6580 2286 +3 2286 6580 6579 +3 2286 6579 2300 +3 2300 6579 6551 +3 2300 6551 2301 +3 2301 6551 6550 +3 2301 6550 2302 +3 2302 6550 6549 +3 2302 6549 2303 +3 2303 6549 6593 +3 2303 6593 2304 +3 2304 6593 6592 +3 2304 6592 2305 +3 2305 6592 6499 +3 2373 6482 2323 +3 2323 6482 6481 +3 2323 6481 2324 +3 2324 6481 6571 +3 2324 6571 2343 +3 2343 6571 6548 +3 2343 6548 2341 +3 2341 6548 6547 +3 2341 6547 2339 +3 2339 6547 6526 +3 2339 6526 2359 +3 2359 6526 6605 +3 2359 6605 2360 +3 2360 6605 6603 +3 2360 6603 2361 +3 2361 6603 6602 +3 2361 6602 2367 +3 2367 6602 6475 +3 2367 6475 2368 +3 2368 6475 6474 +3 2368 6474 2370 +3 2370 6474 6528 +3 2370 6528 2371 +3 2371 6528 6496 +3 2371 6496 2352 +3 2352 6496 6495 +3 2352 6495 2353 +3 2353 6495 6493 +3 2353 6493 2362 +3 2362 6493 6492 +3 2362 6492 2363 +3 2363 6492 6532 +3 2363 6532 2321 +3 2321 6532 6574 +3 2321 6574 2309 +3 2309 6574 6573 +3 2309 6573 2310 +3 2310 6573 6572 +3 2310 6572 2318 +3 2318 6572 6501 +3 2318 6501 2319 +3 2319 6501 6500 +3 2319 6500 2320 +3 2320 6500 6498 +3 2320 6498 2325 +3 2325 6498 6497 +3 2325 6497 2326 +3 2326 6497 6591 +3 2326 6591 2327 +3 2327 6591 6542 +3 2327 6542 2331 +3 2331 6542 6541 +3 2331 6541 2330 +3 2330 6541 6540 +3 2330 6540 2328 +3 2328 6540 6539 +3 2328 6539 2354 +3 2354 6539 6514 +3 2354 6514 2355 +3 2355 6514 6513 +3 2355 6513 2356 +3 2356 6513 6512 +3 2356 6512 2364 +3 2364 6512 6511 +3 2364 6511 2365 +3 2365 6511 6538 +3 2365 6538 2366 +3 2366 6538 6537 +3 2366 6537 2372 +3 2372 6537 6483 +3 2372 6483 2373 +3 2373 6483 6482 +3 2459 6400 2451 +3 2451 6400 6401 +3 2451 6401 2450 +3 2450 6401 6402 +3 2450 6402 2475 +3 2475 6402 6393 +3 2475 6393 2476 +3 2476 6393 6392 +3 2476 6392 2477 +3 2477 6392 6406 +3 2477 6406 2472 +3 2472 6406 6407 +3 2472 6407 2473 +3 2473 6407 6420 +3 2473 6420 2484 +3 2484 6420 6419 +3 2484 6419 2485 +3 2485 6419 6417 +3 2485 6417 2486 +3 2486 6417 6416 +3 2486 6416 2478 +3 2478 6416 6405 +3 2478 6405 2509 +3 2509 6405 6404 +3 2509 6404 2510 +3 2510 6404 6403 +3 2510 6403 2511 +3 2511 6403 6396 +3 2511 6396 2502 +3 2502 6396 6395 +3 2502 6395 2503 +3 2503 6395 6399 +3 2503 6399 2513 +3 2513 6399 6452 +3 2513 6452 2481 +3 2481 6452 6461 +3 2481 6461 2386 +3 2386 6461 6460 +3 2386 6460 2387 +3 2387 6460 6451 +3 2387 6451 2411 +3 2411 6451 6450 +3 2411 6450 2412 +3 2412 6450 6449 +3 2412 6449 2413 +3 2413 6449 6442 +3 2413 6442 2421 +3 2421 6442 6441 +3 2421 6441 2422 +3 2422 6441 6440 +3 2422 6440 2423 +3 2423 6440 6427 +3 2423 6427 2424 +3 2424 6427 6428 +3 2424 6428 2425 +3 2425 6428 6436 +3 2425 6436 2426 +3 2426 6436 6435 +3 2426 6435 2385 +3 2385 6435 6426 +3 2385 6426 2384 +3 2384 6426 6425 +3 2384 6425 2447 +3 2447 6425 6424 +3 2447 6424 2448 +3 2448 6424 6423 +3 2448 6423 2449 +3 2449 6423 6422 +3 2449 6422 2458 +3 2458 6422 6421 +3 2458 6421 2459 +3 2459 6421 6400 +3 2397 6350 2398 +3 2398 6350 6349 +3 2398 6349 2399 +3 2399 6349 6348 +3 2399 6348 2400 +3 2400 6348 6347 +3 2400 6347 2401 +3 2401 6347 6346 +3 2401 6346 2402 +3 2402 6346 6345 +3 2402 6345 2403 +3 2403 6345 6344 +3 2403 6344 2404 +3 2404 6344 6362 +3 2404 6362 2406 +3 2406 6362 6367 +3 2406 6367 2407 +3 2407 6367 6366 +3 2407 6366 2445 +3 2445 6366 6356 +3 2445 6356 2446 +3 2446 6356 6355 +3 2446 6355 2441 +3 2441 6355 6333 +3 2441 6333 2418 +3 2418 6333 6332 +3 2418 6332 2453 +3 2453 6332 6331 +3 2453 6331 2454 +3 2454 6331 6341 +3 2454 6341 2456 +3 2456 6341 6340 +3 2456 6340 2457 +3 2457 6340 6337 +3 2457 6337 2434 +3 2434 6337 6338 +3 2434 6338 2382 +3 2382 6338 6339 +3 2382 6339 2383 +3 2383 6339 6336 +3 2383 6336 2437 +3 2437 6336 6335 +3 2437 6335 2438 +3 2438 6335 6334 +3 2438 6334 2439 +3 2439 6334 6330 +3 2439 6330 2428 +3 2428 6330 6329 +3 2428 6329 2427 +3 2427 6329 6328 +3 2427 6328 2388 +3 2388 6328 6327 +3 2388 6327 2389 +3 2389 6327 6326 +3 2389 6326 2414 +3 2414 6326 6325 +3 2414 6325 2415 +3 2415 6325 6323 +3 2415 6323 2390 +3 2390 6323 6322 +3 2390 6322 2391 +3 2391 6322 6321 +3 2391 6321 2393 +3 2393 6321 6320 +3 2393 6320 2394 +3 2394 6320 6319 +3 2394 6319 2395 +3 2395 6319 6318 +3 2395 6318 2396 +3 2396 6318 6317 +3 2396 6317 2397 +3 2397 6317 6350 +3 2557 6245 2562 +3 2562 6245 6244 +3 2562 6244 2576 +3 2576 6244 6274 +3 2576 6274 2577 +3 2577 6274 6289 +3 2577 6289 2578 +3 2578 6289 6316 +3 2578 6316 2597 +3 2597 6316 6315 +3 2597 6315 2594 +3 2594 6315 6313 +3 2594 6313 2584 +3 2584 6313 6311 +3 2584 6311 2574 +3 2574 6311 6310 +3 2574 6310 2575 +3 2575 6310 6299 +3 2575 6299 2586 +3 2586 6299 6297 +3 2586 6297 2588 +3 2588 6297 6295 +3 2588 6295 2589 +3 2589 6295 6294 +3 2589 6294 2591 +3 2591 6294 6262 +3 2591 6262 2565 +3 2565 6262 6261 +3 2565 6261 2566 +3 2566 6261 6260 +3 2566 6260 2567 +3 2567 6260 6259 +3 2567 6259 2537 +3 2537 6259 6273 +3 2537 6273 2536 +3 2536 6273 6272 +3 2536 6272 2527 +3 2527 6272 6270 +3 2527 6270 2528 +3 2528 6270 6269 +3 2528 6269 2533 +3 2533 6269 6283 +3 2533 6283 2534 +3 2534 6283 6282 +3 2534 6282 2535 +3 2535 6282 6281 +3 2535 6281 2551 +3 2551 6281 6280 +3 2551 6280 2552 +3 2552 6280 6279 +3 2552 6279 2553 +3 2553 6279 6278 +3 2553 6278 2568 +3 2568 6278 6286 +3 2568 6286 2569 +3 2569 6286 6285 +3 2569 6285 2570 +3 2570 6285 6284 +3 2570 6284 2555 +3 2555 6284 6268 +3 2555 6268 2556 +3 2556 6268 6267 +3 2556 6267 2560 +3 2560 6267 6266 +3 2560 6266 2561 +3 2561 6266 6256 +3 2561 6256 2559 +3 2559 6256 6255 +3 2559 6255 2558 +3 2558 6255 6254 +3 2558 6254 2557 +3 2557 6254 6245 +3 2622 6178 2627 +3 2627 6178 6197 +3 2627 6197 2628 +3 2628 6197 6196 +3 2628 6196 2629 +3 2629 6196 6195 +3 2629 6195 2604 +3 2604 6195 6194 +3 2604 6194 2605 +3 2605 6194 6193 +3 2605 6193 2644 +3 2644 6193 6192 +3 2644 6192 2645 +3 2645 6192 6191 +3 2645 6191 2666 +3 2666 6191 6218 +3 2666 6218 2667 +3 2667 6218 6217 +3 2667 6217 2669 +3 2669 6217 6213 +3 2669 6213 2671 +3 2671 6213 6212 +3 2671 6212 2672 +3 2672 6212 6211 +3 2672 6211 2660 +3 2660 6211 6198 +3 2660 6198 2661 +3 2661 6198 6200 +3 2661 6200 2662 +3 2662 6200 6241 +3 2662 6241 2663 +3 2663 6241 6239 +3 2663 6239 2658 +3 2658 6239 6238 +3 2658 6238 2613 +3 2613 6238 6237 +3 2613 6237 2614 +3 2614 6237 6230 +3 2614 6230 2615 +3 2615 6230 6229 +3 2615 6229 2651 +3 2651 6229 6228 +3 2651 6228 2652 +3 2652 6228 6216 +3 2652 6216 2623 +3 2623 6216 6215 +3 2623 6215 2624 +3 2624 6215 6214 +3 2624 6214 2625 +3 2625 6214 6207 +3 2625 6207 2626 +3 2626 6207 6206 +3 2626 6206 2653 +3 2653 6206 6223 +3 2653 6223 2654 +3 2654 6223 6222 +3 2654 6222 2655 +3 2655 6222 6221 +3 2655 6221 2616 +3 2616 6221 6205 +3 2616 6205 2617 +3 2617 6205 6204 +3 2617 6204 2618 +3 2618 6204 6203 +3 2618 6203 2619 +3 2619 6203 6181 +3 2619 6181 2620 +3 2620 6181 6180 +3 2620 6180 2621 +3 2621 6180 6179 +3 2621 6179 2622 +3 2622 6179 6178 +3 2708 6098 2720 +3 2720 6098 6097 +3 2720 6097 2721 +3 2721 6097 6125 +3 2721 6125 2722 +3 2722 6125 6126 +3 2722 6126 2685 +3 2685 6126 6136 +3 2685 6136 2686 +3 2686 6136 6137 +3 2686 6137 2726 +3 2726 6137 6153 +3 2726 6153 2727 +3 2727 6153 6152 +3 2727 6152 2742 +3 2742 6152 6151 +3 2742 6151 2744 +3 2744 6151 6168 +3 2744 6168 2745 +3 2745 6168 6163 +3 2745 6163 2723 +3 2723 6163 6162 +3 2723 6162 2724 +3 2724 6162 6164 +3 2724 6164 2736 +3 2736 6164 6133 +3 2736 6133 2735 +3 2735 6133 6132 +3 2735 6132 2740 +3 2740 6132 6131 +3 2740 6131 2711 +3 2711 6131 6130 +3 2711 6130 2683 +3 2683 6130 6150 +3 2683 6150 2682 +3 2682 6150 6149 +3 2682 6149 2680 +3 2680 6149 6148 +3 2680 6148 2681 +3 2681 6148 6122 +3 2681 6122 2699 +3 2699 6122 6123 +3 2699 6123 2700 +3 2700 6123 6124 +3 2700 6124 2701 +3 2701 6124 6129 +3 2701 6129 2717 +3 2717 6129 6128 +3 2717 6128 2718 +3 2718 6128 6103 +3 2718 6103 2719 +3 2719 6103 6102 +3 2719 6102 2730 +3 2730 6102 6143 +3 2730 6143 2731 +3 2731 6143 6142 +3 2731 6142 2732 +3 2732 6142 6141 +3 2732 6141 2702 +3 2702 6141 6121 +3 2702 6121 2703 +3 2703 6121 6120 +3 2703 6120 2704 +3 2704 6120 6119 +3 2704 6119 2705 +3 2705 6119 6111 +3 2705 6111 2706 +3 2706 6111 6110 +3 2706 6110 2707 +3 2707 6110 6109 +3 2707 6109 2708 +3 2708 6109 6098 +3 2149 6701 2154 +3 2154 6701 6702 +3 2154 6702 2122 +3 2122 6702 6700 +3 2122 6700 2123 +3 2123 6700 6699 +3 2123 6699 2124 +3 2124 6699 6698 +3 2124 6698 2092 +3 2092 6698 6682 +3 2092 6682 2091 +3 2091 6682 6681 +3 2091 6681 2090 +3 2090 6681 6686 +3 2090 6686 2113 +3 2113 6686 6747 +3 2113 6747 2114 +3 2114 6747 6746 +3 2114 6746 2115 +3 2115 6746 6745 +3 2115 6745 2116 +3 2116 6745 6744 +3 2116 6744 2117 +3 2117 6744 6743 +3 2117 6743 2118 +3 2118 6743 6742 +3 2118 6742 2096 +3 2096 6742 6741 +3 2096 6741 2097 +3 2097 6741 6740 +3 2097 6740 2119 +3 2119 6740 6739 +3 2119 6739 2120 +3 2120 6739 6738 +3 2120 6738 2121 +3 2121 6738 6737 +3 2121 6737 2125 +3 2125 6737 6753 +3 2125 6753 2126 +3 2126 6753 6752 +3 2126 6752 2127 +3 2127 6752 6751 +3 2127 6751 2098 +3 2098 6751 6736 +3 2098 6736 2099 +3 2099 6736 6735 +3 2099 6735 2128 +3 2128 6735 6750 +3 2128 6750 2129 +3 2129 6750 6749 +3 2129 6749 2130 +3 2130 6749 6706 +3 2130 6706 2100 +3 2100 6706 6726 +3 2100 6726 2101 +3 2101 6726 6725 +3 2101 6725 2132 +3 2132 6725 6724 +3 2132 6724 2133 +3 2133 6724 6723 +3 2133 6723 2106 +3 2106 6723 6711 +3 2106 6711 2107 +3 2107 6711 6710 +3 2107 6710 2109 +3 2109 6710 6709 +3 2109 6709 2146 +3 2146 6709 6690 +3 2146 6690 2147 +3 2147 6690 6688 +3 2147 6688 2149 +3 2149 6688 6701 +3 2217 6633 2218 +3 2218 6633 6632 +3 2218 6632 2202 +3 2202 6632 6631 +3 2202 6631 2203 +3 2203 6631 6630 +3 2203 6630 2204 +3 2204 6630 6629 +3 2204 6629 2205 +3 2205 6629 6628 +3 2205 6628 2206 +3 2206 6628 6627 +3 2206 6627 2207 +3 2207 6627 6626 +3 2207 6626 2208 +3 2208 6626 6625 +3 2208 6625 2209 +3 2209 6625 6649 +3 2209 6649 2210 +3 2210 6649 6648 +3 2210 6648 2211 +3 2211 6648 6647 +3 2211 6647 2191 +3 2191 6647 6624 +3 2191 6624 2192 +3 2192 6624 6623 +3 2192 6623 2193 +3 2193 6623 6622 +3 2193 6622 2194 +3 2194 6622 6652 +3 2194 6652 2195 +3 2195 6652 6651 +3 2195 6651 2196 +3 2196 6651 6650 +3 2196 6650 2197 +3 2197 6650 6658 +3 2197 6658 2198 +3 2198 6658 6657 +3 2198 6657 2199 +3 2199 6657 6677 +3 2199 6677 2200 +3 2200 6677 6664 +3 2200 6664 2201 +3 2201 6664 6663 +3 2201 6663 2166 +3 2166 6663 6662 +3 2166 6662 2167 +3 2167 6662 6660 +3 2167 6660 2168 +3 2168 6660 6659 +3 2168 6659 2169 +3 2169 6659 6613 +3 2169 6613 2165 +3 2165 6613 6611 +3 2165 6611 2181 +3 2181 6611 6637 +3 2181 6637 2182 +3 2182 6637 6639 +3 2182 6639 2176 +3 2176 6639 6654 +3 2176 6654 2212 +3 2212 6654 6655 +3 2212 6655 2213 +3 2213 6655 6621 +3 2213 6621 2214 +3 2214 6621 6620 +3 2214 6620 2215 +3 2215 6620 6619 +3 2215 6619 2216 +3 2216 6619 6634 +3 2216 6634 2217 +3 2217 6634 6633 +3 2276 6472 2290 +3 2290 6472 6471 +3 2290 6471 2291 +3 2291 6471 6599 +3 2291 6599 2292 +3 2292 6599 6567 +3 2292 6567 2293 +3 2293 6567 6566 +3 2293 6566 2294 +3 2294 6566 6565 +3 2294 6565 2295 +3 2295 6565 6563 +3 2295 6563 2296 +3 2296 6563 6562 +3 2296 6562 2298 +3 2298 6562 6518 +3 2298 6518 2299 +3 2299 6518 6519 +3 2299 6519 2297 +3 2297 6519 6520 +3 2297 6520 2247 +3 2247 6520 6490 +3 2247 6490 2248 +3 2248 6490 6489 +3 2248 6489 2249 +3 2249 6489 6488 +3 2249 6488 2250 +3 2250 6488 6487 +3 2250 6487 2251 +3 2251 6487 6486 +3 2251 6486 2252 +3 2252 6486 6485 +3 2252 6485 2253 +3 2253 6485 6484 +3 2253 6484 2257 +3 2257 6484 6545 +3 2257 6545 2256 +3 2256 6545 6516 +3 2256 6516 2255 +3 2255 6516 6515 +3 2255 6515 2271 +3 2271 6515 6582 +3 2271 6582 2272 +3 2272 6582 6581 +3 2272 6581 2241 +3 2241 6581 6561 +3 2241 6561 2242 +3 2242 6561 6560 +3 2242 6560 2269 +3 2269 6560 6596 +3 2269 6596 2268 +3 2268 6596 6469 +3 2268 6469 2266 +3 2266 6469 6465 +3 2266 6465 2237 +3 2237 6465 6505 +3 2237 6505 2239 +3 2239 6505 6479 +3 2239 6479 2308 +3 2308 6479 6510 +3 2308 6510 2287 +3 2287 6510 6536 +3 2287 6536 2288 +3 2288 6536 6535 +3 2288 6535 2289 +3 2289 6535 6534 +3 2289 6534 2279 +3 2279 6534 6576 +3 2279 6576 2278 +3 2278 6576 6575 +3 2278 6575 2276 +3 2276 6575 6472 +3 2380 6570 2381 +3 2381 6570 6590 +3 2381 6590 2332 +3 2332 6590 6589 +3 2332 6589 2333 +3 2333 6589 6588 +3 2333 6588 2334 +3 2334 6588 6587 +3 2334 6587 2335 +3 2335 6587 6586 +3 2335 6586 2336 +3 2336 6586 6585 +3 2336 6585 2337 +3 2337 6585 6584 +3 2337 6584 2344 +3 2344 6584 6583 +3 2344 6583 2345 +3 2345 6583 6568 +3 2345 6568 2338 +3 2338 6568 6564 +3 2338 6564 2346 +3 2346 6564 6601 +3 2346 6601 2347 +3 2347 6601 6600 +3 2347 6600 2348 +3 2348 6600 6598 +3 2348 6598 2349 +3 2349 6598 6597 +3 2349 6597 2350 +3 2350 6597 6523 +3 2350 6523 2351 +3 2351 6523 6522 +3 2351 6522 2357 +3 2357 6522 6521 +3 2357 6521 2358 +3 2358 6521 6473 +3 2358 6473 2311 +3 2311 6473 6502 +3 2311 6502 2312 +3 2312 6502 6577 +3 2312 6577 2313 +3 2313 6577 6578 +3 2313 6578 2314 +3 2314 6578 6533 +3 2314 6533 2315 +3 2315 6533 6529 +3 2315 6529 2316 +3 2316 6529 6530 +3 2316 6530 2317 +3 2317 6530 6494 +3 2317 6494 2322 +3 2322 6494 6527 +3 2322 6527 2369 +3 2369 6527 6476 +3 2369 6476 2340 +3 2340 6476 6491 +3 2340 6491 2342 +3 2342 6491 6604 +3 2342 6604 2376 +3 2376 6604 6606 +3 2376 6606 2377 +3 2377 6606 6607 +3 2377 6607 2378 +3 2378 6607 6525 +3 2378 6525 2374 +3 2374 6525 6524 +3 2374 6524 2375 +3 2375 6524 6569 +3 2375 6569 2379 +3 2379 6569 6546 +3 2379 6546 2380 +3 2380 6546 6570 +3 2505 6390 2500 +3 2500 6390 6456 +3 2500 6456 2506 +3 2506 6456 6455 +3 2506 6455 2507 +3 2507 6455 6448 +3 2507 6448 2508 +3 2508 6448 6447 +3 2508 6447 2520 +3 2520 6447 6446 +3 2520 6446 2521 +3 2521 6446 6445 +3 2521 6445 2523 +3 2523 6445 6444 +3 2523 6444 2524 +3 2524 6444 6443 +3 2524 6443 2491 +3 2491 6443 6437 +3 2491 6437 2495 +3 2495 6437 6438 +3 2495 6438 2514 +3 2514 6438 6439 +3 2514 6439 2515 +3 2515 6439 6434 +3 2515 6434 2516 +3 2516 6434 6433 +3 2516 6433 2517 +3 2517 6433 6432 +3 2517 6432 2518 +3 2518 6432 6431 +3 2518 6431 2519 +3 2519 6431 6430 +3 2519 6430 2525 +3 2525 6430 6429 +3 2525 6429 2526 +3 2526 6429 6415 +3 2526 6415 2512 +3 2512 6415 6414 +3 2512 6414 2501 +3 2501 6414 6462 +3 2501 6462 2479 +3 2479 6462 6454 +3 2479 6454 2480 +3 2480 6454 6453 +3 2480 6453 2474 +3 2474 6453 6459 +3 2474 6459 2487 +3 2487 6459 6458 +3 2487 6458 2488 +3 2488 6458 6457 +3 2488 6457 2432 +3 2432 6457 6398 +3 2432 6398 2433 +3 2433 6398 6397 +3 2433 6397 2435 +3 2435 6397 6394 +3 2435 6394 2436 +3 2436 6394 6418 +3 2436 6418 2455 +3 2455 6418 6412 +3 2455 6412 2408 +3 2408 6412 6411 +3 2408 6411 2496 +3 2496 6411 6410 +3 2496 6410 2497 +3 2497 6410 6409 +3 2497 6409 2498 +3 2498 6409 6408 +3 2498 6408 2504 +3 2504 6408 6391 +3 2504 6391 2505 +3 2505 6391 6390 +3 2462 6342 2463 +3 2463 6342 6389 +3 2463 6389 2464 +3 2464 6389 6388 +3 2464 6388 2465 +3 2465 6388 6387 +3 2465 6387 2466 +3 2466 6387 6386 +3 2466 6386 2467 +3 2467 6386 6385 +3 2467 6385 2468 +3 2468 6385 6384 +3 2468 6384 2469 +3 2469 6384 6383 +3 2469 6383 2482 +3 2482 6383 6382 +3 2482 6382 2483 +3 2483 6382 6379 +3 2483 6379 2470 +3 2470 6379 6380 +3 2470 6380 2471 +3 2471 6380 6381 +3 2471 6381 2489 +3 2489 6381 6378 +3 2489 6378 2490 +3 2490 6378 6377 +3 2490 6377 2492 +3 2492 6377 6376 +3 2492 6376 2493 +3 2493 6376 6375 +3 2493 6375 2494 +3 2494 6375 6374 +3 2494 6374 2522 +3 2522 6374 6373 +3 2522 6373 2499 +3 2499 6373 6372 +3 2499 6372 2409 +3 2409 6372 6371 +3 2409 6371 2410 +3 2410 6371 6370 +3 2410 6370 2416 +3 2416 6370 6369 +3 2416 6369 2417 +3 2417 6369 6360 +3 2417 6360 2419 +3 2419 6360 6359 +3 2419 6359 2420 +3 2420 6359 6358 +3 2420 6358 2443 +3 2443 6358 6368 +3 2443 6368 2442 +3 2442 6368 6354 +3 2442 6354 2440 +3 2440 6354 6365 +3 2440 6365 2444 +3 2444 6365 6361 +3 2444 6361 2405 +3 2405 6361 6363 +3 2405 6363 2452 +3 2452 6363 6364 +3 2452 6364 2429 +3 2429 6364 6353 +3 2429 6353 2430 +3 2430 6353 6352 +3 2430 6352 2431 +3 2431 6352 6351 +3 2431 6351 2460 +3 2460 6351 6357 +3 2460 6357 2461 +3 2461 6357 6343 +3 2461 6343 2462 +3 2462 6343 6342 +3 2563 6276 2564 +3 2564 6276 6277 +3 2564 6277 2538 +3 2538 6277 6253 +3 2538 6253 2539 +3 2539 6253 6252 +3 2539 6252 2540 +3 2540 6252 6251 +3 2540 6251 2541 +3 2541 6251 6250 +3 2541 6250 2542 +3 2542 6250 6249 +3 2542 6249 2543 +3 2543 6249 6248 +3 2543 6248 2544 +3 2544 6248 6247 +3 2544 6247 2545 +3 2545 6247 6246 +3 2545 6246 2546 +3 2546 6246 6257 +3 2546 6257 2547 +3 2547 6257 6258 +3 2547 6258 2529 +3 2529 6258 6265 +3 2529 6265 2530 +3 2530 6265 6264 +3 2530 6264 2531 +3 2531 6264 6263 +3 2531 6263 2532 +3 2532 6263 6302 +3 2532 6302 2548 +3 2548 6302 6301 +3 2548 6301 2549 +3 2549 6301 6293 +3 2549 6293 2550 +3 2550 6293 6292 +3 2550 6292 2579 +3 2579 6292 6309 +3 2579 6309 2580 +3 2580 6309 6308 +3 2580 6308 2581 +3 2581 6308 6307 +3 2581 6307 2571 +3 2571 6307 6306 +3 2571 6306 2572 +3 2572 6306 6305 +3 2572 6305 2593 +3 2593 6305 6304 +3 2593 6304 2592 +3 2592 6304 6303 +3 2592 6303 2590 +3 2590 6303 6296 +3 2590 6296 2587 +3 2587 6296 6298 +3 2587 6298 2585 +3 2585 6298 6300 +3 2585 6300 2573 +3 2573 6300 6312 +3 2573 6312 2599 +3 2599 6312 6314 +3 2599 6314 2582 +3 2582 6314 6290 +3 2582 6290 2583 +3 2583 6290 6288 +3 2583 6288 2595 +3 2595 6288 6287 +3 2595 6287 2596 +3 2596 6287 6291 +3 2596 6291 2598 +3 2598 6291 6275 +3 2598 6275 2563 +3 2563 6275 6276 +3 2633 6183 2634 +3 2634 6183 6182 +3 2634 6182 2635 +3 2635 6182 6177 +3 2635 6177 2648 +3 2648 6177 6176 +3 2648 6176 2649 +3 2649 6176 6210 +3 2649 6210 2650 +3 2650 6210 6209 +3 2650 6209 2664 +3 2664 6209 6190 +3 2664 6190 2665 +3 2665 6190 6189 +3 2665 6189 2636 +3 2636 6189 6188 +3 2636 6188 2637 +3 2637 6188 6185 +3 2637 6185 2638 +3 2638 6185 6186 +3 2638 6186 2639 +3 2639 6186 6187 +3 2639 6187 2610 +3 2610 6187 6173 +3 2610 6173 2611 +3 2611 6173 6172 +3 2611 6172 2612 +3 2612 6172 6171 +3 2612 6171 2600 +3 2600 6171 6233 +3 2600 6233 2601 +3 2601 6233 6232 +3 2601 6232 2602 +3 2602 6232 6231 +3 2602 6231 2640 +3 2640 6231 6236 +3 2640 6236 2641 +3 2641 6236 6235 +3 2641 6235 2642 +3 2642 6235 6234 +3 2642 6234 2643 +3 2643 6234 6227 +3 2643 6227 2656 +3 2656 6227 6226 +3 2656 6226 2657 +3 2657 6226 6225 +3 2657 6225 2630 +3 2630 6225 6224 +3 2630 6224 2631 +3 2631 6224 6240 +3 2631 6240 2659 +3 2659 6240 6242 +3 2659 6242 2670 +3 2670 6242 6243 +3 2670 6243 2668 +3 2668 6243 6202 +3 2668 6202 2647 +3 2647 6202 6201 +3 2647 6201 2646 +3 2646 6201 6199 +3 2646 6199 2603 +3 2603 6199 6219 +3 2603 6219 2606 +3 2606 6219 6220 +3 2606 6220 2608 +3 2608 6220 6175 +3 2608 6175 2609 +3 2609 6175 6174 +3 2609 6174 2632 +3 2632 6174 6184 +3 2632 6184 2633 +3 2633 6184 6183 +3 2688 6108 2687 +3 2687 6108 6107 +3 2687 6107 2691 +3 2691 6107 6106 +3 2691 6106 2692 +3 2692 6106 6105 +3 2692 6105 2693 +3 2693 6105 6113 +3 2693 6113 2694 +3 2694 6113 6112 +3 2694 6112 2695 +3 2695 6112 6101 +3 2695 6101 2696 +3 2696 6101 6100 +3 2696 6100 2737 +3 2737 6100 6140 +3 2737 6140 2738 +3 2738 6140 6139 +3 2738 6139 2739 +3 2739 6139 6138 +3 2739 6138 2697 +3 2697 6138 6118 +3 2697 6118 2698 +3 2698 6118 6117 +3 2698 6117 2709 +3 2709 6117 6155 +3 2709 6155 2710 +3 2710 6155 6154 +3 2710 6154 2675 +3 2675 6154 6147 +3 2675 6147 2673 +3 2673 6147 6146 +3 2673 6146 2674 +3 2674 6146 6145 +3 2674 6145 2676 +3 2676 6145 6144 +3 2676 6144 2677 +3 2677 6144 6160 +3 2677 6160 2678 +3 2678 6160 6159 +3 2678 6159 2679 +3 2679 6159 6158 +3 2679 6158 2712 +3 2712 6158 6157 +3 2712 6157 2713 +3 2713 6157 6156 +3 2713 6156 2714 +3 2714 6156 6165 +3 2714 6165 2715 +3 2715 6165 6161 +3 2715 6161 2716 +3 2716 6161 6170 +3 2716 6170 2733 +3 2733 6170 6169 +3 2733 6169 2734 +3 2734 6169 6167 +3 2734 6167 2725 +3 2725 6167 6166 +3 2725 6166 2743 +3 2743 6166 6135 +3 2743 6135 2741 +3 2741 6135 6134 +3 2741 6134 2729 +3 2729 6134 6127 +3 2729 6127 2728 +3 2728 6127 6116 +3 2728 6116 2684 +3 2684 6116 6115 +3 2684 6115 2690 +3 2690 6115 6114 +3 2690 6114 2688 +3 2688 6114 6108 +3 1704 6026 1705 +3 1705 6026 6041 +3 1705 6041 1706 +3 1706 6041 6040 +3 1706 6040 1707 +3 1707 6040 6033 +3 1707 6033 1708 +3 1708 6033 6032 +3 1708 6032 1684 +3 1684 6032 6031 +3 1684 6031 1685 +3 1685 6031 6025 +3 1685 6025 1686 +3 1686 6025 6024 +3 1686 6024 1687 +3 1687 6024 6023 +3 1687 6023 1696 +3 1696 6023 6039 +3 1696 6039 1697 +3 1697 6039 6038 +3 1697 6038 1698 +3 1698 6038 6037 +3 1698 6037 1691 +3 1691 6037 6030 +3 1691 6030 1692 +3 1692 6030 6029 +3 1692 6029 1693 +3 1693 6029 6028 +3 1693 6028 1688 +3 1688 6028 6048 +3 1688 6048 1689 +3 1689 6048 6047 +3 1689 6047 1694 +3 1694 6047 6043 +3 1694 6043 1695 +3 1695 6043 6042 +3 1695 6042 1690 +3 1690 6042 6059 +3 1690 6059 1709 +3 1709 6059 6058 +3 1709 6058 1710 +3 1710 6058 6057 +3 1710 6057 1711 +3 1711 6057 6046 +3 1711 6046 1712 +3 1712 6046 6045 +3 1712 6045 1713 +3 1713 6045 6056 +3 1713 6056 1714 +3 1714 6056 6055 +3 1714 6055 1718 +3 1718 6055 6052 +3 1718 6052 1719 +3 1719 6052 6053 +3 1719 6053 1720 +3 1720 6053 6054 +3 1720 6054 1715 +3 1715 6054 6051 +3 1715 6051 1716 +3 1716 6051 6050 +3 1716 6050 1717 +3 1717 6050 6049 +3 1717 6049 1699 +3 1699 6049 6036 +3 1699 6036 1700 +3 1700 6036 6035 +3 1700 6035 1702 +3 1702 6035 6034 +3 1702 6034 1703 +3 1703 6034 6027 +3 1703 6027 1704 +3 1704 6027 6026 +3 1755 6007 1756 +3 1756 6007 6006 +3 1756 6006 1757 +3 1757 6006 6005 +3 1757 6005 1737 +3 1737 6005 6004 +3 1737 6004 1738 +3 1738 6004 6003 +3 1738 6003 1739 +3 1739 6003 6002 +3 1739 6002 1740 +3 1740 6002 6001 +3 1740 6001 1741 +3 1741 6001 6000 +3 1741 6000 1742 +3 1742 6000 5994 +3 1742 5994 1727 +3 1727 5994 5987 +3 1727 5987 1721 +3 1721 5987 5986 +3 1721 5986 1722 +3 1722 5986 6017 +3 1722 6017 1723 +3 1723 6017 6016 +3 1723 6016 1743 +3 1743 6016 6012 +3 1743 6012 1744 +3 1744 6012 6011 +3 1744 6011 1724 +3 1724 6011 6010 +3 1724 6010 1725 +3 1725 6010 6009 +3 1725 6009 1726 +3 1726 6009 6020 +3 1726 6020 1730 +3 1730 6020 6019 +3 1730 6019 1729 +3 1729 6019 6018 +3 1729 6018 1728 +3 1728 6018 6022 +3 1728 6022 1745 +3 1745 6022 6021 +3 1745 6021 1746 +3 1746 6021 6015 +3 1746 6015 1731 +3 1731 6015 6014 +3 1731 6014 1732 +3 1732 6014 6013 +3 1732 6013 1747 +3 1747 6013 5999 +3 1747 5999 1748 +3 1748 5999 5998 +3 1748 5998 1733 +3 1733 5998 5996 +3 1733 5996 1735 +3 1735 5996 5995 +3 1735 5995 1736 +3 1736 5995 5993 +3 1736 5993 1749 +3 1749 5993 5992 +3 1749 5992 1750 +3 1750 5992 5991 +3 1750 5991 1751 +3 1751 5991 5990 +3 1751 5990 1752 +3 1752 5990 5989 +3 1752 5989 1753 +3 1753 5989 5988 +3 1753 5988 1754 +3 1754 5988 6008 +3 1754 6008 1755 +3 1755 6008 6007 +3 1790 5946 1789 +3 1789 5946 5938 +3 1789 5938 1788 +3 1788 5938 5977 +3 1788 5977 1791 +3 1791 5977 5955 +3 1791 5955 1792 +3 1792 5955 5954 +3 1792 5954 1778 +3 1778 5954 5952 +3 1778 5952 1779 +3 1779 5952 5951 +3 1779 5951 1793 +3 1793 5951 5916 +3 1793 5916 1794 +3 1794 5916 5915 +3 1794 5915 1758 +3 1758 5915 5914 +3 1758 5914 1759 +3 1759 5914 5913 +3 1759 5913 1762 +3 1762 5913 5935 +3 1762 5935 1766 +3 1766 5935 5934 +3 1766 5934 1767 +3 1767 5934 5933 +3 1767 5933 1768 +3 1768 5933 5932 +3 1768 5932 1769 +3 1769 5932 5950 +3 1769 5950 1770 +3 1770 5950 5949 +3 1770 5949 1771 +3 1771 5949 5948 +3 1771 5948 1772 +3 1772 5948 5962 +3 1772 5962 1773 +3 1773 5962 5961 +3 1773 5961 1774 +3 1774 5961 5960 +3 1774 5960 1760 +3 1760 5960 5923 +3 1760 5923 1761 +3 1761 5923 5922 +3 1761 5922 1763 +3 1763 5922 5921 +3 1763 5921 1764 +3 1764 5921 5920 +3 1764 5920 1765 +3 1765 5920 5918 +3 1765 5918 1775 +3 1775 5918 5917 +3 1775 5917 1776 +3 1776 5917 5931 +3 1776 5931 1777 +3 1777 5931 5930 +3 1777 5930 1780 +3 1780 5930 5929 +3 1780 5929 1782 +3 1782 5929 5928 +3 1782 5928 1783 +3 1783 5928 5927 +3 1783 5927 1784 +3 1784 5927 5926 +3 1784 5926 1785 +3 1785 5926 5983 +3 1785 5983 1786 +3 1786 5983 5981 +3 1786 5981 1787 +3 1787 5981 5980 +3 1787 5980 1790 +3 1790 5980 5946 +3 1831 5971 1810 +3 1810 5971 5970 +3 1810 5970 1811 +3 1811 5970 5969 +3 1811 5969 1800 +3 1800 5969 5968 +3 1800 5968 1801 +3 1801 5968 5967 +3 1801 5967 1802 +3 1802 5967 5966 +3 1802 5966 1803 +3 1803 5966 5965 +3 1803 5965 1804 +3 1804 5965 5964 +3 1804 5964 1812 +3 1812 5964 5963 +3 1812 5963 1813 +3 1813 5963 5956 +3 1813 5956 1805 +3 1805 5956 5953 +3 1805 5953 1814 +3 1814 5953 5979 +3 1814 5979 1815 +3 1815 5979 5978 +3 1815 5978 1816 +3 1816 5978 5976 +3 1816 5976 1817 +3 1817 5976 5975 +3 1817 5975 1818 +3 1818 5975 5939 +3 1818 5939 1819 +3 1819 5939 5937 +3 1819 5937 1827 +3 1827 5937 5936 +3 1827 5936 1828 +3 1828 5936 5945 +3 1828 5945 1829 +3 1829 5945 5947 +3 1829 5947 1797 +3 1797 5947 5982 +3 1797 5982 1798 +3 1798 5982 5984 +3 1798 5984 1799 +3 1799 5984 5985 +3 1799 5985 1795 +3 1795 5985 5944 +3 1795 5944 1796 +3 1796 5944 5943 +3 1796 5943 1806 +3 1806 5943 5974 +3 1806 5974 1807 +3 1807 5974 5973 +3 1807 5973 1808 +3 1808 5973 5972 +3 1808 5972 1820 +3 1820 5972 5959 +3 1820 5959 1821 +3 1821 5959 5958 +3 1821 5958 1822 +3 1822 5958 5957 +3 1822 5957 1823 +3 1823 5957 5925 +3 1823 5925 1824 +3 1824 5925 5924 +3 1824 5924 1825 +3 1825 5924 5942 +3 1825 5942 1826 +3 1826 5942 5941 +3 1826 5941 1830 +3 1830 5941 5940 +3 1830 5940 1831 +3 1831 5940 5971 +3 1882 5876 1867 +3 1867 5876 5910 +3 1867 5910 1865 +3 1865 5910 5909 +3 1865 5909 1883 +3 1883 5909 5902 +3 1883 5902 1884 +3 1884 5902 5901 +3 1884 5901 1874 +3 1874 5901 5900 +3 1874 5900 1873 +3 1873 5900 5899 +3 1873 5899 1871 +3 1871 5899 5898 +3 1871 5898 1870 +3 1870 5898 5897 +3 1870 5897 1854 +3 1854 5897 5890 +3 1854 5890 1855 +3 1855 5890 5891 +3 1855 5891 1875 +3 1875 5891 5892 +3 1875 5892 1876 +3 1876 5892 5881 +3 1876 5881 1877 +3 1877 5881 5880 +3 1877 5880 1878 +3 1878 5880 5879 +3 1878 5879 1879 +3 1879 5879 5878 +3 1879 5878 1880 +3 1880 5878 5877 +3 1880 5877 1887 +3 1887 5877 5896 +3 1887 5896 1888 +3 1888 5896 5895 +3 1888 5895 1889 +3 1889 5895 5912 +3 1889 5912 1856 +3 1856 5912 5911 +3 1856 5911 1857 +3 1857 5911 5908 +3 1857 5908 1858 +3 1858 5908 5907 +3 1858 5907 1859 +3 1859 5907 5906 +3 1859 5906 1860 +3 1860 5906 5905 +3 1860 5905 1861 +3 1861 5905 5904 +3 1861 5904 1868 +3 1868 5904 5903 +3 1868 5903 1869 +3 1869 5903 5889 +3 1869 5889 1845 +3 1845 5889 5894 +3 1845 5894 1846 +3 1846 5894 5893 +3 1846 5893 1841 +3 1841 5893 5887 +3 1841 5887 1840 +3 1840 5887 5886 +3 1840 5886 1862 +3 1862 5886 5885 +3 1862 5885 1863 +3 1863 5885 5884 +3 1863 5884 1864 +3 1864 5884 5883 +3 1864 5883 1881 +3 1881 5883 5882 +3 1881 5882 1882 +3 1882 5882 5876 +3 1903 5839 1904 +3 1904 5839 5855 +3 1904 5855 1848 +3 1848 5855 5854 +3 1848 5854 1849 +3 1849 5854 5850 +3 1849 5850 1850 +3 1850 5850 5849 +3 1850 5849 1834 +3 1834 5849 5848 +3 1834 5848 1835 +3 1835 5848 5845 +3 1835 5845 1836 +3 1836 5845 5846 +3 1836 5846 1837 +3 1837 5846 5847 +3 1837 5847 1842 +3 1842 5847 5853 +3 1842 5853 1843 +3 1843 5853 5852 +3 1843 5852 1844 +3 1844 5852 5851 +3 1844 5851 1832 +3 1832 5851 5840 +3 1832 5840 1833 +3 1833 5840 5841 +3 1833 5841 1851 +3 1851 5841 5842 +3 1851 5842 1852 +3 1852 5842 5857 +3 1852 5857 1853 +3 1853 5857 5856 +3 1853 5856 1872 +3 1872 5856 5844 +3 1872 5844 1866 +3 1866 5844 5843 +3 1866 5843 1838 +3 1838 5843 5875 +3 1838 5875 1839 +3 1839 5875 5874 +3 1839 5874 1890 +3 1890 5874 5873 +3 1890 5873 1891 +3 1891 5873 5868 +3 1891 5868 1892 +3 1892 5868 5867 +3 1892 5867 1885 +3 1885 5867 5872 +3 1885 5872 1886 +3 1886 5872 5871 +3 1886 5871 1895 +3 1895 5871 5864 +3 1895 5864 1894 +3 1894 5864 5866 +3 1894 5866 1893 +3 1893 5866 5870 +3 1893 5870 1896 +3 1896 5870 5869 +3 1896 5869 1897 +3 1897 5869 5863 +3 1897 5863 1898 +3 1898 5863 5862 +3 1898 5862 1899 +3 1899 5862 5861 +3 1899 5861 1900 +3 1900 5861 5860 +3 1900 5860 1901 +3 1901 5860 5859 +3 1901 5859 1902 +3 1902 5859 5858 +3 1902 5858 1903 +3 1903 5858 5839 +3 1933 4147 1934 +3 1934 4147 4146 +3 1934 4146 1935 +3 1935 4146 5823 +3 1935 5823 1936 +3 1936 5823 5822 +3 1936 5822 1937 +3 1937 5822 5812 +3 1937 5812 1938 +3 1938 5812 5811 +3 1938 5811 1910 +3 1910 5811 5830 +3 1910 5830 1911 +3 1911 5830 5829 +3 1911 5829 1912 +3 1912 5829 5828 +3 1912 5828 1939 +3 1939 5828 5835 +3 1939 5835 1940 +3 1940 5835 5834 +3 1940 5834 1941 +3 1941 5834 5833 +3 1941 5833 1925 +3 1925 5833 5821 +3 1925 5821 1926 +3 1926 5821 5820 +3 1926 5820 1927 +3 1927 5820 5819 +3 1927 5819 1928 +3 1928 5819 5827 +3 1928 5827 1929 +3 1929 5827 5826 +3 1929 5826 1913 +3 1913 5826 5818 +3 1913 5818 1914 +3 1914 5818 5817 +3 1914 5817 1915 +3 1915 5817 5838 +3 1915 5838 1916 +3 1916 5838 5837 +3 1916 5837 1917 +3 1917 5837 5836 +3 1917 5836 1918 +3 1918 5836 5825 +3 1918 5825 1919 +3 1919 5825 5824 +3 1919 5824 1920 +3 1920 5824 5832 +3 1920 5832 1921 +3 1921 5832 5831 +3 1921 5831 1930 +3 1930 5831 5813 +3 1930 5813 1931 +3 1931 5813 5815 +3 1931 5815 1932 +3 1932 5815 5816 +3 1932 5816 1905 +3 1905 5816 5808 +3 1905 5808 1906 +3 1906 5808 5807 +3 1906 5807 1908 +3 1908 5807 5806 +3 1908 5806 1909 +3 1909 5806 5805 +3 1909 5805 1922 +3 1922 5805 5810 +3 1922 5810 1923 +3 1923 5810 5809 +3 1923 5809 1924 +3 1924 5809 5804 +3 1924 5804 1933 +3 1933 5804 4147 +3 1964 5770 1965 +3 1965 5770 5769 +3 1965 5769 1966 +3 1966 5769 5768 +3 1966 5768 1948 +3 1948 5768 5767 +3 1948 5767 1949 +3 1949 5767 5784 +3 1949 5784 1967 +3 1967 5784 5783 +3 1967 5783 1968 +3 1968 5783 5780 +3 1968 5780 1969 +3 1969 5780 5781 +3 1969 5781 1976 +3 1976 5781 5782 +3 1976 5782 1977 +3 1977 5782 5798 +3 1977 5798 1978 +3 1978 5798 5797 +3 1978 5797 1970 +3 1970 5797 5796 +3 1970 5796 1971 +3 1971 5796 5792 +3 1971 5792 1974 +3 1974 5792 5791 +3 1974 5791 1975 +3 1975 5791 5790 +3 1975 5790 1942 +3 1942 5790 5779 +3 1942 5779 1943 +3 1943 5779 5778 +3 1943 5778 1944 +3 1944 5778 5803 +3 1944 5803 1953 +3 1953 5803 5802 +3 1953 5802 1954 +3 1954 5802 5801 +3 1954 5801 1955 +3 1955 5801 5800 +3 1955 5800 1972 +3 1972 5800 5799 +3 1972 5799 1973 +3 1973 5799 5795 +3 1973 5795 1950 +3 1950 5795 5794 +3 1950 5794 1951 +3 1951 5794 5793 +3 1951 5793 1952 +3 1952 5793 5789 +3 1952 5789 1958 +3 1958 5789 5788 +3 1958 5788 1957 +3 1957 5788 5786 +3 1957 5786 1956 +3 1956 5786 5785 +3 1956 5785 1959 +3 1959 5785 5777 +3 1959 5777 1960 +3 1960 5777 5776 +3 1960 5776 1946 +3 1946 5776 5775 +3 1946 5775 1947 +3 1947 5775 5774 +3 1947 5774 1961 +3 1961 5774 5773 +3 1961 5773 1962 +3 1962 5773 5772 +3 1962 5772 1963 +3 1963 5772 5771 +3 1963 5771 1964 +3 1964 5771 5770 +3 1997 5738 1998 +3 1998 5738 5737 +3 1998 5737 1999 +3 1999 5737 5736 +3 1999 5736 1979 +3 1979 5736 5735 +3 1979 5735 1980 +3 1980 5735 5743 +3 1980 5743 2000 +3 2000 5743 5742 +3 2000 5742 2001 +3 2001 5742 5730 +3 2001 5730 2002 +3 2002 5730 5729 +3 2002 5729 2013 +3 2013 5729 5760 +3 2013 5760 2014 +3 2014 5760 5759 +3 2014 5759 2015 +3 2015 5759 5758 +3 2015 5758 2003 +3 2003 5758 5747 +3 2003 5747 2004 +3 2004 5747 5746 +3 2004 5746 2008 +3 2008 5746 5757 +3 2008 5757 2009 +3 2009 5757 5756 +3 2009 5756 1984 +3 1984 5756 5745 +3 1984 5745 1985 +3 1985 5745 5744 +3 1985 5744 1986 +3 1986 5744 5766 +3 1986 5766 1987 +3 1987 5766 5765 +3 1987 5765 1988 +3 1988 5765 5764 +3 1988 5764 1989 +3 1989 5764 5755 +3 1989 5755 1990 +3 1990 5755 5754 +3 1990 5754 1991 +3 1991 5754 5753 +3 1991 5753 1992 +3 1992 5753 5752 +3 1992 5752 2005 +3 2005 5752 5751 +3 2005 5751 2006 +3 2006 5751 5749 +3 2006 5749 2007 +3 2007 5749 5748 +3 2007 5748 2010 +3 2010 5748 5763 +3 2010 5763 2011 +3 2011 5763 5762 +3 2011 5762 2012 +3 2012 5762 5761 +3 2012 5761 1981 +3 1981 5761 5741 +3 1981 5741 1982 +3 1982 5741 5740 +3 1982 5740 1995 +3 1995 5740 5739 +3 1995 5739 1996 +3 1996 5739 5731 +3 1996 5731 1993 +3 1993 5731 5733 +3 1993 5733 1994 +3 1994 5733 5734 +3 1994 5734 1997 +3 1997 5734 5738 +3 1339 5668 1340 +3 1340 5668 5667 +3 1340 5667 1341 +3 1341 5667 5661 +3 1341 5661 1322 +3 1322 5661 5660 +3 1322 5660 1323 +3 1323 5660 5666 +3 1323 5666 1332 +3 1332 5666 5665 +3 1332 5665 1333 +3 1333 5665 5656 +3 1333 5656 1334 +3 1334 5656 5655 +3 1334 5655 1342 +3 1342 5655 5691 +3 1342 5691 1343 +3 1343 5691 5690 +3 1343 5690 1344 +3 1344 5690 5689 +3 1344 5689 1345 +3 1345 5689 5683 +3 1345 5683 1346 +3 1346 5683 5682 +3 1346 5682 1347 +3 1347 5682 5688 +3 1347 5688 1348 +3 1348 5688 5687 +3 1348 5687 1349 +3 1349 5687 5681 +3 1349 5681 1350 +3 1350 5681 5680 +3 1350 5680 1335 +3 1335 5680 5679 +3 1335 5679 1336 +3 1336 5679 5678 +3 1336 5678 1337 +3 1337 5678 5686 +3 1337 5686 1338 +3 1338 5686 5685 +3 1338 5685 1324 +3 1324 5685 5684 +3 1324 5684 1325 +3 1325 5684 5675 +3 1325 5675 1326 +3 1326 5675 5674 +3 1326 5674 1327 +3 1327 5674 5677 +3 1327 5677 1328 +3 1328 5677 5676 +3 1328 5676 1329 +3 1329 5676 5670 +3 1329 5670 1330 +3 1330 5670 5672 +3 1330 5672 1331 +3 1331 5672 5673 +3 1331 5673 1314 +3 1314 5673 5664 +3 1314 5664 1315 +3 1315 5664 5663 +3 1315 5663 1320 +3 1320 5663 5662 +3 1320 5662 1321 +3 1321 5662 5659 +3 1321 5659 1317 +3 1317 5659 5658 +3 1317 5658 1318 +3 1318 5658 5657 +3 1318 5657 1319 +3 1319 5657 5669 +3 1319 5669 1339 +3 1339 5669 5668 +3 1375 5649 1379 +3 1379 5649 5648 +3 1379 5648 1380 +3 1380 5648 5647 +3 1380 5647 1381 +3 1381 5647 5640 +3 1381 5640 1382 +3 1382 5640 5639 +3 1382 5639 1383 +3 1383 5639 5638 +3 1383 5638 1384 +3 1384 5638 5637 +3 1384 5637 1385 +3 1385 5637 5636 +3 1385 5636 1386 +3 1386 5636 5635 +3 1386 5635 1387 +3 1387 5635 5646 +3 1387 5646 1378 +3 1378 5646 5645 +3 1378 5645 1356 +3 1356 5645 5644 +3 1356 5644 1357 +3 1357 5644 5643 +3 1357 5643 1358 +3 1358 5643 5651 +3 1358 5651 1359 +3 1359 5651 5650 +3 1359 5650 1362 +3 1362 5650 5623 +3 1362 5623 1363 +3 1363 5623 5622 +3 1363 5622 1360 +3 1360 5622 5654 +3 1360 5654 1361 +3 1361 5654 5653 +3 1361 5653 1364 +3 1364 5653 5652 +3 1364 5652 1365 +3 1365 5652 5634 +3 1365 5634 1366 +3 1366 5634 5633 +3 1366 5633 1367 +3 1367 5633 5632 +3 1367 5632 1368 +3 1368 5632 5631 +3 1368 5631 1369 +3 1369 5631 5630 +3 1369 5630 1370 +3 1370 5630 5629 +3 1370 5629 1371 +3 1371 5629 5620 +3 1371 5620 1351 +3 1351 5620 5619 +3 1351 5619 1352 +3 1352 5619 5618 +3 1352 5618 1354 +3 1354 5618 5642 +3 1354 5642 1355 +3 1355 5642 5641 +3 1355 5641 1376 +3 1376 5641 5628 +3 1376 5628 1377 +3 1377 5628 5627 +3 1377 5627 1372 +3 1372 5627 5626 +3 1372 5626 1373 +3 1373 5626 5625 +3 1373 5625 1374 +3 1374 5625 5624 +3 1374 5624 1375 +3 1375 5624 5649 +3 1407 5583 1408 +3 1408 5583 5572 +3 1408 5572 1409 +3 1409 5572 5571 +3 1409 5571 1410 +3 1410 5571 5569 +3 1410 5569 1411 +3 1411 5569 5568 +3 1411 5568 1412 +3 1412 5568 5574 +3 1412 5574 1413 +3 1413 5574 5579 +3 1413 5579 1414 +3 1414 5579 5601 +3 1414 5601 1417 +3 1417 5601 5590 +3 1417 5590 1418 +3 1418 5590 5589 +3 1418 5589 1415 +3 1415 5589 5598 +3 1415 5598 1416 +3 1416 5598 5597 +3 1416 5597 1421 +3 1421 5597 5596 +3 1421 5596 1422 +3 1422 5596 5595 +3 1422 5595 1419 +3 1419 5595 5594 +3 1419 5594 1420 +3 1420 5594 5588 +3 1420 5588 1423 +3 1423 5588 5587 +3 1423 5587 1424 +3 1424 5587 5586 +3 1424 5586 1392 +3 1392 5586 5593 +3 1392 5593 1393 +3 1393 5593 5592 +3 1393 5592 1399 +3 1399 5592 5591 +3 1399 5591 1400 +3 1400 5591 5582 +3 1400 5582 1401 +3 1401 5582 5581 +3 1401 5581 1402 +3 1402 5581 5580 +3 1402 5580 1403 +3 1403 5580 5552 +3 1403 5552 1388 +3 1388 5552 5550 +3 1388 5550 1389 +3 1389 5550 5549 +3 1389 5549 1390 +3 1390 5549 5564 +3 1390 5564 1391 +3 1391 5564 5563 +3 1391 5563 1394 +3 1394 5563 5562 +3 1394 5562 1396 +3 1396 5562 5561 +3 1396 5561 1397 +3 1397 5561 5567 +3 1397 5567 1398 +3 1398 5567 5566 +3 1398 5566 1404 +3 1404 5566 5565 +3 1404 5565 1405 +3 1405 5565 5585 +3 1405 5585 1406 +3 1406 5585 5584 +3 1406 5584 1407 +3 1407 5584 5583 +3 1444 5547 1445 +3 1445 5547 5617 +3 1445 5617 1446 +3 1446 5617 5616 +3 1446 5616 1447 +3 1447 5616 5615 +3 1447 5615 1448 +3 1448 5615 5614 +3 1448 5614 1449 +3 1449 5614 5613 +3 1449 5613 1450 +3 1450 5613 5612 +3 1450 5612 1451 +3 1451 5612 5611 +3 1451 5611 1454 +3 1454 5611 5610 +3 1454 5610 1455 +3 1455 5610 5607 +3 1455 5607 1452 +3 1452 5607 5608 +3 1452 5608 1453 +3 1453 5608 5609 +3 1453 5609 1458 +3 1458 5609 5606 +3 1458 5606 1459 +3 1459 5606 5605 +3 1459 5605 1456 +3 1456 5605 5604 +3 1456 5604 1457 +3 1457 5604 5603 +3 1457 5603 1460 +3 1460 5603 5602 +3 1460 5602 1461 +3 1461 5602 5600 +3 1461 5600 1428 +3 1428 5600 5599 +3 1428 5599 1429 +3 1429 5599 5578 +3 1429 5578 1435 +3 1435 5578 5577 +3 1435 5577 1436 +3 1436 5577 5576 +3 1436 5576 1437 +3 1437 5576 5575 +3 1437 5575 1438 +3 1438 5575 5570 +3 1438 5570 1439 +3 1439 5570 5573 +3 1439 5573 1425 +3 1425 5573 5556 +3 1425 5556 1426 +3 1426 5556 5555 +3 1426 5555 1427 +3 1427 5555 5546 +3 1427 5546 1430 +3 1430 5546 5545 +3 1430 5545 1431 +3 1431 5545 5560 +3 1431 5560 1433 +3 1433 5560 5559 +3 1433 5559 1434 +3 1434 5559 5554 +3 1434 5554 1440 +3 1440 5554 5553 +3 1440 5553 1441 +3 1441 5553 5558 +3 1441 5558 1442 +3 1442 5558 5557 +3 1442 5557 1443 +3 1443 5557 5548 +3 1443 5548 1444 +3 1444 5548 5547 +3 1496 5508 1492 +3 1492 5508 5544 +3 1492 5544 1497 +3 1497 5544 5543 +3 1497 5543 1498 +3 1498 5543 5542 +3 1498 5542 1499 +3 1499 5542 5541 +3 1499 5541 1500 +3 1500 5541 5540 +3 1500 5540 1501 +3 1501 5540 5539 +3 1501 5539 1503 +3 1503 5539 5538 +3 1503 5538 1504 +3 1504 5538 5537 +3 1504 5537 1505 +3 1505 5537 5534 +3 1505 5534 1506 +3 1506 5534 5535 +3 1506 5535 1507 +3 1507 5535 5536 +3 1507 5536 1508 +3 1508 5536 5533 +3 1508 5533 1509 +3 1509 5533 5532 +3 1509 5532 1510 +3 1510 5532 5531 +3 1510 5531 1511 +3 1511 5531 5530 +3 1511 5530 1512 +3 1512 5530 5529 +3 1512 5529 1515 +3 1515 5529 5528 +3 1515 5528 1516 +3 1516 5528 5527 +3 1516 5527 1464 +3 1464 5527 5526 +3 1464 5526 1475 +3 1475 5526 5525 +3 1475 5525 1476 +3 1476 5525 5524 +3 1476 5524 1477 +3 1477 5524 5523 +3 1477 5523 1478 +3 1478 5523 5522 +3 1478 5522 1479 +3 1479 5522 5521 +3 1479 5521 1480 +3 1480 5521 5520 +3 1480 5520 1493 +3 1493 5520 5519 +3 1493 5519 1494 +3 1494 5519 5516 +3 1494 5516 1483 +3 1483 5516 5518 +3 1483 5518 1481 +3 1481 5518 5517 +3 1481 5517 1487 +3 1487 5517 5514 +3 1487 5514 1486 +3 1486 5514 5513 +3 1486 5513 1488 +3 1488 5513 5512 +3 1488 5512 1489 +3 1489 5512 5511 +3 1489 5511 1490 +3 1490 5511 5510 +3 1490 5510 1495 +3 1495 5510 5509 +3 1495 5509 1496 +3 1496 5509 5508 +3 1530 5474 1531 +3 1531 5474 5485 +3 1531 5485 1532 +3 1532 5485 5484 +3 1532 5484 1533 +3 1533 5484 5483 +3 1533 5483 1534 +3 1534 5483 5482 +3 1534 5482 1465 +3 1465 5482 5481 +3 1465 5481 1466 +3 1466 5481 5473 +3 1466 5473 1467 +3 1467 5473 5472 +3 1467 5472 1468 +3 1468 5472 5471 +3 1468 5471 1469 +3 1469 5471 5480 +3 1469 5480 1470 +3 1470 5480 5479 +3 1470 5479 1471 +3 1471 5479 5478 +3 1471 5478 1462 +3 1462 5478 5477 +3 1462 5477 1463 +3 1463 5477 5476 +3 1463 5476 1472 +3 1472 5476 5475 +3 1472 5475 1473 +3 1473 5475 5507 +3 1473 5507 1474 +3 1474 5507 5506 +3 1474 5506 1502 +3 1502 5506 5496 +3 1502 5496 1491 +3 1491 5496 5495 +3 1491 5495 1484 +3 1484 5495 5505 +3 1484 5505 1485 +3 1485 5505 5504 +3 1485 5504 1517 +3 1517 5504 5503 +3 1517 5503 1518 +3 1518 5503 5500 +3 1518 5500 1519 +3 1519 5500 5499 +3 1519 5499 1513 +3 1513 5499 5502 +3 1513 5502 1514 +3 1514 5502 5501 +3 1514 5501 1522 +3 1522 5501 5492 +3 1522 5492 1521 +3 1521 5492 5494 +3 1521 5494 1520 +3 1520 5494 5498 +3 1520 5498 1523 +3 1523 5498 5497 +3 1523 5497 1524 +3 1524 5497 5491 +3 1524 5491 1525 +3 1525 5491 5490 +3 1525 5490 1526 +3 1526 5490 5489 +3 1526 5489 1527 +3 1527 5489 5488 +3 1527 5488 1528 +3 1528 5488 5487 +3 1528 5487 1529 +3 1529 5487 5486 +3 1529 5486 1530 +3 1530 5486 5474 +3 1570 5449 1571 +3 1571 5449 5448 +3 1571 5448 1561 +3 1561 5448 5444 +3 1561 5444 1562 +3 1562 5444 5443 +3 1562 5443 1563 +3 1563 5443 5442 +3 1563 5442 1544 +3 1544 5442 5441 +3 1544 5441 1545 +3 1545 5441 5440 +3 1545 5440 1546 +3 1546 5440 5439 +3 1546 5439 1547 +3 1547 5439 5438 +3 1547 5438 1535 +3 1535 5438 5437 +3 1535 5437 1536 +3 1536 5437 5436 +3 1536 5436 1540 +3 1540 5436 5435 +3 1540 5435 1537 +3 1537 5435 5434 +3 1537 5434 1538 +3 1538 5434 5465 +3 1538 5465 1548 +3 1548 5465 5464 +3 1548 5464 1549 +3 1549 5464 5463 +3 1549 5463 1550 +3 1550 5463 5462 +3 1550 5462 1551 +3 1551 5462 5461 +3 1551 5461 1552 +3 1552 5461 5460 +3 1552 5460 1539 +3 1539 5460 5470 +3 1539 5470 1555 +3 1555 5470 5469 +3 1555 5469 1556 +3 1556 5469 5468 +3 1556 5468 1557 +3 1557 5468 5459 +3 1557 5459 1558 +3 1558 5459 5458 +3 1558 5458 1559 +3 1559 5458 5467 +3 1559 5467 1560 +3 1560 5467 5466 +3 1560 5466 1564 +3 1564 5466 5457 +3 1564 5457 1565 +3 1565 5457 5456 +3 1565 5456 1553 +3 1553 5456 5454 +3 1553 5454 1554 +3 1554 5454 5453 +3 1554 5453 1541 +3 1541 5453 5445 +3 1541 5445 1542 +3 1542 5445 5446 +3 1542 5446 1566 +3 1566 5446 5447 +3 1566 5447 1567 +3 1567 5447 5452 +3 1567 5452 1568 +3 1568 5452 5451 +3 1568 5451 1569 +3 1569 5451 5450 +3 1569 5450 1570 +3 1570 5450 5449 +3 1590 5402 1589 +3 1589 5402 5401 +3 1589 5401 1592 +3 1592 5401 5400 +3 1592 5400 1593 +3 1593 5400 5418 +3 1593 5418 1594 +3 1594 5418 5417 +3 1594 5417 1605 +3 1605 5417 5416 +3 1605 5416 1606 +3 1606 5416 5415 +3 1606 5415 1575 +3 1575 5415 5414 +3 1575 5414 1576 +3 1576 5414 5408 +3 1576 5408 1580 +3 1580 5408 5407 +3 1580 5407 1581 +3 1581 5407 5409 +3 1581 5409 1582 +3 1582 5409 5413 +3 1582 5413 1583 +3 1583 5413 5412 +3 1583 5412 1584 +3 1584 5412 5411 +3 1584 5411 1585 +3 1585 5411 5410 +3 1585 5410 1586 +3 1586 5410 5430 +3 1586 5430 1587 +3 1587 5430 5429 +3 1587 5429 1588 +3 1588 5429 5428 +3 1588 5428 1595 +3 1595 5428 5433 +3 1595 5433 1596 +3 1596 5433 5432 +3 1596 5432 1597 +3 1597 5432 5431 +3 1597 5431 1598 +3 1598 5431 5427 +3 1598 5427 1607 +3 1607 5427 5426 +3 1607 5426 1608 +3 1608 5426 5425 +3 1608 5425 1599 +3 1599 5425 5424 +3 1599 5424 1600 +3 1600 5424 5423 +3 1600 5423 1601 +3 1601 5423 5422 +3 1601 5422 1602 +3 1602 5422 5421 +3 1602 5421 1603 +3 1603 5421 5420 +3 1603 5420 1604 +3 1604 5420 5419 +3 1604 5419 1572 +3 1572 5419 5406 +3 1572 5406 1573 +3 1573 5406 5405 +3 1573 5405 1577 +3 1577 5405 5404 +3 1577 5404 1578 +3 1578 5404 5399 +3 1578 5399 1579 +3 1579 5399 5398 +3 1579 5398 1591 +3 1591 5398 5403 +3 1591 5403 1590 +3 1590 5403 5402 +3 1624 5369 1625 +3 1625 5369 5368 +3 1625 5368 1626 +3 1626 5368 5367 +3 1626 5367 1609 +3 1609 5367 5366 +3 1609 5366 1610 +3 1610 5366 5374 +3 1610 5374 1627 +3 1627 5374 5373 +3 1627 5373 1628 +3 1628 5373 5361 +3 1628 5361 1629 +3 1629 5361 5360 +3 1629 5360 1640 +3 1640 5360 5391 +3 1640 5391 1641 +3 1641 5391 5390 +3 1641 5390 1642 +3 1642 5390 5389 +3 1642 5389 1630 +3 1630 5389 5380 +3 1630 5380 1631 +3 1631 5380 5379 +3 1631 5379 1632 +3 1632 5379 5378 +3 1632 5378 1633 +3 1633 5378 5377 +3 1633 5377 1611 +3 1611 5377 5376 +3 1611 5376 1612 +3 1612 5376 5375 +3 1612 5375 1620 +3 1620 5375 5397 +3 1620 5397 1621 +3 1621 5397 5396 +3 1621 5396 1622 +3 1622 5396 5395 +3 1622 5395 1623 +3 1623 5395 5388 +3 1623 5388 1634 +3 1634 5388 5387 +3 1634 5387 1635 +3 1635 5387 5386 +3 1635 5386 1636 +3 1636 5386 5385 +3 1636 5385 1637 +3 1637 5385 5384 +3 1637 5384 1638 +3 1638 5384 5382 +3 1638 5382 1639 +3 1639 5382 5381 +3 1639 5381 1643 +3 1643 5381 5394 +3 1643 5394 1644 +3 1644 5394 5393 +3 1644 5393 1645 +3 1645 5393 5392 +3 1645 5392 1613 +3 1613 5392 5372 +3 1613 5372 1614 +3 1614 5372 5371 +3 1614 5371 1616 +3 1616 5371 5370 +3 1616 5370 1617 +3 1617 5370 5362 +3 1617 5362 1618 +3 1618 5362 5364 +3 1618 5364 1619 +3 1619 5364 5365 +3 1619 5365 1624 +3 1624 5365 5369 +3 970 5286 971 +3 971 5286 5320 +3 971 5320 972 +3 972 5320 5319 +3 972 5319 973 +3 973 5319 5307 +3 973 5307 974 +3 974 5307 5306 +3 974 5306 975 +3 975 5306 5305 +3 975 5305 976 +3 976 5305 5304 +3 976 5304 977 +3 977 5304 5303 +3 977 5303 978 +3 978 5303 5318 +3 978 5318 979 +3 979 5318 5317 +3 979 5317 980 +3 980 5317 5316 +3 980 5316 948 +3 948 5316 5315 +3 948 5315 949 +3 949 5315 5314 +3 949 5314 950 +3 950 5314 5313 +3 950 5313 945 +3 945 5313 5291 +3 945 5291 946 +3 946 5291 5290 +3 946 5290 947 +3 947 5290 5289 +3 947 5289 951 +3 951 5289 5312 +3 951 5312 952 +3 952 5312 5311 +3 952 5311 944 +3 944 5311 5310 +3 944 5310 953 +3 953 5310 5322 +3 953 5322 954 +3 954 5322 5321 +3 954 5321 955 +3 955 5321 5302 +3 955 5302 956 +3 956 5302 5301 +3 956 5301 957 +3 957 5301 5309 +3 957 5309 958 +3 958 5309 5308 +3 958 5308 963 +3 963 5308 5295 +3 963 5295 964 +3 964 5295 5297 +3 964 5297 965 +3 965 5297 5298 +3 965 5298 959 +3 959 5298 5294 +3 959 5294 960 +3 960 5294 5293 +3 960 5293 962 +3 962 5293 5292 +3 962 5292 966 +3 966 5292 5300 +3 966 5300 967 +3 967 5300 5299 +3 967 5299 968 +3 968 5299 5288 +3 968 5288 969 +3 969 5288 5287 +3 969 5287 970 +3 970 5287 5286 +3 1007 5249 1008 +3 1008 5249 5282 +3 1008 5282 1009 +3 1009 5282 5281 +3 1009 5281 1010 +3 1010 5281 5268 +3 1010 5268 1011 +3 1011 5268 5267 +3 1011 5267 1012 +3 1012 5267 5266 +3 1012 5266 1013 +3 1013 5266 5265 +3 1013 5265 1014 +3 1014 5265 5264 +3 1014 5264 1015 +3 1015 5264 5280 +3 1015 5280 1016 +3 1016 5280 5279 +3 1016 5279 1017 +3 1017 5279 5278 +3 1017 5278 987 +3 987 5278 5277 +3 987 5277 988 +3 988 5277 5276 +3 988 5276 989 +3 989 5276 5275 +3 989 5275 981 +3 981 5275 5263 +3 981 5263 982 +3 982 5263 5262 +3 982 5262 983 +3 983 5262 5261 +3 983 5261 984 +3 984 5261 5260 +3 984 5260 992 +3 992 5260 5285 +3 992 5285 991 +3 991 5285 5284 +3 991 5284 990 +3 990 5284 5283 +3 990 5283 993 +3 993 5283 5274 +3 993 5274 994 +3 994 5274 5273 +3 994 5273 985 +3 985 5273 5272 +3 985 5272 986 +3 986 5272 5271 +3 986 5271 1003 +3 1003 5271 5270 +3 1003 5270 1004 +3 1004 5270 5269 +3 1004 5269 995 +3 995 5269 5256 +3 995 5256 996 +3 996 5256 5255 +3 996 5255 998 +3 998 5255 5254 +3 998 5254 999 +3 999 5254 5253 +3 999 5253 1000 +3 1000 5253 5252 +3 1000 5252 1001 +3 1001 5252 5259 +3 1001 5259 1002 +3 1002 5259 5258 +3 1002 5258 1005 +3 1005 5258 5251 +3 1005 5251 1006 +3 1006 5251 5250 +3 1006 5250 1007 +3 1007 5250 5249 +3 1050 5235 1051 +3 1051 5235 5239 +3 1051 5239 1052 +3 1052 5239 5241 +3 1052 5241 1042 +3 1042 5241 5242 +3 1042 5242 1043 +3 1043 5242 5219 +3 1043 5219 1044 +3 1044 5219 5232 +3 1044 5232 1036 +3 1036 5232 5210 +3 1036 5210 1037 +3 1037 5210 5203 +3 1037 5203 1038 +3 1038 5203 5202 +3 1038 5202 1031 +3 1031 5202 5201 +3 1031 5201 1032 +3 1032 5201 5200 +3 1032 5200 1033 +3 1033 5200 5199 +3 1033 5199 1034 +3 1034 5199 5198 +3 1034 5198 1035 +3 1035 5198 5197 +3 1035 5197 1039 +3 1039 5197 5196 +3 1039 5196 1040 +3 1040 5196 5209 +3 1040 5209 1041 +3 1041 5209 5208 +3 1041 5208 1045 +3 1045 5208 5207 +3 1045 5207 1046 +3 1046 5207 5231 +3 1046 5231 1025 +3 1025 5231 5230 +3 1025 5230 1018 +3 1018 5230 5229 +3 1018 5229 1019 +3 1019 5229 5228 +3 1019 5228 1020 +3 1020 5228 5227 +3 1020 5227 1026 +3 1026 5227 5226 +3 1026 5226 1027 +3 1027 5226 5225 +3 1027 5225 1028 +3 1028 5225 5224 +3 1028 5224 1029 +3 1029 5224 5223 +3 1029 5223 1030 +3 1030 5223 5192 +3 1030 5192 1021 +3 1021 5192 5191 +3 1021 5191 1022 +3 1022 5191 5190 +3 1022 5190 1024 +3 1024 5190 5184 +3 1024 5184 1047 +3 1047 5184 5183 +3 1047 5183 1048 +3 1048 5183 5195 +3 1048 5195 1049 +3 1049 5195 5194 +3 1049 5194 1053 +3 1053 5194 5238 +3 1053 5238 1054 +3 1054 5238 5237 +3 1054 5237 1050 +3 1050 5237 5235 +3 1090 5185 1091 +3 1091 5185 5222 +3 1091 5222 1081 +3 1081 5222 5221 +3 1081 5221 1082 +3 1082 5221 5216 +3 1082 5216 1083 +3 1083 5216 5215 +3 1083 5215 1071 +3 1071 5215 5214 +3 1071 5214 1072 +3 1072 5214 5206 +3 1072 5206 1076 +3 1076 5206 5205 +3 1076 5205 1077 +3 1077 5205 5204 +3 1077 5204 1069 +3 1069 5204 5213 +3 1069 5213 1070 +3 1070 5213 5212 +3 1070 5212 1073 +3 1073 5212 5211 +3 1073 5211 1074 +3 1074 5211 5233 +3 1074 5233 1075 +3 1075 5233 5220 +3 1075 5220 1078 +3 1078 5220 5218 +3 1078 5218 1079 +3 1079 5218 5217 +3 1079 5217 1080 +3 1080 5217 5240 +3 1080 5240 1084 +3 1084 5240 5248 +3 1084 5248 1085 +3 1085 5248 5247 +3 1085 5247 1057 +3 1057 5247 5246 +3 1057 5246 1055 +3 1055 5246 5245 +3 1055 5245 1056 +3 1056 5245 5244 +3 1056 5244 1058 +3 1058 5244 5243 +3 1058 5243 1059 +3 1059 5243 5234 +3 1059 5234 1060 +3 1060 5234 5236 +3 1060 5236 1067 +3 1067 5236 5193 +3 1067 5193 1068 +3 1068 5193 5179 +3 1068 5179 1061 +3 1061 5179 5178 +3 1061 5178 1062 +3 1062 5178 5182 +3 1062 5182 1064 +3 1064 5182 5181 +3 1064 5181 1065 +3 1065 5181 5177 +3 1065 5177 1066 +3 1066 5177 5176 +3 1066 5176 1086 +3 1086 5176 5189 +3 1086 5189 1087 +3 1087 5189 5188 +3 1087 5188 1088 +3 1088 5188 5187 +3 1088 5187 1089 +3 1089 5187 5186 +3 1089 5186 1090 +3 1090 5186 5185 +3 1103 5158 1104 +3 1104 5158 5157 +3 1104 5157 1155 +3 1155 5157 5156 +3 1155 5156 1156 +3 1156 5156 5150 +3 1156 5150 1130 +3 1130 5150 5149 +3 1130 5149 1131 +3 1131 5149 5148 +3 1131 5148 1133 +3 1133 5148 5155 +3 1133 5155 1134 +3 1134 5155 5154 +3 1134 5154 1142 +3 1142 5154 5153 +3 1142 5153 1135 +3 1135 5153 5175 +3 1135 5175 1136 +3 1136 5175 5174 +3 1136 5174 1149 +3 1149 5174 5173 +3 1149 5173 1150 +3 1150 5173 5172 +3 1150 5172 1151 +3 1151 5172 5171 +3 1151 5171 1152 +3 1152 5171 5170 +3 1152 5170 1153 +3 1153 5170 5169 +3 1153 5169 1154 +3 1154 5169 5168 +3 1154 5168 1159 +3 1159 5168 5167 +3 1159 5167 1160 +3 1160 5167 5166 +3 1160 5166 1161 +3 1161 5166 5165 +3 1161 5165 1098 +3 1098 5165 5147 +3 1098 5147 1099 +3 1099 5147 5146 +3 1099 5146 1100 +3 1100 5146 5152 +3 1100 5152 1101 +3 1101 5152 5151 +3 1101 5151 1102 +3 1102 5151 5140 +3 1102 5140 1106 +3 1106 5140 5139 +3 1106 5139 1107 +3 1107 5139 5164 +3 1107 5164 1108 +3 1108 5164 5163 +3 1108 5163 1162 +3 1162 5163 5162 +3 1162 5162 1163 +3 1163 5162 5161 +3 1163 5161 1164 +3 1164 5161 5160 +3 1164 5160 1144 +3 1144 5160 5159 +3 1144 5159 1137 +3 1137 5159 5145 +3 1137 5145 1138 +3 1138 5145 5144 +3 1138 5144 1148 +3 1148 5144 5143 +3 1148 5143 1147 +3 1147 5143 5142 +3 1147 5142 1103 +3 1103 5142 5158 +3 1124 5135 1123 +3 1123 5135 5134 +3 1123 5134 1122 +3 1122 5134 5133 +3 1122 5133 1125 +3 1125 5133 5127 +3 1125 5127 1126 +3 1126 5127 5126 +3 1126 5126 1094 +3 1094 5126 5125 +3 1094 5125 1095 +3 1095 5125 5122 +3 1095 5122 1096 +3 1096 5122 5123 +3 1096 5123 1097 +3 1097 5123 5124 +3 1097 5124 1127 +3 1127 5124 5132 +3 1127 5132 1128 +3 1128 5132 5131 +3 1128 5131 1129 +3 1129 5131 5130 +3 1129 5130 1092 +3 1092 5130 5106 +3 1092 5106 1093 +3 1093 5106 5105 +3 1093 5105 1143 +3 1143 5105 5121 +3 1143 5121 1132 +3 1132 5121 5120 +3 1132 5120 1158 +3 1158 5120 5119 +3 1158 5119 1157 +3 1157 5119 5138 +3 1157 5138 1141 +3 1141 5138 5137 +3 1141 5137 1105 +3 1105 5137 5136 +3 1105 5136 1145 +3 1145 5136 5118 +3 1145 5118 1146 +3 1146 5118 5117 +3 1146 5117 1109 +3 1109 5117 5129 +3 1109 5129 1110 +3 1110 5129 5128 +3 1110 5128 1111 +3 1111 5128 5103 +3 1111 5103 1112 +3 1112 5103 5102 +3 1112 5102 1113 +3 1113 5102 5116 +3 1113 5116 1114 +3 1114 5116 5115 +3 1114 5115 1116 +3 1116 5115 5114 +3 1116 5114 1117 +3 1117 5114 5113 +3 1117 5113 1139 +3 1139 5113 5112 +3 1139 5112 1140 +3 1140 5112 5111 +3 1140 5111 1118 +3 1118 5111 5110 +3 1118 5110 1119 +3 1119 5110 5109 +3 1119 5109 1120 +3 1120 5109 5108 +3 1120 5108 1121 +3 1121 5108 5107 +3 1121 5107 1124 +3 1124 5107 5135 +3 1183 5084 1182 +3 1182 5084 5083 +3 1182 5083 1181 +3 1181 5083 5082 +3 1181 5082 1184 +3 1184 5082 5076 +3 1184 5076 1185 +3 1185 5076 5075 +3 1185 5075 1165 +3 1165 5075 5074 +3 1165 5074 1166 +3 1166 5074 5081 +3 1166 5081 1167 +3 1167 5081 5080 +3 1167 5080 1168 +3 1168 5080 5079 +3 1168 5079 1169 +3 1169 5079 5101 +3 1169 5101 1177 +3 1177 5101 5100 +3 1177 5100 1186 +3 1186 5100 5099 +3 1186 5099 1187 +3 1187 5099 5098 +3 1187 5098 1188 +3 1188 5098 5097 +3 1188 5097 1189 +3 1189 5097 5096 +3 1189 5096 1190 +3 1190 5096 5095 +3 1190 5095 1191 +3 1191 5095 5094 +3 1191 5094 1195 +3 1195 5094 5093 +3 1195 5093 1196 +3 1196 5093 5092 +3 1196 5092 1197 +3 1197 5092 5091 +3 1197 5091 1170 +3 1170 5091 5073 +3 1170 5073 1171 +3 1171 5073 5072 +3 1171 5072 1172 +3 1172 5072 5078 +3 1172 5078 1173 +3 1173 5078 5077 +3 1173 5077 1174 +3 1174 5077 5066 +3 1174 5066 1175 +3 1175 5066 5065 +3 1175 5065 1176 +3 1176 5065 5090 +3 1176 5090 1194 +3 1194 5090 5089 +3 1194 5089 1193 +3 1193 5089 5088 +3 1193 5088 1192 +3 1192 5088 5087 +3 1192 5087 1200 +3 1200 5087 5086 +3 1200 5086 1201 +3 1201 5086 5085 +3 1201 5085 1178 +3 1178 5085 5071 +3 1178 5071 1179 +3 1179 5071 5070 +3 1179 5070 1198 +3 1198 5070 5069 +3 1198 5069 1199 +3 1199 5069 5068 +3 1199 5068 1183 +3 1183 5068 5084 +3 1223 5052 1232 +3 1232 5052 5051 +3 1232 5051 1233 +3 1233 5051 5050 +3 1233 5050 1234 +3 1234 5050 5049 +3 1234 5049 1235 +3 1235 5049 5048 +3 1235 5048 1236 +3 1236 5048 5047 +3 1236 5047 1237 +3 1237 5047 5034 +3 1237 5034 1238 +3 1238 5034 5035 +3 1238 5035 1224 +3 1224 5035 5036 +3 1224 5036 1225 +3 1225 5036 5046 +3 1225 5046 1226 +3 1226 5046 5045 +3 1226 5045 1227 +3 1227 5045 5044 +3 1227 5044 1211 +3 1211 5044 5043 +3 1211 5043 1212 +3 1212 5043 5064 +3 1212 5064 1213 +3 1213 5064 5063 +3 1213 5063 1202 +3 1202 5063 5062 +3 1202 5062 1203 +3 1203 5062 5061 +3 1203 5061 1204 +3 1204 5061 5060 +3 1204 5060 1205 +3 1205 5060 5059 +3 1205 5059 1206 +3 1206 5059 5058 +3 1206 5058 1207 +3 1207 5058 5057 +3 1207 5057 1228 +3 1228 5057 5056 +3 1228 5056 1229 +3 1229 5056 5055 +3 1229 5055 1208 +3 1208 5055 5032 +3 1208 5032 1209 +3 1209 5032 5031 +3 1209 5031 1210 +3 1210 5031 5042 +3 1210 5042 1214 +3 1214 5042 5041 +3 1214 5041 1215 +3 1215 5041 5040 +3 1215 5040 1217 +3 1217 5040 5039 +3 1217 5039 1218 +3 1218 5039 5038 +3 1218 5038 1219 +3 1219 5038 5037 +3 1219 5037 1220 +3 1220 5037 5054 +3 1220 5054 1221 +3 1221 5054 5053 +3 1221 5053 1230 +3 1230 5053 5028 +3 1230 5028 1231 +3 1231 5028 5029 +3 1231 5029 1222 +3 1222 5029 5030 +3 1222 5030 1223 +3 1223 5030 5052 +3 1271 5015 1272 +3 1272 5015 5014 +3 1272 5014 1273 +3 1273 5014 5013 +3 1273 5013 1265 +3 1265 5013 5012 +3 1265 5012 1266 +3 1266 5012 5011 +3 1266 5011 1267 +3 1267 5011 5010 +3 1267 5010 1274 +3 1274 5010 4991 +3 1274 4991 1275 +3 1275 4991 4990 +3 1275 4990 1239 +3 1239 4990 5009 +3 1239 5009 1240 +3 1240 5009 5008 +3 1240 5008 1250 +3 1250 5008 5007 +3 1250 5007 1243 +3 1243 5007 5006 +3 1243 5006 1244 +3 1244 5006 5005 +3 1244 5005 1251 +3 1251 5005 5004 +3 1251 5004 1252 +3 1252 5004 5003 +3 1252 5003 1245 +3 1245 5003 5002 +3 1245 5002 1241 +3 1241 5002 5001 +3 1241 5001 1242 +3 1242 5001 5027 +3 1242 5027 1246 +3 1246 5027 5026 +3 1246 5026 1253 +3 1253 5026 5025 +3 1253 5025 1254 +3 1254 5025 5022 +3 1254 5022 1255 +3 1255 5022 5021 +3 1255 5021 1256 +3 1256 5021 5020 +3 1256 5020 1257 +3 1257 5020 5000 +3 1257 5000 1249 +3 1249 5000 4999 +3 1249 4999 1248 +3 1248 4999 4997 +3 1248 4997 1247 +3 1247 4997 4996 +3 1247 4996 1258 +3 1258 4996 5019 +3 1258 5019 1259 +3 1259 5019 5018 +3 1259 5018 1261 +3 1261 5018 5017 +3 1261 5017 1262 +3 1262 5017 5016 +3 1262 5016 1263 +3 1263 5016 5024 +3 1263 5024 1264 +3 1264 5024 5023 +3 1264 5023 1268 +3 1268 5023 4992 +3 1268 4992 1269 +3 1269 4992 4994 +3 1269 4994 1270 +3 1270 4994 4995 +3 1270 4995 1271 +3 1271 4995 5015 +3 609 4939 610 +3 610 4939 4938 +3 610 4938 599 +3 599 4938 4937 +3 599 4937 600 +3 600 4937 4936 +3 600 4936 601 +3 601 4936 4935 +3 601 4935 580 +3 580 4935 4927 +3 580 4927 574 +3 574 4927 4926 +3 574 4926 575 +3 575 4926 4925 +3 575 4925 585 +3 585 4925 4934 +3 585 4934 586 +3 586 4934 4933 +3 586 4933 587 +3 587 4933 4932 +3 587 4932 588 +3 588 4932 4924 +3 588 4924 589 +3 589 4924 4923 +3 589 4923 590 +3 590 4923 4922 +3 590 4922 581 +3 581 4922 4921 +3 581 4921 582 +3 582 4921 4920 +3 582 4920 583 +3 583 4920 4919 +3 583 4919 584 +3 584 4919 4918 +3 584 4918 593 +3 593 4918 4952 +3 593 4952 594 +3 594 4952 4951 +3 594 4951 595 +3 595 4951 4950 +3 595 4950 591 +3 591 4950 4949 +3 591 4949 592 +3 592 4949 4948 +3 592 4948 602 +3 602 4948 4947 +3 602 4947 603 +3 603 4947 4946 +3 603 4946 604 +3 604 4946 4945 +3 604 4945 605 +3 605 4945 4944 +3 605 4944 606 +3 606 4944 4942 +3 606 4942 607 +3 607 4942 4941 +3 607 4941 576 +3 576 4941 4917 +3 576 4917 577 +3 577 4917 4916 +3 577 4916 579 +3 579 4916 4931 +3 579 4931 596 +3 596 4931 4930 +3 596 4930 597 +3 597 4930 4929 +3 597 4929 598 +3 598 4929 4928 +3 598 4928 608 +3 608 4928 4940 +3 608 4940 609 +3 609 4940 4939 +3 646 4902 647 +3 647 4902 4901 +3 647 4901 636 +3 636 4901 4900 +3 636 4900 637 +3 637 4900 4899 +3 637 4899 638 +3 638 4899 4898 +3 638 4898 617 +3 617 4898 4890 +3 617 4890 611 +3 611 4890 4889 +3 611 4889 612 +3 612 4889 4888 +3 612 4888 622 +3 622 4888 4897 +3 622 4897 623 +3 623 4897 4896 +3 623 4896 624 +3 624 4896 4895 +3 624 4895 625 +3 625 4895 4887 +3 625 4887 626 +3 626 4887 4886 +3 626 4886 627 +3 627 4886 4885 +3 627 4885 618 +3 618 4885 4884 +3 618 4884 619 +3 619 4884 4883 +3 619 4883 620 +3 620 4883 4882 +3 620 4882 621 +3 621 4882 4881 +3 621 4881 630 +3 630 4881 4915 +3 630 4915 631 +3 631 4915 4914 +3 631 4914 632 +3 632 4914 4913 +3 632 4913 628 +3 628 4913 4912 +3 628 4912 629 +3 629 4912 4911 +3 629 4911 639 +3 639 4911 4910 +3 639 4910 640 +3 640 4910 4909 +3 640 4909 641 +3 641 4909 4908 +3 641 4908 642 +3 642 4908 4907 +3 642 4907 643 +3 643 4907 4905 +3 643 4905 644 +3 644 4905 4904 +3 644 4904 613 +3 613 4904 4880 +3 613 4880 614 +3 614 4880 4879 +3 614 4879 616 +3 616 4879 4894 +3 616 4894 633 +3 633 4894 4893 +3 633 4893 634 +3 634 4893 4892 +3 634 4892 635 +3 635 4892 4891 +3 635 4891 645 +3 645 4891 4903 +3 645 4903 646 +3 646 4903 4902 +3 679 4838 680 +3 680 4838 4837 +3 680 4837 681 +3 681 4837 4858 +3 681 4858 682 +3 682 4858 4857 +3 682 4857 683 +3 683 4857 4856 +3 683 4856 684 +3 684 4856 4825 +3 684 4825 670 +3 670 4825 4840 +3 670 4840 671 +3 671 4840 4816 +3 671 4816 672 +3 672 4816 4815 +3 672 4815 651 +3 651 4815 4809 +3 651 4809 652 +3 652 4809 4808 +3 652 4808 659 +3 659 4808 4854 +3 659 4854 660 +3 660 4854 4853 +3 660 4853 661 +3 661 4853 4852 +3 661 4852 662 +3 662 4852 4871 +3 662 4871 663 +3 663 4871 4870 +3 663 4870 664 +3 664 4870 4869 +3 664 4869 673 +3 673 4869 4868 +3 673 4868 674 +3 674 4868 4867 +3 674 4867 675 +3 675 4867 4866 +3 675 4866 665 +3 665 4866 4865 +3 665 4865 666 +3 666 4865 4864 +3 666 4864 667 +3 667 4864 4863 +3 667 4863 668 +3 668 4863 4836 +3 668 4836 669 +3 669 4836 4835 +3 669 4835 648 +3 648 4835 4834 +3 648 4834 649 +3 649 4834 4814 +3 649 4814 650 +3 650 4814 4813 +3 650 4813 653 +3 653 4813 4850 +3 653 4850 654 +3 654 4850 4821 +3 654 4821 656 +3 656 4821 4820 +3 656 4820 657 +3 657 4820 4862 +3 657 4862 658 +3 658 4862 4861 +3 658 4861 676 +3 676 4861 4859 +3 676 4859 677 +3 677 4859 4876 +3 677 4876 678 +3 678 4876 4875 +3 678 4875 679 +3 679 4875 4838 +3 716 4842 717 +3 717 4842 4843 +3 717 4843 718 +3 718 4843 4844 +3 718 4844 719 +3 719 4844 4829 +3 719 4829 720 +3 720 4829 4828 +3 720 4828 721 +3 721 4828 4827 +3 721 4827 707 +3 707 4827 4819 +3 707 4819 708 +3 708 4819 4818 +3 708 4818 709 +3 709 4818 4817 +3 709 4817 691 +3 691 4817 4811 +3 691 4811 692 +3 692 4811 4810 +3 692 4810 696 +3 696 4810 4841 +3 696 4841 697 +3 697 4841 4826 +3 697 4826 698 +3 698 4826 4824 +3 698 4824 699 +3 699 4824 4823 +3 699 4823 700 +3 700 4823 4874 +3 700 4874 701 +3 701 4874 4873 +3 701 4873 710 +3 710 4873 4872 +3 710 4872 711 +3 711 4872 4839 +3 711 4839 712 +3 712 4839 4855 +3 712 4855 702 +3 702 4855 4877 +3 702 4877 703 +3 703 4877 4878 +3 703 4878 704 +3 704 4878 4860 +3 704 4860 705 +3 705 4860 4822 +3 705 4822 706 +3 706 4822 4851 +3 706 4851 685 +3 685 4851 4833 +3 685 4833 686 +3 686 4833 4832 +3 686 4832 687 +3 687 4832 4831 +3 687 4831 688 +3 688 4831 4830 +3 688 4830 690 +3 690 4830 4807 +3 690 4807 693 +3 693 4807 4806 +3 693 4806 694 +3 694 4806 4849 +3 694 4849 695 +3 695 4849 4848 +3 695 4848 713 +3 713 4848 4847 +3 713 4847 714 +3 714 4847 4846 +3 714 4846 715 +3 715 4846 4845 +3 715 4845 716 +3 716 4845 4842 +3 792 4798 793 +3 793 4798 4797 +3 793 4797 794 +3 794 4797 4796 +3 794 4796 789 +3 789 4796 4795 +3 789 4795 774 +3 774 4795 4794 +3 774 4794 776 +3 776 4794 4793 +3 776 4793 777 +3 777 4793 4789 +3 777 4789 770 +3 770 4789 4788 +3 770 4788 769 +3 769 4788 4787 +3 769 4787 738 +3 738 4787 4783 +3 738 4783 737 +3 737 4783 4784 +3 737 4784 749 +3 749 4784 4785 +3 749 4785 750 +3 750 4785 4786 +3 750 4786 751 +3 751 4786 4805 +3 751 4805 755 +3 755 4805 4804 +3 755 4804 756 +3 756 4804 4803 +3 756 4803 757 +3 757 4803 4802 +3 757 4802 758 +3 758 4802 4801 +3 758 4801 759 +3 759 4801 4800 +3 759 4800 760 +3 760 4800 4799 +3 760 4799 730 +3 730 4799 4792 +3 730 4792 731 +3 731 4792 4791 +3 731 4791 732 +3 732 4791 4790 +3 732 4790 733 +3 733 4790 4782 +3 733 4782 734 +3 734 4782 4781 +3 734 4781 724 +3 724 4781 4780 +3 724 4780 725 +3 725 4780 4771 +3 725 4771 729 +3 729 4771 4773 +3 729 4773 728 +3 728 4773 4774 +3 728 4774 726 +3 726 4774 4779 +3 726 4779 744 +3 744 4779 4778 +3 744 4778 742 +3 742 4778 4777 +3 742 4777 740 +3 740 4777 4776 +3 740 4776 785 +3 785 4776 4775 +3 785 4775 786 +3 786 4775 4770 +3 786 4770 787 +3 787 4770 4769 +3 787 4769 792 +3 792 4769 4798 +3 778 4761 779 +3 779 4761 4760 +3 779 4760 780 +3 780 4760 4759 +3 780 4759 781 +3 781 4759 4758 +3 781 4758 782 +3 782 4758 4757 +3 782 4757 783 +3 783 4757 4756 +3 783 4756 784 +3 784 4756 4752 +3 784 4752 764 +3 764 4752 4751 +3 764 4751 765 +3 765 4751 4750 +3 765 4750 766 +3 766 4750 4746 +3 766 4746 722 +3 722 4746 4747 +3 722 4747 723 +3 723 4747 4748 +3 723 4748 739 +3 739 4748 4749 +3 739 4749 767 +3 767 4749 4768 +3 767 4768 768 +3 768 4768 4767 +3 768 4767 775 +3 775 4767 4766 +3 775 4766 791 +3 791 4766 4765 +3 791 4765 790 +3 790 4765 4764 +3 790 4764 788 +3 788 4764 4763 +3 788 4763 741 +3 741 4763 4762 +3 741 4762 743 +3 743 4762 4755 +3 743 4755 761 +3 761 4755 4754 +3 761 4754 762 +3 762 4754 4753 +3 762 4753 763 +3 763 4753 4745 +3 763 4745 735 +3 735 4745 4744 +3 735 4744 736 +3 736 4744 4743 +3 736 4743 745 +3 745 4743 4734 +3 745 4734 746 +3 746 4734 4736 +3 746 4736 747 +3 747 4736 4737 +3 747 4737 748 +3 748 4737 4733 +3 748 4733 752 +3 752 4733 4732 +3 752 4732 753 +3 753 4732 4742 +3 753 4742 754 +3 754 4742 4741 +3 754 4741 771 +3 771 4741 4740 +3 771 4740 772 +3 772 4740 4739 +3 772 4739 773 +3 773 4739 4738 +3 773 4738 778 +3 778 4738 4761 +3 825 4724 826 +3 826 4724 4723 +3 826 4723 827 +3 827 4723 4722 +3 827 4722 828 +3 828 4722 4721 +3 828 4721 829 +3 829 4721 4720 +3 829 4720 830 +3 830 4720 4719 +3 830 4719 831 +3 831 4719 4715 +3 831 4715 820 +3 820 4715 4714 +3 820 4714 821 +3 821 4714 4713 +3 821 4713 822 +3 822 4713 4709 +3 822 4709 797 +3 797 4709 4710 +3 797 4710 803 +3 803 4710 4711 +3 803 4711 804 +3 804 4711 4712 +3 804 4712 805 +3 805 4712 4731 +3 805 4731 814 +3 814 4731 4730 +3 814 4730 815 +3 815 4730 4729 +3 815 4729 816 +3 816 4729 4728 +3 816 4728 817 +3 817 4728 4727 +3 817 4727 818 +3 818 4727 4726 +3 818 4726 819 +3 819 4726 4725 +3 819 4725 806 +3 806 4725 4718 +3 806 4718 807 +3 807 4718 4717 +3 807 4717 808 +3 808 4717 4716 +3 808 4716 809 +3 809 4716 4708 +3 809 4708 810 +3 810 4708 4707 +3 810 4707 798 +3 798 4707 4706 +3 798 4706 795 +3 795 4706 4697 +3 795 4697 796 +3 796 4697 4699 +3 796 4699 799 +3 799 4699 4700 +3 799 4700 800 +3 800 4700 4705 +3 800 4705 802 +3 802 4705 4704 +3 802 4704 811 +3 811 4704 4703 +3 811 4703 812 +3 812 4703 4702 +3 812 4702 813 +3 813 4702 4701 +3 813 4701 823 +3 823 4701 4696 +3 823 4696 824 +3 824 4696 4695 +3 824 4695 825 +3 825 4695 4724 +3 862 4663 863 +3 863 4663 4662 +3 863 4662 850 +3 850 4662 4661 +3 850 4661 849 +3 849 4661 4688 +3 849 4688 848 +3 848 4688 4687 +3 848 4687 867 +3 867 4687 4686 +3 867 4686 868 +3 868 4686 4685 +3 868 4685 851 +3 851 4685 4684 +3 851 4684 852 +3 852 4684 4683 +3 852 4683 864 +3 864 4683 4682 +3 864 4682 865 +3 865 4682 4681 +3 865 4681 866 +3 866 4681 4680 +3 866 4680 842 +3 842 4680 4679 +3 842 4679 843 +3 843 4679 4678 +3 843 4678 844 +3 844 4678 4677 +3 844 4677 832 +3 832 4677 4669 +3 832 4669 833 +3 833 4669 4668 +3 833 4668 834 +3 834 4668 4694 +3 834 4694 835 +3 835 4694 4693 +3 835 4693 853 +3 853 4693 4692 +3 853 4692 854 +3 854 4692 4691 +3 854 4691 855 +3 855 4691 4690 +3 855 4690 856 +3 856 4690 4689 +3 856 4689 857 +3 857 4689 4676 +3 857 4676 836 +3 836 4676 4675 +3 836 4675 837 +3 837 4675 4674 +3 837 4674 845 +3 845 4674 4670 +3 845 4670 846 +3 846 4670 4672 +3 846 4672 847 +3 847 4672 4673 +3 847 4673 841 +3 841 4673 4667 +3 841 4667 840 +3 840 4667 4666 +3 840 4666 838 +3 838 4666 4665 +3 838 4665 858 +3 858 4665 4660 +3 858 4660 859 +3 859 4660 4659 +3 859 4659 860 +3 860 4659 4658 +3 860 4658 861 +3 861 4658 4664 +3 861 4664 862 +3 862 4664 4663 +3 892 4627 893 +3 893 4627 4626 +3 893 4626 884 +3 884 4626 4625 +3 884 4625 883 +3 883 4625 4654 +3 883 4654 882 +3 882 4654 4653 +3 882 4653 904 +3 904 4653 4646 +3 904 4646 905 +3 905 4646 4645 +3 905 4645 900 +3 900 4645 4644 +3 900 4644 901 +3 901 4644 4643 +3 901 4643 902 +3 902 4643 4642 +3 902 4642 903 +3 903 4642 4641 +3 903 4641 872 +3 872 4641 4624 +3 872 4624 873 +3 873 4624 4623 +3 873 4623 880 +3 880 4623 4640 +3 880 4640 881 +3 881 4640 4639 +3 881 4639 874 +3 874 4639 4633 +3 874 4633 875 +3 875 4633 4632 +3 875 4632 876 +3 876 4632 4657 +3 876 4657 877 +3 877 4657 4656 +3 877 4656 878 +3 878 4656 4655 +3 878 4655 879 +3 879 4655 4652 +3 879 4652 885 +3 885 4652 4651 +3 885 4651 886 +3 886 4651 4650 +3 886 4650 887 +3 887 4650 4649 +3 887 4649 894 +3 894 4649 4648 +3 894 4648 895 +3 895 4648 4647 +3 895 4647 896 +3 896 4647 4638 +3 896 4638 897 +3 897 4638 4637 +3 897 4637 898 +3 898 4637 4635 +3 898 4635 899 +3 899 4635 4634 +3 899 4634 869 +3 869 4634 4631 +3 869 4631 870 +3 870 4631 4630 +3 870 4630 888 +3 888 4630 4629 +3 888 4629 889 +3 889 4629 4621 +3 889 4621 890 +3 890 4621 4620 +3 890 4620 891 +3 891 4620 4628 +3 891 4628 892 +3 892 4628 4627 +3 4195 7882 4214 +3 4214 7882 7883 +3 4214 7883 7864 +3 4234 7884 4194 +3 4194 7884 7882 +3 4194 7882 4195 +3 7880 7885 4035 +3 4035 7885 4036 +3 7881 7885 7880 +3 7886 7887 7881 +3 7881 7887 7885 +3 169 4086 170 +3 170 4086 4085 +3 170 4085 184 +3 184 4085 4088 +3 184 4088 185 +3 185 4088 4087 +3 185 4087 155 +3 155 4087 4084 +3 155 4084 156 +3 156 4084 4083 +3 156 4083 158 +3 158 4083 4082 +3 158 4082 159 +3 159 4082 4072 +3 159 4072 171 +3 171 4072 4071 +3 171 4071 172 +3 172 4071 4081 +3 172 4081 173 +3 173 4081 4080 +3 173 4080 152 +3 152 4080 4079 +3 152 4079 153 +3 153 4079 4078 +3 153 4078 174 +3 174 4078 4077 +3 174 4077 175 +3 175 4077 4076 +3 175 4076 176 +3 176 4076 4070 +3 176 4070 186 +3 186 4070 4068 +3 186 4068 187 +3 187 4068 4067 +3 187 4067 189 +3 189 4067 4066 +3 189 4066 190 +3 190 4066 4065 +3 190 4065 161 +3 161 4065 4064 +3 161 4064 163 +3 163 4064 4063 +3 163 4063 165 +3 165 4063 4062 +3 165 4062 167 +3 167 4062 4061 +3 167 4061 168 +3 168 4061 4060 +3 168 4060 149 +3 149 4060 4059 +3 149 4059 150 +3 150 4059 4058 +3 150 4058 177 +3 177 4058 4057 +3 177 4057 178 +3 178 4057 4056 +3 178 4056 180 +3 180 4056 4055 +3 180 4055 181 +3 181 4055 4054 +3 181 4054 182 +3 182 4054 4053 +3 182 4053 183 +3 183 4053 4052 +3 183 4052 191 +3 191 4052 4051 +3 191 4051 192 +3 192 4051 4049 +3 192 4049 193 +3 193 4049 4048 +3 193 4048 169 +3 169 4048 4086 +3 7888 4242 7889 +3 7889 4242 4245 +3 4242 7888 4255 +3 4255 7888 7890 +3 4255 7890 4254 +3 3993 7891 3992 +3 3992 7891 7876 +3 7891 7892 7877 +3 7877 7892 7893 +3 7876 7891 7877 +3 130 3989 131 +3 131 3989 3988 +3 131 3988 132 +3 132 3988 3987 +3 132 3987 111 +3 111 3987 3986 +3 111 3986 110 +3 110 3986 3984 +3 110 3984 109 +3 109 3984 3983 +3 109 3983 115 +3 115 3983 4016 +3 115 4016 116 +3 116 4016 4015 +3 116 4015 136 +3 136 4015 4014 +3 136 4014 137 +3 137 4014 4004 +3 137 4004 139 +3 139 4004 4003 +3 139 4003 141 +3 141 4003 4002 +3 141 4002 143 +3 143 4002 3991 +3 143 3991 145 +3 145 3991 3990 +3 145 3990 147 +3 147 3990 4019 +3 147 4019 148 +3 148 4019 4018 +3 148 4018 119 +3 119 4018 4020 +3 119 4020 121 +3 121 4020 4022 +3 121 4022 123 +3 123 4022 4024 +3 123 4024 125 +3 125 4024 4026 +3 125 4026 126 +3 126 4026 4028 +3 126 4028 70 +3 70 4028 4013 +3 70 4013 71 +3 71 4013 4012 +3 71 4012 80 +3 80 4012 4011 +3 80 4011 81 +3 81 4011 4001 +3 81 4001 82 +3 82 4001 4000 +3 82 4000 88 +3 88 4000 4010 +3 88 4010 77 +3 77 4010 4009 +3 77 4009 67 +3 67 4009 4008 +3 67 4008 68 +3 68 4008 3998 +3 68 3998 75 +3 75 3998 3997 +3 75 3997 74 +3 74 3997 4007 +3 74 4007 72 +3 72 4007 4006 +3 72 4006 108 +3 108 4006 3996 +3 108 3996 107 +3 107 3996 3995 +3 107 3995 105 +3 105 3995 4005 +3 105 4005 130 +3 130 4005 3989 +3 7894 4283 7895 +3 7895 4283 4287 +3 4308 4283 7896 +3 7896 4283 7894 +3 7874 7897 3929 +3 3929 7897 3927 +3 7898 7899 7875 +3 7875 7899 7897 +3 7875 7897 7874 +3 45 3981 46 +3 46 3981 3979 +3 46 3979 47 +3 47 3979 3977 +3 47 3977 48 +3 48 3977 3975 +3 48 3975 49 +3 49 3975 3974 +3 49 3974 50 +3 50 3974 3972 +3 50 3972 51 +3 51 3972 3970 +3 51 3970 53 +3 53 3970 3968 +3 53 3968 55 +3 55 3968 3966 +3 55 3966 57 +3 57 3966 3964 +3 57 3964 59 +3 59 3964 3962 +3 59 3962 61 +3 61 3962 3960 +3 61 3960 62 +3 62 3960 3959 +3 62 3959 39 +3 39 3959 3940 +3 39 3940 40 +3 40 3940 3939 +3 40 3939 41 +3 41 3939 3938 +3 41 3938 26 +3 26 3938 3933 +3 26 3933 27 +3 27 3933 3932 +3 27 3932 29 +3 29 3932 3931 +3 29 3931 30 +3 30 3931 3930 +3 30 3930 31 +3 31 3930 3958 +3 31 3958 32 +3 32 3958 3957 +3 32 3957 36 +3 36 3957 3952 +3 36 3952 37 +3 37 3952 3951 +3 37 3951 38 +3 38 3951 3950 +3 38 3950 42 +3 42 3950 3945 +3 42 3945 43 +3 43 3945 3944 +3 43 3944 20 +3 20 3944 3949 +3 20 3949 21 +3 21 3949 3948 +3 21 3948 23 +3 23 3948 3947 +3 23 3947 24 +3 24 3947 3943 +3 24 3943 25 +3 25 3943 3942 +3 25 3942 33 +3 33 3942 3941 +3 33 3941 34 +3 34 3941 3937 +3 34 3937 35 +3 35 3937 3935 +3 35 3935 44 +3 44 3935 3934 +3 44 3934 45 +3 45 3934 3981 +3 7873 7900 4170 +3 4170 7900 7901 +3 4170 7901 4149 +3 4150 4149 7902 +3 7902 4149 7901 +3 4105 7903 4112 +3 4112 7903 7878 +3 7903 7904 7879 +3 7879 7904 7905 +3 7878 7903 7879 +3 3913 4126 3914 +3 3914 4126 4124 +3 3914 4124 3904 +3 3904 4124 4123 +3 3904 4123 3905 +3 3905 4123 4122 +3 3905 4122 3906 +3 3906 4122 4121 +3 3906 4121 3910 +3 3910 4121 4120 +3 3910 4120 3911 +3 3911 4120 4119 +3 3911 4119 3900 +3 3900 4119 4118 +3 3900 4118 3884 +3 3884 4118 4145 +3 3884 4145 3885 +3 3885 4145 4144 +3 3885 4144 3886 +3 3886 4144 4143 +3 3886 4143 3887 +3 3887 4143 4117 +3 3887 4117 3888 +3 3888 4117 4116 +3 3888 4116 3889 +3 3889 4116 4115 +3 3889 4115 3890 +3 3890 4115 4104 +3 3890 4104 3891 +3 3891 4104 4103 +3 3891 4103 3879 +3 3879 4103 4101 +3 3879 4101 3880 +3 3880 4101 4100 +3 3880 4100 3892 +3 3892 4100 4111 +3 3892 4111 3893 +3 3893 4111 4110 +3 3893 4110 3894 +3 3894 4110 4109 +3 3894 4109 3883 +3 3883 4109 4099 +3 3883 4099 3882 +3 3882 4099 4098 +3 3882 4098 3881 +3 3881 4098 4097 +3 3881 4097 3895 +3 3895 4097 4142 +3 3895 4142 3896 +3 3896 4142 4141 +3 3896 4141 3897 +3 3897 4141 4140 +3 3897 4140 3907 +3 3907 4140 4139 +3 3907 4139 3908 +3 3908 4139 4138 +3 3908 4138 3909 +3 3909 4138 4137 +3 3909 4137 3898 +3 3898 4137 4108 +3 3898 4108 3899 +3 3899 4108 4107 +3 3899 4107 3901 +3 3901 4107 4106 +3 3901 4106 3902 +3 3902 4106 4132 +3 3902 4132 3903 +3 3903 4132 4130 +3 3903 4130 3912 +3 3912 4130 4128 +3 3912 4128 3913 +3 3913 4128 4126 + diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/polygon_mesh_slicer_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/polygon_mesh_slicer_test.cpp index 9262233579d..223a1c58aa0 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/polygon_mesh_slicer_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/polygon_mesh_slicer_test.cpp @@ -10,29 +10,47 @@ #include #include +#include #include #include - +#include +#include #include typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; typedef CGAL::Exact_predicates_inexact_constructions_kernel Epec; +template +bool is_ccw(int xi, int yi, + const Polyline_type& polyline) +{ + CGAL::Polygon_2 polygon; + if(polyline.front() == polyline.back()) + { + BOOST_FOREACH(const typename K::Point_3& p, polyline) + { + polygon.push_back(typename K::Point_2(p[xi], p[yi])); + } + polygon.erase(polygon.vertices_end()-1); + return polygon.is_counterclockwise_oriented(); + } + return true; +} template int test_slicer() { #ifdef USE_SURFACE_MESH -typedef CGAL::Surface_mesh Mesh; + typedef CGAL::Surface_mesh Mesh; #else -typedef CGAL::Polyhedron_3 Mesh; + typedef CGAL::Polyhedron_3 Mesh; #endif -typedef CGAL::AABB_halfedge_graph_segment_primitive HGSP; -typedef CGAL::AABB_traits AABB_traits; -typedef CGAL::AABB_tree AABB_tree; -typedef std::vector Polyline_type; -typedef std::list< Polyline_type > Polylines; + typedef CGAL::AABB_halfedge_graph_segment_primitive HGSP; + typedef CGAL::AABB_traits AABB_traits; + typedef CGAL::AABB_tree AABB_tree; + typedef std::vector Polyline_type; + typedef std::vector< Polyline_type > Polylines; //API test { @@ -95,6 +113,56 @@ typedef std::list< Polyline_type > Polylines; slicer(typename K::Plane_3(0,0,1,333), std::back_inserter(polylines)); assert(polylines.empty()); +// Now test the orientation of polylines + polylines.clear(); + slicer(typename K::Plane_3(0,1,0,0.5), std::back_inserter(polylines)); + assert(polylines.size()==2); // two polylines + int closed_id = polylines.front().front()==polylines.front().back() ? 0 : 1; + CGAL_USE(closed_id); + CGAL_assertion( is_ccw(0, 2 , polylines[closed_id]) ); + + polylines.clear(); + slicer(typename K::Plane_3(0,-1,0,-0.5), std::back_inserter(polylines)); + assert(polylines.size()==2); // two polylines + closed_id = polylines.front().front()==polylines.front().back() ? 0 : 1; + CGAL_assertion( !is_ccw(0, 2, polylines[closed_id]) ); + + polylines.clear(); + slicer(typename K::Plane_3(0,0,1,1), std::back_inserter(polylines)); + assert(polylines.size()==1); // one polyline + CGAL_assertion( is_ccw(0, 1 , polylines[0]) ); + + polylines.clear(); + slicer(typename K::Plane_3(0,0,-1,-1), std::back_inserter(polylines)); + assert(polylines.size()==1); // one polyline + CGAL_assertion( !is_ccw(0, 1 , polylines[0]) ); + + // reverse face orientation (no need to rebuild the tree) + CGAL::Polygon_mesh_processing::reverse_face_orientations(m); + polylines.clear(); + slicer(typename K::Plane_3(0,1,0,0.5), std::back_inserter(polylines)); + assert(polylines.size()==2); // two polylines + closed_id = polylines.front().front()==polylines.front().back() ? 0 : 1; + CGAL_assertion( !is_ccw(0, 2 , polylines[closed_id]) ); + + polylines.clear(); + slicer(typename K::Plane_3(0,-1,0,-0.5), std::back_inserter(polylines)); + assert(polylines.size()==2); // two polylines + closed_id = polylines.front().front()==polylines.front().back() ? 0 : 1; + CGAL_assertion( is_ccw(0, 2, polylines[closed_id]) ); + + polylines.clear(); + slicer(typename K::Plane_3(0,0,1,1), std::back_inserter(polylines)); + assert(polylines.size()==1); // one polyline + CGAL_assertion( !is_ccw(0, 1 , polylines[0]) ); + + polylines.clear(); + slicer(typename K::Plane_3(0,0,-1,-1), std::back_inserter(polylines)); + assert(polylines.size()==1); // one polyline + CGAL_assertion( is_ccw(0, 1 , polylines[0]) ); + + + return 0; } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp index b37cc61eb92..ab5778ec5f8 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp @@ -1,5 +1,7 @@ #include + #include +#include #include @@ -13,56 +15,233 @@ namespace PMP = CGAL::Polygon_mesh_processing; -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; -typedef CGAL::Surface_mesh Surface_mesh; +typedef CGAL::Surface_mesh Surface_mesh; +typedef CGAL::Polyhedron_3 Polyhedron; -typedef boost::graph_traits::edge_descriptor edge_descriptor; -typedef boost::graph_traits::face_descriptor face_descriptor; - -void detect_degeneracies(const Surface_mesh& mesh) +template +void detect_degeneracies(const EdgeRange& edge_range, + const FaceRange& face_range, + const Mesh& mesh, + const std::size_t expected_dedges_n, + const std::size_t expected_dfaces_n) { - std::vector dfaces; - - PMP::degenerate_faces(mesh, std::back_inserter(dfaces)); - PMP::degenerate_faces(faces(mesh), mesh, std::back_inserter(dfaces)); - PMP::degenerate_faces(mesh, std::back_inserter(dfaces), CGAL::parameters::all_default()); - PMP::degenerate_faces(faces(mesh), mesh, std::back_inserter(dfaces), CGAL::parameters::all_default()); - assert(!dfaces.empty()); + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + // API tests std::set dedges; PMP::degenerate_edges(mesh, std::inserter(dedges, dedges.end())); - PMP::degenerate_edges(edges(mesh), mesh, std::inserter(dedges, dedges.begin())); + PMP::degenerate_edges(edge_range, mesh, std::inserter(dedges, dedges.begin())); PMP::degenerate_edges(mesh, std::inserter(dedges, dedges.end()), CGAL::parameters::all_default()); - PMP::degenerate_edges(edges(mesh), mesh, std::inserter(dedges, dedges.begin()), CGAL::parameters::all_default()); - assert(dedges.empty()); + + dedges.clear(); + PMP::degenerate_edges(edge_range, mesh, std::inserter(dedges, dedges.begin()), CGAL::parameters::all_default()); + std::cout << "\t" << dedges.size() << " degenerate edges vs " << expected_dedges_n << std::endl; + assert(dedges.size() == expected_dedges_n); + + // API tests + std::vector dfaces; + PMP::degenerate_faces(mesh, std::back_inserter(dfaces)); + PMP::degenerate_faces(face_range, mesh, std::back_inserter(dfaces)); + PMP::degenerate_faces(mesh, std::back_inserter(dfaces), CGAL::parameters::all_default()); + + dfaces.clear(); + PMP::degenerate_faces(face_range, mesh, std::back_inserter(dfaces), CGAL::parameters::all_default()); + std::cout << "\t" << dfaces.size() << " degenerate faces vs " << expected_dfaces_n << std::endl; + assert(dfaces.size() == expected_dfaces_n); } -void fix_degeneracies(const char* fname) +template +void detect_degeneracies(const std::vector& edges_selection_ids, + const std::vector& faces_selection_ids, + const Mesh& mesh, + const std::size_t expected_dedges_n, + const std::size_t expected_dfaces_n) { - std::ifstream input(fname); + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; - Surface_mesh mesh; - if (!input || !(input >> mesh) || mesh.is_empty()) { - std::cerr << fname << " is not a valid off file.\n"; + // Convert IDs to descriptors + std::vector all_edges(edges(mesh).begin(), edges(mesh).end()); + std::vector all_faces(faces(mesh).begin(), faces(mesh).end()); + + std::vector edge_range; + for(std::size_t edge_id : edges_selection_ids) + edge_range.push_back(all_edges[edge_id]); + + std::set face_range; + for(std::size_t face_id : faces_selection_ids) + face_range.insert(all_faces[face_id]); + + return detect_degeneracies(edge_range, face_range, mesh, expected_dedges_n, expected_dfaces_n); +} + +template +void detect_degeneracies(const Mesh& mesh, + const std::size_t expected_dedges_n, + const std::size_t expected_dfaces_n) +{ + return detect_degeneracies(edges(mesh), faces(mesh), mesh, expected_dedges_n, expected_dfaces_n); +} + +template +bool remove_dedges(const std::vector& edges_selection_ids, + Mesh& mesh) +{ + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + + // Convert IDs to descriptors + std::vector all_edges(edges(mesh).begin(), edges(mesh).end()); + + std::vector edge_range; + for(std::size_t edge_id : edges_selection_ids) + edge_range.push_back(all_edges[edge_id]); + + return CGAL::Polygon_mesh_processing::remove_degenerate_edges(edge_range, mesh, CGAL::parameters::all_default()); +} + +template +bool remove_dfaces(const std::vector& faces_selection_ids, + Mesh& mesh) +{ + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + // Convert IDs to descriptors + std::vector all_faces(faces(mesh).begin(), faces(mesh).end()); + + std::vector face_range; + for(std::size_t face_id : faces_selection_ids) + face_range.push_back(all_faces[face_id]); + + return CGAL::Polygon_mesh_processing::remove_degenerate_faces(face_range, mesh, CGAL::parameters::all_default()); +} + +template +void test(const char* filename, + const std::vector& edges_selection_ids, + const std::vector& faces_selection_ids, + const std::size_t expected_all_degen_edges_n, + const std::size_t expected_all_degen_faces_n, + const std::size_t expected_partial_degen_edges_n, + const std::size_t expected_partial_degen_faces_n, + const std::size_t expected_post_removal_degen_edges_n, + const std::size_t expected_post_removal_degen_faces_n) +{ + std::cout << " test file: " << filename << std::endl; + + std::ifstream input(filename); + Mesh mesh; + if (!input || !(input >> mesh) || mesh.is_empty()) + { + std::cerr << filename << " is not a valid off file.\n"; exit(1); } - detect_degeneracies(mesh); + Mesh mesh_cpy = mesh; - CGAL::Polygon_mesh_processing::remove_degenerate_faces(mesh); - assert( CGAL::is_valid_polygon_mesh(mesh) ); + // Count + std::cout << " Count..." << std::endl; + detect_degeneracies(mesh, expected_all_degen_edges_n, expected_all_degen_faces_n); + detect_degeneracies(edges_selection_ids, faces_selection_ids, mesh, expected_partial_degen_edges_n, expected_partial_degen_faces_n); + + // Complete remove + std::cout << " Remove all..." << std::endl; + mesh = mesh_cpy; + /* bool all_removed = */ CGAL::Polygon_mesh_processing::remove_degenerate_edges(mesh, CGAL::parameters::all_default()); + //assert(all_removed); + assert(CGAL::is_valid_polygon_mesh(mesh)); + + mesh = mesh_cpy; + /* all_removed = */ CGAL::Polygon_mesh_processing::remove_degenerate_faces(mesh, CGAL::parameters::all_default()); + // assert(all_removed); + assert(CGAL::is_valid_polygon_mesh(mesh)); + + // Check that everything is gone + std::cout << " Count (Post All-Remove)..." << std::endl; + detect_degeneracies(mesh, 0, 0); + + // Partial remove + std::cout << " Partial remove..." << std::endl; + mesh = mesh_cpy; + remove_dedges(edges_selection_ids, mesh); + assert(CGAL::is_valid_polygon_mesh(mesh)); + + mesh = mesh_cpy; + remove_dfaces(faces_selection_ids, mesh); + assert(CGAL::is_valid_polygon_mesh(mesh)); + + // Count how much is left after partial removal + std::cout << " Count (Post Partial-Remove)..." << std::endl; + detect_degeneracies(mesh, expected_post_removal_degen_edges_n, expected_post_removal_degen_faces_n); + + std::cout << " Done" << std::endl; +} + +template +void test() +{ + test("data_degeneracies/degtri_2dt_1edge_split_twice.off", + std::initializer_list({0, 1, 4, 3}), // edge selection + std::initializer_list({0}), // face selection + 0, 2, // expected number of degenerate edges/faces in the complete mesh + 0, 1, // expected number of degenerate edges/faces in the selection + 0, 0); // expected number of degenerate edges/faces in the mesh after partial removal + + test("data_degeneracies/degtri_four.off", + std::initializer_list({1}), + std::initializer_list({3}), + 0, 1, 0, 0, 0, 1); + + test("data_degeneracies/degtri_four-2.off", + std::initializer_list({2}), + std::initializer_list({3}), + 0, 1, 0, 0, 0, 1); + + test("data_degeneracies/degtri_on_border.off", + std::initializer_list({2}), + std::initializer_list({0}), + 0, 1, 0, 1, 0, 0); + + test("data_degeneracies/degtri_three.off", + std::initializer_list({2}), + std::initializer_list({1}), + 0, 1, 0, 0, 0, 1); + + test("data_degeneracies/degtri_single.off", + std::initializer_list({0, 1, 2}), + std::initializer_list({0}), + 0, 1, 0, 1, 0, 0); + + test("data_degeneracies/degtri_nullface.off", + std::initializer_list({3, 6, 7}), + std::initializer_list({0, 1, 2}), + 3, 4, 1, 2, 0, 0); + + test("data_degeneracies/trihole.off", + std::initializer_list({12}), + std::initializer_list({4, 5}), + 1, 3, 1, 2, 0, 0); + + test("data_degeneracies/degtri_sliding.off", + std::initializer_list({2}), + std::initializer_list({2, 4}), + 0, 4, 0, 2, 0, 0); + + test("data_degeneracies/fused_vertices.off", + std::initializer_list({5, 10, 13, 15, 27, 45}), + std::initializer_list({1, 3, 5, 10, 19}), + 6, 7, 2, 4, 3, 3); } int main() { - fix_degeneracies("data_degeneracies/degtri_2dt_1edge_split_twice.off"); - fix_degeneracies("data_degeneracies/degtri_four-2.off"); - fix_degeneracies("data_degeneracies/degtri_four.off"); - fix_degeneracies("data_degeneracies/degtri_on_border.off"); - fix_degeneracies("data_degeneracies/degtri_three.off"); - fix_degeneracies("data_degeneracies/degtri_single.off"); - fix_degeneracies("data_degeneracies/trihole.off"); + std::cout << "EPICK SM TESTS" << std::endl; + test(); - return 0; + std::cout << "EPICK POLYHEDRON TESTS" << std::endl; + test(); + + return EXIT_SUCCESS; } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_merging_border_vertices.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_merging_border_vertices.cpp index ed21427f4d1..4ae670175e3 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_merging_border_vertices.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_merging_border_vertices.cpp @@ -31,7 +31,7 @@ void test_merge_duplicated_vertices_in_boundary_cycles(const char* fname, expected_nb_vertices == vertices(mesh).size()); if (expected_nb_vertices==0) { - std::cout << "writting output to out1.off\n"; + std::cout << "writing output to out1.off\n"; std::ofstream output("out1.off"); output << std::setprecision(17); output << mesh; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_manifoldness.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_manifoldness.cpp new file mode 100644 index 00000000000..b922c86716a --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_manifoldness.cpp @@ -0,0 +1,272 @@ +#include + +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; + +typedef CGAL::Surface_mesh Surface_mesh; +typedef CGAL::Polyhedron_3 Polyhedron; + +typedef std::vector > Vertices_to_merge_container; + +template +void read_mesh(const char* fname, + PolygonMesh& mesh) +{ + std::ifstream input(fname); + if (!input || !(input >> mesh) || mesh.is_empty()) + { + std::cerr << fname << " is not a valid off file.\n"; + std::exit(1); + } +} + +// tests merge_and_duplication +template +void merge_vertices(typename boost::graph_traits::vertex_descriptor v_keep, + typename boost::graph_traits::vertex_descriptor v_rm, + PolygonMesh& mesh) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + assert(v_keep != v_rm); + + std::size_t ini_nv = static_cast(vertices(mesh).size()); + + halfedge_descriptor h = halfedge(v_rm, mesh); + halfedge_descriptor start = h; + do + { + set_target(h, v_keep, mesh); + h = opposite(next(h, mesh), mesh); + } + while(h != start); + + remove_vertex(v_rm, mesh); + + assert(vertices(mesh).size() == ini_nv - 1); +} + +template +void merge_vertices(const Vertices_to_merge_container& all_vertices_to_merge, + std::map::vertex_descriptor, std::size_t>& merged_onto, + PolygonMesh& mesh) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + // int to vd + std::vector vds(vertices(mesh).begin(), vertices(mesh).end()); + + for(std::size_t i=0, avtmn=all_vertices_to_merge.size(); i& vertices_to_merge = all_vertices_to_merge[i]; + if(vertices_to_merge.size() <= 1) + continue; + + vertex_descriptor vd_to_merge_onto = vds[vertices_to_merge[0]]; + + for(std::size_t j=1, vtmn=vertices_to_merge.size(); j::iterator, bool > is_insert_successful = + merged_onto.insert(std::make_pair(vd_to_merge_onto, vertices_to_merge.size() - 1)); + if(!is_insert_successful.second) + is_insert_successful.first->second += vertices_to_merge.size() - 1; + + assert(CGAL::Polygon_mesh_processing::is_non_manifold_vertex(vd_to_merge_onto, mesh)); + } +} + +template +std::size_t test_nm_vertices_duplication(const Vertices_to_merge_container& all_merges, + std::map::vertex_descriptor, std::size_t>& merged_onto, + std::vector::vertex_descriptor> >& duplicated_vertices, + PolygonMesh& mesh) +{ + merge_vertices(all_merges, merged_onto, mesh); + + std::size_t new_vertices_nb = + CGAL::Polygon_mesh_processing::duplicate_non_manifold_vertices(mesh, + CGAL::parameters::output_iterator(std::back_inserter(duplicated_vertices))); + + return new_vertices_nb; +} + +template +std::size_t test_nm_vertices_duplication(const Vertices_to_merge_container& all_merges, + std::vector::vertex_descriptor> >& duplicated_vertices, + PolygonMesh& mesh) +{ + std::map::vertex_descriptor, std::size_t> useless_map; + + return test_nm_vertices_duplication(all_merges, useless_map, duplicated_vertices, mesh); +} + + +template +void test_unpinched_mesh(const Vertices_to_merge_container& all_merges, + PolygonMesh& mesh) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + const std::size_t ini_vertices_size = num_vertices(mesh); + + // this is a nice, smooth, surface initially + for(vertex_descriptor vd : vertices(mesh)) { + assert(!CGAL::Polygon_mesh_processing::is_non_manifold_vertex(vd, mesh)); + } + + std::vector > duplicated_vertices; + std::map number_of_vertices_merged_onto; + std::size_t nb = test_nm_vertices_duplication(all_merges, + number_of_vertices_merged_onto, + duplicated_vertices, + mesh); + + const std::size_t final_vertices_size = vertices(mesh).size(); + std::cout << " ini: " << ini_vertices_size << " final: " << final_vertices_size << std::endl; + assert(final_vertices_size == ini_vertices_size); + + std::size_t expected_nb = 0; + for(std::size_t i=0, n=all_merges.size(); i +void test_blobby() +{ + std::cout << " test: data/blobby.off" << std::endl; + + PolygonMesh mesh; + read_mesh("data/blobby.off", mesh); + + // non-manifold vertices + Vertices_to_merge_container all_merges; + std::vector single_merge; + single_merge.push_back(1); single_merge.push_back(7); single_merge.push_back(14); single_merge.push_back(21); + all_merges.push_back(single_merge); + + single_merge.clear(); + single_merge.push_back(2); single_merge.push_back(8); + all_merges.push_back(single_merge); + + test_unpinched_mesh(all_merges, mesh); +} + +template +void test_nm_cubes() +{ + std::cout << " test: data_repair/nm_closed_cubes.off" << std::endl; + + PolygonMesh mesh; + read_mesh("data_repair/nm_closed_cubes.off", mesh); + + // non-manifold vertices + Vertices_to_merge_container all_merges; + std::vector single_merge; + single_merge.push_back(5); single_merge.push_back(14); + all_merges.push_back(single_merge); + + single_merge.clear(); + single_merge.push_back(6); single_merge.push_back(15); + all_merges.push_back(single_merge); + + test_unpinched_mesh(all_merges, mesh); +} + +template +void test_pinched_triangles(const char* filename, + const std::size_t expected_nb) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + std::cout << " test: " << filename << " expected: " << expected_nb << std::endl; + + PolygonMesh mesh; + read_mesh(filename, mesh); + + // in the triangles, the second (id==1) vertex is non-manifold because it is pinched + int id = 0; + for(vertex_descriptor vd : vertices(mesh)) { + if(id++ == 1) { + assert(CGAL::Polygon_mesh_processing::is_non_manifold_vertex(vd, mesh)); + } else { + assert(!CGAL::Polygon_mesh_processing::is_non_manifold_vertex(vd, mesh)); + } + } + + std::vector > duplicated_vertices; + std::size_t new_vertices_nb = + CGAL::Polygon_mesh_processing::duplicate_non_manifold_vertices(mesh, + CGAL::parameters::output_iterator(std::back_inserter(duplicated_vertices))); + std::cout << " new_vertices_nb: " << new_vertices_nb << " vs expected: " << expected_nb << std::endl; + assert(new_vertices_nb == expected_nb); + assert(duplicated_vertices.size() == 1); + assert(duplicated_vertices[0].size() == 1 + expected_nb); +} + +template +void test_many_umbrellas() +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + std::cout << " test: data_repair/many_umbrellas.off" << std::endl; + + PolygonMesh mesh; + read_mesh("data_repair/many_umbrellas.off", mesh); + + // non-manifold vertices + Vertices_to_merge_container all_merges; + std::vector single_merge; + single_merge.push_back(1); single_merge.push_back(9); single_merge.push_back(15); + all_merges.push_back(single_merge); + + std::vector > duplicated_vertices; + std::size_t nb = test_nm_vertices_duplication(all_merges, duplicated_vertices, mesh); + assert(nb == 5); + + const std::size_t final_vertices_size = vertices(mesh).size(); + + assert(duplicated_vertices.size() == 1); + assert(duplicated_vertices[0].size() == 6); + assert(final_vertices_size == 19); // 5 new ones, but we merged 2 before, so +3 from '16' at the start +} + +int main(int /*argc*/, char** /*argv*/) +{ + std::cout << "Test Vertex Manifoldness Functions (SM)" << std::endl; + + test_blobby(); // data/blobby.off + test_nm_cubes(); // data_repair/nm_closed_cubes.off + test_pinched_triangles("data_repair/two_triangles_sharing_a_vertex.off", 1); + test_pinched_triangles("data_repair/three_triangles_sharing_a_vertex.off", 2); + test_many_umbrellas(); // data_repair/many_umbrellas.off + + std::cout << "Test Vertex Manifoldness Functions (Polyhedron)" << std::endl; + + test_blobby(); // data/blobby.off + test_nm_cubes(); // data_repair/nm_closed_cubes.off + test_pinched_triangles("data_repair/two_triangles_sharing_a_vertex.off", 1); + test_pinched_triangles("data_repair/three_triangles_sharing_a_vertex.off", 2); + test_many_umbrellas(); // data_repair/many_umbrellas.off + + return EXIT_SUCCESS; +} diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_non_conforming_snapping.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_non_conforming_snapping.cpp new file mode 100644 index 00000000000..7bdf106c1fa --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_non_conforming_snapping.cpp @@ -0,0 +1,157 @@ +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace PMP = CGAL::Polygon_mesh_processing; +namespace params = CGAL::parameters; + +typedef CGAL::Exact_predicates_exact_constructions_kernel EPECK; +typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; + +typedef CGAL::Polyhedron_3 Exact_polyhedron; +typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::Surface_mesh Surface_mesh; + +template +void read_mesh(const char* filename, + Mesh& sm) +{ + typedef typename Kernel::Point_3 Point; + + std::ifstream in(filename, std::ios::binary); + if(!in.good()) + { + std::cerr << "Error: can't read file: " << filename << std::endl; + std::exit(1); + } + + std::string fn(filename); + if(fn.substr(fn.find_last_of(".") + 1) == "stl") + { + std::vector points; + std::vector > faces; + CGAL::read_STL(in, points, faces); + + if(!CGAL::Polygon_mesh_processing::orient_polygon_soup(points, faces)) + std::cerr << "W: File does not describe a polygon mesh" << std::endl; + + CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(points, faces, sm); + } + else // off reading + { + if(!in || !(in >> sm)) + { + std::cerr << "Error: cannot open mesh\n"; + return; + } + } +} + +template +void test(const char* filename, + const double large_tolerance, + const double small_tolerance) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename Kernel::FT FT; + + Mesh sm; + read_mesh(filename, sm); + + std::cout << "------------------" << std::endl; + std::cout << "num v/f: " << num_vertices(sm) << " " << num_faces(sm) << std::endl; + + std::size_t res; + Mesh sm_cpy = sm; + + // zero tolerance, just to test the API + CGAL::Constant_property_map tol_pmap_zero(0); + PMP::experimental::snap_border_vertices_non_conforming(sm_cpy, sm_cpy); + PMP::experimental::snap_border_vertices_non_conforming(sm_cpy, sm_cpy, tol_pmap_zero); + PMP::experimental::snap_border_vertices_non_conforming(sm_cpy, sm_cpy, tol_pmap_zero, + CGAL::parameters::geom_traits(Kernel()), + CGAL::parameters::geom_traits(Kernel())); + + // too big, creates wrong snaps + sm_cpy = sm; + CGAL::Constant_property_map tol_pmap_large(large_tolerance); + res = PMP::experimental::snap_border_vertices_non_conforming(sm_cpy, tol_pmap_large); + std::cout << "snapped: " << res << std::endl; + + std::ofstream out1("out1.off"); + out1.precision(17); + out1 << sm_cpy; + out1.close(); + + // too small + sm_cpy = sm; + CGAL::Constant_property_map tol_pmap_small(small_tolerance); + res = PMP::experimental::snap_border_vertices_non_conforming(sm_cpy, tol_pmap_small, + CGAL::parameters::geom_traits(Kernel())); + std::cout << "snapped: " << res << std::endl; + + std::ofstream out2("out2.off"); + out2.precision(17); + out2 << sm_cpy; + out2.close(); + + // automatically computed, custom tolerance at each vertex + sm_cpy = sm; + res = PMP::experimental::snap_border_vertices_non_conforming(sm_cpy); + std::cout << "snapped: " << res << std::endl; + + std::ofstream out3("out3.off"); + out3.precision(17); + out3 << sm_cpy; + out3.close(); +} + +void test(const char* filename, + const double large_tolerance, + const double small_tolerance) +{ + std::cout << "######################## TEST FILE: " << filename << " ################## " << std::endl; + + std::cout << "~~~~~~~~~~~ TEST EPECK POLYHEDRON ~~~~~~~~~~~" << std::endl; + test(filename, large_tolerance, small_tolerance); + + std::cout << std::endl << "~~~~~~~~~~~ TEST EPICK POLYHEDRON ~~~~~~~~~~~" << std::endl; + test(filename, large_tolerance, small_tolerance); + + std::cout << std::endl << "~~~~~~~~~~~ TEST EPICK SURFACE MESH ~~~~~~~~~~~" << std::endl; + test(filename, large_tolerance, small_tolerance); +} + +int main(int, char**) +{ + test("data_snapping/non_conform_snapping.off", 0.02, 0.001); + test("data_snapping/non-conform_snapping-hole.off", 0.02, 0.001); + test("data_snapping/non_conform_snapping-multiple_ccs.off", 0.02, 0.001); + test("data_snapping/non-conform_snapping-overlap.off", 0.02, 0.001); + + test("data_snapping/real_data.off", 1., 0.05); + test("data_snapping/real_data_2.off", 2, 0.1); + + test("data_snapping/pig.stl", 20, 0.01); + + return EXIT_SUCCESS; +} + diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_snapping.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_snapping.cpp new file mode 100644 index 00000000000..3ae3d761799 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_snapping.cpp @@ -0,0 +1,177 @@ +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include + +namespace PMP = CGAL::Polygon_mesh_processing; +namespace params = CGAL::parameters; + +typedef CGAL::Exact_predicates_exact_constructions_kernel EPECK; +typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; + +typedef CGAL::Polyhedron_3 Exact_polyhedron; +typedef CGAL::Polyhedron_3 Polyhedron; + +typedef CGAL::Surface_mesh Surface_mesh; +typedef CGAL::Surface_mesh Exact_surface_mesh; + +template +void test_1() +{ + typedef typename Kernel::FT FT; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + Mesh fg_source, fg_target; + + // empty meshes + std::size_t res = PMP::experimental::snap_border_vertices_onto_vertex_range(fg_source, fg_target); + assert(res == 0); + + std::ifstream source_input("data_snapping/border_snapping_source.off"); + if(!source_input || !(source_input >> fg_source)) + { + std::cerr << "Error: cannot open source mesh\n"; + return; + } + + std::vector border_vertices; + PMP::border_halfedges(fg_source, std::back_inserter(border_vertices)); + std::cout << border_vertices.size() << " border vertices" << std::endl; + + // one empty mesh + std::cout << "Empty meshes tests..." << std::endl; + res = PMP::experimental::snap_border_vertices_onto_vertex_range(fg_source, fg_target); + std::cout << "res: " << res << " (expected 0)" << std::endl; + assert(res == 0); + + res = PMP::experimental::snap_border_vertices_onto_vertex_range(fg_target, halfedges(fg_source), fg_source); + std::cout << "res: " << res << " (expected 0)" << std::endl; + assert(res == 0); + + std::ifstream target_input("data_snapping/border_snapping_target.off"); + if(!target_input || !(target_input >> fg_target)) + { + std::cerr << "Error: cannot open target mesh\n"; + return; + } + + Mesh fg_source_cpy = fg_source; + + // this epsilon value is too small, nothing happens + std::cout << "*********************** EPS = 0.000000001 *************** " << std::endl; + CGAL::Constant_property_map tol_map_small(0.000000001); + res = PMP::experimental::snap_border_vertices_onto_vertex_range(fg_source_cpy, fg_target, tol_map_small); + res = PMP::experimental::snap_border_vertices_onto_vertex_range(fg_source_cpy, halfedges(fg_target), fg_target, tol_map_small); + std::cout << "res: " << res << " (expected 0)" << std::endl; + assert(res == 0); + + // this epsilon value is too big; everything gets snapped! + std::cout << "*********************** EPS = 0.1 *************** " << std::endl; + CGAL::Constant_property_map tol_map_big(0.1); + fg_source_cpy = fg_source; + + border_vertices.clear(); + PMP::border_halfedges(fg_source_cpy, std::back_inserter(border_vertices)); + + res = PMP::experimental::snap_vertex_range_onto_vertex_range(border_vertices, fg_source_cpy, + halfedges(fg_target), fg_target, tol_map_big, + params::geom_traits(Kernel()), params::all_default()); + + std::cout << "res: " << res << " (expected 154)" << std::endl; + assert(res == 154); + + // this is a good value of 'epsilon', but not all expected vertices are projected + // because the sampling of the border of the source mesh is not uniform + std::cout << "*********************** EPS = 0.001 *************** " << std::endl; + CGAL::Constant_property_map tol_map_good(0.001); + fg_source_cpy = fg_source; + + border_vertices.clear(); + PMP::border_halfedges(fg_source_cpy, std::back_inserter(border_vertices)); + + res = PMP::experimental::snap_vertex_range_onto_vertex_range(border_vertices, fg_source_cpy, + halfedges(fg_target), fg_target, tol_map_good); + std::cout << "res: " << res << " vertices" << std::endl; + assert(res == 76); + + std::ofstream partial_snap_out("partially_snapped_mesh.off"); + partial_snap_out << std::setprecision(17) << fg_source_cpy; + + // this one automatically computes an epsilon bound at each vertex + std::cout << "*********************** EPS = LOCALLY COMPUTED *************** " << std::endl; + fg_source_cpy = fg_source; + res = PMP::experimental::snap_border_vertices_onto_vertex_range(fg_source_cpy, fg_target); + std::cout << "res: " << res << " vertices" << std::endl; + assert(res == 77); + + std::ofstream full_snap_out("snapped_mesh.off"); + full_snap_out << std::setprecision(17) << fg_source_cpy; +} + +template +void test_2() +{ + typedef typename Kernel::FT FT; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + Mesh fg_source, fg_target; + + std::ifstream source_input("data_snapping/border_snapping_source_2.off"); + if(!source_input || !(source_input >> fg_source)) + { + std::cerr << "Error: cannot open source mesh\n"; + return; + } + + std::ifstream target_input("data_snapping/border_snapping_target_2.off"); + if(!target_input || !(target_input >> fg_target)) + { + std::cerr << "Error: cannot open target mesh\n"; + return; + } + + // This configuration has three vertices close to a target vertex, it just to make sure that + // if a target vertex is already occupied, the source vertex will go to the next one that is + // within tolerance and is available + CGAL::Constant_property_map tol_map(0.5); + std::size_t res = PMP::experimental::snap_border_vertices_onto_vertex_range(fg_source, fg_target, tol_map); + std::cout << "res: " << res << " vertices" << std::endl; + assert(res == 3); +} + +template +void test() +{ + test_1(); + test_2(); +} + +int main(int, char**) +{ + std::cout << std::endl << "TEST EPICK SURFACE MESH" << std::endl; + test(); + + std::cout << std::endl << "TEST EPICK POLYHEDRON" << std::endl; + test(); + + std::cout << std::endl << "TEST EPECK SURFACE MESH" << std::endl; + test(); + + std::cout << "TEST EPECK POLYHEDRON" << std::endl; + test(); + + return EXIT_SUCCESS; +} diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_predicates.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_predicates.cpp index 6ff76236ccd..2f4c275e29d 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_predicates.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_predicates.cpp @@ -57,109 +57,6 @@ void check_triangle_face_degeneracy(const char* fname) std::cout << "done" << std::endl; } -// tests merge_and_duplication -template -void merge_identical_points(typename boost::graph_traits::vertex_descriptor v_keep, - typename boost::graph_traits::vertex_descriptor v_rm, - PolygonMesh& mesh) -{ - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - - halfedge_descriptor h = halfedge(v_rm, mesh); - halfedge_descriptor start = h; - - do - { - set_target(h, v_keep, mesh); - h = opposite(next(h, mesh), mesh); - } - while( h != start ); - - remove_vertex(v_rm, mesh); -} - -void test_vertex_non_manifoldness(const char* fname) -{ - std::cout << "test vertex non manifoldness..."; - - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef boost::graph_traits::vertices_size_type size_type; - - std::ifstream input(fname); - Surface_mesh mesh; - if (!input || !(input >> mesh) || mesh.is_empty()) { - std::cerr << fname << " is not a valid off file.\n"; - std::exit(1); - } - - size_type ini_nv = num_vertices(mesh); - - // create non-manifold vertex - Surface_mesh::Vertex_index vertex_to_merge_onto(1); - Surface_mesh::Vertex_index vertex_to_merge(7); - merge_identical_points(vertex_to_merge_onto, vertex_to_merge, mesh); - mesh.collect_garbage(); - - assert(num_vertices(mesh) == ini_nv - 1); - - for(vertex_descriptor v : vertices(mesh)) - { - if(v == vertex_to_merge_onto) - assert(CGAL::Polygon_mesh_processing::is_non_manifold_vertex(v, mesh)); - else - assert(!CGAL::Polygon_mesh_processing::is_non_manifold_vertex(v, mesh)); - } - - std::cout << "done" << std::endl; -} - -void test_vertices_merge_and_duplication(const char* fname) -{ - std::cout << "test non manifold vertex duplication..."; - - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - - std::ifstream input(fname); - Surface_mesh mesh; - if (!input || !(input >> mesh) || mesh.is_empty()) { - std::cerr << fname << " is not a valid off file.\n"; - std::exit(1); - } - const std::size_t initial_vertices = num_vertices(mesh); - - // create non-manifold vertex - Surface_mesh::Vertex_index vertex_to_merge_onto(1); - Surface_mesh::Vertex_index vertex_to_merge(7); - Surface_mesh::Vertex_index vertex_to_merge_2(14); - Surface_mesh::Vertex_index vertex_to_merge_3(21); - - Surface_mesh::Vertex_index vertex_to_merge_onto_2(2); - Surface_mesh::Vertex_index vertex_to_merge_4(8); - - merge_identical_points(vertex_to_merge_onto, vertex_to_merge, mesh); - merge_identical_points(vertex_to_merge_onto, vertex_to_merge_2, mesh); - merge_identical_points(vertex_to_merge_onto, vertex_to_merge_3, mesh); - merge_identical_points(vertex_to_merge_onto_2, vertex_to_merge_4, mesh); - mesh.collect_garbage(); - - const std::size_t vertices_after_merge = num_vertices(mesh); - assert(vertices_after_merge == initial_vertices - 4); - - std::vector > duplicated_vertices; - std::size_t new_vertices_nb = - CGAL::Polygon_mesh_processing::duplicate_non_manifold_vertices(mesh, - CGAL::parameters::output_iterator(std::back_inserter(duplicated_vertices))); - - const std::size_t final_vertices_size = vertices(mesh).size(); - assert(final_vertices_size == initial_vertices); - assert(new_vertices_nb == 4); - assert(duplicated_vertices.size() == 2); // two non-manifold vertex - assert(duplicated_vertices.front().size() == 4); - assert(duplicated_vertices.back().size() == 2); - - std::cout << "done" << std::endl; -} - void test_needles_and_caps(const char* fname) { std::cout << "test needles&caps..."; @@ -243,8 +140,7 @@ int main() { check_edge_degeneracy("data_degeneracies/degtri_edge.off"); check_triangle_face_degeneracy("data_degeneracies/degtri_four.off"); - test_vertex_non_manifoldness("data/blobby.off"); - test_vertices_merge_and_duplication("data/blobby.off"); + test_needles_and_caps("data_degeneracies/caps_and_needles.off"); return EXIT_SUCCESS; diff --git a/Polyhedron/demo/Polyhedron/Color_map.h b/Polyhedron/demo/Polyhedron/Color_map.h index 096f2e20720..46164c649cb 100644 --- a/Polyhedron/demo/Polyhedron/Color_map.h +++ b/Polyhedron/demo/Polyhedron/Color_map.h @@ -3,33 +3,38 @@ #include +inline QColor generate_color(double h, double s_min = 0.35) +{ + std::size_t s_max=255; + if(h >0.8 && h < 0.95) //span of ugly pink, desaturates make it less garish IMO + s_max = 160; + std::size_t s = std::rand() % (s_max-static_cast(s_min*255)) +s_min*255; + return QColor::fromHsvF(h,s/255.0,1.0); +} + + template Output_color_iterator compute_color_map(QColor base_color, - unsigned nb_of_colors, + std::size_t nb_of_colors, Output_color_iterator out) { qreal hue = base_color.hueF(); const qreal step = ((qreal)1) / nb_of_colors; - int s = base_color.saturation(), - v = base_color.value(); - s = s<90 ? s+90 : s; - v = v<90 ? v+90 : v; - float sf=s/256.0f, - vf=v/256.0f; - qreal h = hue==-1 ? 0 :hue; for(unsigned i = 0; i < nb_of_colors; ++i) { if (h!=-1) h += step; if ( h > 1 ) { h -= 1; } -//avoid S and V near 0 to avoid having all the same colors - *out++ = QColor::fromHsvF(h, - sf, - vf); + *out++ = generate_color(h); } return out; } +inline QColor generate_random_color() { + std::size_t h = static_cast(std::rand() % 360); + return generate_color(h/359.0); +} + #endif diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 4f72f81635a..7f7978a5e8f 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1000,7 +1000,8 @@ void MainWindow::reloadItem() { QFileInfo fileinfo(filename); CGAL::Three::Scene_item* new_item = loadItem(fileinfo, fileloader); - + if(!new_item) + return; new_item->setName(item->name()); new_item->setColor(item->color()); new_item->setRenderingMode(item->renderingMode()); @@ -1107,7 +1108,12 @@ void MainWindow::open(QString filename) if ( !io_plugin->canLoad() ) continue; all_items << io_plugin->name(); if ( file_matches_filter(io_plugin->loadNameFilters(), filename.toLower()) ) - selected_items << io_plugin->name(); + { + if(io_plugin->isDefaultLoader(fileinfo.completeSuffix())) + selected_items.prepend(io_plugin->name()); + else + selected_items << io_plugin->name(); + } } } else @@ -1128,7 +1134,7 @@ void MainWindow::open(QString filename) default: load_pair = File_loader_dialog::getItem(fileinfo.fileName(), selected_items, &ok); } - viewer->makeCurrent(); + //viewer->makeCurrent(); if(!ok || load_pair.first.isEmpty()) { return; } if (load_pair.second) @@ -1851,7 +1857,8 @@ void MainWindow::on_actionLoad_triggered() dialog.setFileMode(QFileDialog::ExistingFiles); if(dialog.exec() != QDialog::Accepted) { return; } - viewer->update(); + for(auto v : CGAL::QGLViewer::QGLViewerPool()) + v->update(); FilterPluginMap::iterator it = filterPluginMap.find(dialog.selectedNameFilter()); @@ -2007,7 +2014,8 @@ void MainWindow::on_actionSaveAs_triggered() { filename = filename.append(filter_ext); } - viewer->update(); + for(auto v : CGAL::QGLViewer::QGLViewerPool()) + v->update(); save(filename, item); } } @@ -2290,7 +2298,7 @@ void MainWindow::setBackgroundColor() void MainWindow::setLighting_triggered() { - viewer->setLighting(); + qobject_cast(CGAL::Three::Three::activeViewer())->setLighting(); } void MainWindow::viewerShowObject() @@ -2340,14 +2348,8 @@ void MainWindow::on_actionRecenterScene_triggered() bbox_need_update = true; CGAL::qglviewer::Vec min, max; computeViewerBBox(min, max); - Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) - { - if(v == NULL) - continue; - updateViewerBbox(static_cast(v), true, min, max); - v->camera()->interpolateToFitScene(); - } - viewer->camera()->showEntireScene(); + updateViewerBbox(static_cast(activeViewer()), true, min, max); + activeViewer()->showEntireScene(); } void MainWindow::on_actionLoadPlugin_triggered() @@ -2539,7 +2541,8 @@ void MainWindow::setExpanded(QModelIndex index) void MainWindow::setMaxTextItemsDisplayed(int val) { - viewer->textRenderer()->setMax(val); + for(auto v : CGAL::QGLViewer::QGLViewerPool()) + qobject_cast(v)->textRenderer()->setMax(val); } void MainWindow::resetHeader() @@ -2598,7 +2601,8 @@ void MainWindow::colorItems() { scene->item(id)->setColor(colors_[++nb_item]); } - viewer->update(); + for(auto v : CGAL::QGLViewer::QGLViewerPool()) + v->update(); } @@ -3018,9 +3022,6 @@ SubViewer::SubViewer(QWidget *parent, MainWindow* mw, Viewer* mainviewer) actionOrtho->setCheckable(true); actionOrtho->setChecked(false); viewMenu->addAction(actionOrtho); - QAction* actionLight = new QAction("L&ighting...",this); - actionLight->setObjectName("actionLight"); - viewMenu->addAction(actionLight); QAction* actionTotalPass = new QAction("Set Transparency Pass &Number...",this); actionTotalPass->setObjectName("actionTotalPass"); viewMenu->addAction(actionTotalPass); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt index c3e48ffcd9b..c0b3eded9c2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt @@ -11,21 +11,31 @@ if(EIGEN3_FOUND) # to avoid a warning with old cmake set(_Boost_BZIP2_HEADERS "boost/iostreams/filter/bzip2.hpp") set(_Boost_ZLIB_HEADERS "boost/iostreams/filter/zlib.hpp") - find_package( Boost OPTIONAL_COMPONENTS bzip2 zlib) + find_package( Boost OPTIONAL_COMPONENTS serialization iostreams bzip2 zlib) if( Boost_ZLIB_FOUND AND Boost_BZIP2_FOUND) - set(classification_linked_libraries ${classification_linked_libraries} - ${Boost_ZLIB_LIBRARY} ${Boost_BZIP2_LIBRARY}) + if(TARGET Boost::bzip2 AND TARGET Boost::zlib) + set(classification_linked_libraries ${classification_linked_libraries} + Boost::bzip2 Boost::zlib) + else() + set(classification_linked_libraries ${classification_linked_libraries} + ${Boost_ZLIB_LIBRARY} ${Boost_BZIP2_LIBRARY}) + endif() endif() endif() if (Boost_SERIALIZATION_FOUND AND Boost_IOSTREAMS_FOUND AND (NOT WIN32 OR Boost_ZLIB_FOUND)) qt5_wrap_ui( classificationUI_FILES Classification_widget.ui Classification_advanced_widget.ui ) polyhedron_demo_plugin(classification_plugin Classification_plugin Point_set_item_classification Cluster_classification Surface_mesh_item_classification ${classificationUI_FILES} KEYWORDS Classification) - - set(classification_linked_libraries ${classification_linked_libraries} - ${Boost_SERIALIZATION_LIBRARY} - ${Boost_IOSTREAMS_LIBRARY}) - + + if(TARGET Boost::serialization AND TARGET Boost::iostreams) + set(classification_linked_libraries ${classification_linked_libraries} + Boost::serialization Boost::iostreams) + else() + set(classification_linked_libraries ${classification_linked_libraries} + ${Boost_SERIALIZATION_LIBRARY} + ${Boost_IOSTREAMS_LIBRARY}) + endif() + find_package(OpenCV QUIET COMPONENTS core ml) # Need core + machine learning if (OpenCV_FOUND) message(STATUS "Found OpenCV ${OpenCV_VERSION}") diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp index b3034e06bfd..ba869f77b9d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp @@ -32,6 +32,12 @@ public: return true; return false; } + bool isDefaultLoader(const QString& name) const + { + if(name == QString("off")) + return true; + return false; + } QString name() const { return "off_plugin"; } QString nameFilters() const { return "OFF files (*.off);;Wavefront OBJ (*.obj)"; } bool canLoad() const; @@ -149,6 +155,8 @@ Polyhedron_demo_off_plugin::load_off(QFileInfo fileinfo) { tr("%1 isolated vertices found") .arg(item->getNbIsolatedvertices())); } + if(item->isItemMulticolor()) + item->computeItemColorVectorAutomatically(true); return item; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp index d0a943364c8..cc2c1bcd865 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include class Polyhedron_demo_ply_plugin : @@ -38,62 +37,6 @@ public: bool canSave(const CGAL::Three::Scene_item*); bool save(const CGAL::Three::Scene_item*, QFileInfo fileinfo); -private: - void set_vcolors(SMesh* smesh, const std::vector& colors) - { - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - SMesh::Property_map vcolors = - smesh->property_map("v:color").first; - bool created; - boost::tie(vcolors, created) = smesh->add_property_map("v:color",CGAL::Color(0,0,0)); - assert(colors.size()==smesh->number_of_vertices()); - int color_id = 0; - for(vertex_descriptor vd : vertices(*smesh)) - vcolors[vd] = colors[color_id++]; - } - - void set_fcolors(SMesh* smesh, const std::vector& colors) - { - typedef boost::graph_traits::face_descriptor face_descriptor; - SMesh::Property_map fcolors = - smesh->property_map("f:color").first; - bool created; - boost::tie(fcolors, created) = smesh->add_property_map("f:color",CGAL::Color(0,0,0)); - assert(colors.size()==smesh->number_of_faces()); - int color_id = 0; - for(face_descriptor fd : faces(*smesh)) - fcolors[fd] = colors[color_id++]; - } - - bool set_huvs(SMesh* smesh, - std::vector > & hedges, - std::vector >& uvs) - { - QTime timer; - timer.start(); - typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - SMesh::Property_map > uv = - smesh->property_map >("h:uv").first; - bool created; - boost::tie(uv, created) = smesh->add_property_map >("h:uv",std::make_pair(0.0f,0.0f)); - assert(hedges.size()==smesh->number_of_halfedges()); - assert(uvs.size()==smesh->number_of_halfedges()); - for(std::size_t id = 0; id < hedges.size(); ++id) - { - bool exists = false; - halfedge_descriptor hd; - boost::tie(hd, exists) = halfedge( - vertex_descriptor(hedges[id].first), - vertex_descriptor(hedges[id].second), - *smesh); - if(!exists) - return false; - uv[hd] = uvs[id]; - } - return true; - } }; bool Polyhedron_demo_ply_plugin::canLoad() const { @@ -146,57 +89,39 @@ Polyhedron_demo_ply_plugin::load(QFileInfo fileinfo) { if (input_is_mesh) // Open mesh or polygon soup { + // First try mesh + SMesh *surface_mesh = new SMesh(); + std::string comments; + + if (CGAL::read_ply (in, *surface_mesh, comments)) + { + Scene_surface_mesh_item* sm_item = new Scene_surface_mesh_item(surface_mesh); + sm_item->setName(fileinfo.completeBaseName()); + sm_item->comments() = comments; + QApplication::restoreOverrideCursor(); + return sm_item; + } + + in.clear(); + in.seekg(0); + + // else try polygon soup std::vector points; std::vector > polygons; - std::vector > hedges; std::vector fcolors; std::vector vcolors; - std::vector > huvs; - QTime timer; - timer.start(); - if (!(CGAL::read_PLY (in, points, polygons, hedges, fcolors, vcolors, huvs))) + + if (!(CGAL::read_PLY (in, points, polygons, fcolors, vcolors))) { QApplication::restoreOverrideCursor(); return NULL; } - if (CGAL::Polygon_mesh_processing::is_polygon_soup_a_polygon_mesh (polygons)) - { - CGAL::Three::Scene_item* item = nullptr; - SMesh *surface_mesh = new SMesh(); - CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh (points, polygons, - *surface_mesh); - if(!(vcolors.empty())) - set_vcolors(surface_mesh, vcolors); - if(!(fcolors.empty())) - set_fcolors(surface_mesh, fcolors); - if(!huvs.empty()) - { - if(!set_huvs(surface_mesh, hedges, huvs)) - { - std::cerr<<"halfedge not found."<invalidateOpenGLBuffers(); - item->itemChanged(); - } - else - { - item = new Scene_surface_mesh_item(surface_mesh); - } - - item->setName(fileinfo.completeBaseName()); - QApplication::restoreOverrideCursor(); - return item; - } - else - { - Scene_polygon_soup_item* soup_item = new Scene_polygon_soup_item; - soup_item->setName(fileinfo.completeBaseName()); - soup_item->load (points, polygons, fcolors, vcolors); - QApplication::restoreOverrideCursor(); - return soup_item; - } + + Scene_polygon_soup_item* soup_item = new Scene_polygon_soup_item; + soup_item->setName(fileinfo.completeBaseName()); + soup_item->load (points, polygons, fcolors, vcolors); + QApplication::restoreOverrideCursor(); + return soup_item; } else // Open point set { @@ -245,7 +170,10 @@ bool Polyhedron_demo_ply_plugin::save(const CGAL::Three::Scene_item* item, QFile return false; std::ofstream out(fileinfo.filePath().toUtf8().data(), std::ios::binary); - out.precision (std::numeric_limits::digits10 + 2); + if (choice == tr("Binary")) + CGAL::set_binary_mode(out); + else + out.precision (std::numeric_limits::digits10 + 2); // This plugin supports point sets const Scene_points_with_normal_item* point_set_item = @@ -263,13 +191,13 @@ bool Polyhedron_demo_ply_plugin::save(const CGAL::Three::Scene_item* item, QFile const Scene_surface_mesh_item* sm_item = qobject_cast(item); if (sm_item) - return CGAL::write_PLY (out, *(sm_item->polyhedron())); + return CGAL::write_ply (out, *(sm_item->polyhedron()), sm_item->comments()); // This plugin supports textured surface meshes const Scene_textured_surface_mesh_item* stm_item = qobject_cast(item); if (stm_item) - return CGAL::write_PLY (out, *(stm_item->textured_face_graph())); + return CGAL::write_ply (out, *(stm_item->textured_face_graph())); return false; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/lcc_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/lcc_io_plugin.cpp index e566ed6172e..9bf6a73226c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/lcc_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/lcc_io_plugin.cpp @@ -62,9 +62,8 @@ public: } - bool canSave(const CGAL::Three::Scene_item*){return true;} - bool save(const CGAL::Three::Scene_item*, QFileInfo fileinfo){ - qDebug() << fileinfo.fileName() << "Implement me, you fool !"; + bool canSave(const CGAL::Three::Scene_item*){return false;} + bool save(const CGAL::Three::Scene_item*, QFileInfo){ return false; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_rib_exporter_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_rib_exporter_plugin.cpp index 294f07f6aca..12c3dd6649d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_rib_exporter_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_rib_exporter_plugin.cpp @@ -193,12 +193,6 @@ init(QMainWindow* mainWindow, Scene_interface* scene_interface, Messages_interfa actionCreateRib->setProperty("subMenuName", "Tetrahedral Mesh Generation"); connect(actionCreateRib, SIGNAL(triggered()), this, SLOT(create_rib())); } - - if ( NULL == Three::activeViewer() ) - { - std::cerr << "Can't get CGAL::QGLViewer" << std::endl; - } - init_parameters(); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt index 641279dce31..59966607eef 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt @@ -1,55 +1,51 @@ include( polyhedron_demo_macros ) -if ( Boost_VERSION GREATER 103400 ) - remove_definitions(-DQT_STATICPLUGIN) +remove_definitions(-DQT_STATICPLUGIN) - qt5_wrap_cpp( VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_thread.h ) - qt5_wrap_cpp( VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_interface.h ) - qt5_wrap_ui( meshingUI_FILES Meshing_dialog.ui Smoother_dialog.ui Local_optimizers_dialog.ui ) - polyhedron_demo_plugin(mesh_3_plugin Mesh_3_plugin - Mesh_3_plugin_cgal_code.cpp Meshing_thread.cpp split_polylines.cpp - ${meshingUI_FILES} KEYWORDS Mesh_3) - target_link_libraries(mesh_3_plugin PUBLIC scene_polygon_soup_item scene_polylines_item scene_implicit_function_item scene_image_item - scene_surface_mesh_item scene_c3t3_item ${OPENGL_gl_LIBRARY} ) +qt5_wrap_cpp( VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_thread.h ) +qt5_wrap_cpp( VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_interface.h ) +qt5_wrap_ui( meshingUI_FILES Meshing_dialog.ui Smoother_dialog.ui Local_optimizers_dialog.ui ) +polyhedron_demo_plugin(mesh_3_plugin Mesh_3_plugin + Mesh_3_plugin_cgal_code.cpp Meshing_thread.cpp split_polylines.cpp + ${meshingUI_FILES} KEYWORDS Mesh_3) +target_link_libraries(mesh_3_plugin PUBLIC scene_polygon_soup_item scene_polylines_item scene_implicit_function_item scene_image_item + scene_surface_mesh_item scene_c3t3_item ${OPENGL_gl_LIBRARY} ) - set(VTK_LIBS "") - find_package(VTK QUIET COMPONENTS - vtkImagingGeneral vtkIOImage NO_MODULE) - if (VTK_FOUND) - include(${VTK_USE_FILE}) - if ("${VTK_VERSION_MAJOR}" GREATER "5") - if(VTK_LIBRARIES) - add_definitions(-DCGAL_USE_VTK) - set(VTK_LIBS vtkImagingGeneral vtkIOImage) - else() - message(STATUS "NOTICE : the DICOM files (.dcm) need VTK libraries to be open and will not be able to.") - endif() +set(VTK_LIBS "") +find_package(VTK QUIET COMPONENTS + vtkImagingGeneral vtkIOImage NO_MODULE) +if (VTK_FOUND) + include(${VTK_USE_FILE}) + if ("${VTK_VERSION_MAJOR}" GREATER "5") + if(VTK_LIBRARIES) + add_definitions(-DCGAL_USE_VTK) + set(VTK_LIBS vtkImagingGeneral vtkIOImage) else() message(STATUS "NOTICE : the DICOM files (.dcm) need VTK libraries to be open and will not be able to.") endif() else() message(STATUS "NOTICE : the DICOM files (.dcm) need VTK libraries to be open and will not be able to.") endif() - if(Boost_FILESYSTEM_FOUND) - qt5_wrap_ui( imgUI_FILES Image_res_dialog.ui raw_image.ui) - polyhedron_demo_plugin(io_image_plugin Io_image_plugin Volume_plane_intersection.cpp Raw_image_dialog.cpp ${imgUI_FILES} ${VOLUME_MOC_OUTFILES} KEYWORDS IO Mesh_3) - target_link_libraries(io_image_plugin PUBLIC scene_image_item ${VTK_LIBS} ) - target_link_libraries(io_image_plugin PUBLIC CGAL::CGAL_ImageIO) - else() - message( STATUS "NOTICE : the Io_image_plugin needs boost-filesystem to work and will not be compiled") - endif() - polyhedron_demo_plugin(mesh_3_optimization_plugin Optimization_plugin - Optimization_plugin_cgal_code.cpp Optimizer_thread.cpp - ${meshingUI_FILES} KEYWORDS Mesh_3) - target_link_libraries(mesh_3_optimization_plugin PUBLIC scene_c3t3_item scene_surface_mesh_item scene_image_item scene_implicit_function_item ) +else() + message(STATUS "NOTICE : the DICOM files (.dcm) need VTK libraries to be open and will not be able to.") +endif() +if(Boost_FILESYSTEM_FOUND) + qt5_wrap_ui( imgUI_FILES Image_res_dialog.ui raw_image.ui) + polyhedron_demo_plugin(io_image_plugin Io_image_plugin Volume_plane_intersection.cpp Raw_image_dialog.cpp ${imgUI_FILES} ${VOLUME_MOC_OUTFILES} KEYWORDS IO Mesh_3) + target_link_libraries(io_image_plugin PUBLIC scene_image_item ${VTK_LIBS} ) + target_link_libraries(io_image_plugin PUBLIC CGAL::CGAL_ImageIO) +else() + message( STATUS "NOTICE : the Io_image_plugin needs boost-filesystem to work and will not be compiled") +endif() +polyhedron_demo_plugin(mesh_3_optimization_plugin Optimization_plugin + Optimization_plugin_cgal_code.cpp Optimizer_thread.cpp + ${meshingUI_FILES} KEYWORDS IO Mesh_3) +target_link_libraries(mesh_3_optimization_plugin PUBLIC scene_c3t3_item scene_surface_mesh_item scene_image_item scene_implicit_function_item ) - polyhedron_demo_plugin(c3t3_io_plugin C3t3_io_plugin KEYWORDS IO Mesh_3) - target_link_libraries(c3t3_io_plugin PUBLIC scene_c3t3_item) -else( Boost_VERSION GREATER 103400 ) - message(STATUS "warning: the plugin mesh_3_plugin requires Boost>=1.34.1 and will not be compiled.") -endif( Boost_VERSION GREATER 103400 ) +polyhedron_demo_plugin(c3t3_io_plugin C3t3_io_plugin KEYWORDS IO Mesh_3) +target_link_libraries(c3t3_io_plugin PUBLIC scene_c3t3_item) qt5_wrap_ui( ribUI_FILES Rib_dialog.ui) polyhedron_demo_plugin(c3t3_rib_exporter_plugin C3t3_rib_exporter_plugin ${ribUI_FILES} KEYWORDS Mesh_3) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h index 0408113e335..0188d438c2b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h @@ -136,8 +136,8 @@ private: private: boost::any object_to_destroy; C3t3& c3t3_; - Domain* domain_; - Mesh_parameters p_; + Domain* const domain_; + Mesh_parameters const p_; std::atomic stop_; Mesher* mesher_; #ifdef CGAL_MESH_3_MESHER_STATUS_ACTIVATED @@ -237,6 +237,7 @@ Mesh_function:: initialize(const Mesh_criteria& criteria, Mesh_fnt::Domain_tag) // for the other domain types { + namespace p = CGAL::parameters; // Initialization of the mesh, either with the protection of sharp // features, or with the initial points (or both). // If `detect_connected_components==true`, the initialization is @@ -250,7 +251,9 @@ initialize(const Mesh_criteria& criteria, Mesh_fnt::Domain_tag) *domain_, criteria, p_.protect_features, - p_.use_sizing_field_with_aabb_tree); + p::mesh_3_options(p::pointer_to_stop_atomic_boolean = &stop_, + p::nonlinear_growth_of_balls = + p_.use_sizing_field_with_aabb_tree)); } template < typename D_, typename Tag > diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp index be7fed81b90..c3ba7c2100e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp @@ -207,7 +207,7 @@ void Clipping_box_plugin::clip(bool b) void Clipping_box_plugin::tab_change() { - QAction* action = mw->findChild("actionSwitchProjection"); + QAction* action = mw->findChild("actionOrtho"); if(dock_widget->tabWidget->currentIndex() == 1) { if(item) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp index 1817cdd120f..fbd416ee949 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp @@ -150,9 +150,14 @@ public : pen.setWidth(0); painter->setPen(pen); painter->setBrush(brush); - SMesh::Property_map > uv; - uv = graph->add_property_map > - ("h:uv",std::make_pair(0.0f,0.0f)).first; + SMesh::Property_map u; + SMesh::Property_map v; + + u = graph->add_property_map + ("h:u", 0.0f).first; + v = graph->add_property_map + ("h:v", 0.0f).first; + for( Component::iterator fi = component->begin(); fi != component->end(); @@ -161,11 +166,11 @@ public : boost::graph_traits::face_descriptor f(*fi); QPointF points[3]; boost::graph_traits::halfedge_descriptor h = halfedge(f, *graph);; - points[0] = QPointF(get(uv, h).first, -get(uv, h).second); + points[0] = QPointF(get(u, h), -get(v, h)); h = next(halfedge(f, *graph), *graph); - points[1] = QPointF(get(uv, h).first, -get(uv, h).second); + points[1] = QPointF(get(u, h), -get(v, h)); h = next(next(halfedge(f, *graph), *graph), *graph); - points[2] = QPointF(get(uv, h).first, -get(uv, h).second); + points[2] = QPointF(get(u, h), -get(v, h)); painter->drawPolygon(points,3); } @@ -605,9 +610,12 @@ public Q_SLOTS: { component->insert(*bfit); } - SMesh::Property_map > uv; - uv = sm->add_property_map >( - "h:uv",std::make_pair(0.0f,0.0f)).first; + SMesh::Property_map umap; + SMesh::Property_map vmap; + umap = sm->add_property_map + ("h:u", 0.0f).first; + vmap = sm->add_property_map + ("h:v", 0.0f).first; SMesh::Halfedge_iterator it; SMesh::Property_map uv_map = sm->property_map("v:uv").first; @@ -618,7 +626,8 @@ public Q_SLOTS: halfedge_descriptor hd(*it); EPICK::FT u = uv_map[target(hd, *sm)].x(); EPICK::FT v = uv_map[target(hd, *sm)].y(); - put(uv, *it, std::make_pair(static_cast(u),static_cast(v))); + put(umap, *it, static_cast(u)); + put(vmap, *it, static_cast(v)); } //ParamItem does not take ownership of text_mesh_bottom diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp index d19d59c871f..a1f1ccdcac3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp @@ -174,17 +174,20 @@ void Polyhedron_demo_join_and_split_polyhedra_plugin::on_actionSplitPolyhedra_tr } int cc=0; - + std::vector color_map; + if( +// item->isItemMulticolor() || + item->hasPatchIds()) + color_map = item->color_vector(); + else + compute_color_map(item->color(), new_polyhedra.size(), std::back_inserter(color_map)); Scene_group_item *group = new Scene_group_item("CC"); scene->addItem(group); for(FaceGraph* polyhedron_ptr : new_polyhedra) { Scene_facegraph_item* new_item=new Scene_facegraph_item(polyhedron_ptr); new_item->setName(tr("%1 - CC %2").arg(item->name()).arg(cc)); - if(item->isItemMulticolor() || item->hasPatchIds()) - new_item->setColor(item->color_vector()[cc]); - else - new_item->setColor(item->color()); + new_item->setColor(color_map[cc]); ++cc; scene->addItem(new_item); scene->changeGroup(new_item, group); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp index e1a9573b8f7..ab41a5aea46 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp @@ -315,6 +315,7 @@ void Polyhedron_demo_orient_soup_plugin::getNMPoints( typedef std::set Marked_edges; Edge_map edges; + edges.resize(item->points().size()); Marked_edges m_edges; PSO::fill_edge_map(edges, m_edges, item->polygons()); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h b/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h index f4721a266ef..c2de25e778c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h @@ -58,6 +58,15 @@ struct FG_is_selected_edge_property_map{ } }; +inline CGAL::Three::Viewer_interface* getViewerUnderCursor() +{ + QWidget* widget = QApplication::widgetAt(QCursor::pos()); + CGAL::Three::Viewer_interface* viewer = qobject_cast(widget); + if(!viewer) + viewer = CGAL::Three::Three::activeViewer(); + return viewer; +} + class SCENE_FACEGRAPH_ITEM_K_RING_SELECTION_EXPORT Scene_facegraph_item_k_ring_selection : public QObject { @@ -380,7 +389,7 @@ public Q_SLOTS: if(is_ready_to_highlight) { // highlight with mouse move event - CGAL::QGLViewer* viewer = CGAL::Three::Three::activeViewer(); + CGAL::QGLViewer* viewer = getViewerUnderCursor(); CGAL::qglviewer::Camera* camera = viewer->camera(); viewer->makeCurrent(); bool found = false; @@ -581,10 +590,14 @@ protected: viewer->setFocus(); return false; } + if(!is_lasso_active) { is_ready_to_paint_select = true; QMouseEvent* mouse_event = static_cast(event); + hl_pos = mouse_event->pos(); + is_ready_to_highlight = !cut_highlighting; + QTimer::singleShot(0, this, SLOT(highlight())); paint_pos = mouse_event->pos(); if(!is_edit_mode || event->type() == QEvent::MouseButtonPress) { @@ -606,16 +619,11 @@ protected: // highlight the primitive under cursor else if(event->type() == QEvent::MouseMove && !state.left_button_pressing) { - if(target == mainwindow) - { - CGAL::QGLViewer* viewer = CGAL::Three::Three::activeViewer(); - viewer->setFocus(); - return false; - } + QMouseEvent* mouse_event = static_cast(event); + CGAL::QGLViewer* viewer = getViewerUnderCursor(); is_ready_to_highlight = !cut_highlighting; - QMouseEvent* mouse_event = static_cast(event); - hl_pos = mouse_event->pos(); + hl_pos = viewer->mapFromGlobal(mouse_event->globalPos()); QTimer::singleShot(0, this, SLOT(highlight())); }//end MouseMove return false; @@ -720,5 +728,4 @@ protected: return false; } }; - #endif diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp index 92e353a6f17..b4735e94b7f 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp @@ -66,7 +66,11 @@ private: template bool selfIntersect(Mesh* mesh, std::vector::face_descriptor,typename boost::graph_traits::face_descriptor> > &faces) { - + if(!CGAL::is_triangle_mesh(*mesh)) + { + CGAL::Three::Three::warning("%1 skipped because not triangulated."); + return false; + } // compute self-intersections CGAL::Polygon_mesh_processing::self_intersections (*mesh, std::back_inserter(faces), diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt index d81c3fbd17d..8ab1462de67 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt @@ -44,7 +44,6 @@ qt5_wrap_ui(basicUI_FILES Surface_mesh_approximation_dockwidget.ui) polyhedron_demo_plugin(surface_mesh_approximation_plugin Surface_mesh_approximation_plugin ${basicUI_FILES} - Color_cheat_sheet VSA_wrapper) target_link_libraries(surface_mesh_approximation_plugin PUBLIC diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Color_cheat_sheet.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Color_cheat_sheet.cpp deleted file mode 100644 index 427063dc110..00000000000 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Color_cheat_sheet.cpp +++ /dev/null @@ -1,260 +0,0 @@ -#include "Color_cheat_sheet.h" - -const unsigned char Color_cheat_sheet::m_colors[256][3] = { - {0, 0, 0}, - {128, 0, 0}, - {0, 128, 0}, - {128, 128, 0}, - {0, 0, 128}, - {128, 0, 128}, - {0, 128, 128}, - {192, 192, 192}, - {128, 128, 128}, - {255, 0, 0}, - {0, 255, 0}, - {255, 255, 0}, - {0, 0, 255}, - {255, 0, 255}, - {0, 255, 255}, - {255, 255, 255}, - {0, 0, 0}, - {0, 0, 95}, - {0, 0, 135}, - {0, 0, 175}, - {0, 0, 215}, - {0, 0, 255}, - {0, 95, 0}, - {0, 95, 95}, - {0, 95, 135}, - {0, 95, 175}, - {0, 95, 215}, - {0, 95, 255}, - {0, 135, 0}, - {0, 135, 95}, - {0, 135, 135}, - {0, 135, 175}, - {0, 135, 215}, - {0, 135, 255}, - {0, 175, 0}, - {0, 175, 95}, - {0, 175, 135}, - {0, 175, 175}, - {0, 175, 215}, - {0, 175, 255}, - {0, 215, 0}, - {0, 215, 95}, - {0, 215, 135}, - {0, 215, 175}, - {0, 215, 215}, - {0, 215, 255}, - {0, 255, 0}, - {0, 255, 95}, - {0, 255, 135}, - {0, 255, 175}, - {0, 255, 215}, - {0, 255, 255}, - {95, 0, 0}, - {95, 0, 95}, - {95, 0, 135}, - {95, 0, 175}, - {95, 0, 215}, - {95, 0, 255}, - {95, 95, 0}, - {95, 95, 95}, - {95, 95, 135}, - {95, 95, 175}, - {95, 95, 215}, - {95, 95, 255}, - {95, 135, 0}, - {95, 135, 95}, - {95, 135, 135}, - {95, 135, 175}, - {95, 135, 215}, - {95, 135, 255}, - {95, 175, 0}, - {95, 175, 95}, - {95, 175, 135}, - {95, 175, 175}, - {95, 175, 215}, - {95, 175, 255}, - {95, 215, 0}, - {95, 215, 95}, - {95, 215, 135}, - {95, 215, 175}, - {95, 215, 215}, - {95, 215, 255}, - {95, 255, 0}, - {95, 255, 95}, - {95, 255, 135}, - {95, 255, 175}, - {95, 255, 215}, - {95, 255, 255}, - {135, 0, 0}, - {135, 0, 95}, - {135, 0, 135}, - {135, 0, 175}, - {135, 0, 215}, - {135, 0, 255}, - {135, 95, 0}, - {135, 95, 95}, - {135, 95, 135}, - {135, 95, 175}, - {135, 95, 215}, - {135, 95, 255}, - {135, 135, 0}, - {135, 135, 95}, - {135, 135, 135}, - {135, 135, 175}, - {135, 135, 215}, - {135, 135, 255}, - {135, 175, 0}, - {135, 175, 95}, - {135, 175, 135}, - {135, 175, 175}, - {135, 175, 215}, - {135, 175, 255}, - {135, 215, 0}, - {135, 215, 95}, - {135, 215, 135}, - {135, 215, 175}, - {135, 215, 215}, - {135, 215, 255}, - {135, 255, 0}, - {135, 255, 95}, - {135, 255, 135}, - {135, 255, 175}, - {135, 255, 215}, - {135, 255, 255}, - {175, 0, 0}, - {175, 0, 95}, - {175, 0, 135}, - {175, 0, 175}, - {175, 0, 215}, - {175, 0, 255}, - {175, 95, 0}, - {175, 95, 95}, - {175, 95, 135}, - {175, 95, 175}, - {175, 95, 215}, - {175, 95, 255}, - {175, 135, 0}, - {175, 135, 95}, - {175, 135, 135}, - {175, 135, 175}, - {175, 135, 215}, - {175, 135, 255}, - {175, 175, 0}, - {175, 175, 95}, - {175, 175, 135}, - {175, 175, 175}, - {175, 175, 215}, - {175, 175, 255}, - {175, 215, 0}, - {175, 215, 95}, - {175, 215, 135}, - {175, 215, 175}, - {175, 215, 215}, - {175, 215, 255}, - {175, 255, 0}, - {175, 255, 95}, - {175, 255, 135}, - {175, 255, 175}, - {175, 255, 215}, - {175, 255, 255}, - {215, 0, 0}, - {215, 0, 95}, - {215, 0, 135}, - {215, 0, 175}, - {215, 0, 215}, - {215, 0, 255}, - {215, 95, 0}, - {215, 95, 95}, - {215, 95, 135}, - {215, 95, 175}, - {215, 95, 215}, - {215, 95, 255}, - {215, 135, 0}, - {215, 135, 95}, - {215, 135, 135}, - {215, 135, 175}, - {215, 135, 215}, - {215, 135, 255}, - {215, 175, 0}, - {215, 175, 95}, - {215, 175, 135}, - {215, 175, 175}, - {215, 175, 215}, - {215, 175, 255}, - {215, 215, 0}, - {215, 215, 95}, - {215, 215, 135}, - {215, 215, 175}, - {215, 215, 215}, - {215, 215, 255}, - {215, 255, 0}, - {215, 255, 95}, - {215, 255, 135}, - {215, 255, 175}, - {215, 255, 215}, - {215, 255, 255}, - {255, 0, 0}, - {255, 0, 95}, - {255, 0, 135}, - {255, 0, 175}, - {255, 0, 215}, - {255, 0, 255}, - {255, 95, 0}, - {255, 95, 95}, - {255, 95, 135}, - {255, 95, 175}, - {255, 95, 215}, - {255, 95, 255}, - {255, 135, 0}, - {255, 135, 95}, - {255, 135, 135}, - {255, 135, 175}, - {255, 135, 215}, - {255, 135, 255}, - {255, 175, 0}, - {255, 175, 95}, - {255, 175, 135}, - {255, 175, 175}, - {255, 175, 215}, - {255, 175, 255}, - {255, 215, 0}, - {255, 215, 95}, - {255, 215, 135}, - {255, 215, 175}, - {255, 215, 215}, - {255, 215, 255}, - {255, 255, 0}, - {255, 255, 95}, - {255, 255, 135}, - {255, 255, 175}, - {255, 255, 215}, - {255, 255, 255}, - {8, 8, 8}, - {18, 18, 18}, - {28, 28, 28}, - {38, 38, 38}, - {48, 48, 48}, - {58, 58, 58}, - {68, 68, 68}, - {78, 78, 78}, - {88, 88, 88}, - {98, 98, 98}, - {108, 108, 108}, - {118, 118, 118}, - {128, 128, 128}, - {138, 138, 138}, - {148, 148, 148}, - {158, 158, 158}, - {168, 168, 168}, - {178, 178, 178}, - {188, 188, 188}, - {198, 198, 198}, - {208, 208, 208}, - {218, 218, 218}, - {228, 228, 228}, - {238, 238, 238}, -}; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Color_cheat_sheet.h b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Color_cheat_sheet.h deleted file mode 100644 index 216a7810622..00000000000 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Color_cheat_sheet.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef COLOR_CHEAT_SHEET_H -#define COLOR_CHEAT_SHEET_H - -#include -#include - -// 256 color cheat sheet -// Source: https://jonasjacek.github.io/colors/ - -#ifdef surface_mesh_approximation_plugin_EXPORTS -#define COLOR_CHEAT_SHEET_EXPORT Q_DECL_EXPORT -#else -#define COLOR_CHEAT_SHEET_EXPORT Q_DECL_IMPORT -#endif - -class COLOR_CHEAT_SHEET_EXPORT Color_cheat_sheet -{ -public: - static const unsigned char &r(const std::size_t &i) { - return m_colors[i][0]; - } - - static const unsigned char &g(const std::size_t &i) { - return m_colors[i][1]; - } - - static const unsigned char &b(const std::size_t &i) { - return m_colors[i][2]; - } - -private: - static const unsigned char m_colors[256][3]; -}; - -#endif // COLOR_CHEAT_SHEET_H diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp index 8e6da45c524..ebaf3adee56 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp @@ -423,16 +423,25 @@ void Polyhedron_demo_offset_meshing_plugin::offset_meshing() qobject_cast(item); SMesh* sMesh = NULL; -if(sm_item) + double diag = 0; + Scene_item::Bbox box; + if(sm_item) { sMesh = sm_item->face_graph(); if(!sMesh) return; + box = bbox(sMesh); + } + else if(soup_item != 0) + { + box = bbox(soup_item); } else if(soup_item == 0) return; - - double diag = scene->len_diagonal(); + double X=box.max(0)-box.min(0), + Y = box.max(1)-box.min(1), + Z = box.max(2)-box.min(2); + diag = CGAL::sqrt(X*X+Y*Y+Z*Z); double offset_value = QInputDialog::getDouble(mw, QString("Choose Offset Value"), QString("Offset Value (use negative number for inset)"), diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp index 72f29cdf983..7ef01c4e953 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp @@ -265,8 +265,11 @@ public : pen.setWidth(0); painter->setPen(pen); painter->setBrush(brush); -SMesh::Property_map > uv; -uv = graph->add_property_map >("h:uv",std::make_pair(0.0f,0.0f)).first; + SMesh::Property_map u,v; + + u = graph->add_property_map("h:u", 0.0f).first; + v = graph->add_property_map("h:v", 0.0f).first; + for( Component::iterator fi = components->at(m_current_component).begin(); fi != components->at(m_current_component).end(); @@ -276,11 +279,11 @@ uv = graph->add_property_map >("h:uv QPointF points[3]; boost::graph_traits::halfedge_descriptor h = halfedge(f, *graph);; - points[0] = QPointF(get(uv, h).first, get(uv, h).second); + points[0] = QPointF(get(u, h), get(v, h)); h = next(halfedge(f, *graph), *graph); - points[1] = QPointF(get(uv, h).first, get(uv, h).second); + points[1] = QPointF(get(u, h), get(v, h)); h = next(next(halfedge(f, *graph), *graph), *graph); - points[2] = QPointF(get(uv, h).first, get(uv, h).second); + points[2] = QPointF(get(u, h), get(v, h)); painter->drawPolygon(points,3); } } @@ -906,8 +909,13 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio QApplication::restoreOverrideCursor(); QPointF min(FLT_MAX, FLT_MAX), max(-FLT_MAX, -FLT_MAX); - SMesh::Property_map > uv; - uv = tMesh.add_property_map >("h:uv",std::make_pair(0.0f,0.0f)).first; + SMesh::Property_map umap; + SMesh::Property_map vmap; + + umap = tMesh.add_property_map("h:u", 0.0f).first; + vmap = tMesh.add_property_map("h:v", 0.0f).first; + + tMesh.property_stats(std::cerr); Base_face_graph::Halfedge_iterator it; for(it = tMesh.halfedges_begin(); it != tMesh.halfedges_end(); @@ -916,7 +924,8 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio Seam_mesh::halfedge_descriptor hd(*it); FT u = uv_pm[target(hd, sMesh)].x(); FT v = uv_pm[target(hd, sMesh)].y(); - put(uv, *it, std::make_pair(static_cast(u),static_cast(v))); + put(umap, *it, static_cast(u)); + put(vmap, *it, static_cast(v)); if(umax.x()) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.cpp index 3af5c4c26ce..1d13c7ab82f 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.cpp @@ -60,9 +60,7 @@ std::size_t VSA_wrapper::add_one_proxy() { break; } if (nb_added == 1) { - const std::size_t c = rand_0_255(); - m_proxy_colors.push_back(QColor::fromRgb( - Color_cheat_sheet::r(c), Color_cheat_sheet::g(c), Color_cheat_sheet::b(c))); + m_proxy_colors.push_back(generate_random_color()); } return nb_added; @@ -95,9 +93,7 @@ bool VSA_wrapper::split(const std::size_t px_idx, const std::size_t n, const std } if (splitted) { for (std::size_t i = m_proxy_colors.size(); i < number_of_proxies(); ++i) { - const std::size_t c = rand_0_255(); - m_proxy_colors.push_back(QColor::fromRgb( - Color_cheat_sheet::r(c), Color_cheat_sheet::g(c), Color_cheat_sheet::b(c))); + m_proxy_colors.push_back(generate_random_color()); } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h index 05158076f87..f43b6c94d48 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/VSA_wrapper.h @@ -8,7 +8,8 @@ #include #include "SMesh_type.h" -#include "Color_cheat_sheet.h" +//#include "Color_cheat_sheet.h" +#include "Color_map.h" #ifdef surface_mesh_approximation_plugin_EXPORTS #define VSA_WRAPPER_EXPORT Q_DECL_EXPORT @@ -95,10 +96,7 @@ class VSA_WRAPPER_EXPORT VSA_wrapper { typedef CGAL::Variational_shape_approximation Compact_approx; #endif - - std::size_t rand_0_255() { - return static_cast(std::rand() % 255); - } + public: enum Metric { L21, L2, Compact }; @@ -155,10 +153,10 @@ public: // generate proxy colors m_proxy_colors.clear(); + m_proxy_colors.reserve(number_of_proxies()); + for (std::size_t i = 0; i < number_of_proxies(); ++i) { - const std::size_t c = rand_0_255(); - m_proxy_colors.push_back(QColor::fromRgb( - Color_cheat_sheet::r(c), Color_cheat_sheet::g(c), Color_cheat_sheet::b(c))); + m_proxy_colors.push_back(generate_random_color()); } m_initialized = true; diff --git a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp index 7dd0aac8532..91957c58dda 100644 --- a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp @@ -593,7 +593,7 @@ bool Scene_points_with_normal_item::read_ply_point_set(std::istream& stream) d->m_points->clear(); bool ok = stream && - CGAL::read_ply_point_set (stream, *(d->m_points), &(d->m_comments)) && + CGAL::read_ply_point_set (stream, *(d->m_points), d->m_comments) && !isEmpty(); d->point_Slider->setValue(CGAL::Three::Three::getDefaultPointSize()); std::cerr << d->m_points->info(); @@ -627,7 +627,7 @@ bool Scene_points_with_normal_item::write_ply_point_set(std::ostream& stream, bo if (binary) CGAL::set_binary_mode (stream); - CGAL::write_ply_point_set (stream, *(d->m_points), &(d->m_comments)); + CGAL::write_ply_point_set (stream, *(d->m_points), d->m_comments); return true; } diff --git a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp index 5f50d54751e..8df409d7547 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp @@ -33,6 +33,13 @@ #include "triangulate_primitive.h" #include +#include +#include +#include +#include +#include +#include + #include using namespace CGAL::Three; typedef Viewer_interface Vi; @@ -52,6 +59,7 @@ struct Scene_polygon_soup_item_priv{ nb_polys = 0; nb_lines = 0; nb_nm_edges = 0; + invalidate_stats(); } ~Scene_polygon_soup_item_priv() { @@ -63,6 +71,8 @@ struct Scene_polygon_soup_item_priv{ } void compute_normals_and_vertices(void) const; void triangulate_polygon(Polygons_iterator, int ) const; + void invalidate_stats(); + void compute_stats(); mutable QOpenGLShaderProgram *program; @@ -86,6 +96,10 @@ struct Scene_polygon_soup_item_priv{ mutable std::size_t nb_nm_edges; mutable std::size_t nb_polys; mutable std::size_t nb_lines; + bool is_triangle, is_quad, stats_computed; + double minl, maxl, meanl, midl, mini, maxi, ave; + std::size_t nb_null_edges, nb_degen_faces; + Scene_polygon_soup_item* item; }; @@ -624,6 +638,7 @@ Scene_polygon_soup_item::invalidateOpenGLBuffers() } getPointContainer(0)->reset_vbos(ALL); setBuffersFilled(false); + d->invalidate_stats(); } void Scene_polygon_soup_item::compute_bbox() const { @@ -844,3 +859,156 @@ void Scene_polygon_soup_item::repair(bool erase_dup, bool req_same_orientation) .require_same_orientation(req_same_orientation)); QApplication::restoreOverrideCursor(); } + +CGAL::Three::Scene_item::Header_data Scene_polygon_soup_item::header() const +{ + CGAL::Three::Scene_item::Header_data data; + //categories + + data.categories.append(std::pair(QString("Vertices"),1)); + data.categories.append(std::pair(QString("Polygons"),4)); + data.categories.append(std::pair(QString("Edges"),6)); + data.categories.append(std::pair(QString("Angles"),3)); + + + //titles + data.titles.append(QString("#Points")); + + data.titles.append(QString("#Polygons")); + data.titles.append(QString("Pure Triangle")); + data.titles.append(QString("Pure Quad")); + data.titles.append(QString("#Degenerate Polygons")); + + data.titles.append(QString("#Edges")); + data.titles.append(QString("Minimum Length")); + data.titles.append(QString("Maximum Length")); + data.titles.append(QString("Median Length")); + data.titles.append(QString("Mean Length")); + data.titles.append(QString("#Degenerate Edges")); + + data.titles.append(QString("Minimum")); + data.titles.append(QString("Maximum")); + data.titles.append(QString("Average")); + return data; +} + +QString Scene_polygon_soup_item::computeStats(int type) +{ + if(!d->stats_computed) + d->compute_stats(); + + switch(type) + { + case NB_VERTICES: + return QString::number(d->soup->points.size()); + case NB_FACETS: + return QString::number(d->soup->polygons.size()); + case NB_EDGES: + return QString::number(d->nb_lines/6); + + case NB_DEGENERATED_FACES: + { + if(d->is_triangle) + { + return QString::number(d->nb_degen_faces); + } + else + return QString("n/a"); + } + + case MIN_LENGTH: + return QString::number(d->minl); + case MAX_LENGTH: + return QString::number(d->maxl); + case MID_LENGTH: + return QString::number(d->midl); + case MEAN_LENGTH: + return QString::number(d->meanl); + case NB_NULL_LENGTH: + return QString::number(d->nb_null_edges); + + case MIN_ANGLE: + return QString::number(d->mini); + case MAX_ANGLE: + return QString::number(d->maxi); + case MEAN_ANGLE: + return QString::number(d->ave); + + case IS_PURE_TRIANGLE: + if(d->is_triangle) + return QString("yes"); + else + return QString("no"); + case IS_PURE_QUAD: + if (d->is_quad) + return QString("yes"); + else + return QString("no"); + } + return QString(); +} + +void +Scene_polygon_soup_item_priv:: +invalidate_stats() +{ + is_triangle = true; + is_quad = true; + minl=0; + maxl=0; + meanl=0; + midl=0; + mini=0; + maxi=0; + ave=0; + nb_null_edges=0; + nb_degen_faces=0; + stats_computed = false; +} + + +void +Scene_polygon_soup_item_priv::compute_stats() +{ + using namespace boost::accumulators; + accumulator_set< double, + features< tag::min, tag::max, tag::mean , tag::median> > edges_acc; + accumulator_set< double, + features< tag::min, tag::max, tag::mean > > angles_acc; + double rad_to_deg = 180. / CGAL_PI; + + + for(auto poly : soup->polygons) + { + if(poly.size() != 3) + is_triangle = false; + if(poly.size() != 4) + is_quad = false; + for(std::size_t i = 0; i< poly.size(); ++i) + { + Polygon_soup::Point_3 a(soup->points[poly[i]]), + b(soup->points[poly[(i+1)%poly.size()]]), + c(soup->points[poly[(i+2)%poly.size()]]); + if (a == b) + ++nb_null_edges; + edges_acc(CGAL::sqrt(CGAL::squared_distance(a, b))); + typename Traits::Vector_3 ba(b, a); + typename Traits::Vector_3 bc(b, c); + double cos_angle = (ba * bc) + / std::sqrt(ba.squared_length() * bc.squared_length()); + if(cos_angle == CGAL_PI || cos_angle == 0) + ++nb_degen_faces; + angles_acc(std::acos(cos_angle) * rad_to_deg); + } + } + + minl = extract_result< tag::min >(edges_acc); + maxl = extract_result< tag::max >(edges_acc); + meanl = extract_result< tag::mean >(edges_acc); + midl = extract_result< tag::median >(edges_acc); + mini = extract_result< tag::min >(angles_acc); + maxi = extract_result< tag::max >(angles_acc); + ave = extract_result< tag::mean >(angles_acc); + + stats_computed = true; +} diff --git a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h index 0fbfccdf58e..fe223f318d6 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h @@ -152,6 +152,27 @@ public: const Edges& non_manifold_edges() const; void initializeBuffers(CGAL::Three::Viewer_interface *) const Q_DECL_OVERRIDE; void computeElements() const Q_DECL_OVERRIDE; + //statistics + enum STATS { + NB_VERTICES = 0, + NB_FACETS, + IS_PURE_TRIANGLE, + IS_PURE_QUAD, + NB_DEGENERATED_FACES, + NB_EDGES, + MIN_LENGTH, + MAX_LENGTH, + MID_LENGTH, + MEAN_LENGTH, + NB_NULL_LENGTH, + MIN_ANGLE, + MAX_ANGLE, + MEAN_ANGLE + }; + + bool has_stats()const Q_DECL_OVERRIDE{return true;} + QString computeStats(int type)Q_DECL_OVERRIDE; + CGAL::Three::Scene_item::Header_data header() const Q_DECL_OVERRIDE; public Q_SLOTS: void shuffle_orientations(); bool orient(); diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp index 084448d92f6..09270611ceb 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp @@ -1685,7 +1685,7 @@ void Scene_polyhedron_selection_item::selectPath(fg_vertex_descriptor vh) end_of_path_is_prio = false; //makes the end of the path prioritary over the other points when there is a conflict if(it->vertex == first.vertex && - !(it == d->path.begin())&&// makes the begining of the path impossible to move + !(it == d->path.begin())&&// makes the beginning of the path impossible to move end_of_path_is_prio) { if(it!=d->path.end()-1 &&! is_same ) @@ -2076,7 +2076,8 @@ void Scene_polyhedron_selection_item::selected_HL(const std::setreset_vbos(ALL); getEdgeContainer(Priv::HL_edges)->reset_vbos(ALL); getPointContainer(Priv::HL_points)->reset_vbos(ALL); @@ -2090,7 +2091,8 @@ void Scene_polyhedron_selection_item::selected_HL(const std::setreset_vbos(ALL); getEdgeContainer(Priv::HL_edges)->reset_vbos(ALL); getPointContainer(Priv::HL_points)->reset_vbos(ALL); @@ -2104,7 +2106,8 @@ void Scene_polyhedron_selection_item::selected_HL(const std::setreset_vbos(ALL); getEdgeContainer(Priv::HL_edges)->reset_vbos(ALL); getPointContainer(Priv::HL_points)->reset_vbos(ALL); diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index 6cb4e563f99..7793692024d 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -211,6 +211,8 @@ struct Scene_surface_mesh_item_priv{ mutable QList text_ids; mutable std::vector targeted_id; + std::string comments; + mutable bool has_fpatch_id; mutable bool has_feature_edges; mutable bool floated; @@ -688,6 +690,7 @@ void Scene_surface_mesh_item_priv::initialize_colors() const colors_.clear(); compute_color_map(item->color(), (std::max)(1, max + 1 - min_patch_id), std::back_inserter(colors_)); + qDebug()<smesh_; } const SMesh* Scene_surface_mesh_item::polyhedron() const { return d->smesh_; } +std::string& Scene_surface_mesh_item::comments() { return d->comments; } +const std::string& Scene_surface_mesh_item::comments() const { return d->comments; } + void Scene_surface_mesh_item::compute_bbox()const { SMesh::Property_map pprop = d->smesh_->points(); diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h index 6c8bbc90da2..c2bf3d8fd9c 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h @@ -89,6 +89,10 @@ public: Face_graph* face_graph() { return polyhedron(); } const Face_graph* face_graph() const { return polyhedron(); } + // Gets PLY comments (empty if mesh not originated from PLY input) + std::string& comments(); + const std::string& comments() const; + void invalidate_aabb_tree(); void invalidateOpenGLBuffers()Q_DECL_OVERRIDE; void invalidate(Gl_data_names name); diff --git a/Polyhedron/demo/Polyhedron/Scene_textured_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_textured_surface_mesh_item.cpp index b0a2a2019d8..816d37d3e60 100644 --- a/Polyhedron/demo/Polyhedron/Scene_textured_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_textured_surface_mesh_item.cpp @@ -21,8 +21,8 @@ struct Scene_textured_surface_mesh_item_priv { item = parent; texture.GenerateCheckerBoard(2048,2048,128,0,0,0,250,250,255); - uv = sm->add_property_map >("h:uv",std::make_pair(0.0f,0.0f)).first; - + umap = sm->add_property_map("h:u", 0.0f).first; + vmap = sm->add_property_map("h:v", 0.0f).first; } Scene_textured_surface_mesh_item_priv(const SMesh& p, Scene_textured_surface_mesh_item* parent) : sm(new SMesh(p)) @@ -30,14 +30,16 @@ struct Scene_textured_surface_mesh_item_priv { item = parent; texture.GenerateCheckerBoard(2048,2048,128,0,0,0,250,250,255); - uv = sm->add_property_map >("h:uv",std::make_pair(0.0f,0.0f)).first; + umap = sm->add_property_map("h:u", 0.0f).first; + vmap = sm->add_property_map("h:v", 0.0f).first; } Scene_textured_surface_mesh_item_priv(SMesh* const p,Scene_textured_surface_mesh_item* parent) :sm(p) { item = parent; texture.GenerateCheckerBoard(2048,2048,128,0,0,0,250,250,255); - uv = sm->add_property_map >("h:uv",std::make_pair(0.0f,0.0f)).first; + umap = sm->add_property_map("h:u", 0.0f).first; + vmap = sm->add_property_map("h:v", 0.0f).first; } ~Scene_textured_surface_mesh_item_priv() @@ -49,7 +51,8 @@ struct Scene_textured_surface_mesh_item_priv SMesh* sm; ::Texture texture; - SMesh::Property_map > uv; + SMesh::Property_map umap; + SMesh::Property_map vmap; //[Px][Py][Pz][Nx][Ny][Nz][u][v] mutable std::vector faces_buffer; @@ -102,8 +105,8 @@ Scene_textured_surface_mesh_item_priv::compute_normals_and_vertices(void) const faces_buffer.push_back(n[1]); faces_buffer.push_back(n[2]); //uvs [2] - const float u = get(uv, *he).first; - const float v = get(uv, *he).second; + const float u = get(umap, *he); + const float v = get(vmap, *he); faces_buffer.push_back(u); faces_buffer.push_back(v); } @@ -127,8 +130,8 @@ Scene_textured_surface_mesh_item_priv::compute_normals_and_vertices(void) const edges_buffer.push_back(a.y() + offset.y); edges_buffer.push_back(a.z() + offset.z); //uvs [2] - float u = get(uv, halfedge(*he, *sm)).first; - float v = get(uv, halfedge(*he, *sm)).second; + float u = get(umap, halfedge(*he, *sm)); + float v = get(vmap, halfedge(*he, *sm)); edges_buffer.push_back(u); edges_buffer.push_back(v); @@ -138,8 +141,8 @@ Scene_textured_surface_mesh_item_priv::compute_normals_and_vertices(void) const edges_buffer.push_back(b.z() + offset.z); //uvs [2] - u = get(uv, opposite(halfedge(*he, *sm), *sm)).first; - v = get(uv, opposite(halfedge(*he, *sm), *sm)).second; + u = get(umap, opposite(halfedge(*he, *sm), *sm)); + v = get(vmap, opposite(halfedge(*he, *sm), *sm)); edges_buffer.push_back(u); edges_buffer.push_back(v); diff --git a/Polyhedron/demo/Polyhedron/TODO b/Polyhedron/demo/Polyhedron/TODO index 77880a99128..8e8b6ee85c2 100644 --- a/Polyhedron/demo/Polyhedron/TODO +++ b/Polyhedron/demo/Polyhedron/TODO @@ -42,5 +42,5 @@ Check what can be pulled in from experimental Mesh_3-protecting branch related to the MERGE with Point_set_demo: - clean up Point_set_3.h and UI_point_3.h - we should probably have a points_item - - Points and normal should be seperated items (pb with select and remove) + - Points and normal should be separated items (pb with select and remove) diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag index 2d67a8e0223..43c775cbcdb 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag @@ -63,7 +63,7 @@ void main(void) { highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; vec4 ret_color = vec4((my_color*light_amb).xyz + diffuse.xyz + specular.xyz,1); if(is_selected) - gl_FragColor = vec4(ret_color.r+70.0/255.0, ret_color.g+70.0/255.0, ret_color.b+70.0/255.0, alpha); + gl_FragColor = vec4(ret_color.r+35.0/255.0, ret_color.g+35.0/255.0, ret_color.b+35.0/255.0, alpha); else gl_FragColor = vec4(ret_color.xyz, alpha); } diff --git a/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag b/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag index 61a65a9fdc4..2bb3354848f 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag +++ b/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag @@ -64,7 +64,7 @@ void main(void) { vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; vec4 ret_color = vec4((my_color*light_amb).xyz + diffuse.xyz + specular.xyz,1); if(is_selected) - out_color = vec4(ret_color.r+70.0/255.0, ret_color.g+70.0/255.0, ret_color.b+70.0/255.0, alpha); + out_color = vec4(ret_color.r+35.0/255.0, ret_color.g+35.0/255.0, ret_color.b+35.0/255.0, alpha); else out_color = vec4(ret_color.xyz, alpha); } diff --git a/Polyhedron/demo/Polyhedron/resources/solid_wireframe_shader.geom b/Polyhedron/demo/Polyhedron/resources/solid_wireframe_shader.geom index 0800640449b..e18af6724d0 100644 --- a/Polyhedron/demo/Polyhedron/resources/solid_wireframe_shader.geom +++ b/Polyhedron/demo/Polyhedron/resources/solid_wireframe_shader.geom @@ -27,7 +27,7 @@ void main(void) //linearized arbitrary Z offset to keep the widelines in front of the edges as much as possible //Problem if coef is not 0, edges might be visible through faces. float coef = 0.0f; - float z_offset = (2.0 * near) / (far + near - coef * (far - near)) - (2.0 * near) / (far + near); + float z_offset = 0;//(2.0 * near) / (far + near - coef * (far - near)) - (2.0 * near) / (far + near); vec3 ndc0 = gl_in[0].gl_Position.xyz / gl_in[0].gl_Position.w; vec3 ndc1 = gl_in[1].gl_Position.xyz / gl_in[1].gl_Position.w; diff --git a/Polyhedron/include/CGAL/Polyhedron_3.h b/Polyhedron/include/CGAL/Polyhedron_3.h index 3e4cd452af4..17a36363cd0 100644 --- a/Polyhedron/include/CGAL/Polyhedron_3.h +++ b/Polyhedron/include/CGAL/Polyhedron_3.h @@ -1423,7 +1423,7 @@ public: // number of border halfedges. An edge with no incident facet // counts as two border halfedges. Precondition: `normalize_border // ()' has been called and no halfedge insertion or removal and no - // change in border status of the halfedges have occured since + // change in border status of the halfedges have occurred since // then. return hds_.size_of_border_halfedges(); } @@ -1434,7 +1434,7 @@ public: // facet on one side and to a hole on the other side. // Precondition: `normalize_border()' has been called and no // halfedge insertion or removal and no change in border status of - // the halfedges have occured since then. + // the halfedges have occurred since then. return hds_.size_of_border_edges(); } @@ -1445,7 +1445,7 @@ public: // halfedges_end()') denotes all border edges. Precondition: // `normalize_border()' has been called and no halfedge insertion // or removal and no change in border status of the halfedges have - // occured since then. + // occurred since then. return hds_.border_halfedges_begin(); } Halfedge_const_iterator border_halfedges_begin() const { diff --git a/Polyhedron_IO/include/CGAL/IO/OBJ_reader.h b/Polyhedron_IO/include/CGAL/IO/OBJ_reader.h index dcb0b39be7a..1bcdf1ce4f6 100644 --- a/Polyhedron_IO/include/CGAL/IO/OBJ_reader.h +++ b/Polyhedron_IO/include/CGAL/IO/OBJ_reader.h @@ -56,7 +56,7 @@ read_OBJ( std::istream& input, else { //std::cerr<<"ERROR : Cannnot read line beginning with "< +#include namespace CGAL{ diff --git a/Polyhedron_IO/include/CGAL/IO/PLY_writer.h b/Polyhedron_IO/include/CGAL/IO/PLY_writer.h index 1ad02f0a562..1807899a040 100644 --- a/Polyhedron_IO/include/CGAL/IO/PLY_writer.h +++ b/Polyhedron_IO/include/CGAL/IO/PLY_writer.h @@ -20,7 +20,7 @@ #ifndef CGAL_IO_PLY_WRITER_H #define CGAL_IO_PLY_WRITER_H -#include +#include namespace CGAL{ diff --git a/Polyhedron_IO/include/CGAL/IO/Polyhedron_builder_from_STL.h b/Polyhedron_IO/include/CGAL/IO/Polyhedron_builder_from_STL.h index 122f901fcf9..da9dd7ebcbc 100644 --- a/Polyhedron_IO/include/CGAL/IO/Polyhedron_builder_from_STL.h +++ b/Polyhedron_IO/include/CGAL/IO/Polyhedron_builder_from_STL.h @@ -67,7 +67,7 @@ public: } if(B.error()) { - std::cerr << "An error occured while creating a Polyhedron" << std::endl; + std::cerr << "An error occurred while creating a Polyhedron" << std::endl; B.rollback(); } diff --git a/Polyhedron_IO/include/CGAL/IO/STL_reader.h b/Polyhedron_IO/include/CGAL/IO/STL_reader.h index 34f0938af36..45f52f9cf23 100644 --- a/Polyhedron_IO/include/CGAL/IO/STL_reader.h +++ b/Polyhedron_IO/include/CGAL/IO/STL_reader.h @@ -299,7 +299,7 @@ bool read_STL(std::istream& input, int pos = 0; // Ignore all initial whitespace - char c; + unsigned char c; while(input.read(reinterpret_cast(&c), sizeof(c))) { diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt index 4017702ca44..5ef3513ac7a 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt @@ -18,10 +18,8 @@ find_package(CGAL COMPONENTS Qt5) find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Widgets Svg) include_directories (BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include) -include_directories (BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/../../include ) -include_directories (BEFORE ${CMAKE_CURRENT_BINARY_DIR}) - if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND ) + set(CMAKE_AUTOMOC ON) add_definitions(-DQT_NO_KEYWORDS) @@ -32,11 +30,8 @@ qt5_wrap_ui( CDT_UI_FILES Polyline_simplification_2.ui ) # qrc files (resources files, that contain icons, at least) qt5_add_resources ( CGAL_Qt5_RESOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.qrc ) -# use the Qt MOC preprocessor on classes that derives from QObject -qt5_generate_moc( ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.cpp Polyline_simplification_2.moc ) - # The executable itself. -add_executable ( Polyline_simplification_2 ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.cpp Polyline_simplification_2.moc ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) +add_executable ( Polyline_simplification_2 ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.cpp ${CDT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) target_link_libraries( Polyline_simplification_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui ) diff --git a/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h b/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h index 6527b0fb2c7..1496e42abf5 100644 --- a/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h @@ -24,7 +24,6 @@ #include #include -#include #include #include #include diff --git a/Polynomial/test/Polynomial/Exponent_vector.cpp b/Polynomial/test/Polynomial/Exponent_vector.cpp index 75d4055adab..fefba0f91de 100644 --- a/Polynomial/test/Polynomial/Exponent_vector.cpp +++ b/Polynomial/test/Polynomial/Exponent_vector.cpp @@ -1,6 +1,6 @@ #include -#include #include + #include #include diff --git a/Polynomial/test/Polynomial/Interpolator.cpp b/Polynomial/test/Polynomial/Interpolator.cpp index fa4ca9ceb98..13b74291449 100644 --- a/Polynomial/test/Polynomial/Interpolator.cpp +++ b/Polynomial/test/Polynomial/Interpolator.cpp @@ -1,5 +1,4 @@ #include -#include #include #include diff --git a/Polynomial/test/Polynomial/Polynomial_traits_d_Integer.cpp b/Polynomial/test/Polynomial/Polynomial_traits_d_Integer.cpp index 0754f474d65..1dca60d29cb 100644 --- a/Polynomial/test/Polynomial/Polynomial_traits_d_Integer.cpp +++ b/Polynomial/test/Polynomial/Polynomial_traits_d_Integer.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #ifdef CGAL_HAS_DEFAULT_ARITHMETIC_KERNEL diff --git a/Polynomial/test/Polynomial/Polynomial_traits_d_Integer_Integer.cpp b/Polynomial/test/Polynomial/Polynomial_traits_d_Integer_Integer.cpp index 24070479211..39fec6ba04a 100644 --- a/Polynomial/test/Polynomial/Polynomial_traits_d_Integer_Integer.cpp +++ b/Polynomial/test/Polynomial/Polynomial_traits_d_Integer_Integer.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #include #include diff --git a/Polynomial/test/Polynomial/Polynomial_traits_d_Rational.cpp b/Polynomial/test/Polynomial/Polynomial_traits_d_Rational.cpp index 94feb855986..8988e4324ae 100644 --- a/Polynomial/test/Polynomial/Polynomial_traits_d_Rational.cpp +++ b/Polynomial/test/Polynomial/Polynomial_traits_d_Rational.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #ifdef CGAL_HAS_DEFAULT_ARITHMETIC_KERNEL diff --git a/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Integer.cpp b/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Integer.cpp index 433958b49d3..818d997587b 100644 --- a/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Integer.cpp +++ b/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Integer.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #ifdef CGAL_HAS_DEFAULT_ARITHMETIC_KERNEL diff --git a/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Rational.cpp b/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Rational.cpp index 7c287c70360..223ef906bbc 100644 --- a/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Rational.cpp +++ b/Polynomial/test/Polynomial/Polynomial_traits_d_Rational_Rational.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #ifdef CGAL_HAS_DEFAULT_ARITHMETIC_KERNEL diff --git a/Polynomial/test/Polynomial/Polynomial_type_generator.cpp b/Polynomial/test/Polynomial/Polynomial_type_generator.cpp index 5d28a774bf0..9de462f7a58 100644 --- a/Polynomial/test/Polynomial/Polynomial_type_generator.cpp +++ b/Polynomial/test/Polynomial/Polynomial_type_generator.cpp @@ -1,8 +1,9 @@ -#include + #include #include #include #include +#include int main(){ CGAL_assertion_code(typedef CGAL::Polynomial Poly_int_1;) diff --git a/Polynomial/test/Polynomial/include/CGAL/gen_sparse_polynomial.h b/Polynomial/test/Polynomial/include/CGAL/gen_sparse_polynomial.h index 3e993524a21..28d32e89775 100644 --- a/Polynomial/test/Polynomial/include/CGAL/gen_sparse_polynomial.h +++ b/Polynomial/test/Polynomial/include/CGAL/gen_sparse_polynomial.h @@ -2,7 +2,6 @@ #ifndef CGAL_GEN_SPARSE_POLYNOMIAL_H #define CGAL_GEN_SPARSE_POLYNOMIAL_H -#include #include #include #include diff --git a/Polynomial/test/Polynomial/include/CGAL/test_modular_gcd.h b/Polynomial/test/Polynomial/include/CGAL/test_modular_gcd.h index 6dac2621a95..343eab9b1ae 100644 --- a/Polynomial/test/Polynomial/include/CGAL/test_modular_gcd.h +++ b/Polynomial/test/Polynomial/include/CGAL/test_modular_gcd.h @@ -3,7 +3,6 @@ #ifndef CGAL_TEST_MODULAR_GCD_H #define CGAL_TEST_MODULAR_GCD_H -#include #include #include #include diff --git a/Polynomial/test/Polynomial/modular_gcd_utcf_algorithm_M.cpp b/Polynomial/test/Polynomial/modular_gcd_utcf_algorithm_M.cpp index b14dc71145f..352d37aca4d 100644 --- a/Polynomial/test/Polynomial/modular_gcd_utcf_algorithm_M.cpp +++ b/Polynomial/test/Polynomial/modular_gcd_utcf_algorithm_M.cpp @@ -34,7 +34,7 @@ #define MY_FUNCTION_CALL modular_gcd_utcf_algorithm_M -#include + #include #include #include diff --git a/Polynomial/test/Polynomial/modular_gcd_utils.cpp b/Polynomial/test/Polynomial/modular_gcd_utils.cpp index 35565afca53..871c2ee41f8 100644 --- a/Polynomial/test/Polynomial/modular_gcd_utils.cpp +++ b/Polynomial/test/Polynomial/modular_gcd_utils.cpp @@ -32,7 +32,7 @@ test for the function euclidean_division_obstinate */ -#include + #include #include #include diff --git a/Polynomial/test/Polynomial/polynomial_gcd.cpp b/Polynomial/test/Polynomial/polynomial_gcd.cpp index c2481844990..f1dfd4a9458 100644 --- a/Polynomial/test/Polynomial/polynomial_gcd.cpp +++ b/Polynomial/test/Polynomial/polynomial_gcd.cpp @@ -32,7 +32,7 @@ test for computing the gcd for polynomials */ -#include + #include #include #include diff --git a/Polynomial/test/Polynomial/resultant.cpp b/Polynomial/test/Polynomial/resultant.cpp index 90ac9fdf353..91a937bd02c 100644 --- a/Polynomial/test/Polynomial/resultant.cpp +++ b/Polynomial/test/Polynomial/resultant.cpp @@ -7,8 +7,6 @@ //#define CGAL_RESULTANT_USE_MODULAR_ARITHMETIC 0 //#define CGAL_RESULTANT_USE_DECOMPOSE 1 -#include - #include #include diff --git a/Polynomial/test/Polynomial/sturm_habicht_sequence.cpp b/Polynomial/test/Polynomial/sturm_habicht_sequence.cpp index 87001959704..a48fd1ec0c0 100644 --- a/Polynomial/test/Polynomial/sturm_habicht_sequence.cpp +++ b/Polynomial/test/Polynomial/sturm_habicht_sequence.cpp @@ -11,7 +11,6 @@ // // ============================================================================ -#include #include #include diff --git a/Polynomial/test/Polynomial/test_polynomial.h b/Polynomial/test/Polynomial/test_polynomial.h index 5784ce41de3..b76017a080c 100644 --- a/Polynomial/test/Polynomial/test_polynomial.h +++ b/Polynomial/test/Polynomial/test_polynomial.h @@ -1,5 +1,4 @@ -#include #include #include #include diff --git a/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp b/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp index a0555c79561..e868144f69c 100644 --- a/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp +++ b/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp @@ -1,5 +1,3 @@ -#include - #include #include diff --git a/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp b/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp index 2513660179d..1735a1f7dc7 100644 --- a/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp +++ b/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Polynomial/test/Polynomial/test_subresultants.cpp b/Polynomial/test/Polynomial/test_subresultants.cpp index a361c2f80f4..3f0507bc7a3 100644 --- a/Polynomial/test/Polynomial/test_subresultants.cpp +++ b/Polynomial/test/Polynomial/test_subresultants.cpp @@ -10,7 +10,7 @@ // Author(s) : Michael Kerber // // ============================================================================ -#include + #include #include #include diff --git a/Polytope_distance_d/doc/Polytope_distance_d/PackageDescription.txt b/Polytope_distance_d/doc/Polytope_distance_d/PackageDescription.txt index 260792a0c3a..0b4088ce277 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/PackageDescription.txt +++ b/Polytope_distance_d/doc/Polytope_distance_d/PackageDescription.txt @@ -9,7 +9,7 @@ \cgalPkgPicture{dist.png} \cgalPkgSummaryBegin \cgalPkgAuthors{Kaspar Fischer, Bernd Gärtner, Thomas Herrmann, Michael Hoffmann, and Sven Schönherr} -\cgalPkgDesc{This package provides algorithms for computing the distance between the convex hulls of two point sets in d-dimensional space, without explicitely constructing the convex hulls. It further provides an algorithm to compute the width of a point set, and the furthest point for each vertex of a convex polygon. } +\cgalPkgDesc{This package provides algorithms for computing the distance between the convex hulls of two point sets in d-dimensional space, without explicitly constructing the convex hulls. It further provides an algorithm to compute the width of a point set, and the furthest point for each vertex of a convex polygon. } \cgalPkgManuals{Chapter_Optimal_Distances,PkgPolytopeDistanceDRef} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin diff --git a/Polytope_distance_d/include/CGAL/Width_3.h b/Polytope_distance_d/include/CGAL/Width_3.h index 25f877c9b0e..4d227d26a43 100644 --- a/Polytope_distance_d/include/CGAL/Width_3.h +++ b/Polytope_distance_d/include/CGAL/Width_3.h @@ -777,7 +777,7 @@ class Width_3 { #endif DEBUGENDL(INITIAL_VF_PAIR,"Initial plane E1:",A<<" "< #include #include #include diff --git a/Property_map/include/CGAL/Dynamic_property_map.h b/Property_map/include/CGAL/Dynamic_property_map.h index 24532c41e55..4934bfe2202 100644 --- a/Property_map/include/CGAL/Dynamic_property_map.h +++ b/Property_map/include/CGAL/Dynamic_property_map.h @@ -27,6 +27,9 @@ #include #include +#include +#include + namespace CGAL { namespace internal { @@ -131,8 +134,12 @@ struct Dynamic_with_index { typedef Key key_type; typedef Value value_type; - typedef value_type& reference; - typedef boost::lvalue_property_map_tag category; + typedef typename boost::mpl::if_< boost::is_same, + value_type, + value_type&>::type reference; + typedef typename boost::mpl::if_< boost::is_same, + boost::read_write_property_map_tag, + boost::lvalue_property_map_tag>::type category; Dynamic_with_index() : m_values() diff --git a/QP_solver/doc/QP_solver/CGAL/QP_models.h b/QP_solver/doc/QP_solver/CGAL/QP_models.h index 28748e7f103..25446737b99 100644 --- a/QP_solver/doc/QP_solver/CGAL/QP_models.h +++ b/QP_solver/doc/QP_solver/CGAL/QP_models.h @@ -717,14 +717,14 @@ public: sets the entry \f$ A_{ij}\f$ in column \f$ j\f$ and row \f$ i\f$ of the constraint matrix \f$ A\f$ of `qp` to `val`. An existing entry is overwritten. `qp` is enlarged if - necessary to accomodate this entry. + necessary to accommodate this entry. */ void set_a (int j, int i, const NT& val); /*! sets the entry \f$ b_i\f$ of `qp` to `val`. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_b (int i, const NT& val); @@ -732,28 +732,28 @@ public: sets the entry \f$ \qprel_i\f$ of `qp` to `rel`. `CGAL::SMALLER` means that the \f$ i\f$-th constraint is of type "\f$ \leq\f$", `CGAL::EQUAL` means "\f$ =\f$", and `CGAL::LARGER` encodes "\f$ \geq\f$". An existing entry - is overwritten. `qp` is enlarged if necessary to accomodate this entry. + is overwritten. `qp` is enlarged if necessary to accommodate this entry. */ void set_r (int i, CGAL::Comparison_result rel); /*! if `is_finite`, this sets the entry \f$ l_j\f$ of `qp` to `val`, otherwise it sets \f$ l_j\f$ to \f$ -\infty\f$. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_l (int j, bool is_finite, const NT& val = NT(0)); /*! if `is_finite`, this sets the entry \f$ u_j\f$ of `qp` to `val`, otherwise it sets \f$ u_j\f$ to \f$ \infty\f$. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_u (int j, bool is_finite, const NT& val = NT(0)); /*! sets the entry \f$ c_j\f$ of `qp` to `val`. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_c (int j, const NT& val); @@ -766,7 +766,7 @@ public: /*! sets the entries \f$ 2D_{ij}\f$ and \f$ 2D_{ji}\f$ of `qp` to `val`. Existing entries are - overwritten. `qp` is enlarged if necessary to accomodate these entries. + overwritten. `qp` is enlarged if necessary to accommodate these entries. \pre `j <= i` */ void set_d (int i, int j, const NT& val); @@ -921,14 +921,14 @@ public: sets the entry \f$ A_{ij}\f$ in column \f$ j\f$ and row \f$ i\f$ of the constraint matrix \f$ A\f$ of `qp` to `val`. An existing entry is overwritten. `qp` is enlarged if - necessary to accomodate this entry. + necessary to accommodate this entry. */ void set_a (int j, int i, const NT& val); /*! sets the entry \f$ b_i\f$ of `qp` to `val`. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_b (int i, const NT& val); @@ -936,28 +936,28 @@ public: sets the entry \f$ \qprel_i\f$ of `qp` to `rel`. `CGAL::SMALLER` means that the \f$ i\f$-th constraint is of type "\f$ \leq\f$", `CGAL::EQUAL` means "\f$ =\f$", and `CGAL::LARGER` encodes "\f$ \geq\f$". An existing entry - is overwritten. `qp` is enlarged if necessary to accomodate this entry. + is overwritten. `qp` is enlarged if necessary to accommodate this entry. */ void set_r (int i, CGAL::Comparison_result rel); /*! if `is_finite`, this sets the entry \f$ l_j\f$ of `qp` to `val`, otherwise it sets \f$ l_j\f$ to \f$ -\infty\f$. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_l (int j, bool is_finite, const NT& val = NT(0)); /*! if `is_finite`, this sets the entry \f$ u_j\f$ of `qp` to `val`, otherwise it sets \f$ u_j\f$ to \f$ \infty\f$. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_u (int j, bool is_finite, const NT& val = NT(0)); /*! sets the entry \f$ c_j\f$ of `qp` to `val`. An existing entry is overwritten. - `qp` is enlarged if necessary to accomodate this entry. + `qp` is enlarged if necessary to accommodate this entry. */ void set_c (int j, const NT& val); @@ -970,7 +970,7 @@ public: /*! sets the entries \f$ 2D_{ij}\f$ and \f$ 2D_{ji}\f$ of `qp` to `val`. Existing entries are - overwritten. `qp` is enlarged if necessary to accomodate these entries. + overwritten. `qp` is enlarged if necessary to accommodate these entries. \pre `j <= i` */ void set_d (int i, int j, const NT& val); diff --git a/QP_solver/doc/QP_solver/fig_src/documentation/Degeneracies.tex b/QP_solver/doc/QP_solver/fig_src/documentation/Degeneracies.tex index c55f9810498..129499d8750 100644 --- a/QP_solver/doc/QP_solver/fig_src/documentation/Degeneracies.tex +++ b/QP_solver/doc/QP_solver/fig_src/documentation/Degeneracies.tex @@ -2865,7 +2865,7 @@ $i \in \hat{B}_{S}$. \begin{enumerate} \item $k \in \hat{N} \cap S$: According to Equation~(\ref{eq:r1_i_B_O_k_N_S}) and the appropriate changes -neccessary we obtain +necessary we obtain \begin{equation} \label{eq:r2_i_B_O_k_N_S} \left( @@ -2884,7 +2884,7 @@ A_{\sigma(k), k} \end{equation} \item $k \in \hat{N} \cap O$: According to Equation~(\ref{eq:r1_i_B_O_k_N_O}) and the appropriate changes -neccessary we obtain +necessary we obtain \begin{equation} \label{eq:r2_i_B_O_k_N_O} \left( @@ -2911,7 +2911,7 @@ neccessary we obtain \begin{enumerate} \item $k \in \hat{N} \cap S$: According to Equation~(\ref{eq:r1_i_B_S_k_N_S}) and the appropriate changes -neccessary we obtain +necessary we obtain \begin{equation} \label{eq:r2_i_B_S_k_N_S} \left( @@ -2930,7 +2930,7 @@ neccessary we obtain \end{equation} \item $k \in \hat{N} \cap O$: According to Equation~(\ref{eq:r1_i_B_S_k_N_O}) and the appropriate changes -neccessary we obtain +necessary we obtain \begin{eqnarray} \label{eq:r2_i_B_S_k_N_O} \left( diff --git a/QP_solver/doc/QP_solver/fig_src/documentation/UpperBounding.tex b/QP_solver/doc/QP_solver/fig_src/documentation/UpperBounding.tex index f945d48fd24..c4d249ea9ce 100644 --- a/QP_solver/doc/QP_solver/fig_src/documentation/UpperBounding.tex +++ b/QP_solver/doc/QP_solver/fig_src/documentation/UpperBounding.tex @@ -852,7 +852,7 @@ M_{\hat{B}}^{-1} \end{eqnarray} Any solution $x_{\hat{B}}(\mu_{j})$ is feasible for $(UQP(\hat{B}^{u}))$, and is optimal if $\mu_{j}=0$. Let $t_{1}$ be the value of $t$ for which the second -event occured in the last iteration of Ratio Test Step~1, then +event occurred in the last iteration of Ratio Test Step~1, then $x_{\hat{B}}^{*}(\mu_{j}(t_{1}))$ is the current feasible solution at the beginning of Ratio Test Step~2. diff --git a/QP_solver/include/CGAL/QP_solver/QP_full_filtered_pricing.h b/QP_solver/include/CGAL/QP_solver/QP_full_filtered_pricing.h index 1d3481cd931..0590ac281a3 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_full_filtered_pricing.h +++ b/QP_solver/include/CGAL/QP_solver/QP_full_filtered_pricing.h @@ -144,7 +144,7 @@ pricing_helper(int& /*direction*/, Tag_true ) // standard form } } - // certify non-existance of entering variable, if necessary + // certify non-existence of entering variable, if necessary if ( min_j < 0) { // update row and column maxima diff --git a/QP_solver/include/CGAL/QP_solver/QP_partial_filtered_pricing.h b/QP_solver/include/CGAL/QP_solver/QP_partial_filtered_pricing.h index 0c7077319f7..39178f13a19 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_partial_filtered_pricing.h +++ b/QP_solver/include/CGAL/QP_solver/QP_partial_filtered_pricing.h @@ -244,7 +244,7 @@ pricing_helper(int& /*direction*/, Tag_true /*is_in_standard_form*/ ) } } - // certify non-existance of entering variable, if necessary + // certify non-existence of entering variable, if necessary if ( min_mu == this->nt0) { // update row and column maxima @@ -388,7 +388,7 @@ pricing_helper(int& direction, Tag_false /*is_in_standard_form*/ ) } } - // certify non-existance of entering variable, if necessary + // certify non-existence of entering variable, if necessary if ( min_j == -1) { // update row and column maxima diff --git a/QP_solver/test/QP_solver/README b/QP_solver/test/QP_solver/README index 84b59df326e..e97b2082afa 100644 --- a/QP_solver/test/QP_solver/README +++ b/QP_solver/test/QP_solver/README @@ -65,12 +65,12 @@ MPS-files in test_solver_data/masters/cgal/ and for each of them make sure that all its derivatives are present (generating them if need be, see below); finally, it collects a list of all these master and derivative filenames and stores it in test_solver.cin. The test_solver.cin file obtained in this way -is what gets commited to the CGAL repository. +is what gets committed to the CGAL repository. In contrast to this, "./create_test_solver_cin all 0" collects all master MPS-files (i.e., all MPS-files in test_solver_data/masters/), generates (if needed) the derivatives and puts the list of the names of all these files into -test_solver.cin. The resulting test_solver.cin should usually not be commited +test_solver.cin. The resulting test_solver.cin should usually not be committed to the CGAL repository (it takes too long to run this suite); so you would run "./test_solver < test_solver.cin" only locally. diff --git a/QP_solver/test/QP_solver/test_solver.cpp b/QP_solver/test/QP_solver/test_solver.cpp index 6fee93f375e..94ba061df45 100644 --- a/QP_solver/test/QP_solver/test_solver.cpp +++ b/QP_solver/test/QP_solver/test_solver.cpp @@ -376,7 +376,7 @@ bool process(const std::string& filename, // print program (using QMATRIX format), read it back in and check // whether it still agrees with the original program std::stringstream inout; - // if we have doubles, adjust precision to accomodate high-precision doubles + // if we have doubles, adjust precision to accommodate high-precision doubles if (is_double(IT())) inout << std::setprecision (12); CGAL::QP_functions_detail::print_program (inout, qp, std::string("test_io_mps"), diff --git a/QP_solver/test/QP_solver/test_solver_data/masters/cgal/QPE_solver_example_bug.mps b/QP_solver/test/QP_solver/test_solver_data/masters/cgal/QPE_solver_example_bug.mps index 92e7a6fe765..3b56f88742b 100644 --- a/QP_solver/test/QP_solver/test_solver_data/masters/cgal/QPE_solver_example_bug.mps +++ b/QP_solver/test/QP_solver/test_solver_data/masters/cgal/QPE_solver_example_bug.mps @@ -1,5 +1,5 @@ * Number-type: integer -* Description: Original example where the omission first occured. Forces an Z1 update +* Description: Original example where the omission first occurred. Forces an Z1 update * Generated-by: Generated by QPE_solver_example_bug.mw NAME QPE_solver_example_bug ROWS diff --git a/Ridges_3/examples/Ridges_3/CMakeLists.txt b/Ridges_3/examples/Ridges_3/CMakeLists.txt index 5f34b46eb30..b682835c270 100644 --- a/Ridges_3/examples/Ridges_3/CMakeLists.txt +++ b/Ridges_3/examples/Ridges_3/CMakeLists.txt @@ -8,21 +8,16 @@ find_package(CGAL QUIET ) if ( CGAL_FOUND ) - # use either Eigen or BLAS/LAPACK + # use either Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) - if (NOT EIGEN3_FOUND) - find_package(LAPACK) - if(LAPACK_FOUND) - include( ${LAPACK_USE_FILE} ) - endif(LAPACK_FOUND) - else() + if (EIGEN3_FOUND) include( ${EIGEN3_USE_FILE} ) - endif() - - - if(EIGEN3_FOUND OR LAPACK_FOUND) + # Link with Boost.ProgramOptions (optional) find_package(Boost QUIET COMPONENTS program_options) + if(TARGET Boost::program_options) + set(Boost_PROGRAM_OPTIONS_LIBRARY Boost::program_options) + endif() if(Boost_PROGRAM_OPTIONS_FOUND) if( CGAL_AUTO_LINK_ENABLED ) message( STATUS "Boost.ProgramOptions library: found" ) @@ -37,11 +32,11 @@ if ( CGAL_FOUND ) create_single_source_cgal_program( Ridges_Umbilics_SM.cpp) create_single_source_cgal_program( Ridges_Umbilics_LCC.cpp) - else(EIGEN3_FOUND OR LAPACK_FOUND) + else() - message(STATUS "NOTICE: This program requires either Eigen 3.1 (or greater) or LAPACK, and will not be compiled.") + message(STATUS "NOTICE: This program requires Eigen 3.1 (or greater) and will not be compiled.") - endif(EIGEN3_FOUND OR LAPACK_FOUND) + endif() else() diff --git a/Ridges_3/include/CGAL/Ridges.h b/Ridges_3/include/CGAL/Ridges.h index 410ace65db9..e49e9eff128 100644 --- a/Ridges_3/include/CGAL/Ridges.h +++ b/Ridges_3/include/CGAL/Ridges.h @@ -238,7 +238,7 @@ class Ridge_approximation protected: const TriangleMesh& P; FT squared_model_size;//squared radius of the smallest enclosing sphere of the TriangleMesh - //used to make the sharpness scale independant and iso indep + //used to make the sharpness scale independent and iso indep Ridge_order tag_order; typedef std::map Facet2bool_map_type; @@ -437,7 +437,7 @@ compute_ridges(Ridge_interrogation_type r_type, OutputIterator ridge_lines_it, R Ridge_type cur_ridge_type = facet_ridge_type(f,h1,h2,r_type); if ( cur_ridge_type == NO_RIDGE ) continue; - //a ridge_line is begining and stored + //a ridge_line is beginning and stored Ridge_line* cur_ridge_line = new Ridge_line(P); init_ridge_line(cur_ridge_line, h1, h2, cur_ridge_type); *ridge_lines_it++ = cur_ridge_line; diff --git a/Ridges_3/include/CGAL/Umbilics.h b/Ridges_3/include/CGAL/Umbilics.h index 96431b1c170..d72b66c9bbb 100644 --- a/Ridges_3/include/CGAL/Umbilics.h +++ b/Ridges_3/include/CGAL/Umbilics.h @@ -89,7 +89,7 @@ operator<<(std::ostream& out_stream, const Umbilic& umbilic) case CGAL::NON_GENERIC_UMBILIC: out_stream << "non generic" << std::endl; break; case CGAL::ELLIPTIC_UMBILIC: out_stream << "elliptic" << std::endl; break; case CGAL::HYPERBOLIC_UMBILIC: out_stream << "hyperbolic" << std::endl; break; - default : out_stream << "Something wrong occured for sure..." << std::endl; break; + default : out_stream << "Something wrong occurred for sure..." << std::endl; break; } return out_stream; } diff --git a/Ridges_3/test/Ridges_3/CMakeLists.txt b/Ridges_3/test/Ridges_3/CMakeLists.txt index 6603c76db97..99a76fe4426 100644 --- a/Ridges_3/test/Ridges_3/CMakeLists.txt +++ b/Ridges_3/test/Ridges_3/CMakeLists.txt @@ -11,27 +11,17 @@ find_package(CGAL QUIET) if ( CGAL_FOUND ) - # use either Eigen or BLAS/LAPACK + # use either Eigen find_package(Eigen3 3.1.0) #(requires 3.1.0 or greater) - if (NOT EIGEN3_FOUND) - find_package(LAPACK) - if(LAPACK_FOUND) - include( ${LAPACK_USE_FILE} ) - endif(LAPACK_FOUND) - else() + if (EIGEN3_FOUND) include( ${EIGEN3_USE_FILE} ) - endif() - - - if(EIGEN3_FOUND OR LAPACK_FOUND) - create_single_source_cgal_program( "ridge_test.cpp" ) - else(EIGEN3_FOUND OR LAPACK_FOUND) + else() - message(STATUS "NOTICE: This program requires either Eigen 3.1 (or greater) or LAPACK, and will not be compiled.") + message(STATUS "NOTICE: This program requires Eigen 3.1 (or greater) and will not be compiled.") - endif(EIGEN3_FOUND OR LAPACK_FOUND) + endif() else() diff --git a/STL_Extension/include/CGAL/Compact_container.h b/STL_Extension/include/CGAL/Compact_container.h index 2cbc38a0a34..48263271f2c 100644 --- a/STL_Extension/include/CGAL/Compact_container.h +++ b/STL_Extension/include/CGAL/Compact_container.h @@ -164,7 +164,7 @@ struct Constant_size_policy }; // The following base class can be used to easily add a squattable pointer -// to a class (maybe you loose a bit of compactness though). +// to a class (maybe you lose a bit of compactness though). // TODO : Shouldn't adding these bits be done automatically and transparently, // based on the traits class info ? class Compact_container_base diff --git a/STL_Extension/include/CGAL/Concurrent_compact_container.h b/STL_Extension/include/CGAL/Concurrent_compact_container.h index 5fb5401c4f1..1618db7647d 100644 --- a/STL_Extension/include/CGAL/Concurrent_compact_container.h +++ b/STL_Extension/include/CGAL/Concurrent_compact_container.h @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -535,7 +536,8 @@ private: static char * clean_pointer(char * p) { - return ((p - (char *) NULL) & ~ (std::ptrdiff_t) START_END) + (char *) NULL; + return reinterpret_cast(reinterpret_cast(p) & + ~ (std::ptrdiff_t) START_END); } // Returns the pointee, cleaned up from the squatted bits. @@ -548,20 +550,23 @@ private: static Type type(const_pointer ptr) { char * p = (char *) Traits::pointer(*ptr); - return (Type) (p - clean_pointer(p)); + return (Type) (reinterpret_cast(p) - + reinterpret_cast(clean_pointer(p))); } - static Type type(const_iterator ptr) + static Type type(const_iterator it) { - return type(&*ptr); + return type(it.operator->()); } // Sets the pointer part and the type of the pointee. - static void set_type(pointer p_element, void * pointer, Type t) + static void set_type(pointer ptr, void * p, Type t) { - CGAL_precondition(0 <= t && (int) t < 4); - Traits::pointer(*p_element) = - (void *) ((clean_pointer((char *) pointer)) + (int) t); + // This out of range compare is always true and causes lots of + // unnecessary warnings. + // CGAL_precondition(0 <= t && t < 4); + Traits::pointer(*ptr) = reinterpret_cast + (reinterpret_cast(clean_pointer((char *) p)) + (int) t); } typedef tbb::queuing_mutex Mutex; diff --git a/STL_Extension/include/CGAL/Handle_with_policy.h b/STL_Extension/include/CGAL/Handle_with_policy.h index 2f7d04a727f..46397e37050 100644 --- a/STL_Extension/include/CGAL/Handle_with_policy.h +++ b/STL_Extension/include/CGAL/Handle_with_policy.h @@ -540,7 +540,7 @@ public: while ( new_rep->next != 0) new_rep = static_cast(new_rep->next); // path compression: assign new rep to all reps seen on the path - // update reference count properly: all reps on the path loose + // update reference count properly: all reps on the path lose // one reference, and the new_rep gains all of them unless // the rep on the path get actually deleted. Rep* rep = h.ptr_; diff --git a/STL_Extension/include/CGAL/Multiset.h b/STL_Extension/include/CGAL/Multiset.h index da0ec9bf16f..13e92cb45d0 100644 --- a/STL_Extension/include/CGAL/Multiset.h +++ b/STL_Extension/include/CGAL/Multiset.h @@ -48,7 +48,7 @@ namespace CGAL { * It has to support the default constructor, the copy constructor and * the assignment operator (operator=). * - Compare is a three-valued functor used to define the order of objects of - * class Type: It has to support an operator() that recieves two objects from + * class Type: It has to support an operator() that receives two objects from * the Type class and returns SMALLER, EQUAL or LARGER, depending on the * comparison result. * In case the deafult parameter is supplied, the Type class has to support @@ -2007,7 +2007,7 @@ Multiset::insert_after (iterator position, if (rootP == NULL) { - // In case the tree is empty, make sure that we did not recieve a valid + // In case the tree is empty, make sure that we did not receive a valid // iterator. CGAL_multiset_precondition (nodeP == NULL); @@ -2105,7 +2105,7 @@ Multiset::insert_before (iterator position, if (rootP == NULL) { - // In case the tree is empty, make sure that we did not recieve a valid + // In case the tree is empty, make sure that we did not receive a valid // iterator. CGAL_multiset_precondition (nodeP == NULL); diff --git a/STL_Extension/include/CGAL/iterator.h b/STL_Extension/include/CGAL/iterator.h index 8d40cec8c38..08b31d48a65 100644 --- a/STL_Extension/include/CGAL/iterator.h +++ b/STL_Extension/include/CGAL/iterator.h @@ -669,10 +669,10 @@ class Join_input_iterator_1 public: typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename cpp11::result_of::type value_type; + typedef std::decay_t::type> value_type; typedef typename std::iterator_traits::difference_type difference_type; - typedef value_type* pointer; - typedef value_type& reference; + typedef value_type const* pointer; + typedef value_type const& reference; protected: I1 i1; diff --git a/STL_Extension/test/STL_Extension/test_composition.cpp b/STL_Extension/test/STL_Extension/test_composition.cpp index 23113a20d7e..c7deeaa56f0 100644 --- a/STL_Extension/test/STL_Extension/test_composition.cpp +++ b/STL_Extension/test/STL_Extension/test_composition.cpp @@ -1,5 +1,6 @@ -#include #include +#include +#include #include #include #include diff --git a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Scale_space_reconstruction_3.txt b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Scale_space_reconstruction_3.txt index 658a9b11c06..ee08e5682ed 100644 --- a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Scale_space_reconstruction_3.txt +++ b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Scale_space_reconstruction_3.txt @@ -52,7 +52,7 @@ The point set at the initial scale is equivalent to the input point set. In theo - `CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother` (default) uses the density-weighted principal component analysis (PCA) of the local neighborhood. If the point set was sampled from a surface for which any unwanted deformation and sampling noise is smaller than the neighborhood size, the scale is coarse enough for mesh reconstruction after a few iterations of increasing the scale. -- `CGAL::Scale_space_reconstruction_3::Jet_smoother` uses the function `CGAL::jet_smooth_point_set()` that projects the point to a local smooth (jet) surface. This smoothing is less agressive and should be used if the point set is not very noisy and if a higher precision is sough. +- `CGAL::Scale_space_reconstruction_3::Jet_smoother` uses the function `CGAL::jet_smooth_point_set()` that projects the point to a local smooth (jet) surface. This smoothing is less aggressive and should be used if the point set is not very noisy and if a higher precision is sough. Users can define their own smoothing operators by following the concept `CGAL::Scale_space_reconstruction_3::Smoother`. diff --git a/Scripts/developer_scripts/autotest_cgal b/Scripts/developer_scripts/autotest_cgal index 848566200f7..0cae40110f4 100755 --- a/Scripts/developer_scripts/autotest_cgal +++ b/Scripts/developer_scripts/autotest_cgal @@ -900,14 +900,14 @@ lockfile -r 1 "$LOCK_FILE"; if [ ${?} != 0 ]; then PID=`cat "$LOCK_FILE"` if kill -0 "$PID"; then - log "${ACTUAL_LOGFILE}" "COULD NOT AQUIRE LOCK! LOCKING PROCESS PID=$PID"; + log "${ACTUAL_LOGFILE}" "COULD NOT ACQUIRE LOCK! LOCKING PROCESS PID=$PID"; exit 1; else # The locking process has died without erasing the lock file rm -f "$LOCK_FILE" lockfile -r 1 "$LOCK_FILE"; if [ ${?} != 0 ]; then - log "${ACTUAL_LOGFILE}" "COULD NOT AQUIRE LOCK!"; + log "${ACTUAL_LOGFILE}" "COULD NOT ACQUIRE LOCK!"; exit 1 fi fi diff --git a/Scripts/developer_scripts/autotest_cgal_with_ctest b/Scripts/developer_scripts/autotest_cgal_with_ctest index cd954740e7d..84e9664889f 100755 --- a/Scripts/developer_scripts/autotest_cgal_with_ctest +++ b/Scripts/developer_scripts/autotest_cgal_with_ctest @@ -23,7 +23,7 @@ export TAR="tar" export GUNZIP="gunzip" export COMPRESSOR="gzip" export CONSOLE_OUTPUT="y" -export CGAL_ROOT=`pwd` +export CGAL_HOME=`pwd` export USE_TARGZ="n" export USE_TARBZ="n" export CGAL_RELEASE="" @@ -121,7 +121,7 @@ get_cgal() # ---------------------------------------------------------------------------------------- unzip_cgal() { - cd "${CGAL_ROOT}" + cd "${CGAL_HOME}" log "${ACTUAL_LOGFILE}" "unzipping CGAL" if [ "${USE_TARGZ}" = "y" ]; then @@ -140,18 +140,18 @@ unzip_cgal() fi # check, if CGAL_DIR exists - if [ -d "${CGAL_ROOT}/${CGAL_RELEASE_ID}" ]; then + if [ -d "${CGAL_HOME}/${CGAL_RELEASE_ID}" ]; then # Reset CGAL-I symlink - log "${ACTUAL_LOGFILE}" "Resetting CGAL-I symlink to ${CGAL_ROOT}/${CGAL_RELEASE_ID}" + log "${ACTUAL_LOGFILE}" "Resetting CGAL-I symlink to ${CGAL_HOME}/${CGAL_RELEASE_ID}" rm -f CGAL-I - ln -s "${CGAL_ROOT}/${CGAL_RELEASE_ID}" CGAL-I + ln -s "${CGAL_HOME}/${CGAL_RELEASE_ID}" CGAL-I # Reset CGAL-3.x-I symlink CGAL_RELEASE=`echo "${CGAL_RELEASE_ID}" | sed 's/I\([^-]*\)-.*/I\1/'` - log "${ACTUAL_LOGFILE}" "Resetting ${CGAL_RELEASE} symlink to ${CGAL_ROOT}/${CGAL_RELEASE_ID}" + log "${ACTUAL_LOGFILE}" "Resetting ${CGAL_RELEASE} symlink to ${CGAL_HOME}/${CGAL_RELEASE_ID}" rm -f "${CGAL_RELEASE}" - ln -s "${CGAL_ROOT}/${CGAL_RELEASE_ID}" "${CGAL_RELEASE}" + ln -s "${CGAL_HOME}/${CGAL_RELEASE_ID}" "${CGAL_RELEASE}" else - error "directory ${CGAL_ROOT}/${CGAL_RELEASE_ID} does not exist" + error "directory ${CGAL_HOME}/${CGAL_RELEASE_ID} does not exist" fi log_done "${ACTUAL_LOGFILE}" @@ -195,30 +195,30 @@ do esac done # Load settings -if [ -f "$CGAL_ROOT/.autocgalrc" ]; then - . "$CGAL_ROOT/.autocgalrc" +if [ -f "${CGAL_HOME}/.autocgalrc" ]; then + . "${CGAL_HOME}/.autocgalrc" else echo "CONFIGURATION FILE .autocgalrc NOT FOUND" >&2; exit 1 fi if [ -n "${SCRIPTS_DIR}" ]; then - CGAL_DIR=`readlink "${CGAL_ROOT}/CGAL-git"` + CGAL_DIR=`readlink "${CGAL_HOME}/CGAL-git"` else - CGAL_DIR=`readlink "${CGAL_ROOT}/CGAL-I"` + CGAL_DIR=`readlink "${CGAL_HOME}/CGAL-I"` fi source "${CGAL_DIR}/${SCRIPTS_DIR}developer_scripts/log.sh" -LOGS_DIR="${CGAL_ROOT}/AUTOTEST_LOGS" -LOCK_FILE="${CGAL_ROOT}/autotest_cgal_with_cmake.lock" +LOGS_DIR="${CGAL_HOME}/AUTOTEST_LOGS" +LOCK_FILE="${CGAL_HOME}/autotest_cgal_with_cmake.lock" # Setup logfile -ACTUAL_LOGFILE="${CGAL_ROOT}/`basename ${0}`.log" +ACTUAL_LOGFILE="${CGAL_HOME}/`basename ${0}`.log" rm -f "${ACTUAL_LOGFILE}" echo "Running `basename ${0}` "'$Revision$' >> "${ACTUAL_LOGFILE}" -cd "$CGAL_ROOT" +cd "$CGAL_HOME" # Starts the process @@ -232,9 +232,9 @@ if [ -z "${USE_LATEST_UNZIPPED}" -a -z "${SCRIPTS_DIR}" ]; then fi #reset CGAL-DIR with the updated CGAL-I if [ -n "${SCRIPTS_DIR}" ]; then - CGAL_DIR=`readlink "${CGAL_ROOT}/CGAL-git"` + CGAL_DIR=`readlink "${CGAL_HOME}/CGAL-git"` else - CGAL_DIR=`readlink "${CGAL_ROOT}/CGAL-I"` + CGAL_DIR=`readlink "${CGAL_HOME}/CGAL-I"` fi CGAL_RELEASE_ID=$(cat last_release_id) @@ -257,7 +257,7 @@ for HOST in ${BUILD_HOSTS}; do echo "export GUNZIP=$GUNZIP">> env.sh echo "export COMPRESSOR=$COMPRESSOR">> env.sh echo "export CONSOLE_OUTPUT=$CONSOLE_OUTPUT">> env.sh - echo "export CGAL_ROOT=/cgal_root">> env.sh + echo "export CGAL_HOME=/cgal_root">> env.sh echo "export USE_TARGZ=$USE_TARGZ">> env.sh echo "export USE_TARBZ=$USE_TARBZ">> env.sh echo "export CGAL_RELEASE=$CGAL_RELEASE">> env.sh @@ -272,17 +272,17 @@ for HOST in ${BUILD_HOSTS}; do docker pull cgal/testsuite-docker:debian-stable-cross-compilation-for-arm if [ -z "${SCRIPTS_DIR}" ]; then #if not from branch echo "export CGAL_DIR=/cgal_root/\${CGAL_LAST}">>env.sh - docker run --rm -t -e CGAL_LAST="${CGAL_RELEASE_ID}" -e HOST="${HOST}" -v ${CGAL_ROOT}/ssh:/tmp_ssh -v ${DEPS_DIR}:/deps -v ${CGAL_ROOT}:/cgal_root cgal/testsuite-docker:debian-stable-cross-compilation-for-arm + docker run --rm -t -e CGAL_LAST="${CGAL_RELEASE_ID}" -e HOST="${HOST}" -v ${CGAL_HOME}/ssh:/tmp_ssh -v ${DEPS_DIR}:/deps -v ${CGAL_HOME}:/cgal_root cgal/testsuite-docker:debian-stable-cross-compilation-for-arm else echo "export CGAL_DIR=/cgal_root/CGAL-git">>env.sh - docker run --rm -t -e HOST="${HOST}" -v ${CGAL_ROOT}/ssh:/tmp_ssh -v ${DEPS_DIR}:/deps -v ${CGAL_ROOT}:/cgal_root -v${CGAL_DIR}:/cgal_root/CGAL-git cgal/testsuite-docker:debian-stable-cross-compilation-for-arm + docker run --rm -t -e HOST="${HOST}" -v ${CGAL_HOME}/ssh:/tmp_ssh -v ${DEPS_DIR}:/deps -v ${CGAL_HOME}:/cgal_root -v${CGAL_DIR}:/cgal_root/CGAL-git cgal/testsuite-docker:debian-stable-cross-compilation-for-arm fi else - HOST=$HOST bash -$- ${CGAL_DIR}/${SCRIPTS_DIR}developer_scripts/run_testsuite_with_cmake + HOST=$HOST bash -$- ${CGAL_DIR}/${SCRIPTS_DIR}developer_scripts/run_testsuite_with_ctest fi done -cd "${CGAL_ROOT}" +cd "${CGAL_HOME}" if [ -e "LATEST" ]; then mv LATEST RELEASE_NR fi diff --git a/Scripts/developer_scripts/cgal_create_package_dir.py b/Scripts/developer_scripts/cgal_create_package_dir.py index 3dfb122266f..1847fada3bc 100755 --- a/Scripts/developer_scripts/cgal_create_package_dir.py +++ b/Scripts/developer_scripts/cgal_create_package_dir.py @@ -83,7 +83,7 @@ r"""namespace CGAL { \anchor Chapter_PACKAGE_NAME \anchor chaptermine \cgalAutoToc -\author AUTHOR1, AUTHOR2 +\author AUTHOR1, AUTHOR2, and AUTHOR3 This chapter describes the ... @@ -97,6 +97,12 @@ Section on definitions here ... The following example shows ... +\cgalExample{ } + +\cgalFigureBegin{figPck,bench.png} +Left: ... +\cgalFigureEnd + */ } /* namespace CGAL */ """ @@ -118,12 +124,10 @@ if re.match("^[A-Za-z_][A-Za-z0-9_]*$", packagename): packagepath = packagename os.mkdir(packagepath) - open(os.path.join(packagepath, 'dont_submit'), 'w').close() inclpath = os.path.join(packagepath, 'include', 'CGAL', packagename) os.makedirs(inclpath) - os.mkdir(os.path.join(packagepath, 'src')) testpath = os.path.join(packagepath, 'test', packagename) os.makedirs(testpath) @@ -134,23 +138,19 @@ if re.match("^[A-Za-z_][A-Za-z0-9_]*$", packagename): os.makedirs(expath) os.mkdir(os.path.join(expath, 'data')) os.mkdir(os.path.join(expath, 'include')) - open(os.path.join(expath, 'README'), 'w').close() demopath = os.path.join(packagepath, 'demo', packagename) os.makedirs(demopath) os.mkdir(os.path.join(demopath, 'data')) os.mkdir(os.path.join(demopath, 'include')) - open(os.path.join(demopath, 'README'), 'w').close() benpath = os.path.join(packagepath, 'benchmark', packagename) os.makedirs(benpath) - os.mkdir(os.path.join(packagepath, 'scripts')) - os.mkdir(os.path.join(packagepath, 'developer_scripts')) infopath = os.path.join(packagepath, 'package_info', packagename) os.makedirs(infopath) - open(os.path.join(infopath, 'copyright.txt'), 'w').close() + open(os.path.join(infopath, 'copyright'), 'w').close() open(os.path.join(infopath, 'description.txt'), 'w').close() open(os.path.join(infopath, 'license.txt'), 'w').close() open(os.path.join(infopath, 'long_description.txt'), 'w').close() diff --git a/Scripts/developer_scripts/run_testsuite_with_cmake b/Scripts/developer_scripts/run_testsuite_with_ctest similarity index 92% rename from Scripts/developer_scripts/run_testsuite_with_cmake rename to Scripts/developer_scripts/run_testsuite_with_ctest index 26cb5cc0593..26a8ed972bb 100644 --- a/Scripts/developer_scripts/run_testsuite_with_cmake +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -7,8 +7,8 @@ source "${CGAL_DIR}/${SCRIPTS_DIR}developer_scripts/log.sh" # Load settings -if [ -f "$CGAL_ROOT/.autocgalrc" ]; then - . "$CGAL_ROOT/.autocgalrc" +if [ -f "${CGAL_HOME}/.autocgalrc" ]; then + . "${CGAL_HOME}/.autocgalrc" else echo "CONFIGURATION FILE .autocgalrc NOT FOUND" >&2; exit 1 @@ -255,7 +255,7 @@ run_test_on_platform() CGAL_BINARY_DIR=${CGAL_BINARY_DIR_BASE}/${PLATFORM} cd "${CGAL_BINARY_DIR}" log "${ACTUAL_LOGFILE}.test.${PLATFORM}" "Testing on host ${HOST} and platform ${PLATFORM}" - INIT_FILE="${CGAL_ROOT}/${REFERENCE_PLATFORMS_DIR}/${PLATFORM}.cmake" + INIT_FILE="${CGAL_HOME}/${REFERENCE_PLATFORMS_DIR}/${PLATFORM}.cmake" if [ ! -f "${INIT_FILE}" ]; then echo "error NEED A INIT FILE !" fi @@ -266,11 +266,11 @@ run_test_on_platform() CMAKE_OPTS="${CMAKE_OPTS} -DWITH_examples=ON -DWITH_demos=ON" fi if [ -z "${SHOW_PROGRESS}" ]; then - cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=ON ${CMAKE_OPTS} $CGAL_DIR 2>&1 >package_installation.log + cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=ON ${CMAKE_OPTS} $CGAL_DIR >package_installation.log 2>&1 else cmake ${INIT_FILE:+"-C${INIT_FILE}"} '${CMAKE_GENERATOR}' -DBUILD_TESTING=ON ${CMAKE_OPTS} $CGAL_DIR 2>&1 |tee package_installation.log fi - LIST_TEST_FILE="${CGAL_ROOT}/list_test_packages" + LIST_TEST_FILE="${CGAL_HOME}/list_test_packages" if [ -f ${LIST_TEST_FILE} ]; then LIST_TEST_PACKAGES=$(source ${LIST_TEST_FILE}) fi @@ -283,11 +283,13 @@ run_test_on_platform() TO_TEST="${TO_TEST}|$pkg" fi done + #unsets the limit of 1024 bits for the logs through ssh + echo "SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 1000000000)" > CTestCustom.cmake + echo "SET(CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE 1000000000)" >> CTestCustom.cmake CTEST_OPTS="-T Start -T Test -j${NUMBER_OF_PROCESSORS} ${DO_NOT_TEST:+-E execution___of__} --timeout 1200" if [ -z "${SHOW_PROGRESS}" ]; then ctest ${TO_TEST:+-L ${TO_TEST} } ${CTEST_OPTS} ${KEEP_TESTS:+-FC .}> tmp.txt else - echo "ctest ${CTEST_OPTS} ${TO_TEST:+-L ${TO_TEST}} ${KEEP_TESTS:+-FC .}|tee tmp.txt" ctest ${CTEST_OPTS} ${TO_TEST:+-L ${TO_TEST}} ${KEEP_TESTS:+-FC .}|tee tmp.txt fi ##################### @@ -310,6 +312,10 @@ run_test_on_platform() echo "CGAL_TEST_PLATFORM ${PLATFORM}" >> "$RESULT_FILE" grep -e "^-- USING " "${CGAL_BINARY_DIR}/installation.log" >> $RESULT_FILE echo "------------" >> "$RESULT_FILE" + #if git branch, create empty scm file for python script + if [ -n "${SCRIPTS_DIR}" ]; then + touch ../../../../../.scm-branch + fi python3 ${CGAL_DIR}/${TESTSUITE_DIR}test/parse-ctest-dashboard-xml.py $CGAL_TESTER $PLATFORM for file in $(ls|grep _Tests); do @@ -319,9 +325,14 @@ run_test_on_platform() TEST_REPORT="TestReport_${CGAL_TESTER}_${PLATFORM}" mkdir -p Installation chmod 777 Installation - cp "${CGAL_BINARY_DIR}/package_installation.log" "Installation/${TEST_REPORT}" + cat "${CGAL_BINARY_DIR}/package_installation.log" >> "Installation/${TEST_REPORT}" + #call the python script to complete the results report. + python3 ${CGAL_DIR}/${TESTSUITE_DIR}test/post_process_ctest_results.py Installation/${TEST_REPORT} ${TEST_REPORT} results_${CGAL_TESTER}_${PLATFORM}.txt rm -f $OUTPUT_FILE $OUTPUT_FILE.gz + if [ -n "${SCRIPTS_DIR}" ]; then + rm ../../../../../.scm-branch + fi tar cf $OUTPUT_FILE results_${CGAL_TESTER}_${PLATFORM}.txt */"$TEST_REPORT" echo gzip -9f $OUTPUT_FILE diff --git a/Scripts/scripts/cgal_create_CMakeLists b/Scripts/scripts/cgal_create_CMakeLists index 63453a6d5f8..1492eccb72c 100755 --- a/Scripts/scripts/cgal_create_CMakeLists +++ b/Scripts/scripts/cgal_create_CMakeLists @@ -99,6 +99,8 @@ create_cmake_script_with_options() # Created by the script cgal_create_CMakeLists # This is the CMake script for compiling a set of CGAL applications. +cmake_minimum_required(VERSION 3.1...3.13) + EOF #--------------------------------------------------------------------------- if [ "$SINGLE_SOURCE" = "n" ]; then @@ -111,8 +113,6 @@ EOF cat << 'EOF' -cmake_minimum_required(VERSION 2.8.11) - # CGAL and its components EOF if [ -n "$ENABLE_CTEST" ]; then @@ -172,7 +172,7 @@ fi fi - echo "find_package( CGAL QUIET COMPONENTS ${CGAL_COMPONENTS//:/ } )" + echo "find_package( CGAL REQUIRED QUIET OPTIONAL_COMPONENTS ${CGAL_COMPONENTS//:/ } )" #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv cat << 'EOF' diff --git a/Scripts/scripts/cgal_create_cmake_script b/Scripts/scripts/cgal_create_cmake_script index 1722483fd0b..79002e65b60 100755 --- a/Scripts/scripts/cgal_create_cmake_script +++ b/Scripts/scripts/cgal_create_cmake_script @@ -40,19 +40,17 @@ create_cmake_script() # Created by the script cgal_create_cmake_script # This is the CMake script for compiling a CGAL application. - +cmake_minimum_required(VERSION 3.1...3.13) project( ${PROJECT}_${TYPE} ) EOF cat <<'EOF' -cmake_minimum_required(VERSION 2.8.10) - set(CMAKE_CXX_STANDARD 14) EOF cat <<'EOF' -find_package(CGAL QUIET COMPONENTS Core ) +find_package(CGAL REQUIRED QUIET OPTIONAL_COMPONENTS Core ) if ( CGAL_FOUND ) diff --git a/SearchStructures/doc/SearchStructures/SearchStructures.txt b/SearchStructures/doc/SearchStructures/SearchStructures.txt index 6c6cb96281c..67818e9024a 100644 --- a/SearchStructures/doc/SearchStructures/SearchStructures.txt +++ b/SearchStructures/doc/SearchStructures/SearchStructures.txt @@ -132,7 +132,7 @@ window queries, enclosing queries, and inverse range queries on the keys. Clearly, an inverse range query makes only sense in the segment tree. In order to perform an inverse range query, a range query of -\f$ \epsilon\f$ width has to be performed. We prefered not to offer an +\f$ \epsilon\f$ width has to be performed. We preferred not to offer an extra function for this sort of query, since the inverse range query is a special case of the range query. Furthermore, offering an inverse range query in the segment tree class implies offering this diff --git a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2.h b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2.h index 35d71f91df2..24aa1ed5478 100644 --- a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2.h +++ b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2.h @@ -589,12 +589,8 @@ public: typedef std::vector Vertex_indices; typedef std::vector Vertices; - Vertex_indices vertex_indices; - vertex_indices.resize(points.size()); - - std::copy(boost::counting_iterator(0), - boost::counting_iterator(points.size()), - std::back_inserter(vertex_indices)); + Vertex_indices vertex_indices(boost::counting_iterator(0), + boost::counting_iterator(points.size())); size_type n = this->number_of_vertices(); Spatial_sort_traits_adapter_2 -#include #include diff --git a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/include/test_types.h b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/include/test_types.h index 612bcffa80b..2efbbb194b4 100644 --- a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/include/test_types.h +++ b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/include/test_types.h @@ -75,10 +75,10 @@ template bool test_sdg(InputStream&, const SDG&, const char* ifname, const char* ofname, bool test_remove) { - std::string ifname_full = get_fname(typename SDG2::Geom_traits::FT(), ifname); - typedef SDG SDG2; + std::string ifname_full = get_fname(typename SDG2::Geom_traits::FT(), ifname); + typedef SDG2 Segment_Delaunay_graph_2; start_testing("type definitions"); @@ -439,7 +439,7 @@ bool test_sdg(InputStream&, const SDG&, const char* ifname, const char* ofname, vnearest = sdg.nearest_neighbor(p2, vnearest); } end_testing("nearest neighbor methods"); - + /* start_testing("drawing methods"); { sdg.draw_dual(null_os); @@ -448,7 +448,7 @@ bool test_sdg(InputStream&, const SDG&, const char* ifname, const char* ofname, sdg.draw_dual_edge(sdg.finite_edges_begin(), null_os); } end_testing("drawing methods"); - + */ start_testing("swap method"); { sdg.swap(sdg); diff --git a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_et.cpp b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_et.cpp index a0ecb7e6dcd..aef1a697d88 100644 --- a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_et.cpp +++ b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_et.cpp @@ -1,54 +1,17 @@ -#include - #include #include #include -// choose number type - -// choose number type -#ifdef CGAL_USE_LEDA - -# include -typedef leda_rational exact_ring_t; -typedef leda_rational exact_field_t; - -namespace CGAL { -// needed for the drawing methods -leda_rational sqrt(const leda_rational& x) { - return leda_rational( CGAL::sqrt( CGAL::to_double(x) ) ); -} -} -#elif defined( CGAL_USE_GMP ) - -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; - -namespace CGAL { -// needed for the drawing methods -Gmpq sqrt(const Gmpq& x) { - return Gmpq( CGAL::sqrt( CGAL::to_double(x) ) ); -} - -} //namespace CGAL -#else - -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; - -#endif - -typedef exact_ring_t ring_number_t; -typedef exact_field_t field_number_t; - #include - +#include #include #include + +typedef CGAL::internal::Exact_ring_selector::Type ring_number_t; +typedef CGAL::internal::Exact_field_selector::Type field_number_t; + + typedef CGAL::Simple_cartesian K_ring; typedef CGAL::Simple_cartesian K_field; diff --git a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_ft.cpp b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_ft.cpp index 6e74a5d0290..c647b794a90 100644 --- a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_ft.cpp +++ b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_2_ft.cpp @@ -1,26 +1,15 @@ -#include - #include #include #include -// choose number type -#ifdef CGAL_USE_GMP -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; -#else -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; -#endif - #include - +#include #include #include +typedef CGAL::internal::Exact_ring_selector::Type exact_ring_t; +typedef CGAL::internal::Exact_field_selector::Type exact_field_t; + typedef CGAL::Simple_cartesian CK; typedef CGAL::Simple_cartesian EK_ring; typedef CGAL::Simple_cartesian EK_field; diff --git a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_et.cpp b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_et.cpp index 79bf71a8031..91006ae680e 100644 --- a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_et.cpp +++ b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_et.cpp @@ -1,52 +1,17 @@ -#include - #include #include #include -// choose number type -#ifdef CGAL_USE_LEDA - -# include -typedef leda_rational exact_ring_t; -typedef leda_rational exact_field_t; - -namespace CGAL { -// needed for the drawing methods -leda_rational sqrt(const leda_rational& x) { - return leda_rational( CGAL::sqrt( CGAL::to_double(x) ) ); -} -} -#elif defined( CGAL_USE_GMP ) - -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; - -namespace CGAL { -// needed for the drawing methods -Gmpq sqrt(const Gmpq& x) { - return Gmpq( sqrt( to_double(x) ) ); -} - -} //namespace CGAL -#else - -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; - -#endif - -typedef exact_ring_t ring_number_t; -typedef exact_field_t field_number_t; - #include +#include #include #include + +typedef CGAL::internal::Exact_ring_selector::Type ring_number_t; +typedef CGAL::internal::Exact_field_selector::Type field_number_t; + typedef CGAL::Simple_cartesian K_ring; typedef CGAL::Simple_cartesian K_field; diff --git a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_ft.cpp b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_ft.cpp index d96c75cf825..526642e79e1 100644 --- a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_ft.cpp +++ b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_hierarchy_2_ft.cpp @@ -1,26 +1,15 @@ -#include - #include #include #include -// choose number type -#ifdef CGAL_USE_GMP -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; -#else -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; -#endif - #include - +#include #include #include +typedef CGAL::internal::Exact_ring_selector::Type exact_ring_t; +typedef CGAL::internal::Exact_field_selector::Type exact_field_t; + typedef CGAL::Simple_cartesian CK; typedef CGAL::Simple_cartesian EK_ring; typedef CGAL::Simple_cartesian EK_field; diff --git a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_traits_2.cpp b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_traits_2.cpp index a392e4f68a5..a792ffe1a74 100644 --- a/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_traits_2.cpp +++ b/Segment_Delaunay_graph_2/test/Segment_Delaunay_graph_2/test_sdg_traits_2.cpp @@ -1,36 +1,34 @@ -#include - #include #include #include #include +#include #include #include #include #include -#ifdef CGAL_USE_CORE -#include +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) +#include #endif -#ifdef CGAL_USE_GMP -#include -#include -#endif +#include +#include + typedef CGAL::Simple_cartesian Double_Kernel; typedef CGAL::Simple_cartesian > IT_Kernel; typedef CGAL::Simple_cartesian > IF_Kernel; typedef CGAL::Simple_cartesian Double_Kernel; -#ifdef CGAL_USE_CORE -typedef CGAL::Simple_cartesian CORE_Kernel; -#endif -#ifdef CGAL_USE_GMP -typedef CGAL::Simple_cartesian Gmpq_Kernel; -typedef CGAL::Simple_cartesian Gmpz_Kernel; + +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) +typedef CGAL::Simple_cartesian Algebraic_Kernel; #endif +typedef CGAL::Simple_cartesian Rational_Kernel; +typedef CGAL::Simple_cartesian Integer_Kernel; + typedef CGAL::Integral_domain_without_division_tag Ring; typedef CGAL::Field_tag Field; typedef CGAL::Field_with_sqrt_tag Sqrt; @@ -90,77 +88,73 @@ IF_Sqrt_Gt; //---------------------------------------------------------------------- //---------------------------------------------------------------------- -#ifdef CGAL_USE_CORE +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) typedef CGAL::Segment_Delaunay_graph_traits_without_intersections_2 - -CORE_Ring_Gtwi; + +Algebraic_Ring_Gtwi; typedef CGAL::Segment_Delaunay_graph_traits_without_intersections_2 - -CORE_Sqrt_Gtwi; + +Algebraic_Sqrt_Gtwi; -typedef CGAL::Segment_Delaunay_graph_traits_2 -CORE_Field_Gt; +typedef CGAL::Segment_Delaunay_graph_traits_2 +Algebraic_Field_Gt; -typedef CGAL::Segment_Delaunay_graph_traits_2 -CORE_Sqrt_Gt; +typedef CGAL::Segment_Delaunay_graph_traits_2 +Algebraic_Sqrt_Gt; #endif //---------------------------------------------------------------------- -#ifdef CGAL_USE_GMP typedef CGAL::Segment_Delaunay_graph_traits_without_intersections_2 - -Gmpz_Ring_Gtwi; + +Integer_Ring_Gtwi; //---------------------------------------------------------------------- typedef CGAL::Segment_Delaunay_graph_traits_without_intersections_2 - -Gmpq_Ring_Gtwi; + +Rational_Ring_Gtwi; -typedef CGAL::Segment_Delaunay_graph_traits_2 -Gmpq_Field_Gt; -#endif +typedef CGAL::Segment_Delaunay_graph_traits_2 +Rational_Field_Gt; //---------------------------------------------------------------------- //---------------------------------------------------------------------- -#ifdef CGAL_USE_CORE +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) typedef CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2 - -F_CORE_Ring_Gtwi; + +F_Algebraic_Ring_Gtwi; typedef CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2 - -F_CORE_Sqrt_Gtwi; + +F_Algebraic_Sqrt_Gtwi; typedef CGAL::Segment_Delaunay_graph_filtered_traits_2 - -F_CORE_Field_Gt; + +F_Algebraic_Field_Gt; typedef CGAL::Segment_Delaunay_graph_filtered_traits_2 - -F_CORE_Sqrt_Gt; + +F_Algebraic_Sqrt_Gt; #endif //---------------------------------------------------------------------- -#ifdef CGAL_USE_GMP typedef CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2 - -F_Gmpz_Ring_Gtwi; + +F_Integer_Ring_Gtwi; //---------------------------------------------------------------------- typedef CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2 - -F_Gmpq_Ring_Gtwi; + +F_Rational_Ring_Gtwi; typedef CGAL::Segment_Delaunay_graph_filtered_traits_2 - -F_Gmpq_Field_Gt; -#endif + +F_Rational_Field_Gt; //---------------------------------------------------------------------- //---------------------------------------------------------------------- @@ -263,40 +257,36 @@ int main(int , char**) std::cout << std::endl; #endif -#ifdef CGAL_USE_CORE - test_traits("CORE Ring WI"); - test_traits("CORE Sqrt WI"); +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) + test_traits("Algebraic Ring WI"); + test_traits("Algebraic Sqrt WI"); - test_traits("CORE Field"); - test_traits("CORE Sqrt"); + test_traits("Algebraic Field"); + test_traits("Algebraic Sqrt"); #endif -#ifdef CGAL_USE_GMP - test_traits("Gmpz Ring WI"); + test_traits("Integer Ring WI"); - test_traits("Gmpq Ring WI"); - test_traits("Gmpq Field"); -#endif + test_traits("Rational Ring WI"); + test_traits("Rational Field"); std::cout << std::endl; std::cout << "************************************" << "************************************" << std::endl; std::cout << std::endl; -#ifdef CGAL_USE_CORE - test_traits("F CORE Ring WI"); - test_traits("F CORE Sqrt WI"); +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) + test_traits("F Algebraic Ring WI"); + test_traits("F Algebraic Sqrt WI"); - test_traits("F CORE Field"); - test_traits("F CORE Sqrt"); + test_traits("F Algebraic Field"); + test_traits("F Algebraic Sqrt"); #endif -#ifdef CGAL_USE_GMP - test_traits("F Gmpz Ring WI"); + test_traits("F Integer Ring WI"); - test_traits("F Gmpq Ring WI"); - test_traits("F Gmpq Field"); -#endif + test_traits("F Rational Ring WI"); + test_traits("F Rational Field"); std::cout << std::endl; std::cout << "************************************" diff --git a/Segment_Delaunay_graph_Linf_2/examples/Segment_Delaunay_graph_Linf_2/sdg-voronoi-edges-exact-linf.cpp b/Segment_Delaunay_graph_Linf_2/examples/Segment_Delaunay_graph_Linf_2/sdg-voronoi-edges-exact-linf.cpp index 5c68ed7f3ef..99f740e5110 100644 --- a/Segment_Delaunay_graph_Linf_2/examples/Segment_Delaunay_graph_Linf_2/sdg-voronoi-edges-exact-linf.cpp +++ b/Segment_Delaunay_graph_Linf_2/examples/Segment_Delaunay_graph_Linf_2/sdg-voronoi-edges-exact-linf.cpp @@ -6,41 +6,17 @@ // define the kernel -// choose number type -#ifdef CGAL_USE_GMP - -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; - -//namespace CGAL { -//// needed for the drawing methods -//Gmpq sqrt(const Gmpq& x) { -// return Gmpq( CGAL::sqrt( CGAL::to_double(x) ) ); -//} -// -//} //namespace CGAL -#else - -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; - -#endif - -typedef exact_field_t field_number_t; - +#include #include #include #include -typedef CGAL::Simple_cartesian K_field; +typedef CGAL::Simple_cartesian Kernel; typedef CGAL::Field_tag MTag; -typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 Gt; +typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 Gt; typedef CGAL::Segment_Delaunay_graph_Linf_2 SDG2; using namespace std; diff --git a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h index 3948746f812..60123a43e20 100644 --- a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h +++ b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h @@ -3501,10 +3501,10 @@ public: //-------------------------------------------------------------------------- inline FT x(Integral_domain_without_division_tag) const { - return CGAL::to_double(hx()) / CGAL::to_double(hw()); + return FT(CGAL::to_double(hx()) / CGAL::to_double(hw())); } inline FT y(Integral_domain_without_division_tag) const { - return CGAL::to_double(hy()) / CGAL::to_double(hw()); + return FT(CGAL::to_double(hy()) / CGAL::to_double(hw())); } inline FT x(Field_tag) const { return hx() / hw(); } diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_types.h b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_types.h index a2e414a691c..b381b49a9a6 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_types.h +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_types.h @@ -75,10 +75,10 @@ template bool test_sdg(InputStream&, const SDG&, const char* ifname, const char* ofname, bool test_remove) { - std::string ifname_full = get_fname(typename SDG2::Geom_traits::FT(), ifname); - typedef SDG SDG2; + std::string ifname_full = get_fname(typename SDG2::Geom_traits::FT(), ifname); + typedef SDG2 Segment_Delaunay_graph_2; start_testing("type definitions"); @@ -439,7 +439,7 @@ bool test_sdg(InputStream&, const SDG&, const char* ifname, const char* ofname, vnearest = sdg.nearest_neighbor(p2, vnearest); } end_testing("nearest neighbor methods"); - + /* start_testing("drawing methods"); { sdg.draw_dual(null_os); @@ -448,7 +448,7 @@ bool test_sdg(InputStream&, const SDG&, const char* ifname, const char* ofname, sdg.draw_dual_edge(sdg.finite_edges_begin(), null_os); } end_testing("drawing methods"); - + */ start_testing("swap method"); { sdg.swap(sdg); diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp index a1dc6c955b6..7e3eae0e3ea 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp @@ -12,18 +12,8 @@ #include // choose number type -typedef CGAL::Exact_rational exact_ring_t; -typedef CGAL::Exact_rational exact_field_t; - -namespace CGAL { -// needed for the drawing methods -exact_ring_t sqrt(const exact_ring_t& x) { - return exact_ring_t( sqrt( to_double(x) ) ); -} -} - -typedef exact_ring_t ring_number_t; -typedef exact_field_t field_number_t; +typedef CGAL::Exact_rational ring_number_t; +typedef CGAL::Exact_rational field_number_t; #include diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp index b29b4615c6c..d0fa8923e00 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp @@ -12,18 +12,8 @@ #include // choose number type -typedef CGAL::Exact_rational exact_ring_t; -typedef CGAL::Exact_rational exact_field_t; - -namespace CGAL { -// needed for the drawing methods -exact_ring_t sqrt(const exact_ring_t& x) { - return exact_ring_t( sqrt( to_double(x) ) ); -} -} - -typedef exact_ring_t ring_number_t; -typedef exact_field_t field_number_t; +typedef CGAL::Exact_rational ring_number_t; +typedef CGAL::Exact_rational field_number_t; #include diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_traits_2.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_traits_2.cpp index e023bc44390..c22a176b0ce 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_traits_2.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_traits_2.cpp @@ -13,31 +13,28 @@ #include #include #include +#include +#include +#include #include #include -#ifdef CGAL_USE_CORE -#include -#endif -#ifdef CGAL_USE_GMP -#include -#include -#endif + typedef CGAL::Simple_cartesian Double_Kernel; typedef CGAL::Simple_cartesian > IT_Kernel; typedef CGAL::Simple_cartesian > IF_Kernel; typedef CGAL::Simple_cartesian Double_Kernel; -#ifdef CGAL_USE_CORE -typedef CGAL::Simple_cartesian CORE_Kernel; -#endif -#ifdef CGAL_USE_GMP -typedef CGAL::Simple_cartesian Gmpq_Kernel; -typedef CGAL::Simple_cartesian Gmpz_Kernel; +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) +typedef CGAL::Simple_cartesian Algebraic_Kernel; #endif +typedef CGAL::Simple_cartesian Rational_Kernel; +typedef CGAL::Simple_cartesian Integer_Kernel; + + typedef CGAL::Integral_domain_without_division_tag Ring; typedef CGAL::Field_tag Field; typedef CGAL::Field_with_sqrt_tag Sqrt; @@ -96,78 +93,74 @@ IF_Sqrt_Gt; //---------------------------------------------------------------------- //---------------------------------------------------------------------- - -#ifdef CGAL_USE_CORE +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) typedef CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2 - -CORE_Ring_Gtwi; + +Algebraic_Ring_Gtwi; typedef CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2 - -CORE_Sqrt_Gtwi; + +Algebraic_Sqrt_Gtwi; -typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 -CORE_Field_Gt; +typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 +Algebraic_Field_Gt; -typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 -CORE_Sqrt_Gt; +typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 +Algebraic_Sqrt_Gt; #endif //---------------------------------------------------------------------- -#ifdef CGAL_USE_GMP + typedef CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2 - -Gmpz_Ring_Gtwi; + +Integer_Ring_Gtwi; //---------------------------------------------------------------------- typedef CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2 - -Gmpq_Ring_Gtwi; + +Rational_Ring_Gtwi; -typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 -Gmpq_Field_Gt; -#endif +typedef CGAL::Segment_Delaunay_graph_Linf_traits_2 +Rational_Field_Gt; //---------------------------------------------------------------------- //---------------------------------------------------------------------- - -#ifdef CGAL_USE_CORE +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2 - -F_CORE_Ring_Gtwi; + +F_Algebraic_Ring_Gtwi; typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2 - -F_CORE_Sqrt_Gtwi; + +F_Algebraic_Sqrt_Gtwi; typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2 - -F_CORE_Field_Gt; + +F_Algebraic_Field_Gt; typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2 - -F_CORE_Sqrt_Gt; + +F_Algebraic_Sqrt_Gt; #endif //---------------------------------------------------------------------- -#ifdef CGAL_USE_GMP typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2 - -F_Gmpz_Ring_Gtwi; + +F_Integer_Ring_Gtwi; //---------------------------------------------------------------------- typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2 - -F_Gmpq_Ring_Gtwi; + +F_Rational_Ring_Gtwi; typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2 - -F_Gmpq_Field_Gt; -#endif + +F_Rational_Field_Gt; + //---------------------------------------------------------------------- //---------------------------------------------------------------------- @@ -1788,40 +1781,36 @@ int main(int , char**) std::cout << std::endl; #endif -#ifdef CGAL_USE_CORE - test_traits("CORE Ring WI"); - test_traits("CORE Sqrt WI"); +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) + test_traits("CORE Ring WI"); + test_traits("CORE Sqrt WI"); - test_traits("CORE Field"); - test_traits("CORE Sqrt"); + test_traits("CORE Field"); + test_traits("CORE Sqrt"); #endif -#ifdef CGAL_USE_GMP - test_traits("Gmpz Ring WI"); + test_traits("Integer Ring WI"); - test_traits("Gmpq Ring WI"); - test_traits("Gmpq Field"); -#endif + test_traits("Rational Ring WI"); + test_traits("Rational Field"); std::cout << std::endl; std::cout << "************************************" << "************************************" << std::endl; std::cout << std::endl; -#ifdef CGAL_USE_CORE - test_traits("F CORE Ring WI"); - test_traits("F CORE Sqrt WI"); +#if defined(CGAL_USE_CORE) || defined(CGAL_USE_LEDA) + test_traits("F Algebraic Ring WI"); + test_traits("F Algebraic Sqrt WI"); - test_traits("F CORE Field"); - test_traits("F CORE Sqrt"); + test_traits("F Algebraic Field"); + test_traits("F Algebraic Sqrt"); #endif -#ifdef CGAL_USE_GMP - test_traits("F Gmpz Ring WI"); + test_traits("F Integer Ring WI"); - test_traits("F Gmpq Ring WI"); - test_traits("F Gmpq Field"); -#endif + test_traits("F Rational Ring WI"); + test_traits("F Rational Field"); std::cout << std::endl; std::cout << "************************************" @@ -1831,3 +1820,4 @@ int main(int , char**) return 0; } + diff --git a/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt b/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt index 1e320fd62f3..32e3051acd5 100644 --- a/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt +++ b/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt @@ -16,7 +16,7 @@ while considering different kinds of motions and various definitions of separation. The Moving sofa problem or sofa problem is a classic member of this -class. It is a two-dimensional idealisation of real-life +class. It is a two-dimensional idealization of real-life furniture-moving problems; it asks for the rigid two-dimensional shape of largest area \f$A\f$ that can be maneuvered through an L-shaped planar region with legs of unit width \cgalCite{w-sf-76}. The area @@ -77,7 +77,7 @@ Chapter_2D_Regularized_Boolean_Set-Operations "2D Regularized Boolean Set-Operations" for the precise definition of simple polygons. Secondly, any consecutive three vertices cannot be collinear. If you suspect that the input polygon may not satisfy the -latter condition, pre-process the polygon to elliminate this +latter condition, pre-process the polygon to eliminate this ill-condition. The implementation is based on an algorithm developed by Shamai and diff --git a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h index ba6236639eb..d6f9b934330 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h @@ -6,7 +6,6 @@ to solve in the least square sense a linear system with a singular value decomposition \cgalHasModel `CGAL::Eigen_svd` - \cgalHasModel `CGAL::Lapack_svd` */ class SvdTraits { diff --git a/Solver_interface/doc/Solver_interface/PackageDescription.txt b/Solver_interface/doc/Solver_interface/PackageDescription.txt index a084ce0dca6..c8b3c05c79b 100644 --- a/Solver_interface/doc/Solver_interface/PackageDescription.txt +++ b/Solver_interface/doc/Solver_interface/PackageDescription.txt @@ -39,7 +39,4 @@ - `CGAL::Eigen_sparse_matrix` - `CGAL::Eigen_sparse_symmetric_matrix` - `CGAL::Eigen_svd` -- `CGAL::Lapack_vector` -- `CGAL::Lapack_matrix` -- `CGAL::Lapack_svd` */ diff --git a/Solver_interface/include/CGAL/Lapack_svd.h b/Solver_interface/include/CGAL/Lapack_svd.h deleted file mode 100644 index cb6cc749e0e..00000000000 --- a/Solver_interface/include/CGAL/Lapack_svd.h +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (c) 2007 INRIA Sophia-Antipolis (France), INRIA Lorraine LORIA. -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// Author(s) : Marc Pouget and Frédéric Cazals - -#ifndef CGAL_LAPACK_H -#define CGAL_LAPACK_H - -#include -#include -#include - -extern "C" -{ -// taken from acml.h -void dgelss(int m, int n, int nrhs, - double *a, int lda, double *b, int ldb, double *sing, - double rcond, int *irank, int *info); - -void dgelss_(int *m, int *n, int *nrhs, - double *a, int *lda, double *b, int *ldb, double * - s, double *rcond, int *rank, double *work, int *lwork, - int *info); -} - -namespace CGAL { -namespace LAPACK { - -inline -void dgelss(int *m, int *n, int *nrhs, - double *a, int *lda, double *b, int *ldb, double *s, - double *rcond, int *rank, double *work, int *lwork, int *info) -{ -#ifdef CGAL_USE_F2C - ::dgelss_(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, lwork, info); -#else - ::dgelss(*m, *n, *nrhs, a, *lda, b, *ldb, s, *rcond, rank, info); -#endif -} - -} // namespace LAPACK -} // namespace CGAL - -namespace CGAL { - -/// \ingroup PkgSolverInterfaceRef -/// -/// A matrix class to be used in the class `Lapack_svd`. -/// -/// \cgalModels `SvdTraits::Matrix` -class Lapack_vector -{ - typedef double FT; - -protected: - FT* m_vector; - size_t nb_elts; - -public: - /// Initializes all the elements of the vector to zero. - Lapack_vector(size_t n) - { - m_vector = (FT*) std::calloc(n, sizeof(FT)); - nb_elts = n; - } - - ~Lapack_vector() { free(m_vector); } - - /// Return the size of the vector. - size_t size() { return nb_elts; } - - /// Return the vector as an array. - const FT* vector() const { return m_vector;} - - /// Return the vector as an array. - FT* vector() { return m_vector; } - - /// Return the `i`th entry, `i` from `0` to `size()-1`. - FT operator()(size_t i) {return m_vector[i];} - - /// Set the `i`'th entry to `value`. - void set(size_t i, const FT value) { m_vector[i] = value; } - -private: - /// Copy constructor and operator =() are not implemented. - Lapack_vector(const Lapack_vector& toCopy); - Lapack_vector& operator =(const Lapack_vector& toCopy); -}; - -/// \ingroup PkgSolverInterfaceRef -/// -/// In CLAPACK, matrices are one-dimensional arrays and elements are -/// column-major ordered. This class is a wrapper defining set and get -/// in the usual way with line and column indices. -/// -/// \cgalModels `SvdTraits::Matrix` -class Lapack_matrix -{ - typedef double FT; - -protected: - FT* m_matrix; - size_t nb_rows; - size_t nb_columns; - -public: - /// Initializes all the elements of the matrix to zero. - Lapack_matrix(size_t n1, size_t n2) - { - m_matrix = (FT*) std::calloc (n1*n2, sizeof(FT)); - nb_rows = n1; - nb_columns = n2; - } - - ~Lapack_matrix() { free(m_matrix); } - - /// Return the number of rows of the matrix. - size_t number_of_rows() { return nb_rows; } - /// Return the number of columns of the matrix. - size_t number_of_columns() { return nb_columns; } - - /// Return the matrix as an array. - const FT* matrix() const { return m_matrix; } - /// Return the matrix as an array. - FT* matrix() { return m_matrix; } - - /// Return the entry at row `i` and column `j`, `i` from `0` to `number_of_rows - 1`, - /// `j` from `0` to `number_of_columns - 1`. - FT operator()(size_t i, size_t j) { return m_matrix[j*nb_rows+i]; } - - /// Set the entry at row `i` and column `j` to `value`. - void set(size_t i, size_t j, const FT value) { m_matrix[j*nb_rows+i] = value; } - -private: - /// Copy constructor and operator =() are not implemented. - Lapack_matrix(const Lapack_matrix& toCopy); - Lapack_matrix& operator =(const Lapack_matrix& toCopy); -}; - -/// \ingroup PkgSolverInterfaceRef -/// -/// This class is a wrapper to the singular value decomposition algorithm of LAPACK. -/// -/// \cgalModels `SvdTraits` -class Lapack_svd -{ -public: - typedef double FT; - typedef Lapack_vector Vector; - typedef Lapack_matrix Matrix; - - /// Solves the system \f$ MX=B\f$ (in the least square sense if \f$ M\f$ is not - /// square) using a singular value decomposition. The solution is stored in \f$ B\f$. - /// \return the condition number of \f$ M\f$ - static FT solve(Matrix& M, Vector& B); -}; - -inline -Lapack_svd::FT Lapack_svd::solve(Matrix& M, Vector& B) -{ - int m = static_cast(M.number_of_rows()), - n = static_cast(M.number_of_columns()), - nrhs = 1, - lda = m, - ldb = m, - rank, - lwork = 5*m, - info; - - // c style - FT* sing_values = (FT*) std::malloc(n*sizeof(FT)); - FT* work = (FT*) std::malloc(lwork*sizeof(FT)); - - FT rcond = -1; - - LAPACK::dgelss(&m, &n, &nrhs, M.matrix(), &lda, B.vector(), &ldb, sing_values, - &rcond, &rank, work, &lwork, &info); - CGAL_assertion(info==0); - - FT cond_nb = sing_values[0]/sing_values[n-1]; - - // clean up - free(sing_values); - free(work); - - return cond_nb; -} - -} // namespace CGAL - -#endif // CGAL_LAPACK_H diff --git a/Spatial_searching/test/Spatial_searching/iso_rectangle_2_query_2.cpp b/Spatial_searching/test/Spatial_searching/iso_rectangle_2_query_2.cpp index fc3ae4312fc..7cf4213c15d 100644 --- a/Spatial_searching/test/Spatial_searching/iso_rectangle_2_query_2.cpp +++ b/Spatial_searching/test/Spatial_searching/iso_rectangle_2_query_2.cpp @@ -27,7 +27,7 @@ main() { //inserting N points one-by-one, thus the use of "reserve" is recommended, and we use it tree.reserve(N); - //to test wether the tree.capacity() function works properly. + //to test whether the tree.capacity() function works properly. if( tree.capacity() < N) { std::cerr << "ERROR: Something is wrong with allocating points memory." << std::endl; diff --git a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h index 91b9919732d..1ec4e451e27 100644 --- a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h +++ b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h @@ -25,7 +25,7 @@ public: /*! */ -boost::property_traits::key_type Point_2; +typedef boost::property_traits::key_type Point_2; /// @} diff --git a/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp b/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp index 40d9596df1a..ac1e5d47ef9 100644 --- a/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp +++ b/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Spatial_sorting/test/Spatial_sorting/test_multiscale.cpp b/Spatial_sorting/test/Spatial_sorting/test_multiscale.cpp index 33b9b7ac33f..7dfc145cd0a 100644 --- a/Spatial_sorting/test/Spatial_sorting/test_multiscale.cpp +++ b/Spatial_sorting/test/Spatial_sorting/test_multiscale.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h index 72bc26180ec..3d327857972 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h @@ -21,13 +21,13 @@ The set of input polygons are unique and interior disjoint. That is, given disti bounded or unbounded side of `Q` (but not both). \tparam OutputPolygonWithHolesPtrIterator must be an output iterator whose `value_type` is a smart pointer (such as `boost::shared_ptr`) whose `element_type` is `Polygon_with_holes_2`. - +\return `true` if no error was encountered, and `false` otherwise. \sa `create_exterior_straight_skeleton_2()` \sa `Straight_skeleton_builder_2` */ template -void arrange_offset_polygons_2 ( InputPolygonPtrIterator begin +bool arrange_offset_polygons_2 ( InputPolygonPtrIterator begin , InputPolygonPtrIterator end , OutputPolygonWithHolesPtrIterator out , K const& k diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/PackageDescription.txt b/Straight_skeleton_2/doc/Straight_skeleton_2/PackageDescription.txt index f5ca9bead09..0540d24e803 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/PackageDescription.txt +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/PackageDescription.txt @@ -25,7 +25,6 @@ \cgalPkgDependsOn{\ref PkgHalfedgeDS} \cgalPkgBib{cgal:c-sspo2} \cgalPkgLicense{\ref licensesGPL "GPL"} -\cgalPkgDemo{2D Straight Skeleton,straight_skeleton_2.zip,Operations on Polygons,polygon.zip} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt b/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt index 108484ae6f3..5ce74a182ba 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt @@ -304,7 +304,7 @@ roundoff in the coordinates of the output points will cause parallel edges that almost collapse-but not so-to become really collinear or even cross each other. -Thus, it is neccessary to use a kernel with exact constructions if +Thus, it is necessary to use a kernel with exact constructions if offset polygons must be simple, yet computing a straight skeleton using that kernel is very slow, much more than computing the offset polygons. To help with this, it is possible to construct the straight @@ -411,7 +411,7 @@ Constructing the exterior skeleton of the outer contour is possible by means of To construct exterior offset contours in the inside of each hole you just use the skeleton constructed in the interior, and, if required, revert the orientation of each resulting offset contour. -Constructing exterior offset contours in the outside of the outer contour is just a little bit more involved: Since the contour is placed as a hole of a frame, you will always obtain 2 offset contours for any given distance; one is the offseted frame and the other is the offseted contour. Thus, from the resulting offset contour sequence, you always need to discard the offsetted frame, easily identified as the offset contour with the largest area. +Constructing exterior offset contours in the outside of the outer contour is just a little bit more involved: Since the contour is placed as a hole of a frame, you will always obtain 2 offset contours for any given distance; one is the offsetted frame and the other is the offsetted contour. Thus, from the resulting offset contour sequence, you always need to discard the offsetted frame, easily identified as the offset contour with the largest area. It is necessary to place the frame sufficiently away from the contour. If it is not, it could occur that the outward offset contour collides and merges with the inward offset frame, resulting in 1 instead of 2 offset contours. @@ -441,7 +441,7 @@ On the other hand, only reflex vertices (whose internal angle \f$ > \pi\f$) are the source of deviations of the bisectors from its center location. Therefore, for convex polygons, the straight skeleton, the medial axis and the Voronoi diagram are exactly equivalent, -and, if a non-convex polygon contains only vertices of low +and, if a non-convex polygon contains only vertices of lowfor f in *.txt ; do echo $f ; aspell list < $f | sort | uniq -c ; done reflexivity, the straight skeleton bisectors will be placed nearly equidistant to their defining edges, producing a straight skeleton pretty much alike a proper medial axis. diff --git a/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h b/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h index fa86f4a2a15..31a456c7aac 100644 --- a/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h +++ b/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h @@ -39,7 +39,7 @@ namespace CGAL { // Every hole is contained in one and only one outer polygon // template -void arrange_offset_polygons_2 ( InputPolygonPtrIterator aBegin +bool arrange_offset_polygons_2 ( InputPolygonPtrIterator aBegin , InputPolygonPtrIterator aEnd , OutputPolygonWithHolesPtrIterator rOut , K const& @@ -95,25 +95,36 @@ void arrange_offset_polygons_2 ( InputPolygonPtrIterator aBegin lParent = lOuter ; } - CGAL_assertion(lParent != NULL); + if (lParent == NULL) + return false; lParent->add_hole(*lPoly); } } + return true; } template std::vector< boost::shared_ptr< Polygon_with_holes_2 > > inline -arrange_offset_polygons_2 ( std::vector< boost::shared_ptr< Polygon_2 > > const& aPolygons ) +arrange_offset_polygons_2 ( std::vector< boost::shared_ptr< Polygon_2 > > const& aPolygons, bool& no_error) { std::vector< boost::shared_ptr< Polygon_with_holes_2 > > rResult ; - arrange_offset_polygons_2(aPolygons.begin(), aPolygons.end(), std::back_inserter(rResult), K() ) ; + no_error = arrange_offset_polygons_2(aPolygons.begin(), aPolygons.end(), std::back_inserter(rResult), K() ) ; return rResult ; } +template +std::vector< boost::shared_ptr< Polygon_with_holes_2 > > +inline +arrange_offset_polygons_2 ( std::vector< boost::shared_ptr< Polygon_2 > > const& aPolygons) +{ + bool no_error; + return arrange_offset_polygons_2(aPolygons, no_error); +} + } // end namespace CGAL diff --git a/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h b/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h index 4ff949a6df7..201e2113131 100644 --- a/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h @@ -212,11 +212,11 @@ Uncertain exist_offset_lines_isec2 ( intrusive_ptr< Trisegment_2 > cons } } else{ - CGAL_STSKEL_TRAITS_TRACE("\nDenominator is probably zero (but not exactly), event existance is indeterminate." ) ; + CGAL_STSKEL_TRAITS_TRACE("\nDenominator is probably zero (but not exactly), event existence is indeterminate." ) ; } } else{ - CGAL_STSKEL_TRAITS_TRACE("\nEvent time overflowed, event existance is indeterminate." ) ; + CGAL_STSKEL_TRAITS_TRACE("\nEvent time overflowed, event existence is indeterminate." ) ; } } else diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h index c5a190eb439..bb40956cd60 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h @@ -20,7 +20,6 @@ #ifndef CGAL_TEST_SLS_BUILDER_TYPES_H #define CGAL_TEST_SLS_BUILDER_TYPES_H -#include #include #include #include diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h index d7f833d69eb..cf4fcefb6a5 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h @@ -20,7 +20,6 @@ #ifndef CGAL_TEST_SLS_BUILDER_TYPES_H #define CGAL_TEST_SLS_BUILDER_TYPES_H -#include #include #include #include diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_types.h b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_types.h index 173915be889..1afa70696ab 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_types.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_types.h @@ -20,7 +20,7 @@ #ifndef CGAL_TEST_SLS_TRAITS_TYPES_H #define CGAL_TEST_SLS_TRAITS_TYPES_H -#include + #include #include diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h index 601ab300e31..1f1542a70f5 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h @@ -20,7 +20,7 @@ #ifndef CGAL_TEST_SLS_TYPES_H #define CGAL_TEST_SLS_TYPES_H -#include + #include #include #include diff --git a/Stream_support/examples/Stream_support/CMakeLists.txt b/Stream_support/examples/Stream_support/CMakeLists.txt index 165c4ae8cec..0b27d681d69 100644 --- a/Stream_support/examples/Stream_support/CMakeLists.txt +++ b/Stream_support/examples/Stream_support/CMakeLists.txt @@ -6,22 +6,12 @@ project( Stream_support_Examples) cmake_minimum_required(VERSION 2.8.11) -# Boost and its components -find_package( Boost REQUIRED ) - -if ( NOT Boost_FOUND ) - - message(STATUS "This project requires the Boost library, and will not be compiled.") - - return() - -endif() # CGAL and its components find_package( CGAL QUIET) if ( CGAL_FOUND ) include( ${CGAL_USE_FILE} ) - find_package( Boost REQUIRED ) + find_package( Boost QUIET ) if ( NOT Boost_FOUND ) diff --git a/Stream_support/include/CGAL/IO/PLY.h b/Stream_support/include/CGAL/IO/PLY.h new file mode 100644 index 00000000000..104c85ce0ef --- /dev/null +++ b/Stream_support/include/CGAL/IO/PLY.h @@ -0,0 +1,973 @@ +// Copyright (c) 2015 Geometry Factory +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// Author(s) : Simon Giraudot + +#ifndef CGAL_IO_PLY_H +#define CGAL_IO_PLY_H + +#include +#include + +#include +#include +#include +#include + +#define TRY_TO_GENERATE_PROPERTY(STD_TYPE, T_TYPE, TYPE) \ + if (type == STD_TYPE || type == T_TYPE) \ + m_elements.back().add_property (new PLY_read_typed_number< TYPE > (name, format)) + +#define TRY_TO_GENERATE_SIZED_LIST_PROPERTY(STD_SIZE_TYPE, T_SIZE_TYPE, SIZE_TYPE, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) \ + if ((size_type == STD_SIZE_TYPE || size_type == T_SIZE_TYPE) && \ + (index_type == STD_INDEX_TYPE || index_type == T_INDEX_TYPE)) \ + m_elements.back().add_property (new PLY_read_typed_list_with_typed_size< SIZE_TYPE , INDEX_TYPE > (name, format)) + +#define TRY_TO_GENERATE_LIST_PROPERTY(STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) \ + TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uchar", "uint8", boost::uint8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ + else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("ushort", "uint16", boost::uint16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ + else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uint", "uint32", boost::uint32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) + + +/// \cond SKIP_IN_MANUAL + +namespace CGAL { + +// PLY types: +// name type number of bytes +// --------------------------------------- +// char character 1 +// uchar unsigned character 1 +// short short integer 2 +// ushort unsigned short integer 2 +// int integer 4 +// uint unsigned integer 4 +// float single-precision float 4 +// double double-precision float 8 + +template +struct PLY_property +{ + typedef T type; + const char* name; + PLY_property (const char* name) : name (name) { } +}; + +// Use a double property for all kernels... +template struct Convert_FT { typedef double type; }; +// ...except if kernel uses type float +template <> struct Convert_FT { typedef float type; }; + +template +struct Get_FT_from_map +{ + typedef typename Convert_FT + ::value_type>::Kernel::FT>::type type; +}; + +template +std::tuple::Kernel::Construct_point_3, + PLY_property::type>, + PLY_property::type>, + PLY_property::type> > +make_ply_point_reader(PointMap point_map) +{ + return std::make_tuple (point_map, typename Kernel_traits::Kernel::Construct_point_3(), + PLY_property::type>("x"), + PLY_property::type>("y"), + PLY_property::type>("z")); +} + +template +std::tuple::Kernel::Construct_vector_3, + PLY_property::type>, + PLY_property::type>, + PLY_property::type> > +make_ply_normal_reader(VectorMap normal_map) +{ + return std::make_tuple (normal_map, typename Kernel_traits::Kernel::Construct_vector_3(), + PLY_property::type>("nx"), + PLY_property::type>("ny"), + PLY_property::type>("nz")); +} + +template +std::tuple::type>, + PLY_property::type>, + PLY_property::type> > +make_ply_point_writer(PointMap point_map) +{ + return std::make_tuple (point_map, + PLY_property::type>("x"), + PLY_property::type>("y"), + PLY_property::type>("z")); +} + +template +std::tuple::type>, + PLY_property::type>, + PLY_property::type> > +make_ply_normal_writer(VectorMap normal_map) +{ + return std::make_tuple (normal_map, + PLY_property::type>("nx"), + PLY_property::type>("ny"), + PLY_property::type>("nz")); +} + +namespace internal { + +namespace PLY { + +class PLY_read_number +{ +protected: + std::string m_name; + std::size_t m_format; + +public: + PLY_read_number (std::string name, std::size_t format) + : m_name (name), m_format (format) { } + virtual ~PLY_read_number() { } + + const std::string& name () const { return m_name; } + + virtual void get (std::istream& stream) const = 0; + + // The two following functions prevent the stream to only extract + // ONE character (= what the types char imply) by requiring + // explicitely an integer object when reading the stream + void read_ascii (std::istream& stream, char& c) const + { + short s; + stream >> s; + c = static_cast(s); + } + void read_ascii (std::istream& stream, signed char& c) const + { + short s; + stream >> s; + c = static_cast(s); + } + void read_ascii (std::istream& stream, unsigned char& c) const + { + unsigned short s; + stream >> s; + c = static_cast(s); + } + + void read_ascii (std::istream& stream, float& t) const + { + stream >> iformat(t); + } + + void read_ascii (std::istream& stream, double& t) const + { + stream >> iformat(t); + } + + // Default template when Type is not a char type + template + void read_ascii (std::istream& stream, Type& t) const + { + stream >> t; + } + + + template + Type read (std::istream& stream) const + { + if (m_format == 0) // Ascii + { + Type t; + read_ascii (stream, t); + return t; + } + else // Binary (2 = little endian) + { + union + { + char uChar[sizeof (Type)]; + Type type; + } buffer; + + std::size_t size = sizeof (Type); + + stream.read(buffer.uChar, size); + + if (m_format == 2) // Big endian + { + for (std::size_t i = 0; i < size / 2; ++ i) + { + unsigned char tmp = buffer.uChar[i]; + buffer.uChar[i] = buffer.uChar[size - 1 - i]; + buffer.uChar[size - 1 - i] = tmp; + } + } + return buffer.type; + } + return Type(); + } +}; + +template +class PLY_read_typed_number : public PLY_read_number +{ + mutable Type m_buffer; +public: + PLY_read_typed_number (std::string name, std::size_t format) + : PLY_read_number (name, format) + { + } + void get (std::istream& stream) const + { + m_buffer = (this->read (stream)); + } + const Type& buffer() const + { + return m_buffer; + } +}; + +template +class PLY_read_typed_list : public PLY_read_number +{ +protected: + mutable std::vector m_buffer; +public: + PLY_read_typed_list (std::string name, std::size_t format) + : PLY_read_number (name, format) + { + } + virtual void get (std::istream& stream) const = 0; + + const std::vector& buffer() const + { + return m_buffer; + } +}; + +template +class PLY_read_typed_list_with_typed_size + : public PLY_read_typed_list +{ + +public: + PLY_read_typed_list_with_typed_size (std::string name, std::size_t format) + : PLY_read_typed_list (name, format) + { + } + void get (std::istream& stream) const + { + std::size_t size = static_cast(this->template read(stream)); + this->m_buffer.resize (size); + for (std::size_t i = 0; i < size; ++ i) + this->m_buffer[i] = this->template read (stream); + } +}; + +class PLY_element +{ + std::string m_name; + std::size_t m_number; + + std::vector m_properties; +public: + + PLY_element (const std::string& name, std::size_t number) + : m_name (name), m_number (number) + { } + + PLY_element (const PLY_element& other) + : m_name (other.m_name), m_number (other.m_number), m_properties (other.m_properties) + { + const_cast(other).m_properties.clear(); + } + + PLY_element& operator= (const PLY_element& other) + { + m_name = other.m_name; + m_number = other.m_number; + m_properties = other.m_properties; + const_cast(other).m_properties.clear(); + return *this; + } + + ~PLY_element() + { + for (std::size_t i = 0; i < m_properties.size(); ++ i) + delete m_properties[i]; + } + + const std::string& name() const { return m_name; } + std::size_t number_of_items() const { return m_number; } + std::size_t number_of_properties() const { return m_properties.size(); } + + PLY_read_number* property (std::size_t idx) { return m_properties[idx]; } + + void add_property (PLY_read_number* read_number) + { + m_properties.push_back (read_number); + } + + template + bool has_property (const char* tag) + { + return has_property (tag, Type()); + } + template + bool has_property (const char* tag, const std::vector&) + { + for (std::size_t i = 0; i < number_of_properties(); ++ i) + if (m_properties[i]->name () == tag) + return (dynamic_cast*>(m_properties[i]) != NULL); + return false; + } + + template + bool has_property (const char* tag, Type) + { + for (std::size_t i = 0; i < number_of_properties(); ++ i) + if (m_properties[i]->name () == tag) + return (dynamic_cast*>(m_properties[i]) != NULL); + return false; + } + bool has_property (const char* tag, double) + { + for (std::size_t i = 0; i < number_of_properties(); ++ i) + if (m_properties[i]->name () == tag) + return (dynamic_cast*>(m_properties[i]) != NULL + || dynamic_cast*>(m_properties[i]) != NULL); + + return false; + } + + template + void assign (Type& t, const char* tag) + { + for (std::size_t i = 0; i < number_of_properties (); ++ i) + if (m_properties[i]->name () == tag) + { + PLY_read_typed_number* + property = dynamic_cast*>(m_properties[i]); + CGAL_assertion (property != NULL); + t = property->buffer(); + return; + } + } + + template + void assign (std::vector& t, const char* tag) + { + for (std::size_t i = 0; i < number_of_properties (); ++ i) + if (m_properties[i]->name () == tag) + { + PLY_read_typed_list* + property = dynamic_cast*>(m_properties[i]); + CGAL_assertion (property != NULL); + t = property->buffer(); + return; + } + } + + void assign (double& t, const char* tag) + { + for (std::size_t i = 0; i < number_of_properties (); ++ i) + if (m_properties[i]->name () == tag) + { + PLY_read_typed_number* + property_double = dynamic_cast*>(m_properties[i]); + if (property_double == NULL) + { + PLY_read_typed_number* + property_float = dynamic_cast*>(m_properties[i]); + CGAL_assertion (property_float != NULL); + t = property_float->buffer(); + } + else + t = property_double->buffer(); + + return; + } + } + +}; + +class PLY_reader +{ + std::vector m_elements; + std::string m_comments; + +public: + PLY_reader () { } + + std::size_t number_of_elements() const { return m_elements.size(); } + PLY_element& element (std::size_t idx) + { + return m_elements[idx]; + } + + const std::string& comments() const { return m_comments; } + + template + bool init (Stream& stream) + { + std::size_t lineNumber = 0; // current line number + enum Format { ASCII = 0, BINARY_LITTLE_ENDIAN = 1, BINARY_BIG_ENDIAN = 2}; + Format format = ASCII; + + std::string line; + std::istringstream iss; + + while (getline (stream,line)) + { + iss.clear(); + iss.str (line); + ++ lineNumber; + + // Reads file signature on first line + if (lineNumber == 1) + { + std::string signature; + if (!(iss >> signature) || (signature != "ply")) + { + // if wrong file format + std::cerr << "Error: incorrect file format line " << lineNumber << " of file" << std::endl; + return false; + } + } + + // Reads format on 2nd line + else if (lineNumber == 2) + { + std::string tag, format_string, version; + if ( !(iss >> tag >> format_string >> version) ) + { + std::cerr << "Error line " << lineNumber << " of file" << std::endl; + return false; + } + if (format_string == "ascii") format = ASCII; + else if (format_string == "binary_little_endian") format = BINARY_LITTLE_ENDIAN; + else if (format_string == "binary_big_endian") format = BINARY_BIG_ENDIAN; + else + { + std::cerr << "Error: unknown file format \"" << format_string << "\" line " << lineNumber << std::endl; + return false; + } + } + + // Comments and vertex properties + else + { + std::string keyword; + if (!(iss >> keyword)) + { + std::cerr << "Error line " << lineNumber << " of file" << std::endl; + return false; + } + + if (keyword == "property") + { + std::string type, name; + if (!(iss >> type >> name)) + { + std::cerr << "Error line " << lineNumber << " of file" << std::endl; + return false; + } + + + if (type == "list") // Special case + { + std::string size_type = name; + std::string index_type; + name.clear(); + if (!(iss >> index_type >> name)) + { + std::cerr << "Error line " << lineNumber << " of file" << std::endl; + return false; + } + + TRY_TO_GENERATE_LIST_PROPERTY ("char", "int8", boost::int8_t); + else TRY_TO_GENERATE_LIST_PROPERTY ("uchar", "uint8", boost::uint8_t); + else TRY_TO_GENERATE_LIST_PROPERTY ("short", "int16", boost::int16_t); + else TRY_TO_GENERATE_LIST_PROPERTY ("ushort", "uint16", boost::uint16_t); + else TRY_TO_GENERATE_LIST_PROPERTY ("int", "int32", boost::int32_t); + else TRY_TO_GENERATE_LIST_PROPERTY ("uint", "uint32", boost::uint32_t); + else TRY_TO_GENERATE_LIST_PROPERTY ("float", "float32", float); + else TRY_TO_GENERATE_LIST_PROPERTY ("double", "float64", double); + } + else + { + TRY_TO_GENERATE_PROPERTY ("char", "int8", boost::int8_t); + else TRY_TO_GENERATE_PROPERTY ("uchar", "uint8", boost::uint8_t); + else TRY_TO_GENERATE_PROPERTY ("short", "int16", boost::int16_t); + else TRY_TO_GENERATE_PROPERTY ("ushort", "uint16", boost::uint16_t); + else TRY_TO_GENERATE_PROPERTY ("int", "int32", boost::int32_t); + else TRY_TO_GENERATE_PROPERTY ("uint", "uint32", boost::uint32_t); + else TRY_TO_GENERATE_PROPERTY ("float", "float32", float); + else TRY_TO_GENERATE_PROPERTY ("double", "float64", double); + } + + continue; + } + else if (keyword == "comment") + { + std::string str = iss.str(); + if (str.size() > 8) + { + std::copy (str.begin() + 8, str.end(), std::back_inserter (m_comments)); + m_comments += "\n"; + } + } + else if (keyword == "element") + { + std::string type; + std::size_t number; + if (!(iss >> type >> number)) + { + std::cerr << "Error line " << lineNumber << " of file" << std::endl; + return false; + } + + m_elements.push_back (PLY_element(type, number)); + } + // When end_header is reached, stop loop and begin reading points + else if (keyword == "end_header") + break; + } + } + return true; + } + + ~PLY_reader () + { + } + +}; + +template +void get_value(Reader& r, T& v, PLY_property& wrapper) +{ + return r.assign(v, wrapper.name); +} + + +template +struct Filler +{ + template + static void fill(Reader& r, Value_tuple& values, PLY_property_tuple wrappers) + { + get_value(r, std::get(values), std::get(wrappers)); + Filler::fill(r, values, wrappers); + } +}; + +template +struct seq { }; + +template +struct gens : gens { }; + +template +struct gens<0, S...> { + typedef seq type; +}; + +template +ValueType call_functor(Functor f, Tuple t, seq) { + return f(std::get(t) ...); +} + +template +ValueType call_functor(Functor f, std::tuple& t) +{ + return call_functor(f, t, typename gens::type()); +} + +template<> +struct Filler<0> +{ + template + static void fill(Reader& r, Value_tuple& values, PLY_property_tuple wrappers) + { + get_value(r, std::get<0>(values), std::get<2>(wrappers)); + } +}; + +template +void process_properties (PLY_element& element, OutputValueType& new_element, + std::tuple...>&& current) +{ + typedef typename PropertyMap::value_type PmapValueType; + std::tuple values; + Filler::fill(element, values, current); + PmapValueType new_value = call_functor(std::get<1>(current), values); + put (std::get<0>(current), new_element, new_value); +} + +template +void process_properties (PLY_element& element, OutputValueType& new_element, + std::tuple...>&& current, + NextPropertyBinder&& next, + PropertyMapBinders&& ... properties) +{ + typedef typename PropertyMap::value_type PmapValueType; + std::tuple values; + Filler::fill(element, values, current); + PmapValueType new_value = call_functor(std::get<1>(current), values); + put (std::get<0>(current), new_element, new_value); + + process_properties (element, new_element, std::forward(next), + std::forward(properties)...); +} + + +template +void process_properties (PLY_element& element, OutputValueType& new_element, + std::pair >&& current) +{ + T new_value = T(); + element.assign (new_value, current.second.name); + put (current.first, new_element, new_value); +} + +template +void process_properties (PLY_element& element, OutputValueType& new_element, + std::pair >&& current, + NextPropertyBinder&& next, + PropertyMapBinders&& ... properties) +{ + T new_value = T(); + element.assign (new_value, current.second.name); + put (current.first, new_element, new_value); + process_properties (element, new_element, std::forward(next), + std::forward(properties)...); +} + +template inline void property_header_type (std::ostream& stream) +{ + CGAL_assertion_msg (false, "Unknown PLY type"); + stream << "undefined_type"; +} + +template <> inline void property_header_type (std::ostream& stream) { stream << "char"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "char"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "uchar"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "short"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "ushort"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "int"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "uint"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "float"; } +template <> inline void property_header_type (std::ostream& stream) { stream << "double"; } + +template +void property_header (std::ostream& stream, const PLY_property& prop) +{ + stream << "property "; + property_header_type(stream); + stream << " " << prop.name << std::endl; +} + +template +void property_header (std::ostream& stream, const PLY_property >& prop) +{ + stream << "property list uchar "; + property_header_type(stream); + stream << " " << prop.name << std::endl; +} + + +template +struct Properties_header +{ + template + static void write(std::ostream& stream, PLY_property_tuple& wrappers) + { + Properties_header::write(stream, wrappers); + property_header (stream, std::get(wrappers)); + } +}; +template <> +struct Properties_header<0> +{ + template + static void write(std::ostream& stream, PLY_property_tuple& wrappers) + { + property_header (stream, std::get<1>(wrappers)); + } +}; + +template +void output_property_header (std::ostream& stream, + std::tuple... >&& current) +{ + Properties_header::write(stream, current); +} + + +template +void output_property_header (std::ostream& stream, + std::pair >&& current) +{ + property_header (stream, current.second); +} + +template +void output_property_header (std::ostream& stream, + std::pair >&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) +{ + property_header (stream, current.second); + output_property_header (stream, std::forward(next), + std::forward(properties)...); +} +template +void output_property_header (std::ostream& stream, + std::tuple... >&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) +{ + Properties_header::write(stream, current); + output_property_header (stream, std::forward(next), + std::forward(properties)...); +} + + +template +void property_write (std::ostream& stream, ForwardIterator it, PropertyMap map) +{ + stream << CGAL::oformat(get (map, *it)); +} + +template +inline T no_char_character (const T& t) { return t; } +inline int no_char_character (const char& t) { return int(t); } +inline int no_char_character (const signed char& t) { return int(t); } +inline int no_char_character (const unsigned char& t) { return int(t); } + +template +void simple_property_write (std::ostream& stream, ForwardIterator it, + std::pair > map) +{ + if (CGAL::get_mode(stream) == IO::ASCII) + stream << no_char_character(get (map.first, *it)); + else + { + typename PropertyMap::value_type value = get(map.first, *it); + stream.write (reinterpret_cast(&value), sizeof(value)); + } +} + +template +void simple_property_write (std::ostream& stream, ForwardIterator it, + std::pair > > map) +{ + const typename PropertyMap::reference value = get(map.first, *it); + + if (CGAL::get_mode(stream) == IO::ASCII) + { + stream << value.size(); + for (std::size_t i = 0; i < value.size(); ++ i) + stream << " " << no_char_character(value[i]); + } + else + { + unsigned char size = static_cast(value.size()); + stream.write (reinterpret_cast(&size), sizeof(size)); + for (std::size_t i = 0; i < value.size(); ++ i) + { + T t = T(value[i]); + stream.write (reinterpret_cast(&t), sizeof(t)); + } + } +} + + +template +void output_properties (std::ostream& stream, + ForwardIterator it, + std::tuple... >&& current) +{ + property_write (stream, it, std::get<0>(current)); + if (get_mode(stream) == IO::ASCII) + stream << std::endl; +} + + +template +void output_properties (std::ostream& stream, + ForwardIterator it, + std::pair >&& current) +{ + simple_property_write (stream, it, std::forward > >(current)); + if (get_mode(stream) == IO::ASCII) + stream << std::endl; +} + +template +void output_properties (std::ostream& stream, + ForwardIterator it, + std::pair >&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) +{ + simple_property_write (stream, it, current); + if (get_mode(stream) == IO::ASCII) + stream << " "; + output_properties (stream, it, std::forward(next), + std::forward(properties)...); +} + +template +void output_properties (std::ostream& stream, + ForwardIterator it, + std::tuple... >&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) +{ + property_write (stream, it, std::get<0>(current)); + if (get_mode(stream) == IO::ASCII) + stream << " "; + output_properties (stream, it, std::forward(next), + std::forward(properties)...); +} + + +// Printer classes used by Point_set_3 and Surface_mesh (translate a +// property map to a PLY property) + +template +class Abstract_property_printer +{ +public: + virtual ~Abstract_property_printer() { } + virtual void print (std::ostream& stream, const Index& index) = 0; +}; + +template +class Property_printer : public Abstract_property_printer +{ + PropertyMap m_pmap; +public: + Property_printer (const PropertyMap& pmap) : m_pmap (pmap) + { + + } + + virtual void print(std::ostream& stream, const Index& index) + { + stream << get(m_pmap, index); + } +}; + +template +class Simple_property_printer : public Abstract_property_printer +{ + PropertyMap m_pmap; +public: + Simple_property_printer (const PropertyMap& pmap) : m_pmap (pmap) + { + + } + + virtual void print(std::ostream& stream, const Index& index) + { + if (get_mode(stream) == IO::ASCII) + stream << get(m_pmap, index); + else + { + Type t = Type(get (m_pmap, index)); + stream.write (reinterpret_cast(&t), sizeof(t)); + } + } +}; + +template +class Char_property_printer : public Abstract_property_printer +{ + typedef typename PropertyMap::value_type Type; + PropertyMap m_pmap; +public: + Char_property_printer (const PropertyMap& pmap) : m_pmap (pmap) + { + + } + + virtual void print(std::ostream& stream, const Index& index) + { + if (get_mode(stream) == IO::ASCII) + stream << int(get(m_pmap, index)); + else + { + Type t = get (m_pmap, index); + stream.write (reinterpret_cast(&t), sizeof(t)); + } + } +}; + +} // namespace PLY + +} // namespace internal + +} // namespace CGAL + + +#endif // CGAL_IO_PLY_H diff --git a/Stream_support/include/CGAL/IO/io_impl.h b/Stream_support/include/CGAL/IO/io_impl.h index 22ebb0e95d2..c7d5b437e2b 100644 --- a/Stream_support/include/CGAL/IO/io_impl.h +++ b/Stream_support/include/CGAL/IO/io_impl.h @@ -29,7 +29,6 @@ #define CGAL_INLINE_FUNCTION #endif -#include #include #include diff --git a/Stream_support/test/Stream_support/test_ioformat.cpp b/Stream_support/test/Stream_support/test_ioformat.cpp index e5a75482948..8b32500e40e 100644 --- a/Stream_support/test/Stream_support/test_ioformat.cpp +++ b/Stream_support/test/Stream_support/test_ioformat.cpp @@ -27,7 +27,6 @@ // // ============================================================================ -#include #include #include #include diff --git a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt index b00d486b22f..9856b42bccc 100644 --- a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt +++ b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt @@ -276,7 +276,7 @@ or segmentation algorithms work for `Surface_mesh` and `Polyhedron_3`. BGL algorithms use property maps in order to associate information to vertices and edges. One important property is the index, an integer between `0` and `num_vertices(g)` for the vertices of a graph `g`. -This allows algorithms to create a vector of the approriate size +This allows algorithms to create a vector of the appropriate size in order to store per vertex information. For example a Boolean for storing if a vertex has already been visited during a graph traversal. @@ -303,7 +303,7 @@ this boils down to an identity function as vertices \em are indices. \cgalExample{Surface_mesh/sm_bgl.cpp} -\section sectionSurfaceMesh_memory Memory Managment +\section sectionSurfaceMesh_memory Memory Management Memory management is semi-automatic. Memory grows as more elements are added to the structure but does not shrink when elements are @@ -363,7 +363,7 @@ Result of the run of the draw_surface_mesh program. A window shows the surface m As integer type for the indices we have chosen `boost::uint32_t`. On 64 bit operating systems they take only half the size of a pointer. They still allow to have meshes with 2 billion elements. -We use `std::vector` for storing properties. So by accessing the adress +We use `std::vector` for storing properties. So by accessing the address of the 0th element of a property map you can access the underlying raw array. This may be useful, for example for passing an array of points to OpenGL. diff --git a/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h new file mode 100644 index 00000000000..6b5508b78ef --- /dev/null +++ b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h @@ -0,0 +1,729 @@ +// Copyright (c) 2018 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0+ +// +// +// Author(s) : Simon Giraudot + +#ifndef CGAL_SURFACE_MESH_IO_PLY +#define CGAL_SURFACE_MESH_IO_PLY + +#include + +namespace CGAL { + +namespace internal { + +#if !defined(CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE) && !defined(CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES) +namespace PLY { + +template +class Surface_mesh_filler +{ +public: + typedef typename Kernel_traits::Kernel Kernel; + typedef typename Kernel::Vector_3 Vector; + typedef CGAL::Surface_mesh Surface_mesh; + typedef typename Surface_mesh::size_type size_type; + typedef typename Surface_mesh::Vertex_index Vertex_index; + typedef typename Surface_mesh::Face_index Face_index; + typedef typename Surface_mesh::Edge_index Edge_index; + typedef typename Surface_mesh::Halfedge_index Halfedge_index; + +private: + + struct Abstract_ply_property_to_surface_mesh_property + { + virtual ~Abstract_ply_property_to_surface_mesh_property() { } + virtual void assign (PLY_element& element, size_type index) = 0; + }; + + template + class PLY_property_to_surface_mesh_property : public Abstract_ply_property_to_surface_mesh_property + { + typedef typename Surface_mesh::template Property_map Map; + Map m_map; + std::string m_name; + public: + PLY_property_to_surface_mesh_property (Surface_mesh& sm, const std::string& name) + : m_name (name) + { + m_map = sm.template add_property_map(prefix(Simplex()) + name).first; + } + + virtual void assign (PLY_element& element, size_type index) + { + Type t{}; + element.assign (t, m_name.c_str()); + put(m_map, Simplex(index), t); + } + + std::string prefix(Vertex_index) const { return "v:"; } + std::string prefix(Face_index) const { return "f:"; } + std::string prefix(Edge_index) const { return "e:"; } + std::string prefix(Halfedge_index) const { return "h:"; } + }; + + Surface_mesh& m_mesh; + std::vector m_map_v2v; + bool m_use_floats; + int m_normals; + typename Surface_mesh::template Property_map m_normal_map; + int m_vcolors; + typename Surface_mesh::template Property_map m_vcolor_map; + int m_fcolors; + typename Surface_mesh::template Property_map m_fcolor_map; + bool m_use_int32_t; + std::string m_index_tag; + std::vector m_vertex_properties; + std::vector m_face_properties; + std::vector m_edge_properties; + std::vector m_halfedge_properties; + +public: + + Surface_mesh_filler (Surface_mesh& mesh) + : m_mesh (mesh), m_use_floats (false), m_normals(0), m_vcolors(0), m_fcolors(0) + { } + + ~Surface_mesh_filler() + { + for (std::size_t i = 0; i < m_vertex_properties.size(); ++ i) + delete m_vertex_properties[i]; + for (std::size_t i = 0; i < m_face_properties.size(); ++ i) + delete m_face_properties[i]; + for (std::size_t i = 0; i < m_edge_properties.size(); ++ i) + delete m_edge_properties[i]; + for (std::size_t i = 0; i < m_halfedge_properties.size(); ++ i) + delete m_halfedge_properties[i]; + } + + bool has_simplex_specific_property (internal::PLY::PLY_read_number* property, Vertex_index) + { + const std::string& name = property->name(); + if (name == "x" || + name == "y" || + name == "z") + { + if (dynamic_cast*>(property)) + m_use_floats = true; + return true; + } + if (name == "nx" || + name == "ny" || + name == "nz") + { + ++ m_normals; + if (m_normals == 3) + m_normal_map = m_mesh.template add_property_map("v:normal").first; + return true; + } + if (name == "red" || + name == "green" || + name == "blue") + { + ++ m_vcolors; + if (m_vcolors == 3) + m_vcolor_map = m_mesh.template add_property_map("v:color").first; + return true; + } + return false; + } + + bool has_simplex_specific_property (internal::PLY::PLY_read_number* property, Face_index) + { + const std::string& name = property->name(); + if (name == "vertex_indices" || name == "vertex_index") + { + CGAL_assertion (dynamic_cast*>(property) + || dynamic_cast*>(property)); + m_index_tag = name; + m_use_int32_t = dynamic_cast*>(property); + return true; + } + if (name == "red" || + name == "green" || + name == "blue") + { + ++ m_fcolors; + if (m_fcolors == 3) + m_fcolor_map = m_mesh.template add_property_map("f:color").first; + return true; + } + + return false; + } + + bool has_simplex_specific_property (internal::PLY::PLY_read_number* property, Edge_index) + { + const std::string& name = property->name(); + if (name == "v0" || name == "v1") + return true; + return false; + } + + bool has_simplex_specific_property (internal::PLY::PLY_read_number* property, Halfedge_index) + { + const std::string& name = property->name(); + if (name == "source" || name == "target") + return true; + return false; + } + + void instantiate_vertex_properties (PLY_element& element) + { + m_map_v2v.reserve(element.number_of_items()); + instantiate_properties (element, m_vertex_properties); + } + + void instantiate_face_properties (PLY_element& element) + { + instantiate_properties (element, m_face_properties); + } + + void instantiate_edge_properties (PLY_element& element) + { + instantiate_properties (element, m_edge_properties); + } + + void instantiate_halfedge_properties (PLY_element& element) + { + instantiate_properties (element, m_halfedge_properties); + } + + template + void instantiate_properties (PLY_element& element, + std::vector& properties) + { + for (std::size_t j = 0; j < element.number_of_properties(); ++ j) + { + internal::PLY::PLY_read_number* property = element.property(j); + + if (has_simplex_specific_property (property, Simplex())) + continue; + + const std::string& name = property->name(); + + if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + else if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + else if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + else if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + else if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + else if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + else if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + else if (dynamic_cast*>(property)) + { + properties.push_back + (new PLY_property_to_surface_mesh_property(m_mesh, + name)); + } + } + } + + void process_vertex_line (PLY_element& element) + { + Vertex_index vi; + + if (m_use_floats) + process_line(element, vi); + else + process_line(element, vi); + + for (std::size_t i = 0; i < m_vertex_properties.size(); ++ i) + m_vertex_properties[i]->assign (element, vi); + } + + template + void process_line (PLY_element& element, Vertex_index& vi) + { + FT x = (FT)0.,y = (FT)0., z = (FT)0., + nx = (FT)0., ny = (FT)0., nz = (FT)0.; + element.assign (x, "x"); + element.assign (y, "y"); + element.assign (z, "z"); + Point point (x, y, z); + vi = m_mesh.add_vertex(point); + m_map_v2v.push_back(vi); + + if (m_normals == 3) + { + element.assign (nx, "nx"); + element.assign (ny, "ny"); + element.assign (nz, "nz"); + Vector normal (nx, ny, nz); + m_normal_map[vi] = normal; + } + + if (m_vcolors == 3) + { + unsigned char r, g, b; + element.assign (r, "red"); + element.assign (g, "green"); + element.assign (b, "blue"); + m_vcolor_map[vi] = CGAL::Color (r, g, b); + } + } + + bool process_face_line (PLY_element& element) + { + Face_index fi = m_mesh.null_face(); + + if (m_use_int32_t) + process_line(element, fi); + else + process_line(element, fi); + + if (fi == Surface_mesh::null_face()) + return false; + + for (std::size_t i = 0; i < m_face_properties.size(); ++ i) + m_face_properties[i]->assign (element, fi); + + return true; + } + + template + void process_line (PLY_element& element, Face_index& fi) + { + std::vector indices; + element.assign (indices, m_index_tag.c_str()); + std::vector vertices; + vertices.reserve(indices.size()); + for (std::size_t i = 0; i < indices.size(); ++ i) + vertices.push_back (m_map_v2v[std::size_t(indices[i])]); + + fi = m_mesh.add_face(vertices); + if (fi == m_mesh.null_face()) + return; + + if (m_fcolors == 3) + { + unsigned char r, g, b; + element.assign (r, "red"); + element.assign (g, "green"); + element.assign (b, "blue"); + m_fcolor_map[fi] = CGAL::Color (r, g, b); + } + } + + bool process_edge_line (PLY_element& element) + { + Edge_index ei = m_mesh.null_edge(); + + if (m_use_int32_t) + process_line(element, ei); + else + process_line(element, ei); + + if (ei == Surface_mesh::null_edge()) + return false; + + for (std::size_t i = 0; i < m_edge_properties.size(); ++ i) + m_edge_properties[i]->assign (element, ei); + + return true; + } + + template + void process_line (PLY_element& element, Edge_index& ei) + { + IntType v0, v1; + element.assign (v0, "v0"); + element.assign (v1, "v1"); + + Halfedge_index hi = m_mesh.halfedge(m_map_v2v[std::size_t(v0)], + m_map_v2v[std::size_t(v1)]); + if (hi == m_mesh.null_halfedge()) + return; + + ei = m_mesh.edge (hi); + } + + bool process_halfedge_line (PLY_element& element) + { + Halfedge_index hi = m_mesh.null_halfedge(); + + if (m_use_int32_t) + process_line(element, hi); + else + process_line(element, hi); + + if (hi == Surface_mesh::null_halfedge()) + return false; + + for (std::size_t i = 0; i < m_halfedge_properties.size(); ++ i) + m_halfedge_properties[i]->assign (element, hi); + + return true; + } + + template + void process_line (PLY_element& element, Halfedge_index& hi) + { + IntType source, target; + element.assign (source, "source"); + element.assign (target, "target"); + hi = m_mesh.halfedge(m_map_v2v[std::size_t(source)], m_map_v2v[std::size_t(target)]); + } + +}; + + +template +bool fill_simplex_specific_header +(std::ostream& os, const Surface_mesh& sm, + std::vector::Vertex_index>*>& printers, + const std::string& prop) +{ + typedef Surface_mesh SMesh; + typedef typename SMesh::Vertex_index VIndex; + typedef typename Kernel_traits::Kernel Kernel; + typedef typename Kernel::FT FT; + typedef typename Kernel::Vector_3 Vector; + typedef typename SMesh::template Property_map Point_map; + typedef typename SMesh::template Property_map Vector_map; + typedef typename SMesh::template Property_map Vcolor_map; + + if (prop == "v:connectivity" || + prop == "v:removed") + return true; + + if (prop == "v:point") + { + if (boost::is_same::value) + { + os << "property float x" << std::endl + << "property float y" << std::endl + << "property float z" << std::endl; + } + else + { + os << "property double x" << std::endl + << "property double y" << std::endl + << "property double z" << std::endl; + } + printers.push_back (new Property_printer(sm.points())); + return true; + } + + bool okay = false; + if (prop == "v:normal") + { + Vector_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop); + if (okay) + { + if (boost::is_same::value) + { + os << "property float nx" << std::endl + << "property float ny" << std::endl + << "property float nz" << std::endl; + } + else + { + os << "property double nx" << std::endl + << "property double ny" << std::endl + << "property double nz" << std::endl; + } + printers.push_back (new Property_printer(pmap)); + return true; + } + } + + if (prop == "v:color") + { + Vcolor_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop); + if (okay) + { + os << "property uchar red" << std::endl + << "property uchar green" << std::endl + << "property uchar blue" << std::endl + << "property uchar alpha" << std::endl; + + printers.push_back (new Property_printer(pmap)); + return true; + } + } + + return false; +} + +template +bool fill_simplex_specific_header +(std::ostream& os, const Surface_mesh& sm, + std::vector::Face_index>*>& printers, + const std::string& prop) +{ + typedef Surface_mesh SMesh; + typedef typename SMesh::Face_index FIndex; + typedef typename SMesh::template Property_map Fcolor_map; + + if (prop == "f:connectivity" || + prop == "f:removed") + return true; + + bool okay = false; + if (prop == "f:color") + { + Fcolor_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop); + if (okay) + { + os << "property uchar red" << std::endl + << "property uchar green" << std::endl + << "property uchar blue" << std::endl + << "property uchar alpha" << std::endl; + + printers.push_back (new Property_printer(pmap)); + return true; + } + } + return false; +} + +template +bool fill_simplex_specific_header +(std::ostream& , const Surface_mesh& , + std::vector::Edge_index>*>& , + const std::string& prop) +{ + if (prop == "e:removed") + return true; + return false; +} + +template +bool fill_simplex_specific_header +(std::ostream& , const Surface_mesh& , + std::vector::Halfedge_index>*>& , + const std::string& prop) +{ + if (prop == "h:connectivity") + return true; + return false; +} + +template +std::string get_property_raw_name (const std::string& prop, typename Surface_mesh::Vertex_index) +{ + std::string name = prop; + if (name.rfind("v:",0) == 0) + name = std::string (prop.begin() + 2, prop.end()); + return name; +} + +template +std::string get_property_raw_name (const std::string& prop, typename Surface_mesh::Face_index) +{ + std::string name = prop; + if (name.rfind("f:",0) == 0) + name = std::string (prop.begin() + 2, prop.end()); + return name; +} + +template +std::string get_property_raw_name (const std::string& prop, typename Surface_mesh::Edge_index) +{ + std::string name = prop; + if (name.rfind("e:",0) == 0) + name = std::string (prop.begin() + 2, prop.end()); + return name; +} + +template +std::string get_property_raw_name (const std::string& prop, typename Surface_mesh::Halfedge_index) +{ + std::string name = prop; + if (name.rfind("h:",0) == 0) + name = std::string (prop.begin() + 2, prop.end()); + return name; +} + +template +void fill_header (std::ostream& os, const Surface_mesh& sm, + std::vector*>& printers) +{ + typedef Surface_mesh SMesh; + typedef typename SMesh::template Property_map Int8_map; + typedef typename SMesh::template Property_map Uint8_map; + typedef typename SMesh::template Property_map Int16_map; + typedef typename SMesh::template Property_map Uint16_map; + typedef typename SMesh::template Property_map Int32_map; + typedef typename SMesh::template Property_map Uint32_map; + typedef typename SMesh::template Property_map Int64_map; + typedef typename SMesh::template Property_map Uint64_map; + typedef typename SMesh::template Property_map Float_map; + typedef typename SMesh::template Property_map Double_map; + std::vector prop = sm.template properties(); + + for (std::size_t i = 0; i < prop.size(); ++ i) + { + if (fill_simplex_specific_header(os, sm, printers, prop[i])) + continue; + + // Cut the "v:" prefix + std::string name = get_property_raw_name (prop[i], Simplex()); + + bool okay = false; + { + Int8_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property char " << name << std::endl; + printers.push_back (new internal::PLY::Char_property_printer(pmap)); + continue; + } + } + { + Uint8_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property uchar " << name << std::endl; + printers.push_back (new internal::PLY::Char_property_printer(pmap)); + continue; + } + } + { + Int16_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property short " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Uint16_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property ushort " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Int32_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property int " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Uint32_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property uint " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Int64_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property int " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Uint64_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property uint " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Float_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property float " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + { + Double_map pmap; + boost::tie (pmap, okay) = sm.template property_map(prop[i]); + if (okay) + { + os << "property double " << name << std::endl; + printers.push_back (new internal::PLY::Simple_property_printer(pmap)); + continue; + } + } + } +} + +} // namespace PLY +#endif + +} // namespace internal + +} // namespace CGAL + + +#endif // CGAL_SURFACE_MESH_IO_PLY diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h index be0a59473ea..0f9b77861b2 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -2164,6 +2165,188 @@ private: //------------------------------------------------------- private data return os; } +#if !defined(CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE) && !defined(CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES) + + /// \relates Surface_mesh + /// Inserts the surface mesh in an output stream in PLY format. + /// If found, "v:normal", "v:color" and "f:color" are inserted in the stream. + /// All other vertex and face properties with simple types are inserted in the stream. + /// Edges are only inserted in the stream if they have at least one + /// property with simple type: if they do, all edge properties with + /// simple types are inserted in the stream. The halfedges follow + /// the same behavior. + /// + /// If provided, the `comments` string is included line by line in + /// the header of the PLY stream (each line will be precedeed by + /// "comment "). + /// + template + bool write_ply(std::ostream& os, const Surface_mesh

        & sm, const std::string& comments = std::string()) + { + typedef Surface_mesh

        SMesh; + typedef typename SMesh::Vertex_index VIndex; + typedef typename SMesh::Face_index FIndex; + typedef typename SMesh::Edge_index EIndex; + typedef typename SMesh::Halfedge_index HIndex; + + os << "ply" << std::endl + << ((get_mode(os) == IO::BINARY) ? "format binary_little_endian 1.0" : "format ascii 1.0") << std::endl + << "comment Generated by the CGAL library" << std::endl; + + if (comments != std::string()) + { + std::istringstream iss (comments); + std::string line; + while (getline(iss, line)) + { + if (line != "Generated by the CGAL library") // Avoid repeating the line if multiple savings + os << "comment " << line << std::endl; + } + } + + os << "element vertex " << sm.number_of_vertices() << std::endl; + + std::vector*> vprinters; + internal::PLY::fill_header (os, sm, vprinters); + + os << "element face " << sm.number_of_faces() << std::endl; + os << "property list uchar int vertex_indices" << std::endl; + std::vector*> fprinters; + internal::PLY::fill_header (os, sm, fprinters); + + std::vector*> eprinters; + if (sm.template properties().size() > 1) + { + os << "element edge " << sm.number_of_edges() << std::endl; + os << "property int v0" << std::endl; + os << "property int v1" << std::endl; + internal::PLY::fill_header (os, sm, eprinters); + } + + std::vector*> hprinters; + if (sm.template properties().size() > 1) + { + os << "element halfedge " << sm.number_of_halfedges() << std::endl; + os << "property int source" << std::endl; + os << "property int target" << std::endl; + internal::PLY::fill_header (os, sm, hprinters); + } + + os << "end_header" << std::endl; + + BOOST_FOREACH(VIndex vi, sm.vertices()) + { + for (std::size_t i = 0; i < vprinters.size(); ++ i) + { + vprinters[i]->print(os, vi); + if (get_mode (os) == IO::ASCII) + os << " "; + } + if (get_mode (os) == IO::ASCII) + os << std::endl; + } + + std::vector polygon; + + BOOST_FOREACH(FIndex fi, sm.faces()) + { + // Get list of vertex indices + polygon.clear(); + BOOST_FOREACH(HIndex hi, halfedges_around_face(halfedge(fi, sm), sm)) + polygon.push_back (sm.target(hi)); + + if (get_mode (os) == IO::ASCII) + { + os << polygon.size() << " "; + for (std::size_t i = 0; i < polygon.size(); ++ i) + os << int(polygon[i]) << " "; + } + else + { + unsigned char size = (unsigned char)(polygon.size()); + os.write (reinterpret_cast(&size), sizeof(size)); + for (std::size_t i = 0; i < polygon.size(); ++ i) + { + int idx = int(polygon[i]); + os.write (reinterpret_cast(&idx), sizeof(idx)); + } + } + + for (std::size_t i = 0; i < fprinters.size(); ++ i) + { + fprinters[i]->print(os, fi); + if (get_mode (os) == IO::ASCII) + os << " "; + } + + if (get_mode (os) == IO::ASCII) + os << std::endl; + } + + if (!eprinters.empty()) + { + BOOST_FOREACH(EIndex ei, sm.edges()) + { + if (get_mode (os) == IO::ASCII) + os << int(sm.vertex(ei,0)) << " " << int(sm.vertex(ei,1)) << " "; + else + { + int v0 = int(sm.vertex(ei,0)); + int v1 = int(sm.vertex(ei,1)); + os.write (reinterpret_cast(&v0), sizeof(v0)); + os.write (reinterpret_cast(&v1), sizeof(v1)); + } + + for (std::size_t i = 0; i < eprinters.size(); ++ i) + { + eprinters[i]->print(os, ei); + if (get_mode (os) == IO::ASCII) + os << " "; + } + + if (get_mode (os) == IO::ASCII) + os << std::endl; + } + } + + if (!hprinters.empty()) + { + BOOST_FOREACH(HIndex hi, sm.halfedges()) + { + if (get_mode (os) == IO::ASCII) + os << int(sm.source(hi)) << " " << int(sm.target(hi)) << " "; + else + { + int source = int(sm.source(hi)); + int target = int(sm.target(hi)); + os.write (reinterpret_cast(&source), sizeof(source)); + os.write (reinterpret_cast(&target), sizeof(target)); + } + + for (std::size_t i = 0; i < hprinters.size(); ++ i) + { + hprinters[i]->print(os, hi); + if (get_mode (os) == IO::ASCII) + os << " "; + } + + if (get_mode (os) == IO::ASCII) + os << std::endl; + } + } + + for (std::size_t i = 0; i < vprinters.size(); ++ i) + delete vprinters[i]; + for (std::size_t i = 0; i < fprinters.size(); ++ i) + delete fprinters[i]; + for (std::size_t i = 0; i < eprinters.size(); ++ i) + delete eprinters[i]; + for (std::size_t i = 0; i < hprinters.size(); ++ i) + delete hprinters[i]; + + return true; + } +#endif /// @cond CGAL_DOCUMENT_INTERNALS @@ -2222,7 +2405,7 @@ private: //------------------------------------------------------- private data if(!is){ return false; } - sm.reserve(sm.num_vertices()+n, sm.num_faces()+2*f, sm.num_edges()+e); + sm.reserve(sm.num_vertices()+n, sm.num_edges()+e, sm.num_faces()+f); std::vector vertexmap(n); P p; Vector_3 v; @@ -2324,6 +2507,133 @@ private: //------------------------------------------------------- private data return read_off(is, sm, parameters::all_default()); } +#if !defined(CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE) && !defined(CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES) + + /// \cond SKIP_IN_MANUAL + template + bool read_ply(std::istream& is, Surface_mesh

        & sm) + { + std::string dummy; + return read_ply (is, sm, dummy); + } + /// \endcond + + /// Extracts the surface mesh from an input stream in Ascii or + /// Binary PLY format and appends it to the surface mesh `sm`. + /// + /// - the operator reads the vertex `point` property and the face + /// `vertex_index` (or `vertex_indices`) property; + /// - if three PLY properties `nx`, `ny` and `nz` with type `float` + /// or `double` are found for vertices, a "v:normal" vertex + /// property map is added; + /// - if three PLY properties `red`, `green` and `blue` with type + /// `uchar` are found for vertices, a "v:color" vertex property + /// map is added; + /// - if three PLY properties `red`, `green` and `blue` with type + /// `uchar` are found for faces, a "f:color" face property map is + /// added; + /// - if any other PLY property is found, a "[s]:[name]" property map is + /// added, where `[s]` is `v` for vertex and `f` for face, and + /// `[name]` is the name of the PLY property. + /// + /// The `comments` parameter can be omitted. If provided, it will be + /// used to store the potential comments found in the PLY + /// header. Each line starting by "comment " in the header is + /// appended to the `comments` string (without the "comment " word). + /// + /// \pre The data in the stream must represent a two-manifold. If this is not the case + /// the `failbit` of `is` is set and the mesh cleared. + /// \relates Surface_mesh + + template + bool read_ply(std::istream& is, Surface_mesh

        & sm, std::string& comments) + { + typedef typename Surface_mesh

        ::size_type size_type; + + if(!is) + { + std::cerr << "Error: cannot open file" << std::endl; + return false; + } + + internal::PLY::PLY_reader reader; + internal::PLY::Surface_mesh_filler

        filler(sm); + + if (!(reader.init (is))) + { + is.setstate(std::ios::failbit); + return false; + } + + comments = reader.comments(); + + for (std::size_t i = 0; i < reader.number_of_elements(); ++ i) + { + internal::PLY::PLY_element& element = reader.element(i); + + bool is_vertex = (element.name() == "vertex" || element.name() == "vertices"); + bool is_face = false; + bool is_edge = false; + bool is_halfedge = false; + if (is_vertex) + { + sm.reserve(sm.number_of_vertices() + size_type(element.number_of_items()), + sm.number_of_edges(), + sm.number_of_faces()); + filler.instantiate_vertex_properties (element); + } + else + is_face = (element.name() == "face" || element.name() == "faces"); + + if (is_face) + { + sm.reserve(sm.number_of_vertices(), + sm.number_of_edges(), + sm.number_of_faces() + size_type(element.number_of_items())); + filler.instantiate_face_properties (element); + } + else + is_edge = (element.name() == "edge"); + + if (is_edge) + filler.instantiate_edge_properties (element); + else + is_halfedge = (element.name() == "halfedge"); + + if (is_halfedge) + filler.instantiate_halfedge_properties (element); + + for (std::size_t j = 0; j < element.number_of_items(); ++ j) + { + for (std::size_t k = 0; k < element.number_of_properties(); ++ k) + { + internal::PLY::PLY_read_number* property = element.property(k); + property->get (is); + if (is.fail()) + return false; + } + + if (is_vertex) + filler.process_vertex_line (element); + else if (is_face) + { + if (!filler.process_face_line (element)) + { + is.setstate(std::ios::failbit); + return false; + } + } + else if (is_edge) + filler.process_edge_line (element); + else if (is_halfedge) + filler.process_halfedge_line (element); + } + } + + return true; + } +#endif + /// \relates Surface_mesh /// This operator calls `read_off(std::istream& is, CGAL::Surface_mesh& sm)`. /// \attention Up to %CGAL 4.10 this operator called `sm.clear()`. diff --git a/Surface_mesh/test/Surface_mesh/colored_tetra.ply b/Surface_mesh/test/Surface_mesh/colored_tetra.ply new file mode 100644 index 00000000000..7ec622125d1 --- /dev/null +++ b/Surface_mesh/test/Surface_mesh/colored_tetra.ply @@ -0,0 +1,38 @@ +ply +format ascii 1.0 +element vertex 4 +property double x +property double y +property double z +property double nx +property double ny +property double nz +property uchar red +property uchar green +property uchar blue +property int id +element face 4 +property list uchar int vertex_indices +property uchar red +property uchar green +property uchar blue +property int label +element edge 6 +property int v0 +property int v1 +property float confidence +end_header +0 0 0 -0.5 -0.5 -0.5 255 255 0 0 +0 0 1 -0.5 -0.5 0 0 255 255 1 +0 1 0 -0.5 0 -0.5 128 0 255 2 +1 0 0 0 -0.5 -0.5 255 128 0 3 +3 0 1 2 255 0 0 -1 +3 0 3 1 0 255 0 1 +3 1 3 2 0 0 255 -1 +3 0 2 3 255 0 255 0 +0 1 0.1 +0 2 0.2 +0 3 0.3 +1 2 0.4 +1 3 0.5 +2 3 0.6 diff --git a/Surface_mesh/test/Surface_mesh/sm_ply_io.cpp b/Surface_mesh/test/Surface_mesh/sm_ply_io.cpp new file mode 100644 index 00000000000..c18b6523b74 --- /dev/null +++ b/Surface_mesh/test/Surface_mesh/sm_ply_io.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point; +typedef CGAL::Surface_mesh SMesh; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + + +int main() +{ + std::ifstream in ("colored_tetra.ply"); + SMesh mesh; + CGAL::read_ply (in, mesh); + + std::cerr << "Read mesh with " << mesh.number_of_vertices() << " vertices and " + << mesh.number_of_faces() << " faces" << std::endl; + + std::cerr << "Properties associated with vertices:" << std::endl; + std::vector properties = mesh.properties(); + for (std::size_t i = 0; i < properties.size(); ++ i) + std::cerr << " * " << properties[i] << std::endl; + + std::cerr << "Properties associated with faces:" << std::endl; + properties = mesh.properties(); + for (std::size_t i = 0; i < properties.size(); ++ i) + std::cerr << " * " << properties[i] << std::endl; + + mesh.add_property_map("id", 42); + mesh.add_property_map("u", 13.f); + mesh.add_property_map("v", 37.f); + + // Append second mesh + std::ifstream in2 ("tetra.ply"); + CGAL::read_ply (in2, mesh); + + std::ofstream out ("out.ply"); +// CGAL::set_binary_mode(out); + CGAL::write_ply (out, mesh); + + return 0; +} diff --git a/Surface_mesh/test/Surface_mesh/tetra.ply b/Surface_mesh/test/Surface_mesh/tetra.ply new file mode 100644 index 00000000000..6b2a697893f --- /dev/null +++ b/Surface_mesh/test/Surface_mesh/tetra.ply @@ -0,0 +1,14 @@ +ply +format ascii 1.0 +element vertex 3 +property double x +property double y +property double z +property int blabla +element face 1 +property list uchar int vertex_indices +end_header +0 0 2 1000 +0 1 2 200 +1 0 2 30 +3 0 1 2 diff --git a/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Surface_Mesh_Segmentation.txt b/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Surface_Mesh_Segmentation.txt index a574e9d53dc..da48b479ff7 100644 --- a/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Surface_Mesh_Segmentation.txt +++ b/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Surface_Mesh_Segmentation.txt @@ -206,8 +206,8 @@ When using a `Surface_mesh`, you can use the built-in property mechanism. \cgalExample{Surface_mesh_segmentation/segmentation_from_sdf_values_SM_example.cpp} -\subsection Surface_mesh_segmentationIndependantmeshpersegment Independant TriangleMesh per Segment - It is possible to consider each segment as an independant triangle mesh, like in the following example, where the area of each segment is computed. +\subsection Surface_mesh_segmentationIndependentmeshpersegment Independent TriangleMesh per Segment + It is possible to consider each segment as an independent triangle mesh, like in the following example, where the area of each segment is computed. \cgalExample{Surface_mesh_segmentation/extract_segmentation_into_mesh_example.cpp} @@ -280,7 +280,7 @@ A comparison with biased and uniform sampling of points can be seen in \cgalFigu The mesh segmentation problem being ill-posed, the mesh segmentation community have proposed some benchmarks to evaluate the quality of a given algorithm. A benchmark is composed of a set of models and a software responsible for scoring the results. On a particular benchmark \cite Chen2009SegmentationBenchmark, the current implementation obtains the -score of XXX. The code used in the benchmark is provided as an exemple XXX. +score of XXX. The code used in the benchmark is provided as an example XXX. \todo Add the score and the source code used for the benchmark --> diff --git a/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/Alpha_expansion_graph_cut.h b/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/Alpha_expansion_graph_cut.h index 43dc6053805..395e46dcf83 100644 --- a/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/Alpha_expansion_graph_cut.h +++ b/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/Alpha_expansion_graph_cut.h @@ -276,7 +276,7 @@ public: edge_creation_time += timer.time(); #endif - // initialize vertex indices, it is neccessary since we are using VertexList = listS + // initialize vertex indices, it is necessary since we are using VertexList = listS Vertex_iterator v_begin, v_end; Traits::vertices_size_type index = 0; for(boost::tie(v_begin, v_end) = vertices(graph); v_begin != v_end; ++v_begin) { diff --git a/Surface_mesh_segmentation/test/Surface_mesh_segmentation/Utils.h b/Surface_mesh_segmentation/test/Surface_mesh_segmentation/Utils.h index d5fe1a9c16a..997bb3c5449 100644 --- a/Surface_mesh_segmentation/test/Surface_mesh_segmentation/Utils.h +++ b/Surface_mesh_segmentation/test/Surface_mesh_segmentation/Utils.h @@ -7,7 +7,7 @@ bool read_to_polyhedron(const char* file_name, Polyhedron& mesh) std::ifstream input(file_name); if ( !input || !(input >> mesh) || mesh.empty() ){ - std::cerr << "Problem occured while reading off file"; + std::cerr << "Problem occurred while reading off file"; return false; } return true; diff --git a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h index 86169e4583a..ec6f44e5a28 100644 --- a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h +++ b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h @@ -851,7 +851,7 @@ private: // A potential optimization could be made by only expanding in the 'necessary' range (i.e. the range outside of geodesic visibility), but the // benefits may be small, since the node filter would prevent more than one-level propagation. - // It would also be neccessary to distinguish expanding a root vertex node from a pseudo-source node + // It would also be necessary to distinguish expanding a root vertex node from a pseudo-source node do { diff --git a/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt b/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt index 77817ce208c..8b70d2db06f 100644 --- a/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt +++ b/Surface_mesh_shortest_path/test/Surface_mesh_shortest_path/CMakeLists.txt @@ -1,49 +1,39 @@ -# Created by the script cgal_create_cmake_script -# This is the CMake script for compiling a CGAL application. - +cmake_minimum_required(VERSION 3.1...3.13) project( Surface_mesh_shortest_path_Tests ) -cmake_minimum_required(VERSION 3.1) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core) +include(${CGAL_USE_FILE}) -find_package(CGAL QUIET COMPONENTS Core ) +find_package(LEDA QUIET) -if ( CGAL_FOUND ) +include_directories (BEFORE "include") - include(${CGAL_USE_FILE}) - include_directories (BEFORE "include") +create_single_source_cgal_program( "Surface_mesh_shortest_path_test_1.cpp" ) +create_single_source_cgal_program( "Surface_mesh_shortest_path_test_2.cpp" ) +create_single_source_cgal_program( "Surface_mesh_shortest_path_test_3.cpp" ) +create_single_source_cgal_program( "Surface_mesh_shortest_path_test_4.cpp" ) +create_single_source_cgal_program( "Surface_mesh_shortest_path_traits_test.cpp" ) - create_single_source_cgal_program( "Surface_mesh_shortest_path_test_1.cpp" ) - create_single_source_cgal_program( "Surface_mesh_shortest_path_test_2.cpp" ) - create_single_source_cgal_program( "Surface_mesh_shortest_path_test_3.cpp" ) - create_single_source_cgal_program( "Surface_mesh_shortest_path_test_4.cpp" ) - create_single_source_cgal_program( "Surface_mesh_shortest_path_traits_test.cpp" ) - - - # Link with Boost.ProgramOptions (optional) - find_package(Boost QUIET COMPONENTS program_options) - if(Boost_PROGRAM_OPTIONS_FOUND) - if( CGAL_AUTO_LINK_ENABLED ) - message( STATUS "Boost.ProgramOptions library: found" ) - else() - message( STATUS "Boost.ProgramOptions library: ${Boost_PROGRAM_OPTIONS_LIBRARY}" ) - endif() - add_definitions( "-DCGAL_USE_BOOST_PROGRAM_OPTIONS" ) - list(APPEND CGAL_3RD_PARTY_LIBRARIES ${Boost_PROGRAM_OPTIONS_LIBRARY}) - if(CGAL_Core_FOUND) - create_single_source_cgal_program( "TestMesh.cpp" ) - else() - message(STATUS "NOTICE: Example TestMesh.cpp requires CGAL_Core library and will not be compiled.") - endif() - else() - message(STATUS "NOTICE: Example TestMesh.cpp requires boost program_option and will not be compiled.") +# Link with Boost.ProgramOptions (optional) +find_package(Boost QUIET COMPONENTS program_options) +if(Boost_PROGRAM_OPTIONS_FOUND) + if(TARGET Boost::program_options) + set(Boost_PROGRAM_OPTIONS_LIBRARY Boost::program_options) + endif() + if( CGAL_AUTO_LINK_ENABLED ) + message( STATUS "Boost.ProgramOptions library: found" ) + else() + message( STATUS "Boost.ProgramOptions library: ${Boost_PROGRAM_OPTIONS_LIBRARY}" ) + endif() + add_definitions( "-DCGAL_USE_BOOST_PROGRAM_OPTIONS" ) + list(APPEND CGAL_3RD_PARTY_LIBRARIES ${Boost_PROGRAM_OPTIONS_LIBRARY}) + if(CGAL_Core_FOUND OR LEDA_FOUND) + create_single_source_cgal_program( "TestMesh.cpp" ) + else() + message(STATUS "NOTICE: Example TestMesh.cpp requires the CGAL_Core library (or LEDA) and will not be compiled.") endif() - - else() - - message(STATUS "This program requires the CGAL library, and will not be compiled.") - + message(STATUS "NOTICE: Example TestMesh.cpp requires boost program_option and will not be compiled.") endif() - diff --git a/Surface_mesher/TODO b/Surface_mesher/TODO index 52bae23251b..34a04da7c79 100644 --- a/Surface_mesher/TODO +++ b/Surface_mesher/TODO @@ -5,7 +5,7 @@ Laurent Rineau, 2006/09/14 - use Kernel::Assign_3 instead of CGAL::assign Laurent Rineau, 2006/08/10 -- try to ease the maintainance of Surface_mesher and Mesh_3 demos: +- try to ease the maintenance of Surface_mesher and Mesh_3 demos: - demo/Surface_mesher/implicit_surface_mesher.cpp - demo/Surface_mesher/polyhedral_surface_mesher.cpp - examples/Mesh_3/implicit_surfaces_mesher_3.cpp diff --git a/Surface_mesher/archive/include/CGAL/enriched_polyhedron.h b/Surface_mesher/archive/include/CGAL/enriched_polyhedron.h index cb596b6801f..e1016acde8b 100644 --- a/Surface_mesher/archive/include/CGAL/enriched_polyhedron.h +++ b/Surface_mesher/archive/include/CGAL/enriched_polyhedron.h @@ -67,7 +67,7 @@ public: }; // a refined halfedge with a general tag and -// a binary tag to indicate wether it belongs +// a binary tag to indicate whether it belongs // to the control mesh or not template class Enriched_halfedge : public CGAL::HalfedgeDS_halfedge_base @@ -380,7 +380,7 @@ public : return CGAL::circulator_size(pVertex->vertex_begin()); } - // check wether a vertex is on a boundary or not + // check whether a vertex is on a boundary or not static bool is_border(Vertex_handle pVertex) { Halfedge_around_vertex_circulator pHalfEdge = pVertex->vertex_begin(); diff --git a/Surface_mesher/demo/Surface_mesher/CMakeLists.txt b/Surface_mesher/demo/Surface_mesher/CMakeLists.txt index 3bc6c16965c..b702b4bb27f 100644 --- a/Surface_mesher/demo/Surface_mesher/CMakeLists.txt +++ b/Surface_mesher/demo/Surface_mesher/CMakeLists.txt @@ -29,11 +29,7 @@ set(PACKAGE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..) # Add several CGAL packages to the include and link paths, # if they lie in ${PACKAGE_ROOT}/. -foreach(INC_DIR ${PACKAGE_ROOT}/include ${PACKAGE_ROOT}/../Mesh_2/include ${PACKAGE_ROOT}/../Data_structure_for_queries_3/include ${PACKAGE_ROOT}/../Marching_cube/include ${PACKAGE_ROOT}/../CGAL_ImageIO/include ${PACKAGE_ROOT}/../GraphicsView/include) - if (EXISTS ${INC_DIR}) - include_directories (BEFORE ${INC_DIR}) - endif() -endforeach() + foreach(LIB_DIR ${PACKAGE_ROOT}/../CGAL_ImageIO/src/CGAL_ImageIO ${PACKAGE_ROOT}/../GraphicsView/src/CGALQt5) if (EXISTS ${LIB_DIR}) link_directories (${LIB_DIR}) diff --git a/Surface_mesher/examples/Surface_mesher/mesh_a_3d_gray_image.cpp b/Surface_mesher/examples/Surface_mesher/mesh_a_3d_gray_image.cpp index 5a9f7c1e604..5373cf751cd 100644 --- a/Surface_mesher/examples/Surface_mesher/mesh_a_3d_gray_image.cpp +++ b/Surface_mesher/examples/Surface_mesher/mesh_a_3d_gray_image.cpp @@ -24,7 +24,7 @@ int main() { // the 'function' is a 3D gray level image Gray_level_image image("data/skull_2.9.inr", 2.9f); - // Carefully choosen bounding sphere: the center must be inside the + // Carefully chosen bounding sphere: the center must be inside the // surface defined by 'image' and the radius must be high enough so that // the sphere actually bounds the whole image. GT::Point_3 bounding_sphere_center(122., 102., 117.); diff --git a/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h b/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h index efac2e8109c..5e91785fbd1 100644 --- a/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h +++ b/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h @@ -452,7 +452,7 @@ protected: /*! Add a subcurve to the right of an event point. * \param event The event point. * \param curve The subcurve to add. - * \return (true) if an overlap occured; (false) otherwise. + * \return (true) if an overlap occurred; (false) otherwise. */ virtual bool _add_curve_to_right(Event* event, Subcurve* curve); diff --git a/Surface_sweep_2/include/CGAL/Surface_sweep_2/No_overlap_subcurve.h b/Surface_sweep_2/include/CGAL/Surface_sweep_2/No_overlap_subcurve.h index e155d1f1b70..aae2105b266 100644 --- a/Surface_sweep_2/include/CGAL/Surface_sweep_2/No_overlap_subcurve.h +++ b/Surface_sweep_2/include/CGAL/Surface_sweep_2/No_overlap_subcurve.h @@ -174,7 +174,7 @@ protected: // Data members: X_monotone_curve_2 m_last_curve; // The portion of the curve that lies to // the right of the last event point - // that occured on the curve. + // that occurred on the curve. public: /*! Construct default. */ diff --git a/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h b/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h index e2a75d6375e..229be666185 100644 --- a/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h +++ b/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h @@ -347,7 +347,7 @@ bool Surface_sweep_2::_add_curve_to_right(Event* event, Subcurve* curve) // that the overlapping curve will be added to the right of // `event` because of an adjacency in the status line. - // Indicate that an overlap has occured: + // Indicate that an overlap has occurred: CGAL_SS_PRINT_END_EOL("adding a Curve to the right (overlap)"); return true; } @@ -570,7 +570,7 @@ template // If the two subcurves have a common right-event, and the last intersection // object is a point, we can ignore last intersection (note that in case of - // an overlap that ends at the common endpoint, we definately want to keep + // an overlap that ends at the common endpoint, we definitely want to keep // the intersection object). if (c1->right_event() == c2->right_event()) { vector_inserter vi_last = vi_end; diff --git a/Surface_sweep_2/test/Surface_sweep_2/test_sweep.cpp b/Surface_sweep_2/test/Surface_sweep_2/test_sweep.cpp index 14084a04191..23ceebf559d 100644 --- a/Surface_sweep_2/test/Surface_sweep_2/test_sweep.cpp +++ b/Surface_sweep_2/test/Surface_sweep_2/test_sweep.cpp @@ -1,6 +1,6 @@ // examples/Pm_with_intersections/example4 // --------------------------------------- -#include +#include #include #include #include diff --git a/Surface_sweep_2/test/Surface_sweep_2/test_sweep_conic.cpp b/Surface_sweep_2/test/Surface_sweep_2/test_sweep_conic.cpp index f30cb92df10..45ae9544851 100644 --- a/Surface_sweep_2/test/Surface_sweep_2/test_sweep_conic.cpp +++ b/Surface_sweep_2/test/Surface_sweep_2/test_sweep_conic.cpp @@ -1,4 +1,4 @@ -#include +#include #if !defined(CGAL_USE_CORE) #include diff --git a/TDS_2/doc/TDS_2/TDS_2.txt b/TDS_2/doc/TDS_2/TDS_2.txt index d650a466019..d5caf752b9e 100644 --- a/TDS_2/doc/TDS_2/TDS_2.txt +++ b/TDS_2/doc/TDS_2/TDS_2.txt @@ -317,7 +317,7 @@ and `TriangulationFaceBase_2`. See Section \ref Section_2D_Triangulations_Flexibility "Flexibility" of the chapter on 2D triangulations -for examples which make use of the flexilibity of the triangulation data structure. +for examples which make use of the flexibility of the triangulation data structure. */ } /* namespace CGAL */ diff --git a/TDS_2/test/TDS_2/include/CGAL/_test_short_names_2.h b/TDS_2/test/TDS_2/include/CGAL/_test_short_names_2.h deleted file mode 100644 index fa44f4a11f1..00000000000 --- a/TDS_2/test/TDS_2/include/CGAL/_test_short_names_2.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef CGAL_TRIANGULATION_TEST_SHORT_NAMES_2_H -#define CGAL_TRIANGULATION_TEST_SHORT_NAMES_2_H - - -// Define shorter names - - #define Cartesian Ca - #define Homogeneous Hg -// #define Quotient Qt - - #define Triangulation_test_point Ttp - #define Triangulation_test_segment Tts - #define Triangulation_test_line Ttl - #define Triangulation_test_direction Ttd - #define Triangulation_test_ray Ttr - #define Triangulation_test_distance Ttdst - #define _Triangulation_test_traits _Tttr - -#endif //CGAL_TRIANGULATION_TEST_SHORT_NAMES_2_H diff --git a/TDS_2/test/TDS_2/include/CGAL/_test_types.h b/TDS_2/test/TDS_2/include/CGAL/_test_types.h index 3b9285f281e..5d4e12fe2e7 100644 --- a/TDS_2/test/TDS_2/include/CGAL/_test_types.h +++ b/TDS_2/test/TDS_2/include/CGAL/_test_types.h @@ -1,9 +1,6 @@ #ifndef CGAL_TEST_TYPES_H #define CGAL_TEST_TYPES_H -#include - -#include #include #include diff --git a/TDS_2/test/TDS_2/test_triangulation_tds.cpp b/TDS_2/test/TDS_2/test_triangulation_tds.cpp index 78075001a74..b75e0b36d60 100644 --- a/TDS_2/test/TDS_2/test_triangulation_tds.cpp +++ b/TDS_2/test/TDS_2/test_triangulation_tds.cpp @@ -21,7 +21,6 @@ // // ============================================================================ -#include #include #include diff --git a/Testsuite/test/parse-ctest-dashboard-xml.py b/Testsuite/test/parse-ctest-dashboard-xml.py index b197db9997c..6258d56babe 100644 --- a/Testsuite/test/parse-ctest-dashboard-xml.py +++ b/Testsuite/test/parse-ctest-dashboard-xml.py @@ -100,11 +100,13 @@ for label, tests in tests_per_label.items(): tester=tester_name, platform=platform_name), 'w') as label_report: print(""" +{scm_branch} ------------------------------------------------------------------ - Error output from platform {platform} ------------------------------------------------------------------ {error_txt} -""" .format(platform=platform_name, +""" .format(scm_branch=open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r').read(), + platform=platform_name, error_txt=open("{}/error.txt".format(label), 'r').read()), file=label_report) for t in tests: filename="{}/ProgramOutput.{}".format(label, t['Name']) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py new file mode 100644 index 00000000000..ff81668fb35 --- /dev/null +++ b/Testsuite/test/post_process_ctest_results.py @@ -0,0 +1,77 @@ +import sys +import io +import re +import os + +report_file=sys.argv[1] +report_name=sys.argv[2] +global_report_name=sys.argv[3] +rx=re.compile('(.*Configuring (examples|demo|test)*( in )*(test\/|examples\/|demo\/)*)((?!done)\w+)') +rx_demo=re.compile('.*in demo\/') +rx_examples=re.compile('.*in examples\/') + + +#open the Installation report +#For each NAME, check if NAME is a directory. If not, create one, create a +#text report, and write everything that is in the report until the next NAME +#in it. Then, add 'NAME r' in the global report. This should allow to get all +#the NOTICE and other info explaining why the configuration is skiped. + +name="" +is_writing=False +is_ignored=False +global_report=open(global_report_name, "a+") +with open(report_file, "rt") as test_report: + for myline in test_report: + m=rx.match(myline) + + if is_writing: + if m: + is_writing=False + test_report.close() + if is_ignored: + print("{label} {result}".format(label=name, result='r'), file=global_report) + is_ignored=False + else: + test_report.write(myline) + if not is_writing: + if m: + name=m.group(0).replace(m.group(1), "") + if rx_demo.match(myline): + name="{str}_Demo".format(str=name) + elif rx_examples.match(myline): + name="{str}_Examples".format(str=name) + elif name == "libCGAL": + name="libCGAL_shared" + elif name == "libCGAL_Core": + name="libCGALCore_shared" + elif name == "libCGAL_ImageIO": + name="libCGALimageIO_shared" + elif name == "libCGAL_Qt5": + name="libCGALQt5_shared" + elif name == "Mesh_3_implicit_functions": + name="Polyhedron_Demo" + if name=="incomplete": + is_writing=False + is_ignored=False + continue + else: + if not os.path.isdir(name): + is_ignored=True + os.mkdir(name) + test_report=open("{dir}/{file}".format(dir=name, file=report_name), "w+") + print(""" +{scm_branch} +""" .format(scm_branch=open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r').read()),file=test_report) + else: + is_ignored=False + test_report=open("{dir}/{file}".format(dir=name, file=report_name), "a+") + test_report.write(" --- CMake Results: --- \n\n") + is_writing=True +if is_writing: + is_writing=False + test_report.close() + if is_ignored: + print("{label} {result}".format(label=name, result='r'), file=global_report) + is_ignored=False +global_report.close() diff --git a/Three/include/CGAL/Three/Polyhedron_demo_io_plugin_interface.h b/Three/include/CGAL/Three/Polyhedron_demo_io_plugin_interface.h index e3e857b0306..40210f4c6d9 100644 --- a/Three/include/CGAL/Three/Polyhedron_demo_io_plugin_interface.h +++ b/Three/include/CGAL/Three/Polyhedron_demo_io_plugin_interface.h @@ -70,10 +70,15 @@ public: //! This must be overriden. virtual bool save(const Scene_item*, QFileInfo fileinfo) = 0; - //! If this returns `true`, then the loader will be chosen as defaultin the + //! If this returns `true`, then the loader will be chosen as default in the //! list of available loaders when saving a file, which means it will be the //! first in the list. virtual bool isDefaultLoader(const Scene_item*) const { return false; } + //! If this returns `true`, then the loader will be chosen as default in the + //! list of available loaders when loading a file, which means it will be the + //! first in the list. + //! @param name is the extension without the dot (e.g. "off" for a .off file) + virtual bool isDefaultLoader(const QString& name) const { Q_UNUSED(name); return false; } }; } } diff --git a/Three/include/CGAL/Three/Scene_item.h b/Three/include/CGAL/Three/Scene_item.h index cc1da66cf4b..8337c9dfbc3 100644 --- a/Three/include/CGAL/Three/Scene_item.h +++ b/Three/include/CGAL/Three/Scene_item.h @@ -209,7 +209,7 @@ public: virtual bool manipulatable() const { return false; } //!\brief The manipulatedFrame of the item. //! - //! A manipulated frame is an independant system that can be + //! A manipulated frame is an independent system that can be //! translated or rotated using the Ctrl key and the mouse. //!@returns the manipulatedFrame of the item. virtual ManipulatedFrame* manipulatedFrame() { return 0; } @@ -298,7 +298,7 @@ public: * | |_______|_____| * |General Info | #Edges|12 | * |_____________|_______|_____| - * compute stats(0) should return "Cube" and computeStats(1) should return QString::number(12); + * ComputeStats(0) should return "Cube" and computeStats(1) should return QString::number(12); * The numbers must be coherent with the order of declaration of the titles in the header. * \endverbatim * diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h index cbbe03db232..5a1b8649f68 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h @@ -556,8 +556,8 @@ This method does exactly the opposite of `insert_increase_dimension()`: `v` is removed, full cells not containing `star` are removed, -full cells containing `star` but not `v` loose vertex `star`, -full cells containing `star` and `v` loose vertex `v` +full cells containing `star` but not `v` lose vertex `star`, +full cells containing `star` and `v` lose vertex `v` (see Figure \cgalFigureRef{triangulationfiginsertincreasedim}). \pre All cells contain either `star` or `v`. Edge `star-v` exists in the triangulation diff --git a/Triangulation/doc/Triangulation/Triangulation.txt b/Triangulation/doc/Triangulation/Triangulation.txt index 7155810157a..c3cf1c75e4e 100644 --- a/Triangulation/doc/Triangulation/Triangulation.txt +++ b/Triangulation/doc/Triangulation/Triangulation.txt @@ -193,7 +193,7 @@ full cell. This improves speed a little, but requires more memory. \cgalAdvanced \cgal provides the class template `Triangulation_ds_full_cell` for representing full cells in a -triangulation. Its second template parameter is used to specify wether +triangulation. Its second template parameter is used to specify whether or not the mirror indices should be kept in memory or computed on-the-fly, which is the default case. Please refer to the documentation of that class template for specific details. diff --git a/Triangulation/include/CGAL/Triangulation.h b/Triangulation/include/CGAL/Triangulation.h index 28308eedc23..ccb4249bc8d 100644 --- a/Triangulation/include/CGAL/Triangulation.h +++ b/Triangulation/include/CGAL/Triangulation.h @@ -316,7 +316,7 @@ public: #endif { // We find the vertex at infinity by scanning the vertices of both - // triangulations. This works because Compact_container garantees that + // triangulations. This works because Compact_container guarantees that // the vertices in the copy (*this) are stored in the same order as in // the original triangulation (t2) infinity_ = vertices_begin(); diff --git a/Triangulation/include/CGAL/Triangulation_ds_vertex.h b/Triangulation/include/CGAL/Triangulation_ds_vertex.h index 83ab7f5261d..0c476f6585c 100644 --- a/Triangulation/include/CGAL/Triangulation_ds_vertex.h +++ b/Triangulation/include/CGAL/Triangulation_ds_vertex.h @@ -84,7 +84,7 @@ public: return false; } bool found(false); - // These two typename below are OK because TDS fullfils the + // These two typename below are OK because TDS fulfils the // TriangulationDataStructure concept. typename TDS::Full_cell::Vertex_handle_iterator vit(full_cell()->vertices_begin()); typedef typename TDS::Vertex_handle Vertex_handle; diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_2.h index 6b1524e117e..9722d8b0fa7 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_2.h @@ -322,15 +322,17 @@ Writes the triangulation as for `Triangulation_2` and, for each face writes "C" or "N" depending whether edge `(f,i)` is constrained or not. \relates Constrained_triangulation_2 -*/ -ostream & operator<<(ostream& os, const Constrained_triangulation_2 &Ct); +*/ +template +std::ostream & operator<<(std::ostream& os, const Constrained_triangulation_2 &ct); /*! -Reads a triangulation from stream `is` and assigns it to `t`. Data in the stream must have the same format `operator<<` uses. -Note that `t` is first cleared. +Reads a triangulation from stream `is` and assigns it to c`t`. Data in the stream must have the same format `operator<<` uses. +Note that `ct` is first cleared. \relates Constrained_triangulation_2 -*/ -istream& operator>>(istream& is,Constrained_triangulation_2 Ct& t); +*/ +template +std::istream& operator>>(std::istream& is,Constrained_triangulation_2 Ct& ct); /*! Exception used by constrained triangulations configured with the tag `No_intersection_tag`. It is thrown upon insertion of a constraint diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h index 9317ccc4d17..42cb053bf86 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h @@ -356,22 +356,6 @@ Returns an iterator past the last vertex on the constraint `cid`. Vertices_in_constraint_iterator vertices_in_constraint_end(Constraint_id cid) const; -/*! -\deprecated Returns an iterator on the first vertex on the constraint `cid`. -\attention This function only works for constraints that were inserted -as a pair of points or pair of vertex handles. -*/ -Vertices_in_constraint_iterator -vertices_in_constraint_begin(Vertex_handle va, Vertex_handle vb) const; - -/*! -\deprecated Returns an iterator past the last vertex on the constraint `cid`. -\attention This function only works for constraints that were inserted -as a pair of points or pair of vertex handles. -*/ -Vertices_in_constraint_iterator -vertices_in_constraint_end(Vertex_handle va, Vertex_handle vb) const; - /// @} @@ -476,11 +460,29 @@ been removed by the `simplify()` function. void remove_points_without_corresponding_vertex(); - - - /// @} }; /* end Constrained_triangulation_plus_2 */ + +/*! +Writes the triangulation as for `Tr`, then writes one constraint per line, starting with the number +of vertices and the indices of the vertices of the constraint. + +\relates Constrained_triangulation_plus_2 +*/ + +template +std::ostream & operator<<(std::ostream& os, const Constrained_triangulation_plus_2 &ctp); + + +/*! +Reads a triangulation from stream `is` and assigns it to the triangulation. + +\relates Constrained_triangulation_plus_2 +*/ +template +std::istream & operator>>(std::istream& is, Constrained_triangulation_plus_2 &ctp); + + } /* end namespace CGAL */ diff --git a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h index dd6f110c879..dbf425e8d2c 100644 --- a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h @@ -121,6 +121,7 @@ public: using Ctr::update_constraints; using Ctr::delete_vertex; using Ctr::push_back; + using Ctr::mirror_index; #endif typedef typename Geom_traits::Point_2 Point; @@ -312,7 +313,7 @@ private: template std::ptrdiff_t insert_with_info(InputIterator first,InputIterator last) { - size_type n = this->number_of_vertices(); + size_type n = number_of_vertices(); std::vector indices; std::vector points; std::vector infos; @@ -343,7 +344,7 @@ private: } } - return this->number_of_vertices() - n; + return number_of_vertices() - n; } public: @@ -548,7 +549,7 @@ public: f=(*itedge).first; i=(*itedge).second; if (is_flipable(f,i)) { - eni=Edge(f->neighbor(i),this->mirror_index(f,i)); + eni=Edge(f->neighbor(i),mirror_index(f,i)); if (less_edge(*itedge,eni)) edge_set.insert(*itedge); else edge_set.insert(eni); } @@ -565,7 +566,7 @@ public: // f->neighbor(indf) that are distinct from the edge to be flipped ni = f->neighbor(indf); - indn=this->mirror_index(f,indf); + indn=mirror_index(f,indf); ei= Edge(f,indf); edge_set.erase(ei); e[0]= Edge(f,cw(indf)); @@ -576,7 +577,7 @@ public: for(i=0;i<4;i++) { ff=e[i].first; ii=e[i].second; - eni=Edge(ff->neighbor(ii),this->mirror_index(ff,ii)); + eni=Edge(ff->neighbor(ii),mirror_index(ff,ii)); if (less_edge(e[i],eni)) {edge_set.erase(e[i]);} else { edge_set.erase(eni);} } @@ -598,7 +599,7 @@ public: ff=e[i].first; ii=e[i].second; if (is_flipable(ff,ii)) { - eni=Edge(ff->neighbor(ii),this->mirror_index(ff,ii)); + eni=Edge(ff->neighbor(ii),mirror_index(ff,ii)); if (less_edge(e[i],eni)) { edge_set.insert(e[i]);} else { @@ -643,17 +644,17 @@ Constrained_Delaunay_triangulation_2:: flip (Face_handle& f, int i) { Face_handle g = f->neighbor(i); - int j = this->mirror_index(f,i); + int j = mirror_index(f,i); // save wings neighbors to be able to restore contraint status Face_handle f1 = f->neighbor(cw(i)); - int i1 = this->mirror_index(f,cw(i)); + int i1 = mirror_index(f,cw(i)); Face_handle f2 = f->neighbor(ccw(i)); - int i2 = this->mirror_index(f,ccw(i)); + int i2 = mirror_index(f,ccw(i)); Face_handle f3 = g->neighbor(cw(j)); - int i3 = this->mirror_index(g,cw(j)); + int i3 = mirror_index(g,cw(j)); Face_handle f4 = g->neighbor(ccw(j)); - int i4 = this->mirror_index(g,ccw(j)); + int i4 = mirror_index(g,ccw(j)); // The following precondition prevents the test suit // of triangulation to work on constrained Delaunay triangulation @@ -663,13 +664,13 @@ flip (Face_handle& f, int i) // restore constraint status f->set_constraint(f->index(g), false); g->set_constraint(g->index(f), false); - f1->neighbor(i1)->set_constraint(this->mirror_index(f1,i1), + f1->neighbor(i1)->set_constraint(mirror_index(f1,i1), f1->is_constrained(i1)); - f2->neighbor(i2)->set_constraint(this->mirror_index(f2,i2), + f2->neighbor(i2)->set_constraint(mirror_index(f2,i2), f2->is_constrained(i2)); - f3->neighbor(i3)->set_constraint(this->mirror_index(f3,i3), + f3->neighbor(i3)->set_constraint(mirror_index(f3,i3), f3->is_constrained(i3)); - f4->neighbor(i4)->set_constraint(this->mirror_index(f4,i4), + f4->neighbor(i4)->set_constraint(mirror_index(f4,i4), f4->is_constrained(i4)); return; } diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index a453d120cd1..e3b80ccc4ee 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -144,6 +144,11 @@ public: using Triangulation::includes_edge; using Triangulation::remove_first; using Triangulation::remove_second; + using Triangulation::is_valid; + using Triangulation::all_edges_begin; + using Triangulation::all_edges_end; + using Triangulation::mirror_index; + using Triangulation::orientation; #endif typedef Gt Geom_traits; @@ -178,7 +183,7 @@ public: for( ;lcit != lc.end(); lcit++) { insert( (*lcit).first, (*lcit).second); } - CGAL_triangulation_postcondition( this->is_valid() ); + CGAL_triangulation_postcondition( is_valid() ); } template @@ -190,7 +195,7 @@ public: for ( ; it != last; it++) { insert_constraint((*it).first, (*it).second); } - CGAL_triangulation_postcondition( this->is_valid() ); + CGAL_triangulation_postcondition( is_valid() ); } //TODO Is that destructor correct ? @@ -201,16 +206,16 @@ public: { Is_constrained pred(*this); return Constrained_edges_iterator(pred, - this->all_edges_begin(), - this->all_edges_end()); + all_edges_begin(), + all_edges_end()); } Constrained_edges_iterator constrained_edges_end() const { Is_constrained pred(*this); return Constrained_edges_iterator(pred, - this->all_edges_end(), - this->all_edges_end()); + all_edges_end(), + all_edges_end()); } // INSERTION @@ -588,7 +593,7 @@ public: fc->set_constraint(cw(vindex), false); fc->set_constraint(ccw(vindex), false); fh = fc->neighbor(vindex); - ih = this->mirror_index(fc,vindex); + ih = mirror_index(fc,vindex); fc->set_constraint(vindex, fh->is_constrained(ih)); } while (++fc != done); return v; @@ -806,7 +811,7 @@ find_intersected_faces(Vertex_handle vaa, // loop over triangles intersected by ab bool done = false; while (current_vertex != vbb && !done) { - orient = this->orientation(aa,bb,current_vertex->point()); + orient = orientation(aa,bb,current_vertex->point()); int i1, i2; switch (orient) { case COLLINEAR : @@ -993,7 +998,7 @@ update_constraints_incident(Vertex_handle va, { if (dimension() == 0) return; if (dimension()== 1) { - Edge_circulator ec=this->incident_edges(va), done(ec); + Edge_circulator ec=incident_edges(va), done(ec); do { ((*ec).first)->set_constraint(2,true); }while (++ec != done); @@ -1001,7 +1006,7 @@ update_constraints_incident(Vertex_handle va, else{ //dimension() ==2 int cwi, ccwi, indf; - Face_circulator fc=this->incident_faces(va), done(fc); + Face_circulator fc=incident_faces(va), done(fc); CGAL_triangulation_assertion(fc != 0); do { indf = fc->index(va); @@ -1026,7 +1031,7 @@ Constrained_triangulation_2:: clear_constraints_incident(Vertex_handle va) // make the edges incident to a newly created vertex unconstrained { - Edge_circulator ec=this->incident_edges(va), done(ec); + Edge_circulator ec=incident_edges(va), done(ec); Face_handle f; int indf; if ( ec != 0){ @@ -1035,7 +1040,7 @@ clear_constraints_incident(Vertex_handle va) indf = (*ec).second; f->set_constraint(indf,false); if (dimension() == 2) { - f->neighbor(indf)->set_constraint(this->mirror_index(f,indf),false); + f->neighbor(indf)->set_constraint(mirror_index(f,indf),false); } } while (++ec != done); } @@ -1055,7 +1060,7 @@ update_constraints_opposite(Vertex_handle va) int indf; do { indf = f->index(va); - if (f->neighbor(indf)->is_constrained(this->mirror_index(f,indf)) ) { + if (f->neighbor(indf)->is_constrained(mirror_index(f,indf)) ) { f->set_constraint(indf,true); } else { @@ -1078,8 +1083,8 @@ update_constraints( const List_edges &hole) f =(*it).first; i = (*it).second; if ( f->is_constrained(i) ) - (f->neighbor(i))->set_constraint(this->mirror_index(f,i),true); - else (f->neighbor(i))->set_constraint(this->mirror_index(f,i),false); + (f->neighbor(i))->set_constraint(mirror_index(f,i),true); + else (f->neighbor(i))->set_constraint(mirror_index(f,i),false); } } @@ -1092,7 +1097,7 @@ mark_constraint(Face_handle fr, int i) if (dimension()==1) fr->set_constraint(2, true); else{ fr->set_constraint(i,true); - fr->neighbor(i)->set_constraint(this->mirror_index(fr,i),true); + fr->neighbor(i)->set_constraint(mirror_index(fr,i),true); } return; } @@ -1206,7 +1211,7 @@ remove_constrained_edge(Face_handle f, int i) { f->set_constraint(i, false); if (dimension() == 2) - (f->neighbor(i))->set_constraint(this->mirror_index(f,i), false); + (f->neighbor(i))->set_constraint(mirror_index(f,i), false); return; } @@ -1291,28 +1296,28 @@ triangulate_half_hole(List_edges & list_edges, List_edges & new_edges) // in case n1 is no longer a triangle of the new triangulation if ( n1->neighbor(ind1) != Face_handle() ) { n=n1->neighbor(ind1); - //ind=this->mirror_index(n1,ind1); + //ind=mirror_index(n1,ind1); // mirror_index does not work in this case ind = cw(n->index(n1->vertex(cw(ind1)))); n1=n->neighbor(ind); - ind1= this->mirror_index(n,ind); + ind1= mirror_index(n,ind); } n2=(*next).first; ind2=(*next).second; // in case n2 is no longer a triangle of the new triangulation if (n2->neighbor(ind2) != Face_handle() ) { n=n2->neighbor(ind2); - // ind=this->mirror_index(n2,ind2); + // ind=mirror_index(n2,ind2); // mirror_index does not work in this case ind = cw(n->index(n2->vertex(cw(ind2)))); n2=n->neighbor(ind); - ind2= this->mirror_index(n,ind); + ind2= mirror_index(n,ind); } Vertex_handle v0=n1->vertex(ccw(ind1)); Vertex_handle v1=n1->vertex(cw(ind1)); Vertex_handle v2=n2->vertex(cw(ind2)); - orient = this->orientation(v0->point(),v1->point(),v2->point()); + orient = orientation(v0->point(),v1->point(),v2->point()); switch (orient) { case RIGHT_TURN : // creates the new triangle v0v1v2 diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h index c18f2c58b21..7f19c173511 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h @@ -26,6 +26,7 @@ #include +#include #include #include #include @@ -133,6 +134,14 @@ public: typedef Constrained_triangulation_plus_2 Self; typedef Tr Base; + +#ifndef CGAL_CFG_USING_BASE_MEMBER_BUG_2 + using Triangulation::vertices_begin; + using Triangulation::vertices_end; + using Triangulation::is_infinite; + using Triangulation::number_of_vertices; +#endif + typedef typename Triangulation::Edge Edge; typedef typename Triangulation::Vertex Vertex; typedef typename Triangulation::Vertex_handle Vertex_handle; @@ -597,7 +606,62 @@ private: return ca; } + public: + + void + file_output(std::ostream& os) const + { + os << static_cast(*this); + Unique_hash_map V; + int inum = 0; + for(Vertex_iterator vit = vertices_begin(); vit != vertices_end() ; ++vit){ + if(! is_infinite(vit)){ + V[vit] = inum++; + } + } + + for(Constraint_iterator cit = constraints_begin(); cit != constraints_end(); ++cit){ + os << (*cit).second->all_size(); + for(Vertices_in_constraint it = vertices_in_constraint_begin(*cit); + it != vertices_in_constraint_end(*cit); + it++){ + Vertex_handle vh = *it; + os << " " << V[vh]; + } + os << std::endl; + } + } + + + void file_input(std::istream& is) + { + + is >> static_cast(*this); + + std::vector V; + V.reserve(number_of_vertices()); + for(Vertex_iterator vit = vertices_begin(); vit != vertices_end() ; ++vit){ + if(! is_infinite(vit)){ + V.push_back(vit); + } + } + Constraint_id cid; + int n, i0, i1; + while(is >> n){ + is >> i0 >> i1; + cid = insert_constraint(V[i0],V[i1]); + + for(int i = 2; i < n; i++){ + i0 = i1; + is >> i1; + Constraint_id cid2 = insert_constraint(V[i0],V[i1]); + cid = concatenate(cid, cid2); + } + } + } + + template typename Constrained_triangulation_plus_2::Constraint_id insert_constraint(Vertex_handle va, Vertex_handle vb, OutputIterator out) @@ -661,11 +725,7 @@ public: remove_constraint(cid, Emptyset_iterator()); } - void remove_constraint(Vertex_handle va, Vertex_handle vb) - { - hierarchy.remove_constraint(va,vb); - } - + void simplify(Vertices_in_constraint_iterator v) { Vertices_in_constraint_iterator u = boost::prior(v); @@ -722,8 +782,6 @@ public: Vertices_in_constraint_iterator vertices_in_constraint_begin(Constraint_id cid) const; Vertices_in_constraint_iterator vertices_in_constraint_end(Constraint_id cid) const ; - Vertices_in_constraint_iterator vertices_in_constraint_begin(Vertex_handle va, Vertex_handle vb) const; - Vertices_in_constraint_iterator vertices_in_constraint_end(Vertex_handle va, Vertex_handle vb) const ; Points_in_constraint_iterator points_in_constraint_begin(Constraint_id cid) const; Points_in_constraint_iterator points_in_constraint_end(Constraint_id cid) const ; @@ -1099,6 +1157,15 @@ operator<<(std::ostream& os, return os ; } +template +std::istream & +operator>>(std::istream& is, + Constrained_triangulation_plus_2 &ct) +{ + ct.file_input(is); + return is ; +} + // Constraint Hierarchy Queries template @@ -1206,23 +1273,6 @@ vertices_in_constraint_end(Constraint_id cid) const { return hierarchy.vertices_in_constraint_end(cid); } -template -inline -typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator -Constrained_triangulation_plus_2:: -vertices_in_constraint_begin(Vertex_handle va, Vertex_handle vb) const -{ - return hierarchy.vertices_in_constraint_begin(va,vb); -} - -template -inline -typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator -Constrained_triangulation_plus_2:: -vertices_in_constraint_end(Vertex_handle va, Vertex_handle vb) const -{ - return hierarchy.vertices_in_constraint_end(va,vb); -} template inline diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_2.h index 121595ab3c8..0f2a30c720e 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_2.h @@ -97,6 +97,7 @@ public: using Base::dimension; using Base::geom_traits; using Base::infinite_vertex; + using Base::finite_vertex; using Base::create_face; using Base::number_of_faces; using Base::all_faces_begin; @@ -121,12 +122,15 @@ public: using Base::is_infinite; using Base::degree; using Base::delete_vertex; + using Base::delete_face; using Base::incident_vertices; using Base::make_hole; using Base::mirror_index; using Base::show_vertex; using Base::test_dim_down; using Base::oriented_side; + using Base::compare_x; + using Base::compare_y; #endif private: @@ -986,7 +990,7 @@ is_valid(bool verbose, int /* level */) const // cannot call for is_valid() of Base Triangulation class // because 1) number of vertices of base class does not match // tds.is_valid calls is_valid for each vertex - // and the test is not fullfilled by hidden vertices ... + // and the test is not fulfilled by hidden vertices ... // result = result && Triangulation_2::is_valid(verbose, level); bool result = true; for(All_faces_iterator fit = all_faces_begin(); @@ -1840,10 +1844,10 @@ update_hidden_points_2_2(const Face_handle& f1, const Face_handle& f2) const Weighted_point& a1 = f1->vertex(f1->index(f2))->point(); const Weighted_point& a = f1->vertex(1-f1->index(f2))->point(); while(! p_list.empty()) { - if(this->compare_x(a, p_list.front()->point()) == - this->compare_x(a, a1) && - this->compare_y(a, p_list.front()->point()) == - this->compare_y(a, a1)) + if(compare_x(a, p_list.front()->point()) == + compare_x(a, a1) && + compare_y(a, p_list.front()->point()) == + compare_y(a, a1)) { hide_vertex(f1, p_list.front()); } else { @@ -2163,7 +2167,7 @@ stack_flip_dim1(Face_handle f, int i, Faces_around_stack &faces_around) n->neighbor(1-in)->set_neighbor(n->neighbor(1-in)->index(n), f); (f->vertex_list()).splice(f->vertex_list().begin(),n->vertex_list()); set_face(f->vertex_list(),f); - this->delete_face(n); + delete_face(n); hide_vertex(f,va); faces_around.push_front(f); return; @@ -2243,13 +2247,13 @@ nearest_power_vertex(const Bare_point& p) const { if(dimension() == -1) { return Vertex_handle(); } - if(dimension() == 0) { return this->finite_vertex(); } + if(dimension() == 0) { return finite_vertex(); } typename Geom_traits::Compare_power_distance_2 cmp_power_distance = geom_traits().compare_power_distance_2_object(); Vertex_handle vclosest; - Vertex_handle v = this->finite_vertex(); + Vertex_handle v = finite_vertex(); // if(dimension() == 1) { // } diff --git a/Triangulation_2/include/CGAL/Triangulation_2.h b/Triangulation_2/include/CGAL/Triangulation_2.h index eba46c6699b..4004b700c60 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_2.h @@ -2141,7 +2141,7 @@ move_if_no_collision(Vertex_handle v, const Point &p) fill_hole(v, hole); // fixing pointer - Face_circulator fc = this->incident_faces(inserted), done(fc); + Face_circulator fc = incident_faces(inserted), done(fc); std::vector faces_pt; faces_pt.reserve(16); do { faces_pt.push_back(fc); } while(++fc != done); @@ -2280,7 +2280,7 @@ move_if_no_collision_and_give_new_faces(Vertex_handle v, make_hole(v, hole, faces_set); fill_hole(v, hole, oif); - fc = this->incident_faces(inserted), done(fc); + fc = incident_faces(inserted), done(fc); std::vector faces_pt; faces_pt.reserve(16); do { faces_pt.push_back(fc); } while (++fc != done); diff --git a/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h b/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h index abd543f2f40..977b6170f65 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h +++ b/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h @@ -52,12 +52,8 @@ namespace CGAL { typedef std::vector Vertex_indices; typedef std::vector Vertices; - Vertex_indices vertex_indices; - vertex_indices.resize(points.size()); - - std::copy(boost::counting_iterator(0), - boost::counting_iterator(points.size()), - std::back_inserter(vertex_indices)); + Vertex_indices vertex_indices(boost::counting_iterator(0), + boost::counting_iterator(points.size())); typename T::size_type n = t.number_of_vertices(); CGAL::Spatial_sort_traits_adapter_2< diff --git a/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h b/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h index 1f3071db44e..e40da6fa737 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h @@ -192,16 +192,11 @@ private: Compare comp; Constraint_set constraint_set; Sc_to_c_map sc_to_c_map; - typedef std::map, - Constraint_id, - Pair_compare> Constraint_map; - Constraint_map constraint_map; public: Polyline_constraint_hierarchy_2(const Compare& comp) : comp(comp) , sc_to_c_map(Pair_compare(comp)) - , constraint_map(Pair_compare(comp)) { } Polyline_constraint_hierarchy_2(const Polyline_constraint_hierarchy_2& ch); ~Polyline_constraint_hierarchy_2(){ clear();} @@ -218,13 +213,6 @@ public: Vertex_it vertices_in_constraint_end(Constraint_id cid) const { return cid.vl_ptr()->skip_end(); } - Vertex_it vertices_in_constraint_begin(Vertex_handle va, Vertex_handle vb) const - { Constraint_id cid = constraint_map.find(make_edge(va,vb))->second; - return cid.vl_ptr()->skip_begin(); } - - Vertex_it vertices_in_constraint_end(Vertex_handle va, Vertex_handle vb) const - { Constraint_id cid = constraint_map.find(make_edge(va,vb))->second; - return cid.vl_ptr()->skip_end(); } Point_it points_in_constraint_begin(Constraint_id cid) const { return cid.vl_ptr()->all_begin(); } @@ -253,11 +241,6 @@ public: void swap(Constraint_id first, Constraint_id second); void remove_constraint(Constraint_id cid); - void remove_constraint(Vertex_handle va, Vertex_handle vb) - { - remove_constraint(constraint_map[make_edge(va,vb)]); - } - void split_constraint(T va, T vb, T vc); void simplify(Vertex_it u, @@ -315,7 +298,6 @@ Polyline_constraint_hierarchy_2:: Polyline_constraint_hierarchy_2(const Polyline_constraint_hierarchy_2& ch) : comp(ch.comp) , sc_to_c_map(Pair_compare(comp)) - , constraint_map(Pair_compare(comp)) { copy(ch); } @@ -898,13 +880,6 @@ Polyline_constraint_hierarchy_2:: insert_constraint_old_API(T va, T vb){ Edge he = make_edge(va, vb); - // First, check if the constraint was already inserted. - // If it was not, then the iterator to the lower bound will serve as - // the hint of the insertion. - typename Constraint_map::iterator c_map_it = constraint_map.lower_bound(he); - if(c_map_it != constraint_map.end() && he == c_map_it->first) - return 0; - Vertex_list* children = new Vertex_list; Context_list* fathers; @@ -924,8 +899,6 @@ insert_constraint_old_API(T va, T vb){ ctxt.pos = children->skip_begin(); fathers->push_front(ctxt); - constraint_map.insert(c_map_it, - typename Constraint_map::value_type(he, children)); return children; } @@ -973,7 +946,6 @@ clear() } sc_to_c_map.clear(); constraint_set.clear(); - constraint_map.clear(); } diff --git a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h index fd5521c6593..3ab4f62c28f 100644 --- a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h @@ -86,6 +86,8 @@ class Triangulation_hierarchy_2 #ifndef CGAL_CFG_USING_BASE_MEMBER_BUG_2 using Tr_Base::geom_traits; + using Tr_Base::number_of_vertices; + using Tr_Base::is_infinite; #endif private: @@ -130,7 +132,7 @@ public: template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last) { - std::ptrdiff_t n = this->number_of_vertices(); + std::ptrdiff_t n = number_of_vertices(); std::vector points (first, last); @@ -168,7 +170,7 @@ public: prev = v; } } - std::ptrdiff_t m = this->number_of_vertices(); + std::ptrdiff_t m = number_of_vertices(); return m - n; } @@ -583,7 +585,7 @@ template typename Triangulation_hierarchy_2::Vertex_handle Triangulation_hierarchy_2:: move(Vertex_handle v, const Point &p) { - CGAL_triangulation_precondition(!this->is_infinite(v)); + CGAL_triangulation_precondition(!is_infinite(v)); Vertex_handle w = move_if_no_collision(v,p); if(w != v) { remove(v); @@ -716,10 +718,10 @@ locate_in_all(const Point& p, Vertex_handle nearest; int level = Triangulation_hierarchy_2__maxlevel; typename Geom_traits::Compare_distance_2 - closer = this->geom_traits().compare_distance_2_object(); + closer = geom_traits().compare_distance_2_object(); typename Geom_traits::Construct_point_2 - construct_point = this->geom_traits().construct_point_2_object(); + construct_point = geom_traits().construct_point_2_object(); // find the highest level with enough vertices that is at the same time 2D while ( (hierarchy[--level]->number_of_vertices() diff --git a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_const_triang_plus_2.h b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_const_triang_plus_2.h index 4b9b87547fc..72b84a1916b 100644 --- a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_const_triang_plus_2.h +++ b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_const_triang_plus_2.h @@ -10,10 +10,12 @@ _test_cls_const_triang_plus_2( const TrP & ) typedef typename TrP::Vertex_handle Vertex_handle; typedef typename TrP::Constraint Constraint; + typedef typename TrP::Constraint_iterator Constraint_iterator; typedef typename TrP::Constraint_hierarchy Hierarchy; typedef typename TrP::Context Context; typedef typename TrP::Context_iterator Context_iterator; typedef typename TrP::Vertices_in_constraint Vertices_in_constraint; + typedef typename TrP::Constraint_id Constraint_id; CGAL_USE_TYPE(Hierarchy); CGAL_USE_TYPE(Context); @@ -34,8 +36,9 @@ _test_cls_const_triang_plus_2( const TrP & ) for(int i=0; i<12; i++){ vh[i] = trp.insert(pt[i]); } + Constraint_id cid; for(int j=0; j<11; j+=2){ - trp.insert_constraint(vh[j],vh[j+1]); + cid = trp.insert_constraint(vh[j],vh[j+1]); } trp.insert(Point(4,4), Point(4,5)); @@ -44,12 +47,12 @@ _test_cls_const_triang_plus_2( const TrP & ) // test access to the hierarchy std::cout << " test acces to the constraint hierarchy" << std::endl; - Vertices_in_constraint vit = trp.vertices_in_constraint_begin(vh[10],vh[11]); + Vertices_in_constraint vit = trp.vertices_in_constraint_begin(cid); assert (*vit == vh[10] || *vit == vh[11] ); Vertex_handle va = *++vit; Vertex_handle vb = *++vit; assert (*++vit == vh[11] || *vit == vh[10]); - assert (++vit == trp.vertices_in_constraint_end(vh[10],vh[11])); + assert (++vit == trp.vertices_in_constraint_end(cid)); assert(trp.number_of_enclosing_constraints(va,vb) == 2); Context_iterator cit1 = trp.contexts_begin(va,vb); Context_iterator cit2 = cit1++; @@ -98,20 +101,19 @@ _test_cls_const_triang_plus_2( const TrP & ) //test remove_constraint std::cout << " test removal of constraint" << std::endl; - trp.remove_constraint(vh[10],vh[11]); - trp.remove_constraint(vh[6],vh[7]); + trp.remove_constraint(cid); std::cerr << " test a special configuration" << std::endl; trp.clear(); Vertex_handle v1 = trp.insert(Point(0, 0)); Vertex_handle v2 = trp.insert(Point(-1, 0)); Vertex_handle v3 = trp.insert(Point(1, 0)); - trp.insert_constraint(v1, v2); - trp.insert_constraint(v2, v3); - trp.insert_constraint(v3, v1); - trp.remove_constraint(v1, v2); - trp.remove_constraint(v2, v3); - trp.remove_constraint(v3, v1); + Constraint_id cid1 = trp.insert_constraint(v1, v2); + Constraint_id cid2 = trp.insert_constraint(v2, v3); + Constraint_id cid3 = trp.insert_constraint(v3, v1); + trp.remove_constraint(cid1); + trp.remove_constraint(cid2); + trp.remove_constraint(cid3); std::cerr << " test the configuration of bug #2999" << std::endl; trp.clear(); @@ -128,6 +130,31 @@ _test_cls_const_triang_plus_2( const TrP & ) } std::cout << std::endl; + std::cout << "test IO" << std::endl; + + trp.clear(); + { + Point c1[2] = { Point(0,0), Point(1,0) }; + Point c2[3] = { Point(0,1), Point(1,1), Point(2,1) }; + Point c3[4] = { Point(0,0), Point(1,0), Point(1,1), Point(0,1) }; + + trp.insert_constraint(c1, c1 + 2); + trp.insert_constraint(c2, c2 + 3); + trp.insert_constraint(c3, c3 + 4); + std::ofstream out("cdtplus.txt"); + out << trp; + out.close(); + trp.clear(); + std::ifstream in("cdtplus.txt"); + in >> trp; + assert(trp.number_of_constraints() == 3); + std::size_t n = 0; + for(Constraint_iterator cit = trp.constraints_begin(); cit != trp.constraints_end(); ++cit){ + Constraint_id cid = *cit; + n += cid.second->all_size(); + } + assert( n == 9); + } return; } diff --git a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_types.h b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_types.h index c9ad3bd67aa..b2c94de238b 100644 --- a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_types.h +++ b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_types.h @@ -4,7 +4,6 @@ #include #include -#include #include typedef CGAL::MP_Float Rtype; diff --git a/Triangulation_2/test/Triangulation_2/test_delaunay_triangulation_2.cpp b/Triangulation_2/test/Triangulation_2/test_delaunay_triangulation_2.cpp index a8d7baca3ee..4670430b581 100644 --- a/Triangulation_2/test/Triangulation_2/test_delaunay_triangulation_2.cpp +++ b/Triangulation_2/test/Triangulation_2/test_delaunay_triangulation_2.cpp @@ -19,7 +19,7 @@ // // coordinator : INRIA Sophia-Antipolis // ============================================================================ -#include +#include #if defined(BOOST_MSVC) diff --git a/Triangulation_3/TODO b/Triangulation_3/TODO index 302b6fba736..93ab1024c36 100644 --- a/Triangulation_3/TODO +++ b/Triangulation_3/TODO @@ -9,11 +9,11 @@ TDS instead of having a cell which stores 4 vertex pointers, it only stores the XOR of them. And a Cell_handle now additionaly stores the 4 vertex pointers of the cell, the "context". - One problem is the Cell_iterator : it looses the context, so I think that + One problem is the Cell_iterator : it loses the context, so I think that one way to work around this is to write the Cell_iterator as based on the Vertex_iterator (a bit like the reverse used to be made) : we iterate over the vertices, and for each vertex, we compute the incident cells, but we - pick only those whose smallest vertex (adress-wise) is the one in question. + pick only those whose smallest vertex (address-wise) is the one in question. T3 - documenter le 2eme tableau de Triangulation_utils diff --git a/Triangulation_3/demo/Triangulation_3/Scene.cpp b/Triangulation_3/demo/Triangulation_3/Scene.cpp index ab6367885cf..50df80a6051 100644 --- a/Triangulation_3/demo/Triangulation_3/Scene.cpp +++ b/Triangulation_3/demo/Triangulation_3/Scene.cpp @@ -183,7 +183,7 @@ void Scene::savePointsOFF(const char* filename) ofstream fout; fout.open( filename ); if( !fout ) { - showError( QObject::tr("Error: cannot open file %1 for writting.").arg(filename) ); + showError( QObject::tr("Error: cannot open file %1 for writing.").arg(filename) ); return; } @@ -221,7 +221,7 @@ void Scene::savePointsXYZ(const char* filename) fout.open( filename ); // Check whether the file is opened properly if( !fout ) { - showError( QObject::tr("Error: cannot open file %1 for writting.").arg(filename) ); + showError( QObject::tr("Error: cannot open file %1 for writing.").arg(filename) ); return; } diff --git a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h index dd437b26bd7..1de9cf3de35 100644 --- a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h +++ b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h @@ -297,7 +297,7 @@ _test_cls_delaunay_3(const Triangulation &) /************** and I/O ****************************/ std::cout << " Constructor " << std::endl; - // Begining with an empty triangulation and adding point until reaching + // Beginning with an empty triangulation and adding point until reaching // 3-dimentional triangulation. Cls T0; assert(T0.dimension() == -1); diff --git a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_remove_cluster.h b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_remove_cluster.h index 2269ee84348..8389c56754d 100644 --- a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_remove_cluster.h +++ b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_remove_cluster.h @@ -1,4 +1,3 @@ -#include #include #include diff --git a/Union_find/test/Union_find/include/CGAL/test_macros.h b/Union_find/test/Union_find/include/CGAL/test_macros.h index 7cede2731f8..7c20753f5ea 100644 --- a/Union_find/test/Union_find/include/CGAL/test_macros.h +++ b/Union_find/test/Union_find/include/CGAL/test_macros.h @@ -1,7 +1,7 @@ #ifndef CGAL_TEST_MACROS_H #define CGAL_TEST_MACROS_H -#include +#include #include #include #include diff --git a/Visibility_2/test/Visibility_2/include/CGAL/test_model_methods.h b/Visibility_2/test/Visibility_2/include/CGAL/test_model_methods.h index de2bee668bd..d3410db466e 100644 --- a/Visibility_2/test/Visibility_2/include/CGAL/test_model_methods.h +++ b/Visibility_2/test/Visibility_2/include/CGAL/test_model_methods.h @@ -23,7 +23,6 @@ #ifndef CGAL_TEST_MODEL_METHODS_H #define CGAL_TEST_MODEL_METHODS_H -#include #include #include #include diff --git a/Visibility_2/test/Visibility_2/pure_benchmark.cpp b/Visibility_2/test/Visibility_2/pure_benchmark.cpp index bd0896b7169..cf5de043b0a 100644 --- a/Visibility_2/test/Visibility_2/pure_benchmark.cpp +++ b/Visibility_2/test/Visibility_2/pure_benchmark.cpp @@ -21,8 +21,6 @@ // Michael Hemmer // Kan Huang -#include #include #include #include diff --git a/Visibility_2/test/Visibility_2/simple_benchmark.cpp b/Visibility_2/test/Visibility_2/simple_benchmark.cpp index 68975f87aa4..f18d6239834 100644 --- a/Visibility_2/test/Visibility_2/simple_benchmark.cpp +++ b/Visibility_2/test/Visibility_2/simple_benchmark.cpp @@ -22,8 +22,7 @@ // Kan Huang // Ning Xu -#include -#include + #include #include #include diff --git a/Visibility_2/test/Visibility_2/test_rotational_visibility.cpp b/Visibility_2/test/Visibility_2/test_rotational_visibility.cpp index f50b441317d..010f960bd69 100644 --- a/Visibility_2/test/Visibility_2/test_rotational_visibility.cpp +++ b/Visibility_2/test/Visibility_2/test_rotational_visibility.cpp @@ -20,7 +20,6 @@ // Author(s): Francisc Bungiu // Kan Huang -#include #include #include #include diff --git a/Visibility_2/test/Visibility_2/test_simple_visibility.cpp b/Visibility_2/test/Visibility_2/test_simple_visibility.cpp index 95a37cbf3ce..04dca48bbeb 100644 --- a/Visibility_2/test/Visibility_2/test_simple_visibility.cpp +++ b/Visibility_2/test/Visibility_2/test_simple_visibility.cpp @@ -20,7 +20,6 @@ // Author(s): Francisc Bungiu // Michael Hemmer -#include #include #include #include diff --git a/Visibility_2/test/Visibility_2/test_star_shape.cpp b/Visibility_2/test/Visibility_2/test_star_shape.cpp index 6ed90961df1..c1cf616ceb1 100644 --- a/Visibility_2/test/Visibility_2/test_star_shape.cpp +++ b/Visibility_2/test/Visibility_2/test_star_shape.cpp @@ -21,7 +21,7 @@ // Francisc Bungiu // Michael Hemmer -#include + #include #include #include diff --git a/Visibility_2/test/Visibility_2/test_triangular_expansion.cpp b/Visibility_2/test/Visibility_2/test_triangular_expansion.cpp index 92659dbacfe..e17eb3e1609 100644 --- a/Visibility_2/test/Visibility_2/test_triangular_expansion.cpp +++ b/Visibility_2/test/Visibility_2/test_triangular_expansion.cpp @@ -20,7 +20,7 @@ // Author(s): Francisc Bungiu // Michael Hemmer -#include + #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_policy_concept.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_policy_concept.h index 40e139fc5c6..5fe1f431a8f 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_policy_concept.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_policy_concept.h @@ -22,7 +22,6 @@ #ifndef CGAL_ADAPTATION_POLICY_CONCEPT_H #define CGAL_ADAPTATION_POLICY_CONCEPT_H 1 -#include #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_traits_concept.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_traits_concept.h index ea5d61ad445..b6c56e91441 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_traits_concept.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Adaptation_traits_concept.h @@ -22,7 +22,6 @@ #ifndef CGAL_ADAPTATION_TRAITS_CONCEPT_H #define CGAL_ADAPTATION_TRAITS_CONCEPT_H 1 -#include #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Delaunay_graph_concept.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Delaunay_graph_concept.h index 810e0cde6e5..024d0327430 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Delaunay_graph_concept.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/Delaunay_graph_concept.h @@ -22,7 +22,6 @@ #ifndef CGAL_DELAUNAY_GRAPH_CONCEPT_H #define CGAL_DELAUNAY_GRAPH_CONCEPT_H 1 -#include #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_aux.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_aux.h index 6c485a3b573..69aa8e76686 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_aux.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_aux.h @@ -22,7 +22,6 @@ #ifndef VDA_AUX_H #define VDA_AUX_H 1 -#include #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_print_report.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_print_report.h index 2d14bd421a4..1d41b34eb55 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_print_report.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_print_report.h @@ -22,7 +22,6 @@ #ifndef VDA_PRINT_REPORT_H #define VDA_PRINT_REPORT_H 1 -#include #include "vda_aux.h" #include "helper_functions.h" #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test.h index 74f3c2f0067..e62a43f77c7 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test.h @@ -22,7 +22,6 @@ #ifndef VDA_TEST_H #define VDA_TEST_H 1 -#include #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h index 9df333f6477..e344ae31a7b 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h @@ -22,7 +22,6 @@ #ifndef VDA_TEST_LOCATE_H #define VDA_TEST_LOCATE_H 1 -#include #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h index 6b397e1959a..71d32d9595b 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h @@ -22,7 +22,6 @@ #ifndef VDA_TEST_VDA_H #define VDA_TEST_VDA_H 1 -#include #include #include #include diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_ag.cpp b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_ag.cpp index 14661db311c..51fc8f279e8 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_ag.cpp +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_ag.cpp @@ -21,8 +21,6 @@ #define VDA_TEST_AG -#include - #include #include "vda_test.h" diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_dt.cpp b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_dt.cpp index 991e4939fbe..f55d86d53ca 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_dt.cpp +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_dt.cpp @@ -21,8 +21,6 @@ #define VDA_TEST_DT -#include - #include #include "vda_test.h" diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_pt.cpp b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_pt.cpp index d1957e5c59d..45c1c72bd58 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_pt.cpp +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_pt.cpp @@ -21,8 +21,6 @@ #define VDA_TEST_PT -#include - #include #include "vda_test.h" diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_rt.cpp b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_rt.cpp index d2532455221..a31c78efa60 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_rt.cpp +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_rt.cpp @@ -21,7 +21,6 @@ #define VDA_TEST_RT -#include #include #include "vda_test.h" diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_sdg.cpp b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_sdg.cpp index 0395aac019d..9018091da4c 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_sdg.cpp +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/vda_sdg.cpp @@ -21,8 +21,6 @@ #define VDA_TEST_SDG -#include - #include #include "vda_test.h"